Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Interfejsy API usługi Azure Communication Services Call Automation to zaawansowany sposób tworzenia interaktywnych środowisk wywołujących. W tym przewodniku Szybki start omówimy sposób na wywołanie ruchu wychodzącego i rozpoznawanie różnych zdarzeń w wywołaniu.
Wymagania wstępne
- Konto platformy Azure z aktywną subskrypcją. Utwórz konto bezpłatnie.
- Wdrożony zasób usług komunikacyjnych. Utwórz zasób usług komunikacyjnych.
- Numer telefonu w zasobie usług Azure Communication Services, który może wykonywać połączenia wychodzące. Jeśli masz bezpłatną subskrypcję, możesz uzyskać numer telefonu w wersji próbnej.
- Tworzenie i hostowanie aplikacji Azure Dev Tunnel. Instrukcje znajdują się tutaj.
- Utwórz i połącz usługi Azure AI z wieloma usługami z zasobem usług Azure Communication Services.
- Utwórz niestandardową poddomenę dla zasobu usług Azure AI.
- (Opcjonalnie) Użytkownik usługi Microsoft Teams z włączoną licencją
voice
na telefon. Licencja na telefon usługi Teams jest wymagana do dodawania użytkowników usługi Teams do połączenia. Dowiedz się więcej o licencjach usługi Teams tutaj. Dowiedz się więcej o włączaniu systemuvoice
telefonicznego tutaj.
Przykładowy kod
Pobierz lub sklonuj przykładowy kod szybki start z usługi GitHub.
Przejdź do CallAutomation_OutboundCalling
folderu i otwórz rozwiązanie w edytorze kodu.
Konfigurowanie i hostowanie usługi Azure DevTunnel
Azure DevTunnels to usługa platformy Azure, która umożliwia udostępnianie lokalnych usług internetowych hostowanych w Internecie. Uruchom polecenia, aby połączyć lokalne środowisko programistyczne z publicznym Internetem. Usługa DevTunnels tworzy trwały adres URL punktu końcowego i umożliwia dostęp anonimowy. Ten punkt końcowy służy do powiadamiania aplikacji o wywoływaniu zdarzeń z usługi Azure Communication Services Call Automation.
devtunnel create --allow-anonymous
devtunnel port create -p 8080
devtunnel host
Alternatywnie postępuj zgodnie z instrukcjami, aby skonfigurować usługę Azure DevTunnel w programie Visual Studio
Aktualizowanie konfiguracji aplikacji
Następnie zaktualizuj Program.cs
plik przy użyciu następujących wartości:
acsConnectionString
: parametry połączenia dla zasobu usług Azure Communication Services. Usługi Azure Communication Services parametry połączenia można znaleźć, korzystając z instrukcji dostępnych tutaj.callbackUriHost
: Po zainicjowaniu hosta Usługi DevTunnel zaktualizuj to pole za pomocą tego identyfikatora URI.acsPhonenumber
: zaktualizuj to pole przy użyciu uzyskanego numeru telefonu usług Azure Communication Services. Ten numer telefonu powinien używać formatu numeru telefonu E164 (np. +18881234567)targetPhonenumber
: zaktualizuj pole przy użyciu numeru telefonu, który ma być wywoływany przez aplikację. Ten numer telefonu powinien używać formatu numeru telefonu E164 (np. +18881234567)cognitiveServiceEndpoint
: zaktualizuj pole za pomocą punktu końcowego usług Azure AI.targetTeamsUserId
: (Opcjonalnie) pole aktualizacji przy użyciu identyfikatora użytkownika usługi Microsoft Teams, które chcesz dodać do wywołania. Zobacz Uzyskiwanie identyfikatora użytkownika aplikacji Teams przy użyciu interfejsu API programu Graph.
// Your ACS resource connection string
var acsConnectionString = "<ACS_CONNECTION_STRING>";
// Your ACS resource phone number will act as source number to start outbound call
var acsPhonenumber = "<ACS_PHONE_NUMBER>";
// Target phone number you want to receive the call.
var targetPhonenumber = "<TARGET_PHONE_NUMBER>";
// Base url of the app
var callbackUriHost = "<CALLBACK_URI_HOST_WITH_PROTOCOL>";
// Your cognitive service endpoint
var cognitiveServiceEndpoint = "<COGNITIVE_SERVICE_ENDPOINT>";
// (Optional) User Id of the target teams user you want to receive the call.
var targetTeamsUserId = "<TARGET_TEAMS_USER_ID>";
Nawiązywanie połączenia wychodzącego
Aby wykonać wywołanie wychodzące z usług Azure Communication Services, w tym przykładzie użyto zdefiniowanego targetPhonenumber
wcześniej w aplikacji wywołania przy użyciu interfejsu CreateCallAsync
API. Ten kod wykona połączenie wychodzące przy użyciu docelowego numeru telefonu.
PhoneNumberIdentifier target = new PhoneNumberIdentifier(targetPhonenumber);
PhoneNumberIdentifier caller = new PhoneNumberIdentifier(acsPhonenumber);
var callbackUri = new Uri(callbackUriHost + "/api/callbacks");
CallInvite callInvite = new CallInvite(target, caller);
var createCallOptions = new CreateCallOptions(callInvite, callbackUri) {
CallIntelligenceOptions = new CallIntelligenceOptions() {
CognitiveServicesEndpoint = new Uri(cognitiveServiceEndpoint)
}
};
CreateCallResult createCallResult = await callAutomationClient.CreateCallAsync(createCallOptions);
Obsługa zdarzeń automatyzacji wywołań
Wcześniej w naszej aplikacji zarejestrowaliśmy callbackUriHost
usługę Call Automation Service. Host wskazuje punkt końcowy, którego usługa wymaga powiadomienia o zdarzeniach wywołujących, które się zdarzają. Następnie możemy iterować zdarzenia i wykrywać określone zdarzenia, które chcemy zrozumieć w naszej aplikacji. W poniższym kodzie odpowiadamy na CallConnected
zdarzenie.
app.MapPost("/api/callbacks", async (CloudEvent[] cloudEvents, ILogger < Program > logger) => {
foreach(var cloudEvent in cloudEvents) {
logger.LogInformation($"Event received: {JsonConvert.SerializeObject(cloudEvent)}");
CallAutomationEventBase parsedEvent = CallAutomationEventParser.Parse(cloudEvent);
logger.LogInformation($"{parsedEvent?.GetType().Name} parsedEvent received for call connection id: {parsedEvent?.CallConnectionId}");
var callConnection = callAutomationClient.GetCallConnection(parsedEvent.CallConnectionId);
var callMedia = callConnection.GetCallMedia();
if (parsedEvent is CallConnected) {
//Handle Call Connected Event
}
}
});
(Opcjonalnie) Dodawanie użytkownika aplikacji Microsoft Teams do wywołania
Możesz dodać użytkownika usługi Microsoft Teams do wywołania przy użyciu AddParticipantAsync
metody z identyfikatorem MicrosoftTeamsUserIdentifier
użytkownika usługi Teams i identyfikatorem użytkownika usługi Teams. Najpierw należy wykonać krok wymagań wstępnych Autoryzacja zasobu usług Azure Communication Services, aby umożliwić wywoływanie użytkowników usługi Microsoft Teams. Opcjonalnie możesz również przekazać element , SourceDisplayName
aby kontrolować tekst wyświetlany w wyskakującym powiadomieniu użytkownika usługi Teams.
await callConnection.AddParticipantAsync(
new CallInvite(new MicrosoftTeamsUserIdentifier(targetTeamsUserId))
{
SourceDisplayName = "Jack (Contoso Tech Support)"
});
Rozpoczynanie nagrywania połączenia
Usługa Call Automation umożliwia również rozpoczęcie nagrywania i przechowywania nagrań połączeń głosowych i wideo. Więcej informacji na temat różnych funkcji można znaleźć w interfejsach API nagrywania wywołań tutaj.
CallLocator callLocator = new ServerCallLocator(parsedEvent.ServerCallId);
var recordingResult = await callAutomationClient.GetCallRecording().StartAsync(new StartRecordingOptions(callLocator));
recordingId = recordingResult.Value.RecordingId;
Odtwórz wiadomość powitalną i rozpoznaj
TextSource
Korzystając z elementu , możesz udostępnić usłudze tekst, który ma zostać zsyntetyzowany i użyty na potrzeby wiadomości powitalnej. Usługa Azure Communication Services Call Automation odtwarza ten komunikat podczas CallConnected
zdarzenia.
Następnie przekazujemy tekst do elementu , a następnie wywołujemy metodę CallMediaRecognizeChoiceOptions
StartRecognizingAsync
. Dzięki temu aplikacja może rozpoznać opcję wybraną przez obiekt wywołujący.
if (parsedEvent is CallConnected callConnected) {
logger.LogInformation($"Start Recording...");
CallLocator callLocator = new ServerCallLocator(parsedEvent.ServerCallId);
var recordingResult = await callAutomationClient.GetCallRecording().StartAsync(new StartRecordingOptions(callLocator));
recordingId = recordingResult.Value.RecordingId;
var choices = GetChoices();
// prepare recognize tones
var recognizeOptions = GetMediaRecognizeChoiceOptions(mainMenu, targetPhonenumber, choices);
// Send request to recognize tones
await callMedia.StartRecognizingAsync(recognizeOptions);
}
CallMediaRecognizeChoiceOptions GetMediaRecognizeChoiceOptions(string content, string targetParticipant, List < RecognitionChoice > choices, string context = "") {
var playSource = new TextSource(content) {
VoiceName = SpeechToTextVoice
};
var recognizeOptions = new CallMediaRecognizeChoiceOptions(targetParticipant: new PhoneNumberIdentifier(targetParticipant), choices) {
InterruptCallMediaOperation = false,
InterruptPrompt = false,
InitialSilenceTimeout = TimeSpan.FromSeconds(10),
Prompt = playSource,
OperationContext = context
};
return recognizeOptions;
}
List < RecognitionChoice > GetChoices() {
return new List < RecognitionChoice > {
new RecognitionChoice("Confirm", new List < string > {
"Confirm",
"First",
"One"
}) {
Tone = DtmfTone.One
},
new RecognitionChoice("Cancel", new List < string > {
"Cancel",
"Second",
"Two"
}) {
Tone = DtmfTone.Two
}
};
}
Obsługa zdarzeń wyboru
Usługa Azure Communication Services Call Automation wyzwala element api/callbacks
webhook, który skonfigurowaliśmy i powiadomi nas o zdarzeniu RecognizeCompleted
. Zdarzenie daje nam możliwość reagowania na odebrane dane wejściowe i wyzwalanie akcji. Następnie aplikacja odtwarza komunikat do obiekt wywołujący na podstawie określonych odebranych danych wejściowych.
if (parsedEvent is RecognizeCompleted recognizeCompleted) {
var choiceResult = recognizeCompleted.RecognizeResult as ChoiceResult;
var labelDetected = choiceResult?.Label;
var phraseDetected = choiceResult?.RecognizedPhrase;
// If choice is detected by phrase, choiceResult.RecognizedPhrase will have the phrase detected,
// If choice is detected using dtmf tone, phrase will be null
logger.LogInformation("Recognize completed successfully, labelDetected={labelDetected}, phraseDetected={phraseDetected}", labelDetected, phraseDetected);
var textToPlay = labelDetected.Equals(ConfirmChoiceLabel, StringComparison.OrdinalIgnoreCase) ? ConfirmedText : CancelText;
await HandlePlayAsync(callMedia, textToPlay);
}
async Task HandlePlayAsync(CallMedia callConnectionMedia, string text) {
// Play goodbye message
var GoodbyePlaySource = new TextSource(text) {
VoiceName = "en-US-NancyNeural"
};
await callConnectionMedia.PlayToAllAsync(GoodbyePlaySource);
}
Zawieszanie się i zatrzymywanie nagrywania
Na koniec, gdy wykryjemy warunek, który ma sens, aby zakończyć wywołanie, możemy użyć HangUpAsync
metody , aby zawiesić wywołanie.
if ((parsedEvent is PlayCompleted) || (parsedEvent is PlayFailed))
{
logger.LogInformation($"Stop recording and terminating call.");
callAutomationClient.GetCallRecording().Stop(recordingId);
await callConnection.HangUpAsync(true);
}
Uruchamianie kodu
Aby uruchomić aplikację za pomocą programu VS Code, otwórz okno terminalu i uruchom następujące polecenie
dotnet run
Otwórz http://localhost:8080/swagger/index.html
adres URL tunelu deweloperskiego w przeglądarce. Adres URL tunelu wygląda następująco: <YOUR DEV TUNNEL ENDPOINT>/swagger/index.html
Wymagania wstępne
- Konto platformy Azure z aktywną subskrypcją. Utwórz konto bezpłatnie.
- Wdrożony zasób usług komunikacyjnych. Utwórz zasób usług komunikacyjnych.
- Numer telefonu w zasobie usług Azure Communication Services, który może wykonywać połączenia wychodzące. Jeśli masz bezpłatną subskrypcję, możesz uzyskać numer telefonu w wersji próbnej.
- Tworzenie i hostowanie aplikacji Azure Dev Tunnel. Instrukcje znajdują się tutaj.
- Utwórz i połącz usługi Azure AI z wieloma usługami z zasobem usług Azure Communication Services.
- Utwórz niestandardową poddomenę dla zasobu usług Azure AI.
- Zestaw Java Development Kit (JDK) w wersji 11 lub nowszej.
- Apache Maven.
- (Opcjonalnie) Użytkownik usługi Microsoft Teams z włączoną licencją
voice
na telefon. Licencja na telefon usługi Teams jest wymagana do dodawania użytkowników usługi Teams do połączenia. Dowiedz się więcej o licencjach usługi Teams tutaj. Aby uzyskać więcej informacji na temat włączaniavoice
w systemie telefonicznym, zobacz Konfigurowanie systemu telefonicznego.
Przykładowy kod
Pobierz lub sklonuj przykładowy kod szybki start z usługi GitHub.
Przejdź do CallAutomation_OutboundCalling
folderu i otwórz rozwiązanie w edytorze kodu.
Konfigurowanie i hostowanie usługi Azure DevTunnel
Azure DevTunnels to usługa platformy Azure, która umożliwia udostępnianie lokalnych usług internetowych hostowanych w Internecie. Uruchom polecenia DevTunnel, aby połączyć lokalne środowisko programistyczne z publicznym Internetem. Usługa DevTunnels tworzy następnie tunel z trwałym adresem URL punktu końcowego i umożliwia dostęp anonimowy. Usługi Azure Communication Services używają tego punktu końcowego do powiadamiania aplikacji o wywołaniach zdarzeń z usługi Azure Communication Services Call Automation.
devtunnel create --allow-anonymous
devtunnel port create -p MY_SPRINGAPP_PORT
devtunnel host
Aktualizowanie konfiguracji aplikacji
Następnie otwórz application.yml
plik w folderze /resources
, aby skonfigurować następujące wartości:
connectionstring
: parametry połączenia dla zasobu usług Azure Communication Services. Usługi Azure Communication Services parametry połączenia można znaleźć, korzystając z instrukcji dostępnych tutaj.basecallbackuri
: Po zainicjowaniu hosta Usługi DevTunnel zaktualizuj to pole za pomocą tego identyfikatora URI.callerphonenumber
: zaktualizuj to pole przy użyciu uzyskanego numeru telefonu usług Azure Communication Services. Ten numer telefonu powinien używać formatu numeru telefonu E164 (np. +18881234567)targetphonenumber
: zaktualizuj pole przy użyciu numeru telefonu, który ma być wywoływany przez aplikację. Ten numer telefonu powinien używać formatu numeru telefonu E164 (np. +18881234567)cognitiveServiceEndpoint
: zaktualizuj pole za pomocą punktu końcowego usług Azure AI.targetTeamsUserId
: (Opcjonalnie) pole aktualizacji przy użyciu identyfikatora użytkownika usługi Microsoft Teams, które chcesz dodać do wywołania. Zobacz Uzyskiwanie identyfikatora użytkownika aplikacji Teams przy użyciu interfejsu API programu Graph.
acs:
connectionstring: <YOUR ACS CONNECTION STRING>
basecallbackuri: <YOUR DEV TUNNEL ENDPOINT>
callerphonenumber: <YOUR ACS PHONE NUMBER ex. "+1425XXXAAAA">
targetphonenumber: <YOUR TARGET PHONE NUMBER ex. "+1425XXXAAAA">
cognitiveServiceEndpoint: <YOUR COGNITIVE SERVICE ENDPOINT>
targetTeamsUserId: <(OPTIONAL) YOUR TARGET TEAMS USER ID ex. "00aa00aa-bb11-cc22-dd33-44ee44ee44ee">
Nawiązywanie połączenia wychodzącego i odtwarzanie multimediów
Aby wykonać wywołanie wychodzące z usług Azure Communication Services, w tym przykładzie targetphonenumber
użyto zdefiniowanego application.yml
w pliku w celu utworzenia wywołania przy użyciu interfejsu createCallWithResponse
API.
PhoneNumberIdentifier caller = new PhoneNumberIdentifier(appConfig.getCallerphonenumber());
PhoneNumberIdentifier target = new PhoneNumberIdentifier(appConfig.getTargetphonenumber());
CallInvite callInvite = new CallInvite(target, caller);
CreateCallOptions createCallOptions = new CreateCallOptions(callInvite, appConfig.getCallBackUri());
CallIntelligenceOptions callIntelligenceOptions = new CallIntelligenceOptions().setCognitiveServicesEndpoint(appConfig.getCognitiveServiceEndpoint());
createCallOptions = createCallOptions.setCallIntelligenceOptions(callIntelligenceOptions);
Response<CreateCallResult> result = client.createCallWithResponse(createCallOptions, Context.NONE);
(Opcjonalnie) Dodawanie użytkownika aplikacji Microsoft Teams do wywołania
Możesz dodać użytkownika usługi Microsoft Teams do wywołania przy użyciu addParticipant
metody z identyfikatorem MicrosoftTeamsUserIdentifier
użytkownika usługi Teams i identyfikatorem użytkownika usługi Teams. Najpierw należy wykonać krok wymagań wstępnych Autoryzacja zasobu usług Azure Communication Services, aby umożliwić wywoływanie użytkowników usługi Microsoft Teams. Opcjonalnie możesz również przekazać element , SourceDisplayName
aby kontrolować tekst wyświetlany w wyskakującym powiadomieniu użytkownika usługi Teams.
client.getCallConnection(callConnectionId).addParticipant(
new CallInvite(new MicrosoftTeamsUserIdentifier(targetTeamsUserId))
.setSourceDisplayName("Jack (Contoso Tech Support)"));
Rozpoczynanie nagrywania połączenia
Usługa Call Automation umożliwia również rozpoczęcie nagrywania i przechowywania nagrań połączeń głosowych i wideo. Więcej informacji na temat różnych funkcji można znaleźć w interfejsach API nagrywania wywołań tutaj.
ServerCallLocator serverCallLocator = new ServerCallLocator(
client.getCallConnection(callConnectionId)
.getCallProperties()
.getServerCallId());
StartRecordingOptions startRecordingOptions = new StartRecordingOptions(serverCallLocator);
Response<RecordingStateResult> response = client.getCallRecording()
.startWithResponse(startRecordingOptions, Context.NONE);
recordingId = response.getValue().getRecordingId();
Reagowanie na zdarzenia wywołujące
Wcześniej w naszej aplikacji zarejestrowaliśmy basecallbackuri
usługę Call Automation Service. Identyfikator URI wskazuje punkt końcowy, którego usługa będzie używać do powiadamiania nas o zdarzeniach wywołujących, które się zdarzają. Następnie możemy iterować zdarzenia i wykrywać określone zdarzenia, które chcemy zrozumieć w naszej aplikacji. W poniższym kodzie odpowiadamy na CallConnected
zdarzenie.
List<CallAutomationEventBase> events = CallAutomationEventParser.parseEvents(reqBody);
for (CallAutomationEventBase event : events) {
String callConnectionId = event.getCallConnectionId();
if (event instanceof CallConnected) {
log.info("CallConnected event received");
}
else if (event instanceof RecognizeCompleted) {
log.info("Recognize Completed event received");
}
}
Odtwórz wiadomość powitalną i rozpoznaj
TextSource
Korzystając z elementu , możesz udostępnić usłudze tekst, który ma zostać zsyntetyzowany i użyty na potrzeby wiadomości powitalnej. Usługa Azure Communication Services Call Automation odtwarza ten komunikat podczas CallConnected
zdarzenia.
Następnie przekazujemy tekst do elementu , a następnie wywołujemy metodę CallMediaRecognizeChoiceOptions
StartRecognizingAsync
. Dzięki temu aplikacja może rozpoznać opcję wybraną przez obiekt wywołujący.
var playSource = new TextSource().setText(content).setVoiceName("en-US-NancyNeural");
var recognizeOptions = new CallMediaRecognizeChoiceOptions(new PhoneNumberIdentifier(targetParticipant), getChoices())
.setInterruptCallMediaOperation(false)
.setInterruptPrompt(false)
.setInitialSilenceTimeout(Duration.ofSeconds(10))
.setPlayPrompt(playSource)
.setOperationContext(context);
client.getCallConnection(callConnectionId)
.getCallMedia()
.startRecognizing(recognizeOptions);
private List < RecognitionChoice > getChoices() {
var choices = Arrays.asList(
new RecognitionChoice().setLabel(confirmLabel).setPhrases(Arrays.asList("Confirm", "First", "One")).setTone(DtmfTone.ONE),
new RecognitionChoice().setLabel(cancelLabel).setPhrases(Arrays.asList("Cancel", "Second", "Two")).setTone(DtmfTone.TWO)
);
return choices;
}
Obsługa zdarzeń wyboru
Usługa Azure Communication Services Call Automation wyzwala element api/callbacks
webhook, który skonfigurowaliśmy i powiadomi nas o zdarzeniu RecognizeCompleted
. Zdarzenie daje nam możliwość reagowania na odebrane dane wejściowe i wyzwalanie akcji. Następnie aplikacja odtwarza komunikat do obiekt wywołujący na podstawie określonych odebranych danych wejściowych.
else if (event instanceof RecognizeCompleted) {
log.info("Recognize Completed event received");
RecognizeCompleted acsEvent = (RecognizeCompleted) event;
var choiceResult = (ChoiceResult) acsEvent.getRecognizeResult().get();
String labelDetected = choiceResult.getLabel();
String phraseDetected = choiceResult.getRecognizedPhrase();
log.info("Recognition completed, labelDetected=" + labelDetected + ", phraseDetected=" + phraseDetected + ", context=" + event.getOperationContext());
String textToPlay = labelDetected.equals(confirmLabel) ? confirmedText : cancelText;
handlePlay(callConnectionId, textToPlay);
}
private void handlePlay(final String callConnectionId, String textToPlay) {
var textPlay = new TextSource()
.setText(textToPlay)
.setVoiceName("en-US-NancyNeural");
client.getCallConnection(callConnectionId)
.getCallMedia()
.playToAll(textPlay);
}
Zawieszanie połączenia
Na koniec, gdy wykryjemy warunek, który ma sens, aby zakończyć wywołanie, możemy użyć hangUp
metody , aby zawiesić wywołanie.
client.getCallConnection(callConnectionId).hangUp(true);
Uruchamianie kodu
Przejdź do katalogu zawierającego plik pom.xml i użyj następujących poleceń mvn:
- Skompiluj aplikację:
mvn compile
- Skompiluj pakiet:
mvn package
- Wykonaj aplikację:
mvn exec:java
Wymagania wstępne
- Konto platformy Azure z aktywną subskrypcją. Utwórz konto bezpłatnie.
- Wdrożony zasób usług komunikacyjnych. Utwórz zasób usług komunikacyjnych.
- Numer telefonu w zasobie usług Azure Communication Services, który może wykonywać połączenia wychodzące. Jeśli masz bezpłatną subskrypcję, możesz uzyskać numer telefonu w wersji próbnej.
- Tworzenie i hostowanie aplikacji Azure Dev Tunnel. Instrukcje znajdują się tutaj.
-
- Utwórz i połącz usługi Azure AI z wieloma usługami z zasobem usług Azure Communication Services.
- Utwórz niestandardową poddomenę dla zasobu usług Azure AI.
- instalacja Node.js LTS.
- Zainstalowany program Visual Studio Code .
- (Opcjonalnie) Użytkownik usługi Microsoft Teams z włączoną licencją
voice
na telefon. Licencja na telefon usługi Teams jest wymagana do dodawania użytkowników usługi Teams do połączenia. Dowiedz się więcej o licencjach usługi Teams tutaj. Aby uzyskać więcej informacji na temat włączaniavoice
w systemie telefonicznym, zobacz Konfigurowanie systemu telefonicznego.
Przykładowy kod
Pobierz lub sklonuj przykładowy kod szybki start z usługi GitHub.
Przejdź do CallAutomation_OutboundCalling
folderu i otwórz rozwiązanie w edytorze kodu.
Konfigurowanie środowiska
Pobierz przykładowy kod i przejdź do katalogu projektu i uruchom npm
polecenie, które instaluje niezbędne zależności i konfiguruje środowisko deweloperskie.
npm install
Konfigurowanie i hostowanie usługi Azure DevTunnel
Azure DevTunnels to usługa platformy Azure, która umożliwia udostępnianie lokalnych usług internetowych hostowanych w Internecie. Użyj poleceń interfejsu wiersza polecenia usługi DevTunnel, aby połączyć lokalne środowisko programistyczne z publicznym Internetem. Ten punkt końcowy służy do powiadamiania aplikacji o wywoływaniu zdarzeń z usługi Azure Communication Services Call Automation.
devtunnel create --allow-anonymous
devtunnel port create -p 8080
devtunnel host
Aktualizowanie konfiguracji aplikacji
Następnie zaktualizuj .env
plik przy użyciu następujących wartości:
CONNECTION_STRING
: parametry połączenia dla zasobu usług Azure Communication Services. Usługi Azure Communication Services parametry połączenia można znaleźć, korzystając z instrukcji dostępnych tutaj.CALLBACK_URI
: Po zainicjowaniu hosta Usługi DevTunnel zaktualizuj to pole za pomocą tego identyfikatora URI.TARGET_PHONE_NUMBER
: zaktualizuj pole przy użyciu numeru telefonu, który ma być wywoływany przez aplikację. Ten numer telefonu powinien używać formatu numeru telefonu E164 (np. +18881234567)ACS_RESOURCE_PHONE_NUMBER
: zaktualizuj to pole przy użyciu uzyskanego numeru telefonu usług Azure Communication Services. Ten numer telefonu powinien używać formatu numeru telefonu E164 (np. +18881234567)COGNITIVE_SERVICES_ENDPOINT
: zaktualizuj pole za pomocą punktu końcowego usług Azure AI.TARGET_TEAMS_USER_ID
: (Opcjonalnie) pole aktualizacji przy użyciu identyfikatora użytkownika usługi Microsoft Teams, które chcesz dodać do wywołania. Zobacz Uzyskiwanie identyfikatora użytkownika aplikacji Teams przy użyciu interfejsu API programu Graph.
CONNECTION_STRING="<YOUR_CONNECTION_STRING>"
ACS_RESOURCE_PHONE_NUMBER ="<YOUR_ACS_NUMBER>"
TARGET_PHONE_NUMBER="<+1XXXXXXXXXX>"
CALLBACK_URI="<VS_TUNNEL_URL>"
COGNITIVE_SERVICES_ENDPOINT="<COGNITIVE_SERVICES_ENDPOINT>"
TARGET_TEAMS_USER_ID="<TARGET_TEAMS_USER_ID>"
Nawiązywanie połączenia wychodzącego i odtwarzanie multimediów
Aby nawiązać połączenie wychodzące z usług Azure Communication Services, użyj numeru telefonu podanego w środowisku. Upewnij się, że numer telefonu jest w formacie E164 (np. +18881234567)
Kod wykonuje wywołanie wychodzące przy użyciu podanego target_phone_number i umieść wywołanie wychodzące do tego numeru:
const callInvite: CallInvite = {
targetParticipant: callee,
sourceCallIdNumber: {
phoneNumber: process.env.ACS_RESOURCE_PHONE_NUMBER || "",
},
};
const options: CreateCallOptions = {
cognitiveServicesEndpoint: process.env.COGNITIVE_SERVICES_ENDPOINT
};
console.log("Placing outbound call...");
acsClient.createCall(callInvite, process.env.CALLBACK_URI + "/api/callbacks", options);
(Opcjonalnie) Dodawanie użytkownika aplikacji Microsoft Teams do wywołania
Możesz dodać użytkownika aplikacji Microsoft Teams do wywołania przy użyciu addParticipant
metody z właściwością microsoftTeamsUserId
. Najpierw należy wykonać krok wymagań wstępnych Autoryzacja zasobu usług Azure Communication Services, aby umożliwić wywoływanie użytkowników usługi Microsoft Teams. Opcjonalnie możesz również przekazać element , sourceDisplayName
aby kontrolować tekst wyświetlany w wyskakującym powiadomieniu użytkownika usługi Teams.
await acsClient.getCallConnection(callConnectionId).addParticipant({
targetParticipant: { microsoftTeamsUserId: process.env.TARGET_TEAMS_USER_ID },
sourceDisplayName: "Jack (Contoso Tech Support)"
});
Rozpoczynanie nagrywania połączenia
Usługa Call Automation umożliwia również rozpoczęcie nagrywania i przechowywania nagrań połączeń głosowych i wideo. Więcej informacji na temat różnych funkcji można znaleźć w interfejsach API nagrywania wywołań tutaj.
const callLocator: CallLocator = {
id: serverCallId,
kind: "serverCallLocator",
};
const recordingOptions: StartRecordingOptions = {
callLocator: callLocator,
};
const response = await acsClient.getCallRecording().start(recordingOptions);
recordingId = response.recordingId;
Reagowanie na zdarzenia wywołujące
Wcześniej w naszej aplikacji zarejestrowaliśmy CALLBACK_URI
usługę Call Automation Service. Identyfikator URI wskazuje punkt końcowy używany przez usługę do powiadamiania nas o zdarzeniach wywołujących, które się zdarzają. Następnie możemy iterować zdarzenia i wykrywać określone zdarzenia, które chcemy zrozumieć w naszej aplikacji. Reagujemy na zdarzenie, aby otrzymywać CallConnected
powiadomienia i inicjować operacje podrzędne. TextSource
Korzystając z elementu , możesz udostępnić usłudze tekst, który ma zostać zsyntetyzowany i użyty na potrzeby wiadomości powitalnej. Usługa Azure Communication Services Call Automation odtwarza ten komunikat podczas CallConnected
zdarzenia.
Następnie przekazujemy tekst do elementu , a następnie wywołujemy metodę CallMediaRecognizeChoiceOptions
StartRecognizingAsync
. Dzięki temu aplikacja może rozpoznać opcję wybraną przez obiekt wywołujący.
callConnectionId = eventData.callConnectionId;
serverCallId = eventData.serverCallId;
console.log("Call back event received, callConnectionId=%s, serverCallId=%s, eventType=%s", callConnectionId, serverCallId, event.type);
callConnection = acsClient.getCallConnection(callConnectionId);
const callMedia = callConnection.getCallMedia();
if (event.type === "Microsoft.Communication.CallConnected") {
console.log("Received CallConnected event");
await startRecording();
await startRecognizing(callMedia, mainMenu, "");
}
async function startRecognizing(callMedia: CallMedia, textToPlay: string, context: string) {
const playSource: TextSource = {
text: textToPlay,
voiceName: "en-US-NancyNeural",
kind: "textSource"
};
const recognizeOptions: CallMediaRecognizeChoiceOptions = {
choices: await getChoices(),
interruptPrompt: false,
initialSilenceTimeoutInSeconds: 10,
playPrompt: playSource,
operationContext: context,
kind: "callMediaRecognizeChoiceOptions"
};
await callMedia.startRecognizing(callee, recognizeOptions)
}
Obsługa zdarzeń wyboru
Usługa Azure Communication Services Call Automation wyzwala element api/callbacks
webhook, który skonfigurowaliśmy i powiadomi nas o zdarzeniu RecognizeCompleted
. Zdarzenie daje nam możliwość reagowania na odebrane dane wejściowe i wyzwalanie akcji. Następnie aplikacja odtwarza komunikat do obiekt wywołujący na podstawie określonych odebranych danych wejściowych.
else if (event.type === "Microsoft.Communication.RecognizeCompleted") {
if(eventData.recognitionType === "choices"){
console.log("Recognition completed, event=%s, resultInformation=%s",eventData, eventData.resultInformation);
var context = eventData.operationContext;
const labelDetected = eventData.choiceResult.label;
const phraseDetected = eventData.choiceResult.recognizedPhrase;
console.log("Recognition completed, labelDetected=%s, phraseDetected=%s, context=%s", labelDetected, phraseDetected, eventData.operationContext);
const textToPlay = labelDetected === confirmLabel ? confirmText : cancelText;
await handlePlay(callMedia, textToPlay);
}
}
async function handlePlay(callConnectionMedia:CallMedia, textContent:string){
const play : TextSource = { text:textContent , voiceName: "en-US-NancyNeural", kind: "textSource"}
await callConnectionMedia.playToAll([play]);
}
Zawieszanie połączenia
Na koniec, gdy wykryjemy warunek, który ma sens, aby zakończyć wywołanie, możemy użyć hangUp()
metody , aby zawiesić wywołanie.
await acsClient.getCallRecording().stop(recordingId);
callConnection.hangUp(true);
Uruchamianie kodu
Aby uruchomić aplikację, otwórz okno terminalu i uruchom następujące polecenie:
npm run dev
Wymagania wstępne
- Konto platformy Azure z aktywną subskrypcją. Utwórz konto bezpłatnie.
- Wdrożony zasób usług komunikacyjnych. Utwórz zasób usług komunikacyjnych.
- Numer telefonu w zasobie usług Azure Communication Services, który może wykonywać połączenia wychodzące. Jeśli masz bezpłatną subskrypcję, możesz uzyskać numer telefonu w wersji próbnej.
- Tworzenie i hostowanie aplikacji Azure Dev Tunnel. Instrukcje znajdują się tutaj.
- Utwórz i połącz usługi Azure AI z wieloma usługami z zasobem usług Azure Communication Services.
- Utwórz niestandardową poddomenę dla zasobu usług Azure AI.
- Python 3.7+.
- (Opcjonalnie) Użytkownik usługi Microsoft Teams z włączoną licencją
voice
na telefon. Licencja na telefon usługi Teams jest wymagana do dodawania użytkowników usługi Teams do połączenia. Dowiedz się więcej o licencjach usługi Teams tutaj. Aby uzyskać więcej informacji na temat włączaniavoice
w systemie telefonicznym, zobacz Konfigurowanie systemu telefonicznego.
Przykładowy kod
Pobierz lub sklonuj przykładowy kod szybki start z usługi GitHub.
Przejdź do CallAutomation_OutboundCalling
folderu i otwórz rozwiązanie w edytorze kodu.
Konfigurowanie środowiska języka Python
Utwórz i aktywuj środowisko języka Python i zainstaluj wymagane pakiety przy użyciu następującego polecenia. Więcej informacji na temat zarządzania pakietami można znaleźć tutaj
pip install -r requirements.txt
Konfigurowanie i hostowanie usługi Azure DevTunnel
Azure DevTunnels to usługa platformy Azure, która umożliwia udostępnianie lokalnych usług internetowych hostowanych w Internecie. Użyj poleceń , aby połączyć lokalne środowisko programistyczne z publicznym Internetem. Usługa DevTunnels tworzy tunel z trwałym adresem URL punktu końcowego i umożliwia dostęp anonimowy. Ten punkt końcowy służy do powiadamiania aplikacji o wywoływaniu zdarzeń z usługi Azure Communication Services Call Automation.
devtunnel create --allow-anonymous
devtunnel port create -p 8080
devtunnel host
Aktualizowanie konfiguracji aplikacji
Następnie zaktualizuj main.py
plik przy użyciu następujących wartości:
ACS_CONNECTION_STRING
: parametry połączenia dla zasobu usług Azure Communication Services. Usługi Azure Communication Services parametry połączenia można znaleźć, korzystając z instrukcji dostępnych tutaj.CALLBACK_URI_HOST
: Po zainicjowaniu hosta Usługi DevTunnel zaktualizuj to pole za pomocą tego identyfikatora URI.TARGET_PHONE_NUMBER
: zaktualizuj pole przy użyciu numeru telefonu, który ma być wywoływany przez aplikację. Ten numer telefonu powinien używać formatu numeru telefonu E164 (np. +18881234567)ACS_PHONE_NUMBER
: zaktualizuj to pole przy użyciu uzyskanego numeru telefonu usług Azure Communication Services. Ten numer telefonu powinien używać formatu numeru telefonu E164 (np. +18881234567)COGNITIVE_SERVICES_ENDPOINT
: zaktualizuj pole za pomocą punktu końcowego usług Azure AI.TARGET_TEAMS_USER_ID
: (Opcjonalnie) pole aktualizacji przy użyciu identyfikatora użytkownika usługi Microsoft Teams, które chcesz dodać do wywołania. Zobacz Uzyskiwanie identyfikatora użytkownika aplikacji Teams przy użyciu interfejsu API programu Graph.
# Your ACS resource connection string
ACS_CONNECTION_STRING = "<ACS_CONNECTION_STRING>"
# Your ACS resource phone number will act as source number to start outbound call
ACS_PHONE_NUMBER = "<ACS_PHONE_NUMBER>"
# Target phone number you want to receive the call.
TARGET_PHONE_NUMBER = "<TARGET_PHONE_NUMBER>"
# Callback events URI to handle callback events.
CALLBACK_URI_HOST = "<CALLBACK_URI_HOST_WITH_PROTOCOL>"
CALLBACK_EVENTS_URI = CALLBACK_URI_HOST + "/api/callbacks"
#Your Cognitive service endpoint
COGNITIVE_SERVICES_ENDPOINT = "<COGNITIVE_SERVICES_ENDPOINT>"
#(OPTIONAL) Your target Microsoft Teams user Id ex. "00aa00aa-bb11-cc22-dd33-44ee44ee44ee"
TARGET_TEAMS_USER_ID = "<TARGET_TEAMS_USER_ID>"
Nawiązywanie połączenia wychodzącego
Aby nawiązać połączenie wychodzące z usług Azure Communication Services, najpierw podaj numer telefonu, który chcesz odebrać. Aby ułatwić sobie to, możesz zaktualizować target_phone_number
numer telefonu przy użyciu numeru telefonu w formacie E164 (np. +18881234567)
Wykonaj wywołanie wychodzące przy użyciu podanego target_phone_number:
target_participant = PhoneNumberIdentifier(TARGET_PHONE_NUMBER)
source_caller = PhoneNumberIdentifier(ACS_PHONE_NUMBER)
call_invite = CallInvite(target=target_participant, source_caller_id_number=source_caller)
call_connection_properties = call_automation_client.create_call(call_invite, CALLBACK_EVENTS_URI,
cognitive_services_endpoint=COGNITIVE_SERVICES_ENDPOINT)
app.logger.info("Created call with connection id: %s",
call_connection_properties.call_connection_id)
return redirect("/")
(Opcjonalnie) Dodawanie użytkownika aplikacji Microsoft Teams do wywołania
Możesz dodać użytkownika usługi Microsoft Teams do wywołania przy użyciu add_participant
metody z identyfikatorem MicrosoftTeamsUserIdentifier
użytkownika usługi Teams i identyfikatorem użytkownika usługi Teams. Najpierw należy wykonać krok wymagań wstępnych Autoryzacja zasobu usług Azure Communication Services, aby umożliwić wywoływanie użytkowników usługi Microsoft Teams. Opcjonalnie możesz również przekazać element , source_display_name
aby kontrolować tekst wyświetlany w wyskakującym powiadomieniu użytkownika usługi Teams.
call_connection_client.add_participant(target_participant = CallInvite(
target = MicrosoftTeamsUserIdentifier(user_id=TARGET_TEAMS_USER_ID),
source_display_name = "Jack (Contoso Tech Support)"))
Rozpoczynanie nagrywania połączenia
Usługa Call Automation umożliwia również rozpoczęcie nagrywania i przechowywania nagrań połączeń głosowych i wideo. Więcej informacji na temat różnych funkcji można znaleźć w interfejsach API nagrywania wywołań tutaj.
recording_properties = call_automation_client.start_recording(ServerCallLocator(event.data['serverCallId']))
recording_id = recording_properties.recording_id
Reagowanie na zdarzenia wywołujące
Wcześniej w naszej aplikacji zarejestrowaliśmy CALLBACK_URI_HOST
usługę Call Automation Service. Identyfikator URI wskazuje punkt końcowy używany przez usługę do powiadamiania nas o zdarzeniach wywołujących, które się zdarzają. Następnie możemy iterować zdarzenia i wykrywać określone zdarzenia, które chcemy zrozumieć w naszej aplikacji. W poniższym kodzie odpowiadamy na CallConnected
zdarzenie.
@app.route('/api/callbacks', methods=['POST'])
def callback_events_handler():
for event_dict in request.json:
event = CloudEvent.from_dict(event_dict)
if event.type == "Microsoft.Communication.CallConnected":
# Handle Call Connected Event
...
return Response(status=200)
Odtwórz wiadomość powitalną i rozpoznaj
TextSource
Korzystając z elementu , możesz udostępnić usłudze tekst, który ma zostać zsyntetyzowany i użyty na potrzeby wiadomości powitalnej. Usługa Azure Communication Services Call Automation odtwarza ten komunikat podczas CallConnected
zdarzenia.
Następnie przekazujemy tekst do elementu , a następnie wywołujemy metodę CallMediaRecognizeChoiceOptions
StartRecognizingAsync
. Dzięki temu aplikacja może rozpoznać opcję wybraną przez obiekt wywołujący.
get_media_recognize_choice_options(
call_connection_client=call_connection_client,
text_to_play=MainMenu,
target_participant=target_participant,
choices=get_choices(),context="")
def get_media_recognize_choice_options(call_connection_client: CallConnectionClient, text_to_play: str, target_participant:str, choices: any, context: str):
play_source = TextSource (text= text_to_play, voice_name= SpeechToTextVoice)
call_connection_client.start_recognizing_media(
input_type=RecognizeInputType.CHOICES,
target_participant=target_participant,
choices=choices,
play_prompt=play_source,
interrupt_prompt=False,
initial_silence_timeout=10,
operation_context=context
)
def get_choices():
choices = [
RecognitionChoice(label = ConfirmChoiceLabel, phrases= ["Confirm", "First", "One"], tone = DtmfTone.ONE),
RecognitionChoice(label = CancelChoiceLabel, phrases= ["Cancel", "Second", "Two"], tone = DtmfTone.TWO)
]
return choices
Obsługa zdarzeń wyboru
Usługa Azure Communication Services Call Automation wyzwala element api/callbacks
webhook, który skonfigurowaliśmy i powiadomi nas o zdarzeniu RecognizeCompleted
. Zdarzenie daje nam możliwość reagowania na odebrane dane wejściowe i wyzwalanie akcji. Następnie aplikacja odtwarza komunikat do obiekt wywołujący na podstawie określonych odebranych danych wejściowych.
elif event.type == "Microsoft.Communication.RecognizeCompleted":
app.logger.info("Recognize completed: data=%s", event.data)
if event.data['recognitionType'] == "choices":
labelDetected = event.data['choiceResult']['label'];
phraseDetected = event.data['choiceResult']['recognizedPhrase'];
app.logger.info("Recognition completed, labelDetected=%s, phraseDetected=%s, context=%s", labelDetected, phraseDetected, event.data.get('operationContext'))
if labelDetected == ConfirmChoiceLabel:
textToPlay = ConfirmedText
else:
textToPlay = CancelText
handle_play(call_connection_client = call_connection_client, text_to_play = textToPlay)
def handle_play(call_connection_client: CallConnectionClient, text_to_play: str):
play_source = TextSource(text = text_to_play, voice_name = SpeechToTextVoice)
call_connection_client.play_media_to_all(play_source)
Zawieszanie połączenia
Na koniec, gdy wykryjemy warunek, który ma sens, aby zakończyć wywołanie, możemy użyć hang_up()
metody , aby zawiesić wywołanie. Na koniec możemy również bezpiecznie zatrzymać operację nagrywania wywołań.
call_automation_client.stop_recording(recording_id)
call_connection_client.hang_up(is_for_everyone=True)
Uruchamianie kodu
Aby uruchomić aplikację za pomocą programu VS Code, otwórz okno terminalu i uruchom następujące polecenie
python main.py