Udostępnij za pośrednictwem


Zbieranie danych wejściowych użytkownika za pomocą akcji Rozpoznawanie

Ten przewodnik ułatwia rozpoczęcie rozpoznawania danych wejściowych DTMF udostępnianych przez uczestników za pomocą zestawu SDK automatyzacji wywołań usług Azure Communication Services.

Wymagania wstępne

  • Aby uzyskać szczegółowe informacje, zobacz Tworzenie konta platformy Azure z aktywną subskrypcją.
  • Zasób usług Azure Communication Services. Zobacz Tworzenie zasobu usług Azure Communication Services. Zanotuj parametry połączenia dla tego zasobu.
  • Utwórz nową aplikację usługi internetowej przy użyciu zestawu Call Automation SDK.
  • Najnowsza biblioteka .NET dla systemu operacyjnego.
  • Najnowszy pakiet NuGet.

W przypadku funkcji sztucznej inteligencji

  • Tworzenie i łączenie usług Azure AI z zasobem usług Azure Communication Services.
  • Utwórz niestandardową poddomenę dla zasobu usług Azure AI.

Specyfikacje techniczne

Dostępne są następujące parametry umożliwiające dostosowanie funkcji Recognize:

Parametr Typ Wartość domyślna (jeśli nie została określona) opis Wymagane lub opcjonalne
Prompt

(Aby uzyskać szczegółowe informacje, zobacz Dostosowywanie monitów głosowych do użytkowników za pomocą akcji Odtwórz)
FileSource, TextSource Nie ustawiono Komunikat do odtworzenia przed rozpoznaniem danych wejściowych. Opcjonalnie
InterToneTimeout przedział_czasu 2 sekundy

Min: 1 sekunda
Maksymalna: 60 sekund
Limit w sekundach oczekiwania usługi Azure Communication Services na naciśnięcie innej cyfry (limit czasu międzycyfrowego). Opcjonalnie
InitialSegmentationSilenceTimeoutInSeconds Integer 0,5 sekundy Jak długo akcja rozpoznawania czeka na dane wejściowe przed rozważeniem przekroczenia limitu czasu. Zobacz Jak rozpoznawać mowę. Opcjonalnie
RecognizeInputsType Wyliczenie Dtmf Typ rozpoznanych danych wejściowych. Opcje to dtmf, , speechchoicesi speechordtmf. Wymagania
InitialSilenceTimeout przedział_czasu 5 s

Min: 0 sekund
Maksymalna: 300 sekund (DTMF)
Maksymalna: 20 sekund (opcje)
Maksymalna: 20 sekund (mowa)
Początkowy limit czasu ciszy dostosowuje, ile dźwięku niespeech jest dozwolony przed wyrażeniem przed zakończeniem próby rozpoznawania w wyniku "brak dopasowania". Zobacz Jak rozpoznawać mowę. Opcjonalnie
MaxTonesToCollect Integer Brak wartości domyślnej

Min: 1
Liczba cyfr, których deweloper oczekuje jako danych wejściowych od uczestnika. Wymagania
StopTones IEnumeration<DtmfTone> Nie ustawiono Uczestnicy cyfry mogą naciskać, aby uciec przed wsadowym zdarzeniem DTMF. Opcjonalnie
InterruptPrompt Bool Prawda Jeśli uczestnik ma możliwość przerwania odtwarzaniaMessage, naciskając cyfrę. Opcjonalnie
InterruptCallMediaOperation Bool Prawda Jeśli ta flaga jest ustawiona, przerywa bieżącą operację nośnika wywołania. Na przykład jeśli jest odtwarzany jakikolwiek dźwięk, przerywa tę operację i inicjuje rozpoznawanie. Opcjonalnie
OperationContext String Nie ustawiono Ciąg, który deweloperzy mogą przekazać w połowie akcji, co jest przydatne w celu umożliwienia deweloperom przechowywania kontekstu dotyczących odbieranych zdarzeń. Opcjonalnie
Phrases String Nie ustawiono Lista fraz, które kojarzą się z etykietą. Wysłuchanie dowolnego z tych fraz powoduje pomyślne uznanie. Wymagania
Tone String Nie ustawiono Ton do rozpoznania, jeśli użytkownik zdecyduje się nacisnąć liczbę zamiast używać mowy. Opcjonalnie
Label String Nie ustawiono Wartość klucza do rozpoznawania. Wymagania
Language String En-us Język używany do rozpoznawania mowy. Opcjonalnie
EndSilenceTimeout przedział_czasu 0,5 sekundy Ostatnia pauza osoby mówiącej używanej do wykrywania końcowego wyniku wygenerowanego jako mowa. Opcjonalnie

Uwaga

W sytuacjach, w których zarówno DTMF, jak i mowa znajdują się w recognizeInputsTypeobiekcie , akcja rozpoznawania działa na pierwszy odebrany typ danych wejściowych. Jeśli na przykład użytkownik najpierw naciśnie numer klawiatury, rozpoznaj akcję uzna to za zdarzenie DTMF i kontynuuje nasłuchiwanie tonów DTMF. Jeśli użytkownik mówi najpierw, rozpoznaj akcję uzna to za zdarzenie rozpoznawania mowy i nasłuchuje danych głosowych.

Tworzenie nowej aplikacji w języku C#

W oknie konsoli systemu operacyjnego użyj dotnet polecenia , aby utworzyć nową aplikację internetową.

dotnet new web -n MyApplication

Instalowanie pakietu NuGet

Pobieranie pakietu NuGet z galerii NuGet | Azure.Communication.CallAutomation. Postępuj zgodnie z instrukcjami, aby zainstalować pakiet.

Ustanawianie połączenia

W tym momencie należy zapoznać się z uruchamianiem wywołań. Aby uzyskać więcej informacji na temat nawiązywania połączenia, zobacz Szybki start: nawiązywanie i nawiązywanie połączeń wychodzących. Możesz również użyć fragmentu kodu podanego tutaj, aby dowiedzieć się, jak odpowiedzieć na połączenie.

var callAutomationClient = new CallAutomationClient("<Azure Communication Services connection string>");

var answerCallOptions = new AnswerCallOptions("<Incoming call context once call is connected>", new Uri("<https://sample-callback-uri>"))  
{  
    CallIntelligenceOptions = new CallIntelligenceOptions() { CognitiveServicesEndpoint = new Uri("<Azure Cognitive Services Endpoint>") } 
};  

var answerCallResult = await callAutomationClient.AnswerCallAsync(answerCallOptions); 

Wywoływanie akcji rozpoznawania

Gdy aplikacja odpowie na wywołanie, możesz podać informacje o rozpoznawaniu danych wejściowych uczestnika i odtwarzaniu monitu.

DTMF

var maxTonesToCollect = 3;
String textToPlay = "Welcome to Contoso, please enter 3 DTMF.";
var playSource = new TextSource(textToPlay, "en-US-ElizabethNeural");
var recognizeOptions = new CallMediaRecognizeDtmfOptions(targetParticipant, maxTonesToCollect) {
  InitialSilenceTimeout = TimeSpan.FromSeconds(30),
    Prompt = playSource,
    InterToneTimeout = TimeSpan.FromSeconds(5),
    InterruptPrompt = true,
    StopTones = new DtmfTone[] {
      DtmfTone.Pound
    },
};
var recognizeResult = await callAutomationClient.GetCallConnection(callConnectionId)
  .GetCallMedia()
  .StartRecognizingAsync(recognizeOptions);

