Zbieranie danych wejściowych użytkownika za pomocą akcji Rozpoznawanie
Ten przewodnik pomoże Ci rozpocząć rozpoznawanie danych wejściowych DTMF udostępnianych przez uczestników za pośrednictwem zestawu SDK usługi Azure Communication Services Call Automation.
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.
- Uzyskaj 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 |
---|---|---|---|---|
Wierszu (Aby uzyskać szczegółowe informacje na temat akcji Odtwórz, zapoznaj się z tym przewodnikiem z instrukcjami) |
FileSource, TextSource | Nie ustawiono | Jest to komunikat, który chcesz odtworzyć 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. Przeczytaj więcej tutaj. | Opcjonalnie |
RecognizeInputsType | Wyliczenie | Dtmf | Typ rozpoznanych danych wejściowych. Opcje to dtmf, opcje, mowa 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". Przeczytaj więcej tutaj. | 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 |
PrzerwaniePrompt | Bool | Prawda | Jeśli uczestnik ma możliwość przerwania odtwarzaniaMessage, naciskając cyfrę. | Opcjonalnie |
InterruptCallMediaOperation | Bool | Prawda | Jeśli ta flaga zostanie 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 |
Frazy | String | Nie ustawiono | Lista fraz, które kojarzą się z etykietą, jeśli którakolwiek z tych fraz jest rozpoznawana jako pomyślna. | Wymagania |
Ton | String | Nie ustawiono | Ton do rozpoznania, jeśli użytkownik zdecyduje się nacisnąć liczbę zamiast używać mowy. | Opcjonalnie |
Etykieta | String | Nie ustawiono | Wartość klucza do rozpoznawania. | Wymagania |
Język | 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, gdy zarówno dtmf, jak i mowa znajdują się w akcji recognizeInputsType, akcja rozpoznawania będzie działać na pierwszym odebranym typie danych wejściowych, tj. jeśli użytkownik naciśnie najpierw numer klawiatury, rozpoznaj akcję rozważy zdarzenie dtmf i będzie kontynuować nasłuchiwanie tonów dtmf. Jeśli użytkownik najpierw mówi, akcja rozpoznawania będzie uwzględniać rozpoznawanie mowy i nasłuchiwać danych wejściowych 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
Pakiet NuGet można uzyskać z tego miejsca, jeśli jeszcze tego nie zrobiono.
Ustanawianie połączenia
W tym momencie należy zapoznać się z rozpoczynaniem wywołań, jeśli musisz dowiedzieć się więcej na temat nawiązywania połączenia, postępuj zgodnie z naszym przewodnikiem Szybki start. 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 rozpoznawania wywołań automatyzacji obsługuje również korzystanie z 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ć w stanie zrozumieć. Dobrym przykładem może być utworzenie aplikacji dla branży telemedycznej, a agent wirtualny musi mieć możliwość rozpoznawania terminów medycznych. Więcej informacji na temat tworzenia i wdrażania niestandardowych modeli mowy można znaleźć tutaj.
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ć zdarzenia RecognizeCompleted i RecognizeFailed w wywołaniu zwrotnym elementu webhook, które zarejestrowali do wywołania w celu utworzenia logiki biznesowej w swojej aplikacji w celu określenia następnych kroków, gdy wystąpi jeden z wcześniej wymienionych 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 |
---|---|---|---|---|
Wierszu (Aby uzyskać szczegółowe informacje na temat akcji Odtwórz, zapoznaj się z tym przewodnikiem z instrukcjami) |
FileSource, TextSource | Nie ustawiono | Jest to komunikat, który chcesz odtworzyć 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. Przeczytaj więcej tutaj. | Opcjonalnie |
RecognizeInputsType | Wyliczenie | Dtmf | Typ rozpoznanych danych wejściowych. Opcje to dtmf, opcje, mowa 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". Przeczytaj więcej tutaj. | 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 |
PrzerwaniePrompt | Bool | Prawda | Jeśli uczestnik ma możliwość przerwania odtwarzaniaMessage, naciskając cyfrę. | Opcjonalnie |
InterruptCallMediaOperation | Bool | Prawda | Jeśli ta flaga zostanie 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 |
Frazy | String | Nie ustawiono | Lista fraz, które kojarzą się z etykietą, jeśli którakolwiek z tych fraz jest rozpoznawana jako pomyślna. | Wymagania |
Ton | String | Nie ustawiono | Ton do rozpoznania, jeśli użytkownik zdecyduje się nacisnąć liczbę zamiast używać mowy. | Opcjonalnie |
Etykieta | String | Nie ustawiono | Wartość klucza do rozpoznawania. | Wymagania |
Język | 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, gdy zarówno dtmf, jak i mowa znajdują się w akcji recognizeInputsType, akcja rozpoznawania będzie działać na pierwszym odebranym typie danych wejściowych, tj. jeśli użytkownik naciśnie najpierw numer klawiatury, rozpoznaj akcję rozważy zdarzenie dtmf i będzie kontynuować nasłuchiwanie tonów dtmf. Jeśli użytkownik najpierw mówi, akcja rozpoznawania będzie uwzględniać rozpoznawanie mowy i nasłuchiwać danych wejściowych 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. W tym katalogu src/main/java
katalog zawiera kod źródłowy projektu, src/test/java
katalog zawiera źródło testowe.
Zauważysz, że krok "generuj" utworzył katalog o takiej samej nazwie jak artifactId. W tym katalogu src/main/java
katalog zawiera kod źródłowy, src/test/java
katalog zawiera testy, a pom.xml
plik jest projektem Project Object Model lub 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 rozpoczynaniem wywołań, jeśli musisz dowiedzieć się więcej na temat nawiązywania połączenia, postępuj zgodnie z naszym przewodnikiem Szybki start. 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 rozpoznawania wywołań automatyzacji obsługuje również korzystanie z 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ć w stanie zrozumieć. Dobrym przykładem może być utworzenie aplikacji dla branży telemedycznej, a agent wirtualny musi mieć możliwość rozpoznawania terminów medycznych. Więcej informacji na temat tworzenia i wdrażania niestandardowych modeli mowy można znaleźć tutaj.
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ć zdarzenia RecognizeCompleted i RecognizeFailed w zarejestrowanym wywołaniu zwrotnym elementu webhook. Tego wywołania zwrotnego można używać z logiką biznesową w aplikacji do określania następnych kroków w przypadku wystąpienia jednego 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 |
---|---|---|---|---|
Wierszu (Aby uzyskać szczegółowe informacje na temat akcji Odtwórz, zapoznaj się z tym przewodnikiem z instrukcjami) |
FileSource, TextSource | Nie ustawiono | Jest to komunikat, który chcesz odtworzyć 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. Przeczytaj więcej tutaj. | Opcjonalnie |
RecognizeInputsType | Wyliczenie | Dtmf | Typ rozpoznanych danych wejściowych. Opcje to dtmf, opcje, mowa 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". Przeczytaj więcej tutaj. | 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 |
PrzerwaniePrompt | Bool | Prawda | Jeśli uczestnik ma możliwość przerwania odtwarzaniaMessage, naciskając cyfrę. | Opcjonalnie |
InterruptCallMediaOperation | Bool | Prawda | Jeśli ta flaga zostanie 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 |
Frazy | String | Nie ustawiono | Lista fraz, które kojarzą się z etykietą, jeśli którakolwiek z tych fraz jest rozpoznawana jako pomyślna. | Wymagania |
Ton | String | Nie ustawiono | Ton do rozpoznania, jeśli użytkownik zdecyduje się nacisnąć liczbę zamiast używać mowy. | Opcjonalnie |
Etykieta | String | Nie ustawiono | Wartość klucza do rozpoznawania. | Wymagania |
Język | 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, gdy zarówno dtmf, jak i mowa znajdują się w akcji recognizeInputsType, akcja rozpoznawania będzie działać na pierwszym odebranym typie danych wejściowych, tj. jeśli użytkownik naciśnie najpierw numer klawiatury, rozpoznaj akcję rozważy zdarzenie dtmf i będzie kontynuować nasłuchiwanie tonów dtmf. Jeśli użytkownik najpierw mówi, akcja rozpoznawania będzie uwzględniać rozpoznawanie mowy i nasłuchiwać danych wejściowych 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 służy do zarządzania 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 nazwę app.js. W tym pliku napiszesz kod JavaScript. Uruchom aplikację przy użyciu Node.js za pomocą następującego polecenia. Spowoduje to wykonanie napisanego kodu JavaScript.
node app.js
Ustanawianie połączenia
W tym momencie należy zapoznać się z rozpoczynaniem wywołań, jeśli musisz dowiedzieć się więcej na temat nawiązywania połączenia, postępuj zgodnie z naszym przewodnikiem Szybki start. W tym przewodniku Szybki start utworzymy wywołanie wychodzące.
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 rozpoznawania wywołań automatyzacji obsługuje również korzystanie z 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ć w stanie zrozumieć. Dobrym przykładem może być utworzenie aplikacji dla branży telemedycznej, a agent wirtualny musi mieć możliwość rozpoznawania terminów medycznych. Więcej informacji na temat tworzenia i wdrażania niestandardowych modeli mowy można znaleźć tutaj.
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ć zdarzenia RecognizeCompleted i RecognizeFailed w wywołaniu zwrotnym elementu webhook, które zarejestrowali do wywołania w celu utworzenia logiki biznesowej w swojej aplikacji w celu określenia następnych kroków, gdy wystąpi jeden z wcześniej wymienionych 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.
- Masz zainstalowany język Python, możesz zainstalować go z oficjalnej witryny.
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 |
---|---|---|---|---|
Wierszu (Aby uzyskać szczegółowe informacje na temat akcji Odtwórz, zapoznaj się z tym przewodnikiem z instrukcjami) |
FileSource, TextSource | Nie ustawiono | Jest to komunikat, który chcesz odtworzyć 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. Przeczytaj więcej tutaj. | Opcjonalnie |
RecognizeInputsType | Wyliczenie | Dtmf | Typ rozpoznanych danych wejściowych. Opcje to dtmf, opcje, mowa 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". Przeczytaj więcej tutaj. | 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 |
PrzerwaniePrompt | Bool | Prawda | Jeśli uczestnik ma możliwość przerwania odtwarzaniaMessage, naciskając cyfrę. | Opcjonalnie |
InterruptCallMediaOperation | Bool | Prawda | Jeśli ta flaga zostanie 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 |
Frazy | String | Nie ustawiono | Lista fraz, które kojarzą się z etykietą, jeśli którakolwiek z tych fraz jest rozpoznawana jako pomyślna. | Wymagania |
Ton | String | Nie ustawiono | Ton do rozpoznania, jeśli użytkownik zdecyduje się nacisnąć liczbę zamiast używać mowy. | Opcjonalnie |
Etykieta | String | Nie ustawiono | Wartość klucza do rozpoznawania. | Wymagania |
Język | 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, gdy zarówno dtmf, jak i mowa znajdują się w akcji recognizeInputsType, akcja rozpoznawania będzie działać na pierwszym odebranym typie danych wejściowych, tj. jeśli użytkownik naciśnie najpierw numer klawiatury, rozpoznaj akcję rozważy zdarzenie dtmf i będzie kontynuować nasłuchiwanie tonów dtmf. Jeśli użytkownik najpierw mówi, akcja rozpoznawania będzie uwzględniać rozpoznawanie mowy i nasłuchiwać danych wejściowych 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 nazwę app.py. Napiszesz kod w języku Python w tym pliku.
Uruchom aplikację przy użyciu języka Python za pomocą następującego polecenia. Spowoduje to wykonanie napisanego kodu w języku Python.
python app.py
Ustanawianie połączenia
W tym momencie należy zapoznać się z rozpoczynaniem wywołań, jeśli musisz dowiedzieć się więcej na temat nawiązywania połączenia, postępuj zgodnie z naszym przewodnikiem Szybki start. W tym przewodniku Szybki start utworzymy wywołanie wychodzące.
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 rozpoznawania wywołań automatyzacji obsługuje również korzystanie z 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ć w stanie zrozumieć. Dobrym przykładem może być utworzenie aplikacji dla branży telemedycznej, a agent wirtualny musi mieć możliwość rozpoznawania terminów medycznych. Więcej informacji na temat tworzenia i wdrażania niestandardowych modeli mowy można znaleźć tutaj.
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ć zdarzenia RecognizeCompleted i RecognizeFailed w wywołaniu zwrotnym elementu webhook, które zarejestrowali do wywołania w celu utworzenia logiki biznesowej w swojej aplikacji w celu określenia następnych kroków, gdy wystąpi jeden z wcześniej wymienionych 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 | Subcode | 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. |
Rozpoznawanie nie powiodło się | 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 należy użyć formatu DTMF RFC 2833.
- 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 lilmit, wykonując kroki opisane tutaj.
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ń
Opinia
https://aka.ms/ContentUserFeedback.
Dostępne już wkrótce: W 2024 r. będziemy stopniowo wycofywać zgłoszenia z serwisu GitHub jako mechanizm przesyłania opinii na temat zawartości i zastępować go nowym systemem opinii. Aby uzyskać więcej informacji, sprawdź:Prześlij i wyświetl opinię dla