Reunir entradas do usuário com a ação “Reconhecer”

Este guia ajuda você a começar a usar o reconhecimento da entrada DTMF fornecido pelos participantes por meio do SDK de Automação de Chamadas dos Serviços de Comunicação do Azure.

Pré-requisitos

Para recursos de IA

Especificações técnicas

Os seguintes parâmetros estão disponíveis para personalizar a função Recognize:

Parâmetro Tipo Padrão (se não especificado) Descrição Obrigatória ou opcional
Prompt

(Para obter detalhes, consulte Personalizar comandos de voz para usuários com a ação de Executar)
FileSource, TextSource Não definido A mensagem a ser reproduzida antes de reconhecer a entrada. Opcional
InterToneTimeout TimeSpan 2 segundos

Mínimo: 1 segundo
Máximo: 60 segundos
Limite em segundos que os Serviços de Comunicação do Azure esperam para que o chamador pressione outro dígito (tempo limite entre dígitos). Opcional
InitialSegmentationSilenceTimeoutInSeconds Inteiro 0,5 segundo Quanto tempo a ação de reconhecimento espera pela entrada antes de considerá-la um tempo limite. Consulte Como reconhecer a fala. Opcional
RecognizeInputsType Enum dtmf Tipo de entrada reconhecida. As opções são dtmf, choices, speech e speechordtmf. Obrigatório
InitialSilenceTimeout TimeSpan 5 segundos

Mínimo: 0 segundo
Máximo: 300 segundos (DTMF)
Máximo: 20 segundos (Opções)
Máximo: 20 segundos (Fala)
OTempo limite de silêncio inicial ajusta a quantidade de áudio sem fala permitido antes que uma frase antes da tentativa de reconhecimento termine em um resultado "sem correspondência". Consulte Como reconhecer a fala. Opcional
MaxTonesToCollect Inteiro Nenhum padrão

Mínimo: 1
Número de dígitos que um desenvolvedor espera como entrada do participante. Obrigatório
StopTones IEnumeration<DtmfTone> Não definido Os participantes de dígito podem pressionar um dígito para sair de um evento DTMF em lote. Opcional
InterruptPrompt Bool Verdadeiro Se o participante tiver a capacidade de interromper a playMessage pressionando um dígito. Opcional
InterruptCallMediaOperation Bool Verdadeiro Se esse sinalizador for definido, ele interromperá a operação de mídia da chamada atual. Por exemplo, se algum áudio estiver sendo reproduzido, ele interromperá essa operação e iniciará o reconhecimento. Opcional
OperationContext String Não definido Cadeia de caracteres que os desenvolvedores podem transmitir no meio da ação. Útil para permitir que os desenvolvedores armazenem o contexto sobre os eventos recebidos. Opcional
Phrases String Não definido Lista de frases que associam ao rótulo. Ouvir qualquer uma dessas frases resulta em um reconhecimento bem-sucedido. Obrigatório
Tone String Não definido O tom a ser reconhecido se o usuário decidir pressionar um número em vez de usar a fala. Opcional
Label String Não definido O valor da chave para o reconhecimento. Obrigatório
Language String En-us O idioma usado para o reconhecimento de fala. Opcional
EndSilenceTimeout TimeSpan 0,5 segundo A pausa final do alto-falante usada para detectar o resultado final que é gerado como fala. Opcional

Observação

Em situações em que a DTMF e Fala estão no recognizeInputsType, a ação de reconhecimento atua no primeiro tipo de entrada recebido. Por exemplo, se o usuário pressionar um número de teclado primeiro, a ação de reconhecimento considerará um evento de DTMF e continuará escutando tons da DTMF. Se o usuário falar primeiro, a ação de reconhecimento considerará isso um evento de reconhecimento de fala e ouvirá a entrada de voz.

Criar um aplicativo em C#

Na janela do console do sistema operacional, use o comando dotnet para criar um aplicativo Web.

dotnet new web -n MyApplication

Instalar o pacote NuGet

Obter o pacote NuGet da Galeria do NuGet | Azure.Communication.CallAutomation. Siga as instruções para instalar o pacote.

Estabelecer uma chamada

A essa altura, é necessário estar familiarizado com as chamadas iniciais. Para obter mais informações sobre como fazer uma chamada, consulte Início Rápido: fazer e chamar de saída. Você também pode usar o trecho de código fornecido aqui para entender como atender a uma chamada.

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); 

Chamar a ação de reconhecimento