W przypadku przepływów zamiany mowy na tekst akcja Rozpoznawanie automatyzacji wywołań obsługuje również używanie niestandardowych modeli mowy. Funkcje, takie jak niestandardowe modele mowy, mogą być przydatne podczas tworzenia aplikacji, która musi nasłuchiwać złożonych słów, których domyślne modele zamiany mowy na tekst mogą nie być zrozumiałe. Jednym z przykładów jest utworzenie aplikacji dla branży telemedycznej, a agent wirtualny musi mieć możliwość rozpoznawania terminów medycznych. Więcej informacji można dowiedzieć się w temacie Create a custom speech project (Tworzenie projektu niestandardowej mowy).

Opcje zamiany mowy na tekst

var choices = new List < RecognitionChoice > {
  new RecognitionChoice("Confirm", new List < string > {
    "Confirm",
    "First",
    "One"
  }) {
    Tone = DtmfTone.One
  },
  new RecognitionChoice("Cancel", new List < string > {
    "Cancel",
    "Second",
    "Two"
  }) {
    Tone = DtmfTone.Two
  }
};
String textToPlay = "Hello, This is a reminder for your appointment at 2 PM, Say Confirm to confirm your appointment or Cancel to cancel the appointment. Thank you!";

var playSource = new TextSource(textToPlay, "en-US-ElizabethNeural");
var recognizeOptions = new CallMediaRecognizeChoiceOptions(targetParticipant, choices) {
  InterruptPrompt = true,
    InitialSilenceTimeout = TimeSpan.FromSeconds(30),
    Prompt = playSource,
    OperationContext = "AppointmentReminderMenu",
    //Only add the SpeechModelEndpointId if you have a custom speech model you would like to use
    SpeechModelEndpointId = "YourCustomSpeechModelEndpointId"
};
var recognizeResult = await callAutomationClient.GetCallConnection(callConnectionId)
  .GetCallMedia()
  .StartRecognizingAsync(recognizeOptions);

Zamiana mowy na tekst

String textToPlay = "Hi, how can I help you today?";
var playSource = new TextSource(textToPlay, "en-US-ElizabethNeural");
var recognizeOptions = new CallMediaRecognizeSpeechOptions(targetParticipant) {
  Prompt = playSource,
    EndSilenceTimeout = TimeSpan.FromMilliseconds(1000),
    OperationContext = "OpenQuestionSpeech",
    //Only add the SpeechModelEndpointId if you have a custom speech model you would like to use
    SpeechModelEndpointId = "YourCustomSpeechModelEndpointId"
};
var recognizeResult = await callAutomationClient.GetCallConnection(callConnectionId)
  .GetCallMedia()
  .StartRecognizingAsync(recognizeOptions);

Zamiana mowy na tekst lub DTMF

var maxTonesToCollect = 1; 
String textToPlay = "Hi, how can I help you today, you can press 0 to speak to an agent?"; 
var playSource = new TextSource(textToPlay, "en-US-ElizabethNeural"); 
var recognizeOptions = new CallMediaRecognizeSpeechOrDtmfOptions(targetParticipant, maxTonesToCollect) 
{ 
    Prompt = playSource, 
    EndSilenceTimeout = TimeSpan.FromMilliseconds(1000), 
    InitialSilenceTimeout = TimeSpan.FromSeconds(30), 
    InterruptPrompt = true, 
    OperationContext = "OpenQuestionSpeechOrDtmf",
    //Only add the SpeechModelEndpointId if you have a custom speech model you would like to use
    SpeechModelEndpointId = "YourCustomSpeechModelEndpointId" 
}; 
var recognizeResult = await callAutomationClient.GetCallConnection(callConnectionId) 
    .GetCallMedia() 
    .StartRecognizingAsync(recognizeOptions); 

Uwaga

Jeśli parametry nie są ustawione, wartości domyślne są stosowane tam, gdzie to możliwe.

Odbieranie aktualizacji zdarzeń rozpoznawania

Deweloperzy mogą subskrybować RecognizeCompleted zdarzenia i RecognizeFailed na zarejestrowanym wywołaniu zwrotnym elementu webhook. Użyj tego wywołania zwrotnego z logiką biznesową w aplikacji, aby określić kolejne kroki, gdy wystąpi jedno ze zdarzeń.

Przykładowy sposób deserializacji zdarzenia RecognizeCompleted :

if (acsEvent is RecognizeCompleted recognizeCompleted) 
{ 
    switch (recognizeCompleted.RecognizeResult) 
    { 
        case DtmfResult dtmfResult: 
            //Take action for Recognition through DTMF 
            var tones = dtmfResult.Tones; 
            logger.LogInformation("Recognize completed succesfully, tones={tones}", tones); 
            break; 
        case ChoiceResult choiceResult: 
            // Take action for Recognition through Choices 
            var labelDetected = choiceResult.Label; 
            var phraseDetected = choiceResult.RecognizedPhrase; 
            // If choice is detected by phrase, choiceResult.RecognizedPhrase will have the phrase detected, 
            // If choice is detected using dtmf tone, phrase will be null 
            logger.LogInformation("Recognize completed succesfully, labelDetected={labelDetected}, phraseDetected={phraseDetected}", labelDetected, phraseDetected);
            break; 
        case SpeechResult speechResult: 
            // Take action for Recognition through Choices 
            var text = speechResult.Speech; 
            logger.LogInformation("Recognize completed succesfully, text={text}", text); 
            break; 
        default: 
            logger.LogInformation("Recognize completed succesfully, recognizeResult={recognizeResult}", recognizeCompleted.RecognizeResult); 
            break; 
    } 
} 

Przykład sposobu deserializacji zdarzenia RecognizeFailed :

if (acsEvent is RecognizeFailed recognizeFailed) 
{ 
    if (MediaEventReasonCode.RecognizeInitialSilenceTimedOut.Equals(recognizeFailed.ReasonCode)) 
    { 
        // Take action for time out 
        logger.LogInformation("Recognition failed: initial silencev time out"); 
    } 
    else if (MediaEventReasonCode.RecognizeSpeechOptionNotMatched.Equals(recognizeFailed.ReasonCode)) 
    { 
        // Take action for option not matched 
        logger.LogInformation("Recognition failed: speech option not matched"); 
    } 
    else if (MediaEventReasonCode.RecognizeIncorrectToneDetected.Equals(recognizeFailed.ReasonCode)) 
    { 
        // Take action for incorrect tone 
        logger.LogInformation("Recognition failed: incorrect tone detected"); 
    } 
    else 
    { 
        logger.LogInformation("Recognition failed, result={result}, context={context}", recognizeFailed.ResultInformation?.Message, recognizeFailed.OperationContext); 
    } 
} 

Przykład sposobu deserializacji zdarzenia RecognizeCanceled :

if (acsEvent is RecognizeCanceled { OperationContext: "AppointmentReminderMenu" })
        {
            logger.LogInformation($"RecognizeCanceled event received for call connection id: {@event.CallConnectionId}");
            //Take action on recognize canceled operation
           await callConnection.HangUpAsync(forEveryone: true);
        }

