Udostępnij za pośrednictwem


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

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

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

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

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