Quando o seu aplicativo atende à chamada, você pode fornecer informações sobre como reconhecer a entrada do participante e reproduzir um prompt.

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);

Para fluxos de conversão de fala em texto, a ação de reconhecimento da Automação de chamadas também dá suporte ao uso de modelos de Fala Personalizadas. Recursos como modelos de Fala Personalizadas podem ser úteis ao criar um aplicativo que precisa escutar palavras complexas as quais os modelos padrão de reconhecimento de fala podem não compreender. Um exemplo é quando você está criando um aplicativo para o setor da telemedicina e seu agente virtual precisa ter a habilidade de reconhecer termos médicos. Saiba mais em Criar um projeto de Fala Personalizada.

Opções de conversão de fala em texto

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);

Conversão de Fala em Texto

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);

Conversão de fala em texto ou 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); 

Observação

Se os parâmetros não forem definidos, os padrões serão aplicados sempre que possível.

Como receber atualizações de eventos de reconhecimento

Os desenvolvedores podem se inscrever em eventos RecognizeCompleted e RecognizeFailed no retorno de chamada de webhook registrado. Use esse retorno de chamada com lógica de negócios em seu aplicativo para determinar as próximas etapas quando um dos eventos ocorrer.

Exemplo de como você pode desserializar o evento 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; 
    } 
} 

Exemplo de como você pode desserializar o evento 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); 
    } 
} 

Exemplo de como você pode desserializar o evento 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);
        }

Pré-requisitos

Para recursos de IA

Especificações técnicas

Os seguintes parâmetros estão disponíveis para personalizar a função Recognize:

Parâmetro Tipo Padrão (se não especificado) Descrição Obrigatória ou opcional
Prompt

(Para obter detalhes, consulte Personalizar comandos de voz para usuários com a ação de Executar)
FileSource, TextSource Não definido A mensagem a ser reproduzida antes de reconhecer a entrada. Opcional
InterToneTimeout TimeSpan 2 segundos

Mínimo: 1 segundo
Máximo: 60 segundos
Limite em segundos que os Serviços de Comunicação do Azure esperam para que o chamador pressione outro dígito (tempo limite entre dígitos). Opcional
InitialSegmentationSilenceTimeoutInSeconds Inteiro 0,5 segundo Quanto tempo a ação de reconhecimento espera pela entrada antes de considerá-la um tempo limite. Consulte Como reconhecer a fala. Opcional
RecognizeInputsType Enum dtmf Tipo de entrada reconhecida. As opções são dtmf, choices, speech e speechordtmf. Obrigatório
InitialSilenceTimeout TimeSpan 5 segundos

Mínimo: 0 segundo
Máximo: 300 segundos (DTMF)
Máximo: 20 segundos (Opções)
Máximo: 20 segundos (Fala)
OTempo limite de silêncio inicial ajusta a quantidade de áudio sem fala permitido antes que uma frase antes da tentativa de reconhecimento termine em um resultado "sem correspondência". Consulte Como reconhecer a fala. Opcional
MaxTonesToCollect Inteiro Nenhum padrão

Mínimo: 1
Número de dígitos que um desenvolvedor espera como entrada do participante. Obrigatório
StopTones IEnumeration<DtmfTone> Não definido Os participantes de dígito podem pressionar um dígito para sair de um evento DTMF em lote. Opcional
InterruptPrompt Bool Verdadeiro Se o participante tiver a capacidade de interromper a playMessage pressionando um dígito. Opcional
InterruptCallMediaOperation Bool Verdadeiro Se esse sinalizador for definido, ele interromperá a operação de mídia da chamada atual. Por exemplo, se algum áudio estiver sendo reproduzido, ele interromperá essa operação e iniciará o reconhecimento. Opcional
OperationContext String Não definido Cadeia de caracteres que os desenvolvedores podem transmitir no meio da ação. Útil para permitir que os desenvolvedores armazenem o contexto sobre os eventos recebidos. Opcional
Phrases String Não definido Lista de frases que associam ao rótulo. Ouvir qualquer uma dessas frases resulta em um reconhecimento bem-sucedido. Obrigatório
Tone String Não definido O tom a ser reconhecido se o usuário decidir pressionar um número em vez de usar a fala. Opcional
Label String Não definido O valor da chave para o reconhecimento. Obrigatório
Language String En-us O idioma usado para o reconhecimento de fala. Opcional
EndSilenceTimeout TimeSpan 0,5 segundo A pausa final do alto-falante usada para detectar o resultado final que é gerado como fala. Opcional