Wymagania wstępne

W przypadku funkcji sztucznej inteligencji

  • Tworzenie i łączenie usług Azure AI z zasobem usług Azure Communication Services.
  • Utwórz niestandardową poddomenę dla zasobu usług Azure AI.

Specyfikacje techniczne

Dostępne są następujące parametry umożliwiające dostosowanie funkcji Recognize:

Parametr Typ Wartość domyślna (jeśli nie została określona) opis Wymagane lub opcjonalne
Prompt

(Aby uzyskać szczegółowe informacje, zobacz Dostosowywanie monitów głosowych do użytkowników za pomocą akcji Odtwórz)
FileSource, TextSource Nie ustawiono Komunikat do odtworzenia przed rozpoznaniem danych wejściowych. Opcjonalnie
InterToneTimeout przedział_czasu 2 sekundy

Min: 1 sekunda
Maksymalna: 60 sekund
Limit w sekundach oczekiwania usługi Azure Communication Services na naciśnięcie innej cyfry (limit czasu międzycyfrowego). Opcjonalnie
InitialSegmentationSilenceTimeoutInSeconds Integer 0,5 sekundy Jak długo akcja rozpoznawania czeka na dane wejściowe przed rozważeniem przekroczenia limitu czasu. Zobacz Jak rozpoznawać mowę. Opcjonalnie
RecognizeInputsType Wyliczenie Dtmf Typ rozpoznanych danych wejściowych. Opcje to dtmf, , speechchoicesi speechordtmf. Wymagania
InitialSilenceTimeout przedział_czasu 5 s

Min: 0 sekund
Maksymalna: 300 sekund (DTMF)
Maksymalna: 20 sekund (opcje)
Maksymalna: 20 sekund (mowa)
Początkowy limit czasu ciszy dostosowuje, ile dźwięku niespeech jest dozwolony przed wyrażeniem przed zakończeniem próby rozpoznawania w wyniku "brak dopasowania". Zobacz Jak rozpoznawać mowę. Opcjonalnie
MaxTonesToCollect Integer Brak wartości domyślnej

Min: 1
Liczba cyfr, których deweloper oczekuje jako danych wejściowych od uczestnika. Wymagania
StopTones IEnumeration<DtmfTone> Nie ustawiono Uczestnicy cyfry mogą naciskać, aby uciec przed wsadowym zdarzeniem DTMF. Opcjonalnie
InterruptPrompt Bool Prawda Jeśli uczestnik ma możliwość przerwania odtwarzaniaMessage, naciskając cyfrę. Opcjonalnie
InterruptCallMediaOperation Bool Prawda Jeśli ta flaga jest ustawiona, przerywa bieżącą operację nośnika wywołania. Na przykład jeśli jest odtwarzany jakikolwiek dźwięk, przerywa tę operację i inicjuje rozpoznawanie. Opcjonalnie
OperationContext String Nie ustawiono Ciąg, który deweloperzy mogą przekazać w połowie akcji, co jest przydatne w celu umożliwienia deweloperom przechowywania kontekstu dotyczących odbieranych zdarzeń. Opcjonalnie
Phrases String Nie ustawiono Lista fraz, które kojarzą się z etykietą. Wysłuchanie dowolnego z tych fraz powoduje pomyślne uznanie. Wymagania
Tone String Nie ustawiono Ton do rozpoznania, jeśli użytkownik zdecyduje się nacisnąć liczbę zamiast używać mowy. Opcjonalnie
Label String Nie ustawiono Wartość klucza do rozpoznawania. Wymagania
Language String En-us Język używany do rozpoznawania mowy. Opcjonalnie
EndSilenceTimeout przedział_czasu 0,5 sekundy Ostatnia pauza osoby mówiącej używanej do wykrywania końcowego wyniku wygenerowanego jako mowa. Opcjonalnie

Uwaga

W sytuacjach, w których zarówno DTMF, jak i mowa znajdują się w recognizeInputsTypeobiekcie , akcja rozpoznawania działa na pierwszy odebrany typ danych wejściowych. Jeśli na przykład użytkownik najpierw naciśnie numer klawiatury, rozpoznaj akcję uzna to za zdarzenie DTMF i kontynuuje nasłuchiwanie tonów DTMF. Jeśli użytkownik mówi najpierw, rozpoznaj akcję uzna to za zdarzenie rozpoznawania mowy i nasłuchuje danych głosowych.

Tworzenie nowej aplikacji Java

W terminalu lub oknie polecenia przejdź do katalogu, w którym chcesz utworzyć aplikację Java. Uruchom polecenie , mvn aby wygenerować projekt Java na podstawie szablonu maven-archetype-quickstart.

mvn archetype:generate -DgroupId=com.communication.quickstart -DartifactId=communication-quickstart -DarchetypeArtifactId=maven-archetype-quickstart -DarchetypeVersion=1.4 -DinteractiveMode=false

Polecenie mvn tworzy katalog o takiej samej nazwie jak artifactId argument. Katalog src/main/java zawiera kod źródłowy projektu. Katalog src/test/java zawiera źródło testowe.

Zwróć uwagę, że generate krok utworzył katalog o takiej samej nazwie jak artifactId. Katalog src/main/java zawiera kod źródłowy. Katalog src/test/java zawiera testy. Plik pom.xml jest projektem Project Object Model (POM).

Zaktualizuj plik POM aplikacji, aby używać środowiska Java 8 lub nowszego.

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
</properties>

Dodawanie odwołań do pakietu

W pliku POM dodaj następujące odwołanie do projektu:

azure-communication-callautomation

<dependency>
  <groupId>com.azure</groupId>
  <artifactId>azure-communication-callautomation</artifactId>
  <version>1.0.0</version>
</dependency>

Ustanawianie połączenia

W tym momencie należy zapoznać się z uruchamianiem wywołań. Aby uzyskać więcej informacji na temat nawiązywania połączenia, zobacz Szybki start: nawiązywanie i nawiązywanie połączeń wychodzących. Możesz również użyć fragmentu kodu podanego tutaj, aby dowiedzieć się, jak odpowiedzieć na połączenie.

CallIntelligenceOptions callIntelligenceOptions = new CallIntelligenceOptions().setCognitiveServicesEndpoint("https://sample-cognitive-service-resource.cognitiveservices.azure.com/"); 
answerCallOptions = new AnswerCallOptions("<Incoming call context>", "<https://sample-callback-uri>").setCallIntelligenceOptions(callIntelligenceOptions); 
Response < AnswerCallResult > answerCallResult = callAutomationClient
  .answerCallWithResponse(answerCallOptions)
  .block();

Wywoływanie akcji rozpoznawania

Gdy aplikacja odpowie na wywołanie, możesz podać informacje o rozpoznawaniu danych wejściowych uczestnika i odtwarzaniu monitu.

DTMF

var maxTonesToCollect = 3;
String textToPlay = "Welcome to Contoso, please enter 3 DTMF.";
var playSource = new TextSource() 
    .setText(textToPlay) 
    .setVoiceName("en-US-ElizabethNeural");

