Zbieranie danych wejściowych użytkownika za pomocą akcji Rozpoznawanie
Ten przewodnik ułatwia rozpoczęcie rozpoznawania danych wejściowych DTMF udostępnianych przez uczestników za pomocą zestawu SDK automatyzacji wywołań usług Azure Communication Services.
Wymagania wstępne
- Aby uzyskać szczegółowe informacje, zobacz Tworzenie konta platformy Azure z aktywną subskrypcją.
- Zasób usług Azure Communication Services. Zobacz Tworzenie zasobu usług Azure Communication Services. Zanotuj parametry połączenia dla tego zasobu.
- Utwórz nową aplikację usługi internetowej przy użyciu zestawu Call Automation SDK.
- Najnowsza biblioteka .NET dla systemu operacyjnego.
- Najnowszy pakiet NuGet.
W przypadku funkcji sztucznej inteligencji
- Tworzenie i łączenie usług Azure AI z zasobem usług Azure Communication Services.
- Utwórz niestandardową poddomenę dla zasobu usług Azure AI.
Specyfikacje techniczne
Dostępne są następujące parametry umożliwiające dostosowanie funkcji Recognize:
Parametr | Typ | Wartość domyślna (jeśli nie została określona) | opis | Wymagane lub opcjonalne |
---|---|---|---|---|
Prompt (Aby uzyskać szczegółowe informacje, zobacz Dostosowywanie monitów głosowych do użytkowników za pomocą akcji Odtwórz) |
FileSource, TextSource | Nie ustawiono | Komunikat do odtworzenia przed rozpoznaniem danych wejściowych. | Opcjonalnie |
InterToneTimeout |
przedział_czasu | 2 sekundy Min: 1 sekunda Maksymalna: 60 sekund |
Limit w sekundach oczekiwania usługi Azure Communication Services na naciśnięcie innej cyfry (limit czasu międzycyfrowego). | Opcjonalnie |
InitialSegmentationSilenceTimeoutInSeconds |
Integer | 0,5 sekundy | Jak długo akcja rozpoznawania czeka na dane wejściowe przed rozważeniem przekroczenia limitu czasu. Zobacz Jak rozpoznawać mowę. | Opcjonalnie |
RecognizeInputsType |
Wyliczenie | Dtmf | Typ rozpoznanych danych wejściowych. Opcje to dtmf , , speech choices i speechordtmf . |
Wymagania |
InitialSilenceTimeout |
przedział_czasu | 5 s Min: 0 sekund Maksymalna: 300 sekund (DTMF) Maksymalna: 20 sekund (opcje) Maksymalna: 20 sekund (mowa) |
Początkowy limit czasu ciszy dostosowuje, ile dźwięku niespeech jest dozwolony przed wyrażeniem przed zakończeniem próby rozpoznawania w wyniku "brak dopasowania". Zobacz Jak rozpoznawać mowę. | Opcjonalnie |
MaxTonesToCollect |
Integer | Brak wartości domyślnej Min: 1 |
Liczba cyfr, których deweloper oczekuje jako danych wejściowych od uczestnika. | Wymagania |
StopTones |
IEnumeration<DtmfTone> | Nie ustawiono | Uczestnicy cyfry mogą naciskać, aby uciec przed wsadowym zdarzeniem DTMF. | Opcjonalnie |
InterruptPrompt |
Bool | Prawda | Jeśli uczestnik ma możliwość przerwania odtwarzaniaMessage, naciskając cyfrę. | Opcjonalnie |
InterruptCallMediaOperation |
Bool | Prawda | Jeśli ta flaga jest ustawiona, przerywa bieżącą operację nośnika wywołania. Na przykład jeśli jest odtwarzany jakikolwiek dźwięk, przerywa tę operację i inicjuje rozpoznawanie. | Opcjonalnie |
OperationContext |
String | Nie ustawiono | Ciąg, który deweloperzy mogą przekazać w połowie akcji, co jest przydatne w celu umożliwienia deweloperom przechowywania kontekstu dotyczących odbieranych zdarzeń. | Opcjonalnie |
Phrases |
String | Nie ustawiono | Lista fraz, które kojarzą się z etykietą. Wysłuchanie dowolnego z tych fraz powoduje pomyślne uznanie. | Wymagania |
Tone |
String | Nie ustawiono | Ton do rozpoznania, jeśli użytkownik zdecyduje się nacisnąć liczbę zamiast używać mowy. | Opcjonalnie |
Label |
String | Nie ustawiono | Wartość klucza do rozpoznawania. | Wymagania |
Language |
String | En-us | Język używany do rozpoznawania mowy. | Opcjonalnie |
EndSilenceTimeout |
przedział_czasu | 0,5 sekundy | Ostatnia pauza osoby mówiącej używanej do wykrywania końcowego wyniku wygenerowanego jako mowa. | Opcjonalnie |
Uwaga
W sytuacjach, w których zarówno DTMF, jak i mowa znajdują się w recognizeInputsType
obiekcie , akcja rozpoznawania działa na pierwszy odebrany typ danych wejściowych. Jeśli na przykład użytkownik najpierw naciśnie numer klawiatury, rozpoznaj akcję uzna to za zdarzenie DTMF i kontynuuje nasłuchiwanie tonów DTMF. Jeśli użytkownik mówi najpierw, rozpoznaj akcję uzna to za zdarzenie rozpoznawania mowy i nasłuchuje danych głosowych.
Tworzenie nowej aplikacji w języku C#
W oknie konsoli systemu operacyjnego użyj dotnet
polecenia , aby utworzyć nową aplikację internetową.
dotnet new web -n MyApplication
Instalowanie pakietu NuGet
Pobieranie pakietu NuGet z galerii NuGet | Azure.Communication.CallAutomation. Postępuj zgodnie z instrukcjami, aby zainstalować pakiet.
Ustanawianie połączenia
W tym momencie należy zapoznać się z uruchamianiem wywołań. Aby uzyskać więcej informacji na temat nawiązywania połączenia, zobacz Szybki start: nawiązywanie i nawiązywanie połączeń wychodzących. Możesz również użyć fragmentu kodu podanego tutaj, aby dowiedzieć się, jak odpowiedzieć na połączenie.
var callAutomationClient = new CallAutomationClient("<Azure Communication Services connection string>");
var answerCallOptions = new AnswerCallOptions("<Incoming call context once call is connected>", new Uri("<https://sample-callback-uri>"))
{
CallIntelligenceOptions = new CallIntelligenceOptions() { CognitiveServicesEndpoint = new Uri("<Azure Cognitive Services Endpoint>") }
};
var answerCallResult = await callAutomationClient.AnswerCallAsync(answerCallOptions);
Wywoływanie akcji rozpoznawania
Gdy aplikacja odpowie na wywołanie, możesz podać informacje o rozpoznawaniu danych wejściowych uczestnika i odtwarzaniu monitu.
DTMF
var maxTonesToCollect = 3;
String textToPlay = "Welcome to Contoso, please enter 3 DTMF.";
var playSource = new TextSource(textToPlay, "en-US-ElizabethNeural");
var recognizeOptions = new CallMediaRecognizeDtmfOptions(targetParticipant, maxTonesToCollect) {
InitialSilenceTimeout = TimeSpan.FromSeconds(30),
Prompt = playSource,
InterToneTimeout = TimeSpan.FromSeconds(5),
InterruptPrompt = true,
StopTones = new DtmfTone[] {
DtmfTone.Pound
},
};
var recognizeResult = await callAutomationClient.GetCallConnection(callConnectionId)
.GetCallMedia()
.StartRecognizingAsync(recognizeOptions);
W przypadku przepływów zamiany mowy na tekst akcja Rozpoznawanie automatyzacji wywołań obsługuje również używanie niestandardowych modeli mowy. Funkcje, takie jak niestandardowe modele mowy, mogą być przydatne podczas tworzenia aplikacji, która musi nasłuchiwać złożonych słów, których domyślne modele zamiany mowy na tekst mogą nie być zrozumiałe. Jednym z przykładów jest utworzenie aplikacji dla branży telemedycznej, a agent wirtualny musi mieć możliwość rozpoznawania terminów medycznych. Więcej informacji można dowiedzieć się w temacie Create a custom speech project (Tworzenie projektu niestandardowej mowy).
Opcje zamiany mowy na tekst
var choices = 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
}
};
String textToPlay = "Hello, This is a reminder for your appointment at 2 PM, Say Confirm to confirm your appointment or Cancel to cancel the appointment. Thank you!";
var playSource = new TextSource(textToPlay, "en-US-ElizabethNeural");
var recognizeOptions = new CallMediaRecognizeChoiceOptions(targetParticipant, choices) {
InterruptPrompt = true,
InitialSilenceTimeout = TimeSpan.FromSeconds(30),
Prompt = playSource,
OperationContext = "AppointmentReminderMenu",
//Only add the SpeechModelEndpointId if you have a custom speech model you would like to use
SpeechModelEndpointId = "YourCustomSpeechModelEndpointId"
};
var recognizeResult = await callAutomationClient.GetCallConnection(callConnectionId)
.GetCallMedia()
.StartRecognizingAsync(recognizeOptions);
Zamiana mowy na tekst
String textToPlay = "Hi, how can I help you today?";
var playSource = new TextSource(textToPlay, "en-US-ElizabethNeural");
var recognizeOptions = new CallMediaRecognizeSpeechOptions(targetParticipant) {
Prompt = playSource,
EndSilenceTimeout = TimeSpan.FromMilliseconds(1000),
OperationContext = "OpenQuestionSpeech",
//Only add the SpeechModelEndpointId if you have a custom speech model you would like to use
SpeechModelEndpointId = "YourCustomSpeechModelEndpointId"
};
var recognizeResult = await callAutomationClient.GetCallConnection(callConnectionId)
.GetCallMedia()
.StartRecognizingAsync(recognizeOptions);
Zamiana mowy na tekst lub DTMF
var maxTonesToCollect = 1;
String textToPlay = "Hi, how can I help you today, you can press 0 to speak to an agent?";
var playSource = new TextSource(textToPlay, "en-US-ElizabethNeural");
var recognizeOptions = new CallMediaRecognizeSpeechOrDtmfOptions(targetParticipant, maxTonesToCollect)
{
Prompt = playSource,
EndSilenceTimeout = TimeSpan.FromMilliseconds(1000),
InitialSilenceTimeout = TimeSpan.FromSeconds(30),
InterruptPrompt = true,
OperationContext = "OpenQuestionSpeechOrDtmf",
//Only add the SpeechModelEndpointId if you have a custom speech model you would like to use
SpeechModelEndpointId = "YourCustomSpeechModelEndpointId"
};
var recognizeResult = await callAutomationClient.GetCallConnection(callConnectionId)
.GetCallMedia()
.StartRecognizingAsync(recognizeOptions);
Uwaga
Jeśli parametry nie są ustawione, wartości domyślne są stosowane tam, gdzie to możliwe.
Odbieranie aktualizacji zdarzeń rozpoznawania
Deweloperzy mogą subskrybować RecognizeCompleted
zdarzenia i RecognizeFailed
na zarejestrowanym wywołaniu zwrotnym elementu webhook. Użyj tego wywołania zwrotnego z logiką biznesową w aplikacji, aby określić kolejne kroki, gdy wystąpi jedno ze zdarzeń.
Przykładowy sposób deserializacji zdarzenia RecognizeCompleted :
if (acsEvent is RecognizeCompleted recognizeCompleted)
{
switch (recognizeCompleted.RecognizeResult)
{
case DtmfResult dtmfResult:
//Take action for Recognition through DTMF
var tones = dtmfResult.Tones;
logger.LogInformation("Recognize completed succesfully, tones={tones}", tones);
break;
case ChoiceResult choiceResult:
// Take action for Recognition through Choices
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 succesfully, labelDetected={labelDetected}, phraseDetected={phraseDetected}", labelDetected, phraseDetected);
break;
case SpeechResult speechResult:
// Take action for Recognition through Choices
var text = speechResult.Speech;
logger.LogInformation("Recognize completed succesfully, text={text}", text);
break;
default:
logger.LogInformation("Recognize completed succesfully, recognizeResult={recognizeResult}", recognizeCompleted.RecognizeResult);
break;
}
}
Przykład sposobu deserializacji zdarzenia RecognizeFailed :
if (acsEvent is RecognizeFailed recognizeFailed)
{
if (MediaEventReasonCode.RecognizeInitialSilenceTimedOut.Equals(recognizeFailed.ReasonCode))
{
// Take action for time out
logger.LogInformation("Recognition failed: initial silencev time out");
}
else if (MediaEventReasonCode.RecognizeSpeechOptionNotMatched.Equals(recognizeFailed.ReasonCode))
{
// Take action for option not matched
logger.LogInformation("Recognition failed: speech option not matched");
}
else if (MediaEventReasonCode.RecognizeIncorrectToneDetected.Equals(recognizeFailed.ReasonCode))
{
// Take action for incorrect tone
logger.LogInformation("Recognition failed: incorrect tone detected");
}
else
{
logger.LogInformation("Recognition failed, result={result}, context={context}", recognizeFailed.ResultInformation?.Message, recognizeFailed.OperationContext);
}
}
Przykład sposobu deserializacji zdarzenia RecognizeCanceled :
if (acsEvent is RecognizeCanceled { OperationContext: "AppointmentReminderMenu" })
{
logger.LogInformation($"RecognizeCanceled event received for call connection id: {@event.CallConnectionId}");
//Take action on recognize canceled operation
await callConnection.HangUpAsync(forEveryone: true);
}
Wymagania wstępne
- Aby uzyskać szczegółowe informacje, zobacz Tworzenie konta platformy Azure z aktywną subskrypcją.
- Zasób usług Azure Communication Services. Zobacz Tworzenie zasobu usług Azure Communication Services
- Utwórz nową aplikację usługi internetowej przy użyciu zestawu Call Automation SDK.
- Zestaw Java Development Kit w wersji 8 lub nowszej.
- Apache Maven.
W przypadku funkcji sztucznej inteligencji
- Tworzenie i łączenie usług Azure AI z zasobem usług Azure Communication Services.
- Utwórz niestandardową poddomenę dla zasobu usług Azure AI.
Specyfikacje techniczne
Dostępne są następujące parametry umożliwiające dostosowanie funkcji Recognize:
Parametr | Typ | Wartość domyślna (jeśli nie została określona) | opis | Wymagane lub opcjonalne |
---|---|---|---|---|
Prompt (Aby uzyskać szczegółowe informacje, zobacz Dostosowywanie monitów głosowych do użytkowników za pomocą akcji Odtwórz) |
FileSource, TextSource | Nie ustawiono | Komunikat do odtworzenia przed rozpoznaniem danych wejściowych. | Opcjonalnie |
InterToneTimeout |
przedział_czasu | 2 sekundy Min: 1 sekunda Maksymalna: 60 sekund |
Limit w sekundach oczekiwania usługi Azure Communication Services na naciśnięcie innej cyfry (limit czasu międzycyfrowego). | Opcjonalnie |
InitialSegmentationSilenceTimeoutInSeconds |
Integer | 0,5 sekundy | Jak długo akcja rozpoznawania czeka na dane wejściowe przed rozważeniem przekroczenia limitu czasu. Zobacz Jak rozpoznawać mowę. | Opcjonalnie |
RecognizeInputsType |
Wyliczenie | Dtmf | Typ rozpoznanych danych wejściowych. Opcje to dtmf , , speech choices i speechordtmf . |
Wymagania |
InitialSilenceTimeout |
przedział_czasu | 5 s Min: 0 sekund Maksymalna: 300 sekund (DTMF) Maksymalna: 20 sekund (opcje) Maksymalna: 20 sekund (mowa) |
Początkowy limit czasu ciszy dostosowuje, ile dźwięku niespeech jest dozwolony przed wyrażeniem przed zakończeniem próby rozpoznawania w wyniku "brak dopasowania". Zobacz Jak rozpoznawać mowę. | Opcjonalnie |
MaxTonesToCollect |
Integer | Brak wartości domyślnej Min: 1 |
Liczba cyfr, których deweloper oczekuje jako danych wejściowych od uczestnika. | Wymagania |
StopTones |
IEnumeration<DtmfTone> | Nie ustawiono | Uczestnicy cyfry mogą naciskać, aby uciec przed wsadowym zdarzeniem DTMF. | Opcjonalnie |
InterruptPrompt |
Bool | Prawda | Jeśli uczestnik ma możliwość przerwania odtwarzaniaMessage, naciskając cyfrę. | Opcjonalnie |
InterruptCallMediaOperation |
Bool | Prawda | Jeśli ta flaga jest ustawiona, przerywa bieżącą operację nośnika wywołania. Na przykład jeśli jest odtwarzany jakikolwiek dźwięk, przerywa tę operację i inicjuje rozpoznawanie. | Opcjonalnie |
OperationContext |
String | Nie ustawiono | Ciąg, który deweloperzy mogą przekazać w połowie akcji, co jest przydatne w celu umożliwienia deweloperom przechowywania kontekstu dotyczących odbieranych zdarzeń. | Opcjonalnie |
Phrases |
String | Nie ustawiono | Lista fraz, które kojarzą się z etykietą. Wysłuchanie dowolnego z tych fraz powoduje pomyślne uznanie. | Wymagania |
Tone |
String | Nie ustawiono | Ton do rozpoznania, jeśli użytkownik zdecyduje się nacisnąć liczbę zamiast używać mowy. | Opcjonalnie |
Label |
String | Nie ustawiono | Wartość klucza do rozpoznawania. | Wymagania |
Language |
String | En-us | Język używany do rozpoznawania mowy. | Opcjonalnie |
EndSilenceTimeout |
przedział_czasu | 0,5 sekundy | Ostatnia pauza osoby mówiącej używanej do wykrywania końcowego wyniku wygenerowanego jako mowa. | Opcjonalnie |
Uwaga
W sytuacjach, w których zarówno DTMF, jak i mowa znajdują się w recognizeInputsType
obiekcie , akcja rozpoznawania działa na pierwszy odebrany typ danych wejściowych. Jeśli na przykład użytkownik najpierw naciśnie numer klawiatury, rozpoznaj akcję uzna to za zdarzenie DTMF i kontynuuje nasłuchiwanie tonów DTMF. Jeśli użytkownik mówi najpierw, rozpoznaj akcję uzna to za zdarzenie rozpoznawania mowy i nasłuchuje danych głosowych.
Tworzenie nowej aplikacji Java
W terminalu lub oknie polecenia przejdź do katalogu, w którym chcesz utworzyć aplikację Java. Uruchom polecenie , mvn
aby wygenerować projekt Java na podstawie szablonu maven-archetype-quickstart.
mvn archetype:generate -DgroupId=com.communication.quickstart -DartifactId=communication-quickstart -DarchetypeArtifactId=maven-archetype-quickstart -DarchetypeVersion=1.4 -DinteractiveMode=false
Polecenie mvn
tworzy katalog o takiej samej nazwie jak artifactId
argument. Katalog src/main/java
zawiera kod źródłowy projektu. Katalog src/test/java
zawiera źródło testowe.
Zwróć uwagę, że generate
krok utworzył katalog o takiej samej nazwie jak artifactId
. Katalog src/main/java
zawiera kod źródłowy. Katalog src/test/java
zawiera testy. Plik pom.xml
jest projektem Project Object Model (POM).
Zaktualizuj plik POM aplikacji, aby używać środowiska Java 8 lub nowszego.
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
Dodawanie odwołań do pakietu
W pliku POM dodaj następujące odwołanie do projektu:
azure-communication-callautomation
<dependency>
<groupId>com.azure</groupId>
<artifactId>azure-communication-callautomation</artifactId>
<version>1.0.0</version>
</dependency>
Ustanawianie połączenia
W tym momencie należy zapoznać się z uruchamianiem wywołań. Aby uzyskać więcej informacji na temat nawiązywania połączenia, zobacz Szybki start: nawiązywanie i nawiązywanie połączeń wychodzących. Możesz również użyć fragmentu kodu podanego tutaj, aby dowiedzieć się, jak odpowiedzieć na połączenie.
CallIntelligenceOptions callIntelligenceOptions = new CallIntelligenceOptions().setCognitiveServicesEndpoint("https://sample-cognitive-service-resource.cognitiveservices.azure.com/");
answerCallOptions = new AnswerCallOptions("<Incoming call context>", "<https://sample-callback-uri>").setCallIntelligenceOptions(callIntelligenceOptions);
Response < AnswerCallResult > answerCallResult = callAutomationClient
.answerCallWithResponse(answerCallOptions)
.block();
Wywoływanie akcji rozpoznawania
Gdy aplikacja odpowie na wywołanie, możesz podać informacje o rozpoznawaniu danych wejściowych uczestnika i odtwarzaniu monitu.
DTMF
var maxTonesToCollect = 3;
String textToPlay = "Welcome to Contoso, please enter 3 DTMF.";
var playSource = new TextSource()
.setText(textToPlay)
.setVoiceName("en-US-ElizabethNeural");
var recognizeOptions = new CallMediaRecognizeDtmfOptions(targetParticipant, maxTonesToCollect)
.setInitialSilenceTimeout(Duration.ofSeconds(30))
.setPlayPrompt(playSource)
.setInterToneTimeout(Duration.ofSeconds(5))
.setInterruptPrompt(true)
.setStopTones(Arrays.asList(DtmfTone.POUND));
var recognizeResponse = callAutomationClient.getCallConnectionAsync(callConnectionId)
.getCallMediaAsync()
.startRecognizingWithResponse(recognizeOptions)
.block();
log.info("Start recognizing result: " + recognizeResponse.getStatusCode());
W przypadku przepływów zamiany mowy na tekst akcja Rozpoznawanie automatyzacji wywołań obsługuje również używanie niestandardowych modeli mowy. Funkcje, takie jak niestandardowe modele mowy, mogą być przydatne podczas tworzenia aplikacji, która musi nasłuchiwać złożonych słów, których domyślne modele zamiany mowy na tekst mogą nie być zrozumiałe. Jednym z przykładów jest utworzenie aplikacji dla branży telemedycznej, a agent wirtualny musi mieć możliwość rozpoznawania terminów medycznych. Więcej informacji można dowiedzieć się w temacie Create a custom speech project (Tworzenie projektu niestandardowej mowy).
Opcje zamiany mowy na tekst
var choices = Arrays.asList(
new RecognitionChoice()
.setLabel("Confirm")
.setPhrases(Arrays.asList("Confirm", "First", "One"))
.setTone(DtmfTone.ONE),
new RecognitionChoice()
.setLabel("Cancel")
.setPhrases(Arrays.asList("Cancel", "Second", "Two"))
.setTone(DtmfTone.TWO)
);
String textToPlay = "Hello, This is a reminder for your appointment at 2 PM, Say Confirm to confirm your appointment or Cancel to cancel the appointment. Thank you!";
var playSource = new TextSource()
.setText(textToPlay)
.setVoiceName("en-US-ElizabethNeural");
var recognizeOptions = new CallMediaRecognizeChoiceOptions(targetParticipant, choices)
.setInterruptPrompt(true)
.setInitialSilenceTimeout(Duration.ofSeconds(30))
.setPlayPrompt(playSource)
.setOperationContext("AppointmentReminderMenu")
//Only add the SpeechRecognitionModelEndpointId if you have a custom speech model you would like to use
.setSpeechRecognitionModelEndpointId("YourCustomSpeechModelEndpointID");
var recognizeResponse = callAutomationClient.getCallConnectionAsync(callConnectionId)
.getCallMediaAsync()
.startRecognizingWithResponse(recognizeOptions)
.block();
Zamiana mowy na tekst
String textToPlay = "Hi, how can I help you today?";
var playSource = new TextSource()
.setText(textToPlay)
.setVoiceName("en-US-ElizabethNeural");
var recognizeOptions = new CallMediaRecognizeSpeechOptions(targetParticipant, Duration.ofMillis(1000))
.setPlayPrompt(playSource)
.setOperationContext("OpenQuestionSpeech")
//Only add the SpeechRecognitionModelEndpointId if you have a custom speech model you would like to use
.setSpeechRecognitionModelEndpointId("YourCustomSpeechModelEndpointID");
var recognizeResponse = callAutomationClient.getCallConnectionAsync(callConnectionId)
.getCallMediaAsync()
.startRecognizingWithResponse(recognizeOptions)
.block();
Zamiana mowy na tekst lub DTMF
var maxTonesToCollect = 1;
String textToPlay = "Hi, how can I help you today, you can press 0 to speak to an agent?";
var playSource = new TextSource()
.setText(textToPlay)
.setVoiceName("en-US-ElizabethNeural");
var recognizeOptions = new CallMediaRecognizeSpeechOrDtmfOptions(targetParticipant, maxTonesToCollect, Duration.ofMillis(1000))
.setPlayPrompt(playSource)
.setInitialSilenceTimeout(Duration.ofSeconds(30))
.setInterruptPrompt(true)
.setOperationContext("OpenQuestionSpeechOrDtmf")
//Only add the SpeechRecognitionModelEndpointId if you have a custom speech model you would like to use
.setSpeechRecognitionModelEndpointId("YourCustomSpeechModelEndpointID");
var recognizeResponse = callAutomationClient.getCallConnectionAsync(callConnectionId)
.getCallMediaAsync()
.startRecognizingWithResponse(recognizeOptions)
.block();
Uwaga
Jeśli parametry nie są ustawione, wartości domyślne są stosowane tam, gdzie to możliwe.
Odbieranie aktualizacji zdarzeń rozpoznawania
Deweloperzy mogą subskrybować RecognizeCompleted
zdarzenia i RecognizeFailed
na zarejestrowanym wywołaniu zwrotnym elementu webhook. Użyj tego wywołania zwrotnego z logiką biznesową w aplikacji, aby określić kolejne kroki, gdy wystąpi jedno ze zdarzeń.
Przykładowy sposób deserializacji zdarzenia RecognizeCompleted :
if (acsEvent instanceof RecognizeCompleted) {
RecognizeCompleted event = (RecognizeCompleted) acsEvent;
RecognizeResult recognizeResult = event.getRecognizeResult().get();
if (recognizeResult instanceof DtmfResult) {
// Take action on collect tones
DtmfResult dtmfResult = (DtmfResult) recognizeResult;
List<DtmfTone> tones = dtmfResult.getTones();
log.info("Recognition completed, tones=" + tones + ", context=" + event.getOperationContext());
} else if (recognizeResult instanceof ChoiceResult) {
ChoiceResult collectChoiceResult = (ChoiceResult) recognizeResult;
String labelDetected = collectChoiceResult.getLabel();
String phraseDetected = collectChoiceResult.getRecognizedPhrase();
log.info("Recognition completed, labelDetected=" + labelDetected + ", phraseDetected=" + phraseDetected + ", context=" + event.getOperationContext());
} else if (recognizeResult instanceof SpeechResult) {
SpeechResult speechResult = (SpeechResult) recognizeResult;
String text = speechResult.getSpeech();
log.info("Recognition completed, text=" + text + ", context=" + event.getOperationContext());
} else {
log.info("Recognition completed, result=" + recognizeResult + ", context=" + event.getOperationContext());
}
}
Przykład sposobu deserializacji zdarzenia RecognizeFailed :
if (acsEvent instanceof RecognizeFailed) {
RecognizeFailed event = (RecognizeFailed) acsEvent;
if (ReasonCode.Recognize.INITIAL_SILENCE_TIMEOUT.equals(event.getReasonCode())) {
// Take action for time out
log.info("Recognition failed: initial silence time out");
} else if (ReasonCode.Recognize.SPEECH_OPTION_NOT_MATCHED.equals(event.getReasonCode())) {
// Take action for option not matched
log.info("Recognition failed: speech option not matched");
} else if (ReasonCode.Recognize.DMTF_OPTION_MATCHED.equals(event.getReasonCode())) {
// Take action for incorrect tone
log.info("Recognition failed: incorrect tone detected");
} else {
log.info("Recognition failed, result=" + event.getResultInformation().getMessage() + ", context=" + event.getOperationContext());
}
}
Przykład sposobu deserializacji zdarzenia RecognizeCanceled :
if (acsEvent instanceof RecognizeCanceled) {
RecognizeCanceled event = (RecognizeCanceled) acsEvent;
log.info("Recognition canceled, context=" + event.getOperationContext());
}
Wymagania wstępne
- Aby uzyskać szczegółowe informacje, zobacz Tworzenie konta platformy Azure z aktywną subskrypcją.
- Zasób usług Azure Communication Services. Zobacz Tworzenie zasobu usług Azure Communication Services. Zanotuj parametry połączenia dla tego zasobu.
- Utwórz nową aplikację usługi internetowej przy użyciu zestawu Call Automation SDK.
- Po zainstalowaniu Node.js można go zainstalować z oficjalnej witryny internetowej.
W przypadku funkcji sztucznej inteligencji
- Tworzenie i łączenie usług Azure AI z zasobem usług Azure Communication Services.
- Utwórz niestandardową poddomenę dla zasobu usług Azure AI.
Specyfikacje techniczne
Dostępne są następujące parametry umożliwiające dostosowanie funkcji Recognize:
Parametr | Typ | Wartość domyślna (jeśli nie została określona) | opis | Wymagane lub opcjonalne |
---|---|---|---|---|
Prompt (Aby uzyskać szczegółowe informacje, zobacz Dostosowywanie monitów głosowych do użytkowników za pomocą akcji Odtwórz) |
FileSource, TextSource | Nie ustawiono | Komunikat do odtworzenia przed rozpoznaniem danych wejściowych. | Opcjonalnie |
InterToneTimeout |
przedział_czasu | 2 sekundy Min: 1 sekunda Maksymalna: 60 sekund |
Limit w sekundach oczekiwania usługi Azure Communication Services na naciśnięcie innej cyfry (limit czasu międzycyfrowego). | Opcjonalnie |
InitialSegmentationSilenceTimeoutInSeconds |
Integer | 0,5 sekundy | Jak długo akcja rozpoznawania czeka na dane wejściowe przed rozważeniem przekroczenia limitu czasu. Zobacz Jak rozpoznawać mowę. | Opcjonalnie |
RecognizeInputsType |
Wyliczenie | Dtmf | Typ rozpoznanych danych wejściowych. Opcje to dtmf , , speech choices i speechordtmf . |
Wymagania |
InitialSilenceTimeout |
przedział_czasu | 5 s Min: 0 sekund Maksymalna: 300 sekund (DTMF) Maksymalna: 20 sekund (opcje) Maksymalna: 20 sekund (mowa) |
Początkowy limit czasu ciszy dostosowuje, ile dźwięku niespeech jest dozwolony przed wyrażeniem przed zakończeniem próby rozpoznawania w wyniku "brak dopasowania". Zobacz Jak rozpoznawać mowę. | Opcjonalnie |
MaxTonesToCollect |
Integer | Brak wartości domyślnej Min: 1 |
Liczba cyfr, których deweloper oczekuje jako danych wejściowych od uczestnika. | Wymagania |
StopTones |
IEnumeration<DtmfTone> | Nie ustawiono | Uczestnicy cyfry mogą naciskać, aby uciec przed wsadowym zdarzeniem DTMF. | Opcjonalnie |
InterruptPrompt |
Bool | Prawda | Jeśli uczestnik ma możliwość przerwania odtwarzaniaMessage, naciskając cyfrę. | Opcjonalnie |
InterruptCallMediaOperation |
Bool | Prawda | Jeśli ta flaga jest ustawiona, przerywa bieżącą operację nośnika wywołania. Na przykład jeśli jest odtwarzany jakikolwiek dźwięk, przerywa tę operację i inicjuje rozpoznawanie. | Opcjonalnie |
OperationContext |
String | Nie ustawiono | Ciąg, który deweloperzy mogą przekazać w połowie akcji, co jest przydatne w celu umożliwienia deweloperom przechowywania kontekstu dotyczących odbieranych zdarzeń. | Opcjonalnie |
Phrases |
String | Nie ustawiono | Lista fraz, które kojarzą się z etykietą. Wysłuchanie dowolnego z tych fraz powoduje pomyślne uznanie. | Wymagania |
Tone |
String | Nie ustawiono | Ton do rozpoznania, jeśli użytkownik zdecyduje się nacisnąć liczbę zamiast używać mowy. | Opcjonalnie |
Label |
String | Nie ustawiono | Wartość klucza do rozpoznawania. | Wymagania |
Language |
String | En-us | Język używany do rozpoznawania mowy. | Opcjonalnie |
EndSilenceTimeout |
przedział_czasu | 0,5 sekundy | Ostatnia pauza osoby mówiącej używanej do wykrywania końcowego wyniku wygenerowanego jako mowa. | Opcjonalnie |
Uwaga
W sytuacjach, w których zarówno DTMF, jak i mowa znajdują się w recognizeInputsType
obiekcie , akcja rozpoznawania działa na pierwszy odebrany typ danych wejściowych. Jeśli na przykład użytkownik najpierw naciśnie numer klawiatury, rozpoznaj akcję uzna to za zdarzenie DTMF i kontynuuje nasłuchiwanie tonów DTMF. Jeśli użytkownik mówi najpierw, rozpoznaj akcję uzna to za zdarzenie rozpoznawania mowy i nasłuchuje danych głosowych.
Tworzenie nowej aplikacji JavaScript
Utwórz nową aplikację JavaScript w katalogu projektu. Zainicjuj nowy projekt Node.js za pomocą następującego polecenia. Spowoduje to utworzenie pliku package.json dla projektu, który zarządza zależnościami projektu.
npm init -y
Instalowanie pakietu automatyzacji wywołań usług Azure Communication Services
npm install @azure/communication-call-automation
Utwórz nowy plik JavaScript w katalogu projektu, na przykład nadaj mu app.js
nazwę . Napisz kod JavaScript w tym pliku.
Uruchom aplikację przy użyciu Node.js za pomocą następującego polecenia.
node app.js
Ustanawianie połączenia
W tym momencie należy zapoznać się z uruchamianiem wywołań. Aby uzyskać więcej informacji na temat nawiązywania połączenia, zobacz Szybki start: nawiązywanie i nawiązywanie połączeń wychodzących.
Wywoływanie akcji rozpoznawania
Gdy aplikacja odpowie na wywołanie, możesz podać informacje o rozpoznawaniu danych wejściowych uczestnika i odtwarzaniu monitu.
DTMF
const maxTonesToCollect = 3;
const textToPlay = "Welcome to Contoso, please enter 3 DTMF.";
const playSource: TextSource = { text: textToPlay, voiceName: "en-US-ElizabethNeural", kind: "textSource" };
const recognizeOptions: CallMediaRecognizeDtmfOptions = {
maxTonesToCollect: maxTonesToCollect,
initialSilenceTimeoutInSeconds: 30,
playPrompt: playSource,
interToneTimeoutInSeconds: 5,
interruptPrompt: true,
stopDtmfTones: [ DtmfTone.Pound ],
kind: "callMediaRecognizeDtmfOptions"
};
await callAutomationClient.getCallConnection(callConnectionId)
.getCallMedia()
.startRecognizing(targetParticipant, recognizeOptions);
W przypadku przepływów zamiany mowy na tekst akcja Rozpoznawanie automatyzacji wywołań obsługuje również używanie niestandardowych modeli mowy. Funkcje, takie jak niestandardowe modele mowy, mogą być przydatne podczas tworzenia aplikacji, która musi nasłuchiwać złożonych słów, których domyślne modele zamiany mowy na tekst mogą nie być zrozumiałe. Jednym z przykładów jest utworzenie aplikacji dla branży telemedycznej, a agent wirtualny musi mieć możliwość rozpoznawania terminów medycznych. Więcej informacji można dowiedzieć się w temacie Create a custom speech project (Tworzenie projektu niestandardowej mowy).
Opcje zamiany mowy na tekst
const choices = [
{
label: "Confirm",
phrases: [ "Confirm", "First", "One" ],
tone: DtmfTone.One
},
{
label: "Cancel",
phrases: [ "Cancel", "Second", "Two" ],
tone: DtmfTone.Two
}
];
const textToPlay = "Hello, This is a reminder for your appointment at 2 PM, Say Confirm to confirm your appointment or Cancel to cancel the appointment. Thank you!";
const playSource: TextSource = { text: textToPlay, voiceName: "en-US-ElizabethNeural", kind: "textSource" };
const recognizeOptions: CallMediaRecognizeChoiceOptions = {
choices: choices,
interruptPrompt: true,
initialSilenceTimeoutInSeconds: 30,
playPrompt: playSource,
operationContext: "AppointmentReminderMenu",
kind: "callMediaRecognizeChoiceOptions",
//Only add the speechRecognitionModelEndpointId if you have a custom speech model you would like to use
speechRecognitionModelEndpointId: "YourCustomSpeechEndpointId"
};
await callAutomationClient.getCallConnection(callConnectionId)
.getCallMedia()
.startRecognizing(targetParticipant, recognizeOptions);
Zamiana mowy na tekst
const textToPlay = "Hi, how can I help you today?";
const playSource: TextSource = { text: textToPlay, voiceName: "en-US-ElizabethNeural", kind: "textSource" };
const recognizeOptions: CallMediaRecognizeSpeechOptions = {
endSilenceTimeoutInSeconds: 1,
playPrompt: playSource,
operationContext: "OpenQuestionSpeech",
kind: "callMediaRecognizeSpeechOptions",
//Only add the speechRecognitionModelEndpointId if you have a custom speech model you would like to use
speechRecognitionModelEndpointId: "YourCustomSpeechEndpointId"
};
await callAutomationClient.getCallConnection(callConnectionId)
.getCallMedia()
.startRecognizing(targetParticipant, recognizeOptions);
Zamiana mowy na tekst lub DTMF
const maxTonesToCollect = 1;
const textToPlay = "Hi, how can I help you today, you can press 0 to speak to an agent?";
const playSource: TextSource = { text: textToPlay, voiceName: "en-US-ElizabethNeural", kind: "textSource" };
const recognizeOptions: CallMediaRecognizeSpeechOrDtmfOptions = {
maxTonesToCollect: maxTonesToCollect,
endSilenceTimeoutInSeconds: 1,
playPrompt: playSource,
initialSilenceTimeoutInSeconds: 30,
interruptPrompt: true,
operationContext: "OpenQuestionSpeechOrDtmf",
kind: "callMediaRecognizeSpeechOrDtmfOptions",
//Only add the speechRecognitionModelEndpointId if you have a custom speech model you would like to use
speechRecognitionModelEndpointId: "YourCustomSpeechEndpointId"
};
await callAutomationClient.getCallConnection(callConnectionId)
.getCallMedia()
.startRecognizing(targetParticipant, recognizeOptions);
Uwaga
Jeśli parametry nie są ustawione, wartości domyślne są stosowane tam, gdzie to możliwe.
Odbieranie aktualizacji zdarzeń rozpoznawania
Deweloperzy mogą subskrybować RecognizeCompleted
zdarzenia i RecognizeFailed
na zarejestrowanym wywołaniu zwrotnym elementu webhook. Użyj tego wywołania zwrotnego z logiką biznesową w aplikacji, aby określić kolejne kroki, gdy wystąpi jedno ze zdarzeń.
Przykładowy sposób deserializacji zdarzenia RecognizeCompleted :
if (event.type === "Microsoft.Communication.RecognizeCompleted") {
if (eventData.recognitionType === "dtmf") {
const tones = eventData.dtmfResult.tones;
console.log("Recognition completed, tones=%s, context=%s", tones, eventData.operationContext);
} else if (eventData.recognitionType === "choices") {
const labelDetected = eventData.choiceResult.label;
const phraseDetected = eventData.choiceResult.recognizedPhrase;
console.log("Recognition completed, labelDetected=%s, phraseDetected=%s, context=%s", labelDetected, phraseDetected, eventData.operationContext);
} else if (eventData.recognitionType === "speech") {
const text = eventData.speechResult.speech;
console.log("Recognition completed, text=%s, context=%s", text, eventData.operationContext);
} else {
console.log("Recognition completed: data=%s", JSON.stringify(eventData, null, 2));
}
}
Przykład sposobu deserializacji zdarzenia RecognizeFailed :
if (event.type === "Microsoft.Communication.RecognizeFailed") {
console.log("Recognize failed: data=%s", JSON.stringify(eventData, null, 2));
}
Przykład sposobu deserializacji zdarzenia RecognizeCanceled :
if (event.type === "Microsoft.Communication.RecognizeCanceled") {
console.log("Recognize canceled, context=%s", eventData.operationContext);
}
Wymagania wstępne
- Aby uzyskać szczegółowe informacje, zobacz Tworzenie konta platformy Azure z aktywną subskrypcją.
- Zasób usług Azure Communication Services. Zobacz Tworzenie zasobu usług Azure Communication Services. Zanotuj parametry połączenia dla tego zasobu.
- Utwórz nową aplikację usługi internetowej przy użyciu zestawu Call Automation SDK.
- Zainstaluj język Python z Python.org.
W przypadku funkcji sztucznej inteligencji
- Tworzenie i łączenie usług Azure AI z zasobem usług Azure Communication Services.
- Utwórz niestandardową poddomenę dla zasobu usług Azure AI.
Specyfikacje techniczne
Dostępne są następujące parametry umożliwiające dostosowanie funkcji Recognize:
Parametr | Typ | Wartość domyślna (jeśli nie została określona) | opis | Wymagane lub opcjonalne |
---|---|---|---|---|
Prompt (Aby uzyskać szczegółowe informacje, zobacz Dostosowywanie monitów głosowych do użytkowników za pomocą akcji Odtwórz) |
FileSource, TextSource | Nie ustawiono | Komunikat do odtworzenia przed rozpoznaniem danych wejściowych. | Opcjonalnie |
InterToneTimeout |
przedział_czasu | 2 sekundy Min: 1 sekunda Maksymalna: 60 sekund |
Limit w sekundach oczekiwania usługi Azure Communication Services na naciśnięcie innej cyfry (limit czasu międzycyfrowego). | Opcjonalnie |
InitialSegmentationSilenceTimeoutInSeconds |
Integer | 0,5 sekundy | Jak długo akcja rozpoznawania czeka na dane wejściowe przed rozważeniem przekroczenia limitu czasu. Zobacz Jak rozpoznawać mowę. | Opcjonalnie |
RecognizeInputsType |
Wyliczenie | Dtmf | Typ rozpoznanych danych wejściowych. Opcje to dtmf , , speech choices i speechordtmf . |
Wymagania |
InitialSilenceTimeout |
przedział_czasu | 5 s Min: 0 sekund Maksymalna: 300 sekund (DTMF) Maksymalna: 20 sekund (opcje) Maksymalna: 20 sekund (mowa) |
Początkowy limit czasu ciszy dostosowuje, ile dźwięku niespeech jest dozwolony przed wyrażeniem przed zakończeniem próby rozpoznawania w wyniku "brak dopasowania". Zobacz Jak rozpoznawać mowę. | Opcjonalnie |
MaxTonesToCollect |
Integer | Brak wartości domyślnej Min: 1 |
Liczba cyfr, których deweloper oczekuje jako danych wejściowych od uczestnika. | Wymagania |
StopTones |
IEnumeration<DtmfTone> | Nie ustawiono | Uczestnicy cyfry mogą naciskać, aby uciec przed wsadowym zdarzeniem DTMF. | Opcjonalnie |
InterruptPrompt |
Bool | Prawda | Jeśli uczestnik ma możliwość przerwania odtwarzaniaMessage, naciskając cyfrę. | Opcjonalnie |
InterruptCallMediaOperation |
Bool | Prawda | Jeśli ta flaga jest ustawiona, przerywa bieżącą operację nośnika wywołania. Na przykład jeśli jest odtwarzany jakikolwiek dźwięk, przerywa tę operację i inicjuje rozpoznawanie. | Opcjonalnie |
OperationContext |
String | Nie ustawiono | Ciąg, który deweloperzy mogą przekazać w połowie akcji, co jest przydatne w celu umożliwienia deweloperom przechowywania kontekstu dotyczących odbieranych zdarzeń. | Opcjonalnie |
Phrases |
String | Nie ustawiono | Lista fraz, które kojarzą się z etykietą. Wysłuchanie dowolnego z tych fraz powoduje pomyślne uznanie. | Wymagania |
Tone |
String | Nie ustawiono | Ton do rozpoznania, jeśli użytkownik zdecyduje się nacisnąć liczbę zamiast używać mowy. | Opcjonalnie |
Label |
String | Nie ustawiono | Wartość klucza do rozpoznawania. | Wymagania |
Language |
String | En-us | Język używany do rozpoznawania mowy. | Opcjonalnie |
EndSilenceTimeout |
przedział_czasu | 0,5 sekundy | Ostatnia pauza osoby mówiącej używanej do wykrywania końcowego wyniku wygenerowanego jako mowa. | Opcjonalnie |
Uwaga
W sytuacjach, w których zarówno DTMF, jak i mowa znajdują się w recognizeInputsType
obiekcie , akcja rozpoznawania działa na pierwszy odebrany typ danych wejściowych. Jeśli na przykład użytkownik najpierw naciśnie numer klawiatury, rozpoznaj akcję uzna to za zdarzenie DTMF i kontynuuje nasłuchiwanie tonów DTMF. Jeśli użytkownik mówi najpierw, rozpoznaj akcję uzna to za zdarzenie rozpoznawania mowy i nasłuchuje danych głosowych.
Tworzenie nowej aplikacji w języku Python
Konfigurowanie środowiska wirtualnego języka Python dla projektu
python -m venv play-audio-app
Uaktywnienie środowiska wirtualnego
W systemie Windows użyj następującego polecenia:
.\ play-audio-quickstart \Scripts\activate
W systemie Unix użyj następującego polecenia:
source play-audio-quickstart /bin/activate
Instalowanie pakietu automatyzacji wywołań usług Azure Communication Services
pip install azure-communication-callautomation
Utwórz plik aplikacji w katalogu projektu, na przykład nadaj mu app.py
nazwę . Napisz kod w języku Python w tym pliku.
Uruchom aplikację przy użyciu języka Python za pomocą następującego polecenia.
python app.py
Ustanawianie połączenia
W tym momencie należy zapoznać się z uruchamianiem wywołań. Aby uzyskać więcej informacji na temat nawiązywania połączenia, zobacz Szybki start: nawiązywanie i nawiązywanie połączeń wychodzących.
Wywoływanie akcji rozpoznawania
Gdy aplikacja odpowie na wywołanie, możesz podać informacje o rozpoznawaniu danych wejściowych uczestnika i odtwarzaniu monitu.
DTMF
max_tones_to_collect = 3
text_to_play = "Welcome to Contoso, please enter 3 DTMF."
play_source = TextSource(text=text_to_play, voice_name="en-US-ElizabethNeural")
call_automation_client.get_call_connection(call_connection_id).start_recognizing_media(
dtmf_max_tones_to_collect=max_tones_to_collect,
input_type=RecognizeInputType.DTMF,
target_participant=target_participant,
initial_silence_timeout=30,
play_prompt=play_source,
dtmf_inter_tone_timeout=5,
interrupt_prompt=True,
dtmf_stop_tones=[ DtmfTone.Pound ])
W przypadku przepływów zamiany mowy na tekst akcja Rozpoznawanie automatyzacji wywołań obsługuje również używanie niestandardowych modeli mowy. Funkcje, takie jak niestandardowe modele mowy, mogą być przydatne podczas tworzenia aplikacji, która musi nasłuchiwać złożonych słów, których domyślne modele zamiany mowy na tekst mogą nie być zrozumiałe. Jednym z przykładów jest utworzenie aplikacji dla branży telemedycznej, a agent wirtualny musi mieć możliwość rozpoznawania terminów medycznych. Więcej informacji można dowiedzieć się w temacie Create a custom speech project (Tworzenie projektu niestandardowej mowy).
Opcje zamiany mowy na tekst
choices = [
RecognitionChoice(
label="Confirm",
phrases=[ "Confirm", "First", "One" ],
tone=DtmfTone.ONE
),
RecognitionChoice(
label="Cancel",
phrases=[ "Cancel", "Second", "Two" ],
tone=DtmfTone.TWO
)
]
text_to_play = "Hello, This is a reminder for your appointment at 2 PM, Say Confirm to confirm your appointment or Cancel to cancel the appointment. Thank you!"
play_source = TextSource(text=text_to_play, voice_name="en-US-ElizabethNeural")
call_automation_client.get_call_connection(call_connection_id).start_recognizing_media(
input_type=RecognizeInputType.CHOICES,
target_participant=target_participant,
choices=choices,
interrupt_prompt=True,
initial_silence_timeout=30,
play_prompt=play_source,
operation_context="AppointmentReminderMenu",
# Only add the speech_recognition_model_endpoint_id if you have a custom speech model you would like to use
speech_recognition_model_endpoint_id="YourCustomSpeechModelEndpointId")
Zamiana mowy na tekst
text_to_play = "Hi, how can I help you today?"
play_source = TextSource(text=text_to_play, voice_name="en-US-ElizabethNeural")
call_automation_client.get_call_connection(call_connection_id).start_recognizing_media(
input_type=RecognizeInputType.SPEECH,
target_participant=target_participant,
end_silence_timeout=1,
play_prompt=play_source,
operation_context="OpenQuestionSpeech",
# Only add the speech_recognition_model_endpoint_id if you have a custom speech model you would like to use
speech_recognition_model_endpoint_id="YourCustomSpeechModelEndpointId")
Zamiana mowy na tekst lub DTMF
max_tones_to_collect = 1
text_to_play = "Hi, how can I help you today, you can also press 0 to speak to an agent."
play_source = TextSource(text=text_to_play, voice_name="en-US-ElizabethNeural")
call_automation_client.get_call_connection(call_connection_id).start_recognizing_media(
dtmf_max_tones_to_collect=max_tones_to_collect,
input_type=RecognizeInputType.SPEECH_OR_DTMF,
target_participant=target_participant,
end_silence_timeout=1,
play_prompt=play_source,
initial_silence_timeout=30,
interrupt_prompt=True,
operation_context="OpenQuestionSpeechOrDtmf",
# Only add the speech_recognition_model_endpoint_id if you have a custom speech model you would like to use
speech_recognition_model_endpoint_id="YourCustomSpeechModelEndpointId")
app.logger.info("Start recognizing")
Uwaga
Jeśli parametry nie są ustawione, wartości domyślne są stosowane tam, gdzie to możliwe.
Odbieranie aktualizacji zdarzeń rozpoznawania
Deweloperzy mogą subskrybować RecognizeCompleted
zdarzenia i RecognizeFailed
na zarejestrowanym wywołaniu zwrotnym elementu webhook. Użyj tego wywołania zwrotnego z logiką biznesową w aplikacji, aby określić kolejne kroki, gdy wystąpi jedno ze zdarzeń.
Przykładowy sposób deserializacji zdarzenia RecognizeCompleted :
if event.type == "Microsoft.Communication.RecognizeCompleted":
app.logger.info("Recognize completed: data=%s", event.data)
if event.data['recognitionType'] == "dtmf":
tones = event.data['dtmfResult']['tones']
app.logger.info("Recognition completed, tones=%s, context=%s", tones, event.data.get('operationContext'))
elif 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'));
elif event.data['recognitionType'] == "speech":
text = event.data['speechResult']['speech'];
app.logger.info("Recognition completed, text=%s, context=%s", text, event.data.get('operationContext'));
else:
app.logger.info("Recognition completed: data=%s", event.data);
Przykład sposobu deserializacji zdarzenia RecognizeFailed :
if event.type == "Microsoft.Communication.RecognizeFailed":
app.logger.info("Recognize failed: data=%s", event.data);
Przykład sposobu deserializacji zdarzenia RecognizeCanceled :
if event.type == "Microsoft.Communication.RecognizeCanceled":
# Handle the RecognizeCanceled event according to your application logic
Kody zdarzeń
Stan | Kod | Podkod | Komunikat |
---|---|---|---|
RecognizeCompleted |
200 | 8531 | Ukończono akcję, maksymalna liczba odebranych cyfr. |
RecognizeCompleted |
200 | 8514 | Akcja została ukończona w miarę wykrycia tonu zatrzymania. |
RecognizeCompleted |
400 | 8508 | Akcja nie powiodła się. Operacja została anulowana. |
RecognizeCompleted |
400 | 8532 | Akcja nie powiodła się, osiągnięto limit czasu ciszy między cyframi. |
RecognizeCanceled |
400 | 8508 | Akcja nie powiodła się. Operacja została anulowana. |
RecognizeFailed |
400 | 8510 | Akcja nie powiodła się, osiągnięto początkowy limit czasu ciszy. |
RecognizeFailed |
500 | 8511 | Akcja nie powiodła się, napotkano błąd podczas próby odtworzenia monitu. |
RecognizeFailed |
500 | 8512 | Nieznany wewnętrzny błąd serwera. |
RecognizeFailed |
400 | 8510 | Akcja nie powiodła się, osiągnięto początkowy limit czasu ciszy |
RecognizeFailed |
400 | 8532 | Akcja nie powiodła się, osiągnięto limit czasu ciszy między cyframi. |
RecognizeFailed |
400 | 8565 | Akcja nie powiodła się, nieprawidłowe żądanie do usług sztucznej inteligencji platformy Azure. Sprawdź parametry wejściowe. |
RecognizeFailed |
400 | 8565 | Akcja nie powiodła się, nieprawidłowe żądanie do usług sztucznej inteligencji platformy Azure. Nie można przetworzyć dostarczonego ładunku, sprawdź dane wejściowe źródła odtwarzania. |
RecognizeFailed |
401 | 8565 | Akcja nie powiodła się, błąd uwierzytelniania usług AI platformy Azure. |
RecognizeFailed |
403 | 8565 | Akcja nie powiodła się, żądanie zabronione do usług azure AI, bezpłatna subskrypcja używana przez żądanie nie przekroczyła limitu przydziału. |
RecognizeFailed |
429 | 8565 | Akcja nie powiodła się. Żądania przekroczyły liczbę dozwolonych żądań współbieżnych dla subskrypcji usług Azure AI. |
RecognizeFailed |
408 | 8565 | Akcja nie powiodła się. Upłynął limit czasu żądania do usług sztucznej inteligencji platformy Azure. |
RecognizeFailed |
500 | 8511 | Akcja nie powiodła się, napotkano błąd podczas próby odtworzenia monitu. |
RecognizeFailed |
500 | 8512 | Nieznany wewnętrzny błąd serwera. |
Znane ograniczenia
- Jednostka DTMF w pasmie nie jest obsługiwana. Zamiast tego użyj RFC 2833 DTMF.
- Monity tekstowe zamiany tekstu na mowę obsługują maksymalnie 400 znaków, jeśli monit jest dłuższy niż sugerujemy użycie języka SSML dla akcji odtwarzania opartych na zamianie tekstu na mowę.
- W przypadku scenariuszy, w których przekroczono limit przydziału usługi Mowa, możesz poprosić o zwiększenie tego limitu, wykonując kroki opisane w temacie Limity przydziału i limity usług rozpoznawania mowy.
Czyszczenie zasobów
Jeśli chcesz wyczyścić i usunąć subskrypcję usług Komunikacyjnych, możesz usunąć zasób lub grupę zasobów. Usunięcie grupy zasobów powoduje również usunięcie wszelkich innych skojarzonych z nią zasobów. Dowiedz się więcej o czyszczeniu zasobów.
Następne kroki
- Dowiedz się więcej o zbieraniu danych wejściowych użytkownika
- Dowiedz się więcej o odtwarzaniu dźwięku w wywołaniu
- Dowiedz się więcej o automatyzacji wywołań