Observação

Em situações em que a DTMF e Fala estão no recognizeInputsType, a ação de reconhecimento atua no primeiro tipo de entrada recebido. Por exemplo, se o usuário pressionar um número de teclado primeiro, a ação de reconhecimento considerará um evento de DTMF e continuará escutando tons da DTMF. Se o usuário falar primeiro, a ação de reconhecimento considerará isso um evento de reconhecimento de fala e ouvirá a entrada de voz.

Criar um aplicativo Java

Em seu terminal ou janela de comando, navegue até o diretório no qual você deseja criar o seu aplicativo Java. Execute o comando mvn para gerar o projeto Java a partir do modelo maven-archetype-quickstart.

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

O comando mvn cria um diretório com o mesmo nome que o argumento artifactId. O diretório src/main/java contém o código-fonte do projeto. O diretório src/test/java contém a origem do teste.

Observe que a etapa generate criou um diretório com o mesmo nome que o artifactId. O diretório src/main/java contém o código-fonte. O diretório src/test/java contém testes. O arquivo pom.xml é o POM (Project Object Model) do projeto.

Atualize o arquivo POM dos seus aplicativos para usar o Java 8 ou superior.

<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>

Adicionar referências do pacote

No arquivo POM, adicione a referência a seguir ao projeto:

azure-communication-callautomation

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

Estabelecer uma chamada

A essa altura, é necessário estar familiarizado com as chamadas iniciais. Para obter mais informações sobre como fazer uma chamada, consulte Início Rápido: fazer e chamar de saída. Você também pode usar o trecho de código fornecido aqui para entender como atender a uma chamada.

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();

Chamar a ação de reconhecimento

Quando o seu aplicativo atende à chamada, você pode fornecer informações sobre como reconhecer a entrada do participante e reproduzir um prompt.

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()); 

Para fluxos de conversão de fala em texto, a ação de reconhecimento da Automação de chamadas também dá suporte ao uso de modelos de Fala Personalizadas. Recursos como modelos de Fala Personalizadas podem ser úteis ao criar um aplicativo que precisa escutar palavras complexas as quais os modelos padrão de reconhecimento de fala podem não compreender. Um exemplo é quando você está criando um aplicativo para o setor da telemedicina e seu agente virtual precisa ter a habilidade de reconhecer termos médicos. Saiba mais em Criar um projeto de Fala Personalizada.

Opções de conversão de fala em texto

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();

Conversão de Fala em Texto

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(); 

Conversão de fala em texto ou 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(); 

Observação

Se os parâmetros não forem definidos, os padrões serão aplicados sempre que possível.

Como receber atualizações de eventos de reconhecimento

Os desenvolvedores podem se inscrever em eventos RecognizeCompleted e RecognizeFailed no retorno de chamada de webhook registrado. Use esse retorno de chamada com lógica de negócios em seu aplicativo para determinar as próximas etapas quando um dos eventos ocorrer.

Exemplo de como você pode desserializar o evento 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()); 
    } 
} 

Exemplo de como você pode desserializar o evento 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()); 
    } 
} 

Exemplo de como você pode desserializar o evento RecognizeCanceled:

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

Pré-requisitos

Para recursos de IA

Especificações técnicas

Os seguintes parâmetros estão disponíveis para personalizar a função Recognize:

Parâmetro Tipo Padrão (se não especificado) Descrição Obrigatória ou opcional
Prompt

(Para obter detalhes, consulte Personalizar comandos de voz para usuários com a ação de Executar)
FileSource, TextSource Não definido A mensagem a ser reproduzida antes de reconhecer a entrada. Opcional
InterToneTimeout TimeSpan 2 segundos

Mínimo: 1 segundo
Máximo: 60 segundos
Limite em segundos que os Serviços de Comunicação do Azure esperam para que o chamador pressione outro dígito (tempo limite entre dígitos). Opcional
InitialSegmentationSilenceTimeoutInSeconds Inteiro 0,5 segundo Quanto tempo a ação de reconhecimento espera pela entrada antes de considerá-la um tempo limite. Consulte Como reconhecer a fala. Opcional
RecognizeInputsType Enum dtmf Tipo de entrada reconhecida. As opções são dtmf, choices, speech e speechordtmf. Obrigatório
InitialSilenceTimeout TimeSpan 5 segundos