var recognizeOptions = new CallMediaRecognizeDtmfOptions(targetParticipant, maxTonesToCollect) 
    .setInitialSilenceTimeout(Duration.ofSeconds(30)) 
    .setPlayPrompt(playSource) 
    .setInterToneTimeout(Duration.ofSeconds(5)) 
    .setInterruptPrompt(true) 
    .setStopTones(Arrays.asList(DtmfTone.POUND));

var recognizeResponse = callAutomationClient.getCallConnectionAsync(callConnectionId) 
    .getCallMediaAsync() 
    .startRecognizingWithResponse(recognizeOptions) 
    .block(); 

log.info("Start recognizing result: " + recognizeResponse.getStatusCode()); 

W przypadku przepływów zamiany mowy na tekst akcja Rozpoznawanie automatyzacji wywołań obsługuje również używanie niestandardowych modeli mowy. Funkcje, takie jak niestandardowe modele mowy, mogą być przydatne podczas tworzenia aplikacji, która musi nasłuchiwać złożonych słów, których domyślne modele zamiany mowy na tekst mogą nie być zrozumiałe. Jednym z przykładów jest utworzenie aplikacji dla branży telemedycznej, a agent wirtualny musi mieć możliwość rozpoznawania terminów medycznych. Więcej informacji można dowiedzieć się w temacie Create a custom speech project (Tworzenie projektu niestandardowej mowy).

Opcje zamiany mowy na tekst

var choices = Arrays.asList(
  new RecognitionChoice()
  .setLabel("Confirm")
  .setPhrases(Arrays.asList("Confirm", "First", "One"))
  .setTone(DtmfTone.ONE),
  new RecognitionChoice()
  .setLabel("Cancel")
  .setPhrases(Arrays.asList("Cancel", "Second", "Two"))
  .setTone(DtmfTone.TWO)
);

String textToPlay = "Hello, This is a reminder for your appointment at 2 PM, Say Confirm to confirm your appointment or Cancel to cancel the appointment. Thank you!";
var playSource = new TextSource()
  .setText(textToPlay)
  .setVoiceName("en-US-ElizabethNeural");
var recognizeOptions = new CallMediaRecognizeChoiceOptions(targetParticipant, choices)
  .setInterruptPrompt(true)
  .setInitialSilenceTimeout(Duration.ofSeconds(30))
  .setPlayPrompt(playSource)
  .setOperationContext("AppointmentReminderMenu")
  //Only add the SpeechRecognitionModelEndpointId if you have a custom speech model you would like to use
  .setSpeechRecognitionModelEndpointId("YourCustomSpeechModelEndpointID"); 
var recognizeResponse = callAutomationClient.getCallConnectionAsync(callConnectionId)
  .getCallMediaAsync()
  .startRecognizingWithResponse(recognizeOptions)
  .block();

Zamiana mowy na tekst

String textToPlay = "Hi, how can I help you today?"; 
var playSource = new TextSource() 
    .setText(textToPlay) 
    .setVoiceName("en-US-ElizabethNeural"); 
var recognizeOptions = new CallMediaRecognizeSpeechOptions(targetParticipant, Duration.ofMillis(1000)) 
    .setPlayPrompt(playSource) 
    .setOperationContext("OpenQuestionSpeech")
    //Only add the SpeechRecognitionModelEndpointId if you have a custom speech model you would like to use
    .setSpeechRecognitionModelEndpointId("YourCustomSpeechModelEndpointID");  
var recognizeResponse = callAutomationClient.getCallConnectionAsync(callConnectionId) 
    .getCallMediaAsync() 
    .startRecognizingWithResponse(recognizeOptions) 
    .block(); 

Zamiana mowy na tekst lub DTMF

var maxTonesToCollect = 1; 
String textToPlay = "Hi, how can I help you today, you can press 0 to speak to an agent?"; 
var playSource = new TextSource() 
    .setText(textToPlay) 
    .setVoiceName("en-US-ElizabethNeural"); 
var recognizeOptions = new CallMediaRecognizeSpeechOrDtmfOptions(targetParticipant, maxTonesToCollect, Duration.ofMillis(1000)) 
    .setPlayPrompt(playSource) 
    .setInitialSilenceTimeout(Duration.ofSeconds(30)) 
    .setInterruptPrompt(true) 
    .setOperationContext("OpenQuestionSpeechOrDtmf")
    //Only add the SpeechRecognitionModelEndpointId if you have a custom speech model you would like to use
    .setSpeechRecognitionModelEndpointId("YourCustomSpeechModelEndpointID");  
var recognizeResponse = callAutomationClient.getCallConnectionAsync(callConnectionId) 
    .getCallMediaAsync() 
    .startRecognizingWithResponse(recognizeOptions) 
    .block(); 

Uwaga

Jeśli parametry nie są ustawione, wartości domyślne są stosowane tam, gdzie to możliwe.

Odbieranie aktualizacji zdarzeń rozpoznawania

Deweloperzy mogą subskrybować RecognizeCompleted zdarzenia i RecognizeFailed na zarejestrowanym wywołaniu zwrotnym elementu webhook. Użyj tego wywołania zwrotnego z logiką biznesową w aplikacji, aby określić kolejne kroki, gdy wystąpi jedno ze zdarzeń.

Przykładowy sposób deserializacji zdarzenia RecognizeCompleted :

if (acsEvent instanceof RecognizeCompleted) { 
    RecognizeCompleted event = (RecognizeCompleted) acsEvent; 
    RecognizeResult recognizeResult = event.getRecognizeResult().get(); 
    if (recognizeResult instanceof DtmfResult) { 
        // Take action on collect tones 
        DtmfResult dtmfResult = (DtmfResult) recognizeResult; 
        List<DtmfTone> tones = dtmfResult.getTones(); 
        log.info("Recognition completed, tones=" + tones + ", context=" + event.getOperationContext()); 
    } else if (recognizeResult instanceof ChoiceResult) { 
        ChoiceResult collectChoiceResult = (ChoiceResult) recognizeResult; 
        String labelDetected = collectChoiceResult.getLabel(); 
        String phraseDetected = collectChoiceResult.getRecognizedPhrase(); 
        log.info("Recognition completed, labelDetected=" + labelDetected + ", phraseDetected=" + phraseDetected + ", context=" + event.getOperationContext()); 
    } else if (recognizeResult instanceof SpeechResult) { 
        SpeechResult speechResult = (SpeechResult) recognizeResult; 
        String text = speechResult.getSpeech(); 
        log.info("Recognition completed, text=" + text + ", context=" + event.getOperationContext()); 
    } else { 
        log.info("Recognition completed, result=" + recognizeResult + ", context=" + event.getOperationContext()); 
    } 
} 

Przykład sposobu deserializacji zdarzenia RecognizeFailed :

if (acsEvent instanceof RecognizeFailed) { 
    RecognizeFailed event = (RecognizeFailed) acsEvent; 
    if (ReasonCode.Recognize.INITIAL_SILENCE_TIMEOUT.equals(event.getReasonCode())) { 
        // Take action for time out 
        log.info("Recognition failed: initial silence time out"); 
    } else if (ReasonCode.Recognize.SPEECH_OPTION_NOT_MATCHED.equals(event.getReasonCode())) { 
        // Take action for option not matched 
        log.info("Recognition failed: speech option not matched"); 
    } else if (ReasonCode.Recognize.DMTF_OPTION_MATCHED.equals(event.getReasonCode())) { 
        // Take action for incorrect tone 
        log.info("Recognition failed: incorrect tone detected"); 
    } else { 
        log.info("Recognition failed, result=" + event.getResultInformation().getMessage() + ", context=" + event.getOperationContext()); 
    } 
} 

Przykład sposobu deserializacji zdarzenia RecognizeCanceled :

if (acsEvent instanceof RecognizeCanceled) { 
    RecognizeCanceled event = (RecognizeCanceled) acsEvent; 
    log.info("Recognition canceled, context=" + event.getOperationContext()); 
}

Wymagania wstępne

  • Aby uzyskać szczegółowe informacje, zobacz Tworzenie konta platformy Azure z aktywną subskrypcją.
  • Zasób usług Azure Communication Services. Zobacz Tworzenie zasobu usług Azure Communication Services. Zanotuj parametry połączenia dla tego zasobu.
  • Utwórz nową aplikację usługi internetowej przy użyciu zestawu Call Automation SDK.
  • Po zainstalowaniu Node.js można go zainstalować z oficjalnej witryny internetowej.

W przypadku funkcji sztucznej inteligencji

  • Tworzenie i łączenie usług Azure AI z zasobem usług Azure Communication Services.
  • Utwórz niestandardową poddomenę dla zasobu usług Azure AI.

Specyfikacje techniczne

Dostępne są następujące parametry umożliwiające dostosowanie funkcji Recognize:

Parametr Typ Wartość domyślna (jeśli nie została określona) opis Wymagane lub opcjonalne
Prompt

(Aby uzyskać szczegółowe informacje, zobacz Dostosowywanie monitów głosowych do użytkowników za pomocą akcji Odtwórz)
FileSource, TextSource Nie ustawiono Komunikat do odtworzenia przed rozpoznaniem danych wejściowych. Opcjonalnie
InterToneTimeout przedział_czasu 2 sekundy

Min: 1 sekunda
Maksymalna: 60 sekund
Limit w sekundach oczekiwania usługi Azure Communication Services na naciśnięcie innej cyfry (limit czasu międzycyfrowego). Opcjonalnie
InitialSegmentationSilenceTimeoutInSeconds Integer 0,5 sekundy Jak długo akcja rozpoznawania czeka na dane wejściowe przed rozważeniem przekroczenia limitu czasu. Zobacz Jak rozpoznawać mowę. Opcjonalnie
RecognizeInputsType Wyliczenie Dtmf Typ rozpoznanych danych wejściowych. Opcje to dtmf, , speechchoicesi speechordtmf. Wymagania
InitialSilenceTimeout przedział_czasu 5 s

Min: 0 sekund
Maksymalna: 300 sekund (DTMF)
Maksymalna: 20 sekund (opcje)
Maksymalna: 20 sekund (mowa)
Początkowy limit czasu ciszy dostosowuje, ile dźwięku niespeech jest dozwolony przed wyrażeniem przed zakończeniem próby rozpoznawania w wyniku "brak dopasowania". Zobacz Jak rozpoznawać mowę. Opcjonalnie
MaxTonesToCollect Integer Brak wartości domyślnej

Min: 1
Liczba cyfr, których deweloper oczekuje jako danych wejściowych od uczestnika. Wymagania
StopTones IEnumeration<DtmfTone> Nie ustawiono Uczestnicy cyfry mogą naciskać, aby uciec przed wsadowym zdarzeniem DTMF. Opcjonalnie
InterruptPrompt Bool Prawda Jeśli uczestnik ma możliwość przerwania odtwarzaniaMessage, naciskając cyfrę. Opcjonalnie
InterruptCallMediaOperation Bool Prawda Jeśli ta flaga jest ustawiona, przerywa bieżącą operację nośnika wywołania. Na przykład jeśli jest odtwarzany jakikolwiek dźwięk, przerywa tę operację i inicjuje rozpoznawanie. Opcjonalnie
OperationContext String Nie ustawiono Ciąg, który deweloperzy mogą przekazać w połowie akcji, co jest przydatne w celu umożliwienia deweloperom przechowywania kontekstu dotyczących odbieranych zdarzeń. Opcjonalnie
Phrases String Nie ustawiono Lista fraz, które kojarzą się z etykietą. Wysłuchanie dowolnego z tych fraz powoduje pomyślne uznanie. Wymagania
Tone String Nie ustawiono Ton do rozpoznania, jeśli użytkownik zdecyduje się nacisnąć liczbę zamiast używać mowy. Opcjonalnie
Label String Nie ustawiono Wartość klucza do rozpoznawania. Wymagania
Language String En-us Język używany do rozpoznawania mowy. Opcjonalnie
EndSilenceTimeout przedział_czasu 0,5 sekundy Ostatnia pauza osoby mówiącej używanej do wykrywania końcowego wyniku wygenerowanego jako mowa. Opcjonalnie

Uwaga

W sytuacjach, w których zarówno DTMF, jak i mowa znajdują się w recognizeInputsTypeobiekcie , akcja rozpoznawania działa na pierwszy odebrany typ danych wejściowych. Jeśli na przykład użytkownik najpierw naciśnie numer klawiatury, rozpoznaj akcję uzna to za zdarzenie DTMF i kontynuuje nasłuchiwanie tonów DTMF. Jeśli użytkownik mówi najpierw, rozpoznaj akcję uzna to za zdarzenie rozpoznawania mowy i nasłuchuje danych głosowych.

Tworzenie nowej aplikacji JavaScript

Utwórz nową aplikację JavaScript w katalogu projektu. Zainicjuj nowy projekt Node.js za pomocą następującego polecenia. Spowoduje to utworzenie pliku package.json dla projektu, który zarządza zależnościami projektu.

npm init -y

Instalowanie pakietu automatyzacji wywołań usług Azure Communication Services

npm install @azure/communication-call-automation

Utwórz nowy plik JavaScript w katalogu projektu, na przykład nadaj mu app.jsnazwę . Napisz kod JavaScript w tym pliku.

Uruchom aplikację przy użyciu Node.js za pomocą następującego polecenia.

node app.js

Ustanawianie połączenia

W tym momencie należy zapoznać się z uruchamianiem wywołań. Aby uzyskać więcej informacji na temat nawiązywania połączenia, zobacz Szybki start: nawiązywanie i nawiązywanie połączeń wychodzących.

Wywoływanie akcji rozpoznawania

Gdy aplikacja odpowie na wywołanie, możesz podać informacje o rozpoznawaniu danych wejściowych uczestnika i odtwarzaniu monitu.

DTMF

const maxTonesToCollect = 3; 
const textToPlay = "Welcome to Contoso, please enter 3 DTMF."; 
const playSource: TextSource = { text: textToPlay, voiceName: "en-US-ElizabethNeural", kind: "textSource" }; 
const recognizeOptions: CallMediaRecognizeDtmfOptions = { 
    maxTonesToCollect: maxTonesToCollect, 
    initialSilenceTimeoutInSeconds: 30, 
    playPrompt: playSource, 
    interToneTimeoutInSeconds: 5, 
    interruptPrompt: true, 
    stopDtmfTones: [ DtmfTone.Pound ], 
    kind: "callMediaRecognizeDtmfOptions" 
}; 