Mínimo: 0 segundo
Máximo: 300 segundos (DTMF)
Máximo: 20 segundos (Opções)
Máximo: 20 segundos (Fala)
OTempo limite de silêncio inicial ajusta a quantidade de áudio sem fala permitido antes que uma frase antes da tentativa de reconhecimento termine em um resultado "sem correspondência". Consulte Como reconhecer a fala. Opcional
MaxTonesToCollect Inteiro Nenhum padrão

Mínimo: 1
Número de dígitos que um desenvolvedor espera como entrada do participante. Obrigatório
StopTones IEnumeration<DtmfTone> Não definido Os participantes de dígito podem pressionar um dígito para sair de um evento DTMF em lote. Opcional
InterruptPrompt Bool Verdadeiro Se o participante tiver a capacidade de interromper a playMessage pressionando um dígito. Opcional
InterruptCallMediaOperation Bool Verdadeiro Se esse sinalizador for definido, ele interromperá a operação de mídia da chamada atual. Por exemplo, se algum áudio estiver sendo reproduzido, ele interromperá essa operação e iniciará o reconhecimento. Opcional
OperationContext String Não definido Cadeia de caracteres que os desenvolvedores podem transmitir no meio da ação. Útil para permitir que os desenvolvedores armazenem o contexto sobre os eventos recebidos. Opcional
Phrases String Não definido Lista de frases que associam ao rótulo. Ouvir qualquer uma dessas frases resulta em um reconhecimento bem-sucedido. Obrigatório
Tone String Não definido O tom a ser reconhecido se o usuário decidir pressionar um número em vez de usar a fala. Opcional
Label String Não definido O valor da chave para o reconhecimento. Obrigatório
Language String En-us O idioma usado para o reconhecimento de fala. Opcional
EndSilenceTimeout TimeSpan 0,5 segundo A pausa final do alto-falante usada para detectar o resultado final que é gerado como fala. Opcional

Observação

Em situações em que a DTMF e Fala estão no recognizeInputsType, a ação de reconhecimento atua no primeiro tipo de entrada recebido. Por exemplo, se o usuário pressionar um número de teclado primeiro, a ação de reconhecimento considerará um evento de DTMF e continuará escutando tons da DTMF. Se o usuário falar primeiro, a ação de reconhecimento considerará isso um evento de reconhecimento de fala e ouvirá a entrada de voz.

Criar um aplicativo JavaScript

Crie um novo aplicativo JavaScript no diretório do seu projeto. Inicialize um novo projeto Node.js com o comando a seguir. Isso cria um arquivo package.json para seu projeto, que gerencia as dependências do projeto.

npm init -y

Instale o pacote de Automação de Chamadas dos Serviços de Comunicação do Azure

npm install @azure/communication-call-automation

Crie um novo arquivo JavaScript no diretório do seu projeto, por exemplo, nomeie-o app.js. Grave seu código JavaScript nesse arquivo.

Execute seu aplicativo usando o Node.js com o seguinte comando.

node app.js

Estabelecer uma chamada

A essa altura, é necessário estar familiarizado com as chamadas iniciais. Para obter mais informações sobre como fazer uma chamada, consulte Início Rápido: fazer e chamar de saída.

Chamar a ação de reconhecimento

Quando o seu aplicativo atende à chamada, você pode fornecer informações sobre como reconhecer a entrada do participante e reproduzir um prompt.

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); 

Para fluxos de conversão de fala em texto, a ação de reconhecimento da Automação de chamadas também dá suporte ao uso de modelos de Fala Personalizadas. Recursos como modelos de Fala Personalizadas podem ser úteis ao criar um aplicativo que precisa escutar palavras complexas as quais os modelos padrão de reconhecimento de fala podem não compreender. Um exemplo é quando você está criando um aplicativo para o setor da telemedicina e seu agente virtual precisa ter a habilidade de reconhecer termos médicos. Saiba mais em Criar um projeto de Fala Personalizada.

Opções de conversão de fala em texto

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); 

Conversão de Fala em Texto

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); 

Conversão de fala em texto ou 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); 

Observação

Se os parâmetros não forem definidos, os padrões serão aplicados sempre que possível.

Como receber atualizações de eventos de reconhecimento

Os desenvolvedores podem se inscrever em eventos RecognizeCompleted e RecognizeFailed no retorno de chamada de webhook registrado. Use esse retorno de chamada com lógica de negócios em seu aplicativo para determinar as próximas etapas quando um dos eventos ocorrer.

Exemplo de como você pode desserializar o evento 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)); 
    } 
} 

Exemplo de como você pode desserializar o evento RecognizeFailed:

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

Exemplo de como você pode desserializar o evento RecognizeCanceled:

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

Pré-requisitos

Para recursos de IA

Especificações técnicas

Os seguintes parâmetros estão disponíveis para personalizar a função Recognize:

Parâmetro Tipo Padrão (se não especificado) Descrição Obrigatória ou opcional
Prompt

(Para obter detalhes, consulte Personalizar comandos de voz para usuários com a ação de Executar)
FileSource, TextSource Não definido A mensagem a ser reproduzida antes de reconhecer a entrada. Opcional
InterToneTimeout TimeSpan 2 segundos

Mínimo: 1 segundo
Máximo: 60 segundos
Limite em segundos que os Serviços de Comunicação do Azure esperam para que o chamador pressione outro dígito (tempo limite entre dígitos). Opcional
InitialSegmentationSilenceTimeoutInSeconds Inteiro 0,5 segundo Quanto tempo a ação de reconhecimento espera pela entrada antes de considerá-la um tempo limite. Consulte Como reconhecer a fala. Opcional
RecognizeInputsType Enum dtmf Tipo de entrada reconhecida. As opções são dtmf, choices, speech e speechordtmf. Obrigatório
InitialSilenceTimeout TimeSpan 5 segundos

Mínimo: 0 segundo
Máximo: 300 segundos (DTMF)
Máximo: 20 segundos (Opções)
Máximo: 20 segundos (Fala)
OTempo limite de silêncio inicial ajusta a quantidade de áudio sem fala permitido antes que uma frase antes da tentativa de reconhecimento termine em um resultado "sem correspondência". Consulte Como reconhecer a fala. Opcional
MaxTonesToCollect Inteiro Nenhum padrão

Mínimo: 1
Número de dígitos que um desenvolvedor espera como entrada do participante. Obrigatório
StopTones IEnumeration<DtmfTone> Não definido Os participantes de dígito podem pressionar um dígito para sair de um evento DTMF em lote. Opcional
InterruptPrompt Bool Verdadeiro Se o participante tiver a capacidade de interromper a playMessage pressionando um dígito. Opcional
InterruptCallMediaOperation Bool Verdadeiro Se esse sinalizador for definido, ele interromperá a operação de mídia da chamada atual. Por exemplo, se algum áudio estiver sendo reproduzido, ele interromperá essa operação e iniciará o reconhecimento. Opcional
OperationContext String Não definido Cadeia de caracteres que os desenvolvedores podem transmitir no meio da ação. Útil para permitir que os desenvolvedores armazenem o contexto sobre os eventos recebidos. Opcional
Phrases String Não definido Lista de frases que associam ao rótulo. Ouvir qualquer uma dessas frases resulta em um reconhecimento bem-sucedido. Obrigatório
Tone String Não definido O tom a ser reconhecido se o usuário decidir pressionar um número em vez de usar a fala. Opcional
Label String Não definido O valor da chave para o reconhecimento. Obrigatório
Language String En-us O idioma usado para o reconhecimento de fala. Opcional
EndSilenceTimeout TimeSpan 0,5 segundo A pausa final do alto-falante usada para detectar o resultado final que é gerado como fala. Opcional

Observação

Em situações em que a DTMF e Fala estão no recognizeInputsType, a ação de reconhecimento atua no primeiro tipo de entrada recebido. Por exemplo, se o usuário pressionar um número de teclado primeiro, a ação de reconhecimento considerará um evento de DTMF e continuará escutando tons da DTMF. Se o usuário falar primeiro, a ação de reconhecimento considerará isso um evento de reconhecimento de fala e ouvirá a entrada de voz.

Criar um novo aplicativo Python

Configurar um ambiente virtual Python para seu projeto

python -m venv play-audio-app

Ativar seu ambiente virtual

No Windows, use o seguinte comando:

.\ play-audio-quickstart \Scripts\activate

No Unix, use o seguinte comando:

source play-audio-quickstart /bin/activate

Instale o pacote de Automação de Chamadas dos Serviços de Comunicação do Azure

pip install azure-communication-callautomation

Crie seu arquivo de aplicativo no diretório do projeto, por exemplo, nomeie-o app.py. Grave seu código Python nesse arquivo.

Execute seu aplicativo usando Python com o seguinte comando.

python app.py

Estabelecer uma chamada

A essa altura, é necessário estar familiarizado com as chamadas iniciais. Para obter mais informações sobre como fazer uma chamada, consulte Início Rápido: fazer e chamar de saída.

Chamar a ação de reconhecimento

Quando o seu aplicativo atende à chamada, você pode fornecer informações sobre como reconhecer a entrada do participante e reproduzir um prompt.

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 ]) 

Para fluxos de conversão de fala em texto, a ação de reconhecimento da Automação de chamadas também dá suporte ao uso de modelos de Fala Personalizadas. Recursos como modelos de Fala Personalizadas podem ser úteis ao criar um aplicativo que precisa escutar palavras complexas as quais os modelos padrão de reconhecimento de fala podem não compreender. Um exemplo é quando você está criando um aplicativo para o setor da telemedicina e seu agente virtual precisa ter a habilidade de reconhecer termos médicos. Saiba mais em Criar um projeto de Fala Personalizada.

Opções de conversão de fala em texto

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")  

Conversão de Fala em Texto

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") 

Conversão de fala em texto ou 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") 

Observação

Se os parâmetros não forem definidos, os padrões serão aplicados sempre que possível.

Como receber atualizações de eventos de reconhecimento

Os desenvolvedores podem se inscrever em eventos RecognizeCompleted e RecognizeFailed no retorno de chamada de webhook registrado. Use esse retorno de chamada com lógica de negócios em seu aplicativo para determinar as próximas etapas quando um dos eventos ocorrer.

Exemplo de como você pode desserializar o evento 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); 

Exemplo de como você pode desserializar o evento RecognizeFailed:

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

Exemplo de como você pode desserializar o evento RecognizeCanceled:

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

Códigos de evento

Status Código Subcódigo Mensagem
RecognizeCompleted 200 8531 Ação concluída. Número máximo de dígitos recebidos.
RecognizeCompleted 200 8514 Ação concluída, pois o tom de parada foi detectado.
RecognizeCompleted 400 8508 Falha na ação, pois a operação foi cancelada.
RecognizeCompleted 400 8532 Falha na ação. Tempo limite de silêncio entre dígitos atingido.
RecognizeCanceled 400 8508 Falha na ação, pois a operação foi cancelada.
RecognizeFailed 400 8510 Falha na ação, o tempo limite de silêncio inicial foi atingido.
RecognizeFailed 500 8511 Falha na ação. Falha na tentativa de reproduzir o prompt.
RecognizeFailed 500 8512 Erro interno desconhecido do servidor.
RecognizeFailed 400 8510 Falha na ação. Tempo limite de silêncio inicial atingido
RecognizeFailed 400 8532 Falha na ação. Tempo limite de silêncio entre dígitos atingido.
RecognizeFailed 400 8565 Falha na ação, solicitação incorreta para os serviços de IA do Azure. Verifique os parâmetros de entrada.
RecognizeFailed 400 8565 Falha na ação, solicitação incorreta para os serviços de IA do Azure. Não foi possível processar o payload fornecido, verifique a entrada de origem da reprodução.
RecognizeFailed 401 8565 Falha na ação, erro de autenticação dos serviços de IA do Azure.
RecognizeFailed 403 8565 Falha na ação, solicitação proibida para os serviços de IA do Azure, a assinatura gratuita usada pela solicitação esgotou a cota.
RecognizeFailed 429 8565 Falha na ação, as solicitações excederam o número de solicitações simultâneas permitidas para a assinatura dos serviços de IA do Azure.
RecognizeFailed 408 8565 Falha na ação, a solicitação para os serviços de IA do Azure atingiu o tempo limite.
RecognizeFailed 500 8511 Falha na ação. Falha na tentativa de reproduzir o prompt.
RecognizeFailed 500 8512 Erro interno desconhecido do servidor.

Limitações conhecidas

  • Não há suporte para a DTMF em banda. Em vez disso, use a DTMF RFC 2833.
  • Os prompts de texto de Conversão de Texto em Fala dão suporte a no máximo 400 caracteres. Se o prompt for maior do que isso, sugerimos o uso de SSML para ações de reprodução baseadas em Conversão de Texto em Fala.
  • Para cenários em que você excede o limite de cota do serviço de Fala, é possível solicitar o aumento desse limite seguindo as etapas descritas em Cotas e limites dos serviços de Fala.

Limpar os recursos

Se quiser limpar e remover uma assinatura dos Serviços de Comunicação, exclua o recurso ou o grupo de recursos. Excluir o grupo de recursos também exclui todos os recursos associados a ele. Saiba mais sobre como limpar recursos.

Próximas etapas