await callAutomationClient.getCallConnection(callConnectionId) 
    .getCallMedia() 
    .startRecognizing(targetParticipant, recognizeOptions); 

W przypadku przepływów zamiany mowy na tekst akcja Rozpoznawanie automatyzacji wywołań obsługuje również używanie niestandardowych modeli mowy. Funkcje, takie jak niestandardowe modele mowy, mogą być przydatne podczas tworzenia aplikacji, która musi nasłuchiwać złożonych słów, których domyślne modele zamiany mowy na tekst mogą nie być zrozumiałe. Jednym z przykładów jest utworzenie aplikacji dla branży telemedycznej, a agent wirtualny musi mieć możliwość rozpoznawania terminów medycznych. Więcej informacji można dowiedzieć się w temacie Create a custom speech project (Tworzenie projektu niestandardowej mowy).

Opcje zamiany mowy na tekst

const choices = [ 
    {  
        label: "Confirm", 
        phrases: [ "Confirm", "First", "One" ], 
        tone: DtmfTone.One 
    }, 
    { 
        label: "Cancel", 
        phrases: [ "Cancel", "Second", "Two" ], 
        tone: DtmfTone.Two 
    } 
]; 

const textToPlay = "Hello, This is a reminder for your appointment at 2 PM, Say Confirm to confirm your appointment or Cancel to cancel the appointment. Thank you!"; 
const playSource: TextSource = { text: textToPlay, voiceName: "en-US-ElizabethNeural", kind: "textSource" }; 
const recognizeOptions: CallMediaRecognizeChoiceOptions = { 
    choices: choices, 
    interruptPrompt: true, 
    initialSilenceTimeoutInSeconds: 30, 
    playPrompt: playSource, 
    operationContext: "AppointmentReminderMenu", 
    kind: "callMediaRecognizeChoiceOptions",
    //Only add the speechRecognitionModelEndpointId if you have a custom speech model you would like to use
    speechRecognitionModelEndpointId: "YourCustomSpeechEndpointId"
}; 

await callAutomationClient.getCallConnection(callConnectionId) 
    .getCallMedia() 
    .startRecognizing(targetParticipant, recognizeOptions); 

Zamiana mowy na tekst

const textToPlay = "Hi, how can I help you today?"; 
const playSource: TextSource = { text: textToPlay, voiceName: "en-US-ElizabethNeural", kind: "textSource" }; 
const recognizeOptions: CallMediaRecognizeSpeechOptions = { 
    endSilenceTimeoutInSeconds: 1, 
    playPrompt: playSource, 
    operationContext: "OpenQuestionSpeech", 
    kind: "callMediaRecognizeSpeechOptions",
    //Only add the speechRecognitionModelEndpointId if you have a custom speech model you would like to use
    speechRecognitionModelEndpointId: "YourCustomSpeechEndpointId"
}; 

await callAutomationClient.getCallConnection(callConnectionId) 
    .getCallMedia() 
    .startRecognizing(targetParticipant, recognizeOptions); 

Zamiana mowy na tekst lub DTMF

const maxTonesToCollect = 1; 
const textToPlay = "Hi, how can I help you today, you can press 0 to speak to an agent?"; 
const playSource: TextSource = { text: textToPlay, voiceName: "en-US-ElizabethNeural", kind: "textSource" }; 
const recognizeOptions: CallMediaRecognizeSpeechOrDtmfOptions = { 
    maxTonesToCollect: maxTonesToCollect, 
    endSilenceTimeoutInSeconds: 1, 
    playPrompt: playSource, 
    initialSilenceTimeoutInSeconds: 30, 
    interruptPrompt: true, 
    operationContext: "OpenQuestionSpeechOrDtmf", 
    kind: "callMediaRecognizeSpeechOrDtmfOptions",
    //Only add the speechRecognitionModelEndpointId if you have a custom speech model you would like to use
    speechRecognitionModelEndpointId: "YourCustomSpeechEndpointId"
}; 

await callAutomationClient.getCallConnection(callConnectionId) 
    .getCallMedia() 
    .startRecognizing(targetParticipant, recognizeOptions); 

Uwaga

Jeśli parametry nie są ustawione, wartości domyślne są stosowane tam, gdzie to możliwe.

Odbieranie aktualizacji zdarzeń rozpoznawania

Deweloperzy mogą subskrybować RecognizeCompleted zdarzenia i RecognizeFailed na zarejestrowanym wywołaniu zwrotnym elementu webhook. Użyj tego wywołania zwrotnego z logiką biznesową w aplikacji, aby określić kolejne kroki, gdy wystąpi jedno ze zdarzeń.

Przykładowy sposób deserializacji zdarzenia RecognizeCompleted :

if (event.type === "Microsoft.Communication.RecognizeCompleted") { 
    if (eventData.recognitionType === "dtmf") { 
        const tones = eventData.dtmfResult.tones; 
        console.log("Recognition completed, tones=%s, context=%s", tones, eventData.operationContext); 
    } else if (eventData.recognitionType === "choices") { 
        const labelDetected = eventData.choiceResult.label; 
        const phraseDetected = eventData.choiceResult.recognizedPhrase; 
        console.log("Recognition completed, labelDetected=%s, phraseDetected=%s, context=%s", labelDetected, phraseDetected, eventData.operationContext); 
    } else if (eventData.recognitionType === "speech") { 
        const text = eventData.speechResult.speech; 
        console.log("Recognition completed, text=%s, context=%s", text, eventData.operationContext); 
    } else { 
        console.log("Recognition completed: data=%s", JSON.stringify(eventData, null, 2)); 
    } 
} 

Przykład sposobu deserializacji zdarzenia RecognizeFailed :

if (event.type === "Microsoft.Communication.RecognizeFailed") {
    console.log("Recognize failed: data=%s", JSON.stringify(eventData, null, 2));
}

Przykład sposobu deserializacji zdarzenia RecognizeCanceled :

if (event.type === "Microsoft.Communication.RecognizeCanceled") {
    console.log("Recognize canceled, context=%s", eventData.operationContext);
}

Wymagania wstępne

  • Aby uzyskać szczegółowe informacje, zobacz Tworzenie konta platformy Azure z aktywną subskrypcją.
  • Zasób usług Azure Communication Services. Zobacz Tworzenie zasobu usług Azure Communication Services. Zanotuj parametry połączenia dla tego zasobu.
  • Utwórz nową aplikację usługi internetowej przy użyciu zestawu Call Automation SDK.
  • Zainstaluj język Python z Python.org.

W przypadku funkcji sztucznej inteligencji

  • Tworzenie i łączenie usług Azure AI z zasobem usług Azure Communication Services.
  • Utwórz niestandardową poddomenę dla zasobu usług Azure AI.

Specyfikacje techniczne

Dostępne są następujące parametry umożliwiające dostosowanie funkcji Recognize:

Parametr Typ Wartość domyślna (jeśli nie została określona) opis Wymagane lub opcjonalne
Prompt

(Aby uzyskać szczegółowe informacje, zobacz Dostosowywanie monitów głosowych do użytkowników za pomocą akcji Odtwórz)
FileSource, TextSource Nie ustawiono Komunikat do odtworzenia przed rozpoznaniem danych wejściowych. Opcjonalnie
InterToneTimeout przedział_czasu 2 sekundy

Min: 1 sekunda
Maksymalna: 60 sekund
Limit w sekundach oczekiwania usługi Azure Communication Services na naciśnięcie innej cyfry (limit czasu międzycyfrowego). Opcjonalnie
InitialSegmentationSilenceTimeoutInSeconds Integer 0,5 sekundy Jak długo akcja rozpoznawania czeka na dane wejściowe przed rozważeniem przekroczenia limitu czasu. Zobacz Jak rozpoznawać mowę. Opcjonalnie
RecognizeInputsType Wyliczenie Dtmf Typ rozpoznanych danych wejściowych. Opcje to dtmf, , speechchoicesi speechordtmf. Wymagania
InitialSilenceTimeout przedział_czasu 5 s

Min: 0 sekund
Maksymalna: 300 sekund (DTMF)
Maksymalna: 20 sekund (opcje)
Maksymalna: 20 sekund (mowa)
Początkowy limit czasu ciszy dostosowuje, ile dźwięku niespeech jest dozwolony przed wyrażeniem przed zakończeniem próby rozpoznawania w wyniku "brak dopasowania". Zobacz Jak rozpoznawać mowę. Opcjonalnie
MaxTonesToCollect Integer Brak wartości domyślnej

Min: 1
Liczba cyfr, których deweloper oczekuje jako danych wejściowych od uczestnika. Wymagania
StopTones IEnumeration<DtmfTone> Nie ustawiono Uczestnicy cyfry mogą naciskać, aby uciec przed wsadowym zdarzeniem DTMF. Opcjonalnie
InterruptPrompt Bool Prawda Jeśli uczestnik ma możliwość przerwania odtwarzaniaMessage, naciskając cyfrę. Opcjonalnie
InterruptCallMediaOperation Bool Prawda Jeśli ta flaga jest ustawiona, przerywa bieżącą operację nośnika wywołania. Na przykład jeśli jest odtwarzany jakikolwiek dźwięk, przerywa tę operację i inicjuje rozpoznawanie. Opcjonalnie
OperationContext String Nie ustawiono Ciąg, który deweloperzy mogą przekazać w połowie akcji, co jest przydatne w celu umożliwienia deweloperom przechowywania kontekstu dotyczących odbieranych zdarzeń. Opcjonalnie
Phrases String Nie ustawiono Lista fraz, które kojarzą się z etykietą. Wysłuchanie dowolnego z tych fraz powoduje pomyślne uznanie. Wymagania
Tone String Nie ustawiono Ton do rozpoznania, jeśli użytkownik zdecyduje się nacisnąć liczbę zamiast używać mowy. Opcjonalnie
Label String Nie ustawiono Wartość klucza do rozpoznawania. Wymagania
Language String En-us Język używany do rozpoznawania mowy. Opcjonalnie
EndSilenceTimeout przedział_czasu 0,5 sekundy Ostatnia pauza osoby mówiącej używanej do wykrywania końcowego wyniku wygenerowanego jako mowa. Opcjonalnie

Uwaga

W sytuacjach, w których zarówno DTMF, jak i mowa znajdują się w recognizeInputsTypeobiekcie , akcja rozpoznawania działa na pierwszy odebrany typ danych wejściowych. Jeśli na przykład użytkownik najpierw naciśnie numer klawiatury, rozpoznaj akcję uzna to za zdarzenie DTMF i kontynuuje nasłuchiwanie tonów DTMF. Jeśli użytkownik mówi najpierw, rozpoznaj akcję uzna to za zdarzenie rozpoznawania mowy i nasłuchuje danych głosowych.

Tworzenie nowej aplikacji w języku Python

Konfigurowanie środowiska wirtualnego języka Python dla projektu

python -m venv play-audio-app

Uaktywnienie środowiska wirtualnego

W systemie Windows użyj następującego polecenia:

.\ play-audio-quickstart \Scripts\activate

W systemie Unix użyj następującego polecenia:

source play-audio-quickstart /bin/activate

Instalowanie pakietu automatyzacji wywołań usług Azure Communication Services

pip install azure-communication-callautomation

Utwórz plik aplikacji w katalogu projektu, na przykład nadaj mu app.pynazwę . Napisz kod w języku Python w tym pliku.

Uruchom aplikację przy użyciu języka Python za pomocą następującego polecenia.

python app.py

Ustanawianie połączenia

W tym momencie należy zapoznać się z uruchamianiem wywołań. Aby uzyskać więcej informacji na temat nawiązywania połączenia, zobacz Szybki start: nawiązywanie i nawiązywanie połączeń wychodzących.

Wywoływanie akcji rozpoznawania

Gdy aplikacja odpowie na wywołanie, możesz podać informacje o rozpoznawaniu danych wejściowych uczestnika i odtwarzaniu monitu.

DTMF

max_tones_to_collect = 3 
text_to_play = "Welcome to Contoso, please enter 3 DTMF." 
play_source = TextSource(text=text_to_play, voice_name="en-US-ElizabethNeural") 
call_automation_client.get_call_connection(call_connection_id).start_recognizing_media( 
    dtmf_max_tones_to_collect=max_tones_to_collect, 
    input_type=RecognizeInputType.DTMF, 
    target_participant=target_participant, 
    initial_silence_timeout=30, 
    play_prompt=play_source, 
    dtmf_inter_tone_timeout=5, 
    interrupt_prompt=True, 
    dtmf_stop_tones=[ DtmfTone.Pound ]) 

W przypadku przepływów zamiany mowy na tekst akcja Rozpoznawanie automatyzacji wywołań obsługuje również używanie niestandardowych modeli mowy. Funkcje, takie jak niestandardowe modele mowy, mogą być przydatne podczas tworzenia aplikacji, która musi nasłuchiwać złożonych słów, których domyślne modele zamiany mowy na tekst mogą nie być zrozumiałe. Jednym z przykładów jest utworzenie aplikacji dla branży telemedycznej, a agent wirtualny musi mieć możliwość rozpoznawania terminów medycznych. Więcej informacji można dowiedzieć się w temacie Create a custom speech project (Tworzenie projektu niestandardowej mowy).

Opcje zamiany mowy na tekst

choices = [ 
    RecognitionChoice( 
        label="Confirm", 
        phrases=[ "Confirm", "First", "One" ], 
        tone=DtmfTone.ONE 
    ), 
    RecognitionChoice( 
        label="Cancel", 
        phrases=[ "Cancel", "Second", "Two" ], 
        tone=DtmfTone.TWO 
    ) 
] 
text_to_play = "Hello, This is a reminder for your appointment at 2 PM, Say Confirm to confirm your appointment or Cancel to cancel the appointment. Thank you!" 
play_source = TextSource(text=text_to_play, voice_name="en-US-ElizabethNeural") 
call_automation_client.get_call_connection(call_connection_id).start_recognizing_media( 
    input_type=RecognizeInputType.CHOICES, 
    target_participant=target_participant, 
    choices=choices, 
    interrupt_prompt=True, 
    initial_silence_timeout=30, 
    play_prompt=play_source, 
    operation_context="AppointmentReminderMenu",
    # Only add the speech_recognition_model_endpoint_id if you have a custom speech model you would like to use
    speech_recognition_model_endpoint_id="YourCustomSpeechModelEndpointId")  

Zamiana mowy na tekst

text_to_play = "Hi, how can I help you today?" 
play_source = TextSource(text=text_to_play, voice_name="en-US-ElizabethNeural") 
call_automation_client.get_call_connection(call_connection_id).start_recognizing_media( 
    input_type=RecognizeInputType.SPEECH, 
    target_participant=target_participant, 
    end_silence_timeout=1, 
    play_prompt=play_source, 
    operation_context="OpenQuestionSpeech",
    # Only add the speech_recognition_model_endpoint_id if you have a custom speech model you would like to use
    speech_recognition_model_endpoint_id="YourCustomSpeechModelEndpointId") 

Zamiana mowy na tekst lub DTMF

max_tones_to_collect = 1 
text_to_play = "Hi, how can I help you today, you can also press 0 to speak to an agent." 
play_source = TextSource(text=text_to_play, voice_name="en-US-ElizabethNeural") 
call_automation_client.get_call_connection(call_connection_id).start_recognizing_media( 
    dtmf_max_tones_to_collect=max_tones_to_collect, 
    input_type=RecognizeInputType.SPEECH_OR_DTMF, 
    target_participant=target_participant, 
    end_silence_timeout=1, 
    play_prompt=play_source, 
    initial_silence_timeout=30, 
    interrupt_prompt=True, 
    operation_context="OpenQuestionSpeechOrDtmf",
    # Only add the speech_recognition_model_endpoint_id if you have a custom speech model you would like to use
    speech_recognition_model_endpoint_id="YourCustomSpeechModelEndpointId")  
app.logger.info("Start recognizing") 

Uwaga

Jeśli parametry nie są ustawione, wartości domyślne są stosowane tam, gdzie to możliwe.

Odbieranie aktualizacji zdarzeń rozpoznawania

Deweloperzy mogą subskrybować RecognizeCompleted zdarzenia i RecognizeFailed na zarejestrowanym wywołaniu zwrotnym elementu webhook. Użyj tego wywołania zwrotnego z logiką biznesową w aplikacji, aby określić kolejne kroki, gdy wystąpi jedno ze zdarzeń.

Przykładowy sposób deserializacji zdarzenia RecognizeCompleted :

if event.type == "Microsoft.Communication.RecognizeCompleted": 
    app.logger.info("Recognize completed: data=%s", event.data) 
    if event.data['recognitionType'] == "dtmf": 
        tones = event.data['dtmfResult']['tones'] 
        app.logger.info("Recognition completed, tones=%s, context=%s", tones, event.data.get('operationContext')) 
    elif event.data['recognitionType'] == "choices": 
        labelDetected = event.data['choiceResult']['label']; 
        phraseDetected = event.data['choiceResult']['recognizedPhrase']; 
        app.logger.info("Recognition completed, labelDetected=%s, phraseDetected=%s, context=%s", labelDetected, phraseDetected, event.data.get('operationContext')); 
    elif event.data['recognitionType'] == "speech": 
        text = event.data['speechResult']['speech']; 
        app.logger.info("Recognition completed, text=%s, context=%s", text, event.data.get('operationContext')); 
    else: 
        app.logger.info("Recognition completed: data=%s", event.data); 

Przykład sposobu deserializacji zdarzenia RecognizeFailed :

if event.type == "Microsoft.Communication.RecognizeFailed": 
    app.logger.info("Recognize failed: data=%s", event.data); 

Przykład sposobu deserializacji zdarzenia RecognizeCanceled :

if event.type == "Microsoft.Communication.RecognizeCanceled":
    # Handle the RecognizeCanceled event according to your application logic

Kody zdarzeń

Stan Kod Podkod Komunikat
RecognizeCompleted 200 8531 Ukończono akcję, maksymalna liczba odebranych cyfr.
RecognizeCompleted 200 8514 Akcja została ukończona w miarę wykrycia tonu zatrzymania.
RecognizeCompleted 400 8508 Akcja nie powiodła się. Operacja została anulowana.
RecognizeCompleted 400 8532 Akcja nie powiodła się, osiągnięto limit czasu ciszy między cyframi.
RecognizeCanceled 400 8508 Akcja nie powiodła się. Operacja została anulowana.
RecognizeFailed 400 8510 Akcja nie powiodła się, osiągnięto początkowy limit czasu ciszy.
RecognizeFailed 500 8511 Akcja nie powiodła się, napotkano błąd podczas próby odtworzenia monitu.
RecognizeFailed 500 8512 Nieznany wewnętrzny błąd serwera.
RecognizeFailed 400 8510 Akcja nie powiodła się, osiągnięto początkowy limit czasu ciszy
RecognizeFailed 400 8532 Akcja nie powiodła się, osiągnięto limit czasu ciszy między cyframi.
RecognizeFailed 400 8565 Akcja nie powiodła się, nieprawidłowe żądanie do usług sztucznej inteligencji platformy Azure. Sprawdź parametry wejściowe.
RecognizeFailed 400 8565 Akcja nie powiodła się, nieprawidłowe żądanie do usług sztucznej inteligencji platformy Azure. Nie można przetworzyć dostarczonego ładunku, sprawdź dane wejściowe źródła odtwarzania.
RecognizeFailed 401 8565 Akcja nie powiodła się, błąd uwierzytelniania usług AI platformy Azure.
RecognizeFailed 403 8565 Akcja nie powiodła się, żądanie zabronione do usług azure AI, bezpłatna subskrypcja używana przez żądanie nie przekroczyła limitu przydziału.
RecognizeFailed 429 8565 Akcja nie powiodła się. Żądania przekroczyły liczbę dozwolonych żądań współbieżnych dla subskrypcji usług Azure AI.
RecognizeFailed 408 8565 Akcja nie powiodła się. Upłynął limit czasu żądania do usług sztucznej inteligencji platformy Azure.
RecognizeFailed 500 8511 Akcja nie powiodła się, napotkano błąd podczas próby odtworzenia monitu.
RecognizeFailed 500 8512 Nieznany wewnętrzny błąd serwera.

Znane ograniczenia

  • Jednostka DTMF w pasmie nie jest obsługiwana. Zamiast tego użyj RFC 2833 DTMF.
  • Monity tekstowe zamiany tekstu na mowę obsługują maksymalnie 400 znaków, jeśli monit jest dłuższy niż sugerujemy użycie języka SSML dla akcji odtwarzania opartych na zamianie tekstu na mowę.
  • W przypadku scenariuszy, w których przekroczono limit przydziału usługi Mowa, możesz poprosić o zwiększenie tego limitu, wykonując kroki opisane w temacie Limity przydziału i limity usług rozpoznawania mowy.

Czyszczenie zasobów

Jeśli chcesz wyczyścić i usunąć subskrypcję usług Komunikacyjnych, możesz usunąć zasób lub grupę zasobów. Usunięcie grupy zasobów powoduje również usunięcie wszelkich innych skojarzonych z nią zasobów. Dowiedz się więcej o czyszczeniu zasobów.

Następne kroki