Compartir vía


Recopilación de entradas de usuario con la acción Reconocer

Esta guía le ayuda a empezar a reconocer la entrada DTMF proporcionada por los participantes a través del SDK de Automatización de llamadas de Azure Communication Services.

Requisitos previos

Para las características de IA

Especificaciones técnicas

Los parámetros siguientes están disponibles para personalizar la función Recognize:

Parámetro Tipo Valor predeterminado (si no se especifica) Descripción Requerido u Opcional
Prompt

(Para más información, consulte Personalización de indicaciones de voz para los usuarios con la acción Reproducir).
FileSource, TextSource Sin establecer Mensaje que se va a reproducir antes de reconocer la entrada. Opcionales
InterToneTimeout TimeSpan 2 segundos

Min: 1 segundo
Máximo: 60 segundos
Limite en segundos que Azure Communication Services espera a que el autor de la llamada presione otro dígito (tiempo de espera entre dígitos). Opcional
InitialSegmentationSilenceTimeoutInSeconds Entero 0.5 segundos Cuánto tiempo espera la acción de reconocimiento para la entrada antes de considerarlo un tiempo de espera. Consulte Reconocimiento de voz. Opcionales
RecognizeInputsType Enum dtmf Tipo de entrada que se reconoce. Las opciones son dtmf, choices, speech y speechordtmf. Obligatorio
InitialSilenceTimeout TimeSpan 5 segundos

Min: 0 segundos
Máximo: 300 segundos (DTMF)
Máximo: 20 segundos (opciones)
Máximo: 20 segundos (voz)
El tiempo de espera de silencio inicial ajusta la cantidad de audio que no es de voz permitida antes de una frase antes de que el intento de reconocimiento termine en un resultado "sin coincidencia". Consulte Reconocimiento de voz. Opcional
MaxTonesToCollect Entero Sin valor predeterminado

Min: 1
Número de dígitos que un desarrollador espera como entrada del participante. Obligatorio
StopTones IEnumeration<DtmfTone> Sin establecer Los participantes de dígitos pueden presionar para escapar de un evento DTMF por lotes. Opcionales
InterruptPrompt Bool True Si el participante tiene la capacidad de interrumpir el playMessage presionando un dígito. Opcionales
InterruptCallMediaOperation Bool True Si se establece esta marca, se interrumpe la operación multimedia de llamada actual. Por ejemplo, si se reproduce algún audio, se interrumpe esa operación y se inicia el reconocimiento. Opcionales
OperationContext String Sin establecer Cadena que los desarrolladores pueden pasar la acción intermedia, útil para permitir que los desarrolladores almacenen contexto sobre los eventos que reciben. Opcionales
Phrases String Sin establecer Lista de frases que se asocian a la etiqueta. Escuchar cualquiera de estas frases da como resultado un reconocimiento correcto. Obligatorio
Tone Cadena Sin establecer Tono que se debe reconocer si el usuario decide presionar un número en lugar de usar la voz. Opcionales
Label String Sin establecer Valor clave para el reconocimiento. Obligatorio
Language Cadena En-us Idioma que se usa para el reconocimiento de la voz. Opcionales
EndSilenceTimeout TimeSpan 0.5 segundos La pausa final del hablante usada para detectar el resultado final que se genera como voz. Opcionales

Nota:

En situaciones en las que tanto DTMF como la voz están en recognizeInputsType, la acción de reconocimiento actúa en el primer tipo de entrada recibido. Por ejemplo, si el usuario presiona primero un número del teclado, la acción de reconocimiento lo considera un evento DTMF y continúa escuchando los tonos DTMF. Si el usuario habla primero, la acción de reconocimiento considera que es un evento de reconocimiento de voz y escucha la entrada de voz.

Creación de una aplicación de C#

En la ventana de consola del sistema operativo, use el comando dotnet para crear una aplicación web.

dotnet new web -n MyApplication

Instalación del paquete NuGet.

Obtención del paquete NuGet de la Galería de NuGet | Azure.Communication.CallAutomation. Siga estas instrucciones para instalar el paquete.

Establecimiento de una llamada

En este punto debe estar familiarizado con el inicio de llamadas. Para más información sobre cómo realizar una llamada, consulte Inicio rápido: Realización de una llamada saliente. También puedes usar el fragmento de código proporcionado aquí para comprender cómo responder a una llamada.

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

Llamada a la acción de reconocimiento

Cuando la aplicación responde a la llamada, puede proporcionar información sobre cómo reconocer la entrada del participante y reproducir un mensaje.

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

En el caso de los flujos de conversión de voz en texto, la acción de reconocimiento de automatización de llamadas también admite el uso de modelos de voz personalizados. Las características como los modelos de voz personalizados pueden ser útiles cuando se crea una aplicación que necesita escuchar palabras complejas que los modelos de conversión de voz en texto predeterminados pueden no comprender. Un ejemplo es cuando se está creando una aplicación para el sector de telemedicina y el agente virtual tiene que ser capaz de reconocer términos médicos. Puede obtener más información en Creación de un proyecto de voz personalizado.

Opciones de conversión de voz en 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);

Speech-to-Text

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

Conversión de voz en texto o 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); 

Nota:

Si no se establecen parámetros, los valores predeterminados se aplican siempre que sea posible.

Recepción de actualizaciones de eventos de reconocimiento

Los desarrolladores pueden suscribirse a los eventos RecognizeCompleted y RecognizeFailed en la devolución de llamada del webhook registrado. Utilice esta devolución de llamada con lógica de negocios en la aplicación para determinar los pasos siguientes cuando se produzca uno de los eventos.

Ejemplo de cómo se puede deserializar el 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; 
    } 
} 

Ejemplo de cómo se puede deserializar el 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); 
    } 
} 

Ejemplo de cómo se puede deserializar el 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);
        }

Requisitos previos

Para las características de IA

Especificaciones técnicas

Los parámetros siguientes están disponibles para personalizar la función Recognize:

Parámetro Tipo Valor predeterminado (si no se especifica) Descripción Requerido u Opcional
Prompt

(Para más información, consulte Personalización de indicaciones de voz para los usuarios con la acción Reproducir).
FileSource, TextSource Sin establecer Mensaje que se va a reproducir antes de reconocer la entrada. Opcionales
InterToneTimeout TimeSpan 2 segundos

Min: 1 segundo
Máximo: 60 segundos
Limite en segundos que Azure Communication Services espera a que el autor de la llamada presione otro dígito (tiempo de espera entre dígitos). Opcional
InitialSegmentationSilenceTimeoutInSeconds Entero 0.5 segundos Cuánto tiempo espera la acción de reconocimiento para la entrada antes de considerarlo un tiempo de espera. Consulte Reconocimiento de voz. Opcionales
RecognizeInputsType Enum dtmf Tipo de entrada que se reconoce. Las opciones son dtmf, choices, speech y speechordtmf. Obligatorio
InitialSilenceTimeout TimeSpan 5 segundos

Min: 0 segundos
Máximo: 300 segundos (DTMF)
Máximo: 20 segundos (opciones)
Máximo: 20 segundos (voz)
El tiempo de espera de silencio inicial ajusta la cantidad de audio que no es de voz permitida antes de una frase antes de que el intento de reconocimiento termine en un resultado "sin coincidencia". Consulte Reconocimiento de voz. Opcional
MaxTonesToCollect Entero Sin valor predeterminado

Min: 1
Número de dígitos que un desarrollador espera como entrada del participante. Obligatorio
StopTones IEnumeration<DtmfTone> Sin establecer Los participantes de dígitos pueden presionar para escapar de un evento DTMF por lotes. Opcionales
InterruptPrompt Bool True Si el participante tiene la capacidad de interrumpir el playMessage presionando un dígito. Opcionales
InterruptCallMediaOperation Bool True Si se establece esta marca, se interrumpe la operación multimedia de llamada actual. Por ejemplo, si se reproduce algún audio, se interrumpe esa operación y se inicia el reconocimiento. Opcionales
OperationContext String Sin establecer Cadena que los desarrolladores pueden pasar la acción intermedia, útil para permitir que los desarrolladores almacenen contexto sobre los eventos que reciben. Opcionales
Phrases String Sin establecer Lista de frases que se asocian a la etiqueta. Escuchar cualquiera de estas frases da como resultado un reconocimiento correcto. Obligatorio
Tone Cadena Sin establecer Tono que se debe reconocer si el usuario decide presionar un número en lugar de usar la voz. Opcionales
Label String Sin establecer Valor clave para el reconocimiento. Obligatorio
Language Cadena En-us Idioma que se usa para el reconocimiento de la voz. Opcionales
EndSilenceTimeout TimeSpan 0.5 segundos La pausa final del hablante usada para detectar el resultado final que se genera como voz. Opcionales

Nota:

En situaciones en las que tanto DTMF como la voz están en recognizeInputsType, la acción de reconocimiento actúa en el primer tipo de entrada recibido. Por ejemplo, si el usuario presiona primero un número del teclado, la acción de reconocimiento lo considera un evento DTMF y continúa escuchando los tonos DTMF. Si el usuario habla primero, la acción de reconocimiento considera que es un evento de reconocimiento de voz y escucha la entrada de voz.

Creación de una aplicación Java

En la ventana de terminal o de comandos, navegue hasta el directorio en el que quiere crear la aplicación de Java. Ejecuta el comando mvn para generar el proyecto de Java a partir de la plantilla maven-archetype-quickstart.

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

El comando mvn crea un directorio con el mismo nombre que el argumento artifactId. El directorio src/main/java contiene el código fuente del proyecto. El directorio src/test/java contiene el origen de prueba.

Observará que el paso generate ha creado un directorio con el mismo nombre que artifactId. El directorio src/main/java contiene código fuente. El directorio src/test/java contiene pruebas. El archivo pom.xml es el modelo de objetos de proyecto (POM) del proyecto.

Actualice el archivo POM de la aplicación para usar Java 8 o posterior.

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

Incorporación de referencias de paquete

En el archivo POM, agregue la siguiente referencia para el proyecto:

azure-communication-callautomation

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

Establecimiento de una llamada

En este punto debe estar familiarizado con el inicio de llamadas. Para más información sobre cómo realizar una llamada, consulte Inicio rápido: Realización de una llamada saliente. También puedes usar el fragmento de código proporcionado aquí para comprender cómo responder a una llamada.

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

Llamada a la acción de reconocimiento

Cuando la aplicación responde a la llamada, puede proporcionar información sobre cómo reconocer la entrada del participante y reproducir un mensaje.

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

En el caso de los flujos de conversión de voz en texto, la acción de reconocimiento de automatización de llamadas también admite el uso de modelos de voz personalizados. Las características como los modelos de voz personalizados pueden ser útiles cuando se crea una aplicación que necesita escuchar palabras complejas que los modelos de conversión de voz en texto predeterminados pueden no comprender. Un ejemplo es cuando se está creando una aplicación para el sector de telemedicina y el agente virtual tiene que ser capaz de reconocer términos médicos. Puede obtener más información en Creación de un proyecto de voz personalizado.

Opciones de conversión de voz en 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();

Speech-to-Text

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

Conversión de voz en texto o 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(); 

Nota:

Si no se establecen parámetros, los valores predeterminados se aplican siempre que sea posible.

Recepción de actualizaciones de eventos de reconocimiento

Los desarrolladores pueden suscribirse a los eventos RecognizeCompleted y RecognizeFailed en la devolución de llamada del webhook registrado. Utilice esta devolución de llamada con lógica de negocios en la aplicación para determinar los pasos siguientes cuando se produzca uno de los eventos.

Ejemplo de cómo se puede deserializar el 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()); 
    } 
} 

Ejemplo de cómo se puede deserializar el 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()); 
    } 
} 

Ejemplo de cómo se puede deserializar el evento RecognizeCanceled:

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

Requisitos previos

Para las características de IA

Especificaciones técnicas

Los parámetros siguientes están disponibles para personalizar la función Recognize:

Parámetro Tipo Valor predeterminado (si no se especifica) Descripción Requerido u Opcional
Prompt

(Para más información, consulte Personalización de indicaciones de voz para los usuarios con la acción Reproducir).
FileSource, TextSource Sin establecer Mensaje que se va a reproducir antes de reconocer la entrada. Opcionales
InterToneTimeout TimeSpan 2 segundos

Min: 1 segundo
Máximo: 60 segundos
Limite en segundos que Azure Communication Services espera a que el autor de la llamada presione otro dígito (tiempo de espera entre dígitos). Opcional
InitialSegmentationSilenceTimeoutInSeconds Entero 0.5 segundos Cuánto tiempo espera la acción de reconocimiento para la entrada antes de considerarlo un tiempo de espera. Consulte Reconocimiento de voz. Opcionales
RecognizeInputsType Enum dtmf Tipo de entrada que se reconoce. Las opciones son dtmf, choices, speech y speechordtmf. Obligatorio
InitialSilenceTimeout TimeSpan 5 segundos

Min: 0 segundos
Máximo: 300 segundos (DTMF)
Máximo: 20 segundos (opciones)
Máximo: 20 segundos (voz)
El tiempo de espera de silencio inicial ajusta la cantidad de audio que no es de voz permitida antes de una frase antes de que el intento de reconocimiento termine en un resultado "sin coincidencia". Consulte Reconocimiento de voz. Opcional
MaxTonesToCollect Entero Sin valor predeterminado

Min: 1
Número de dígitos que un desarrollador espera como entrada del participante. Obligatorio
StopTones IEnumeration<DtmfTone> Sin establecer Los participantes de dígitos pueden presionar para escapar de un evento DTMF por lotes. Opcionales
InterruptPrompt Bool True Si el participante tiene la capacidad de interrumpir el playMessage presionando un dígito. Opcionales
InterruptCallMediaOperation Bool True Si se establece esta marca, se interrumpe la operación multimedia de llamada actual. Por ejemplo, si se reproduce algún audio, se interrumpe esa operación y se inicia el reconocimiento. Opcionales
OperationContext String Sin establecer Cadena que los desarrolladores pueden pasar la acción intermedia, útil para permitir que los desarrolladores almacenen contexto sobre los eventos que reciben. Opcionales
Phrases String Sin establecer Lista de frases que se asocian a la etiqueta. Escuchar cualquiera de estas frases da como resultado un reconocimiento correcto. Obligatorio
Tone Cadena Sin establecer Tono que se debe reconocer si el usuario decide presionar un número en lugar de usar la voz. Opcionales
Label String Sin establecer Valor clave para el reconocimiento. Obligatorio
Language Cadena En-us Idioma que se usa para el reconocimiento de la voz. Opcionales
EndSilenceTimeout TimeSpan 0.5 segundos La pausa final del hablante usada para detectar el resultado final que se genera como voz. Opcionales

Nota:

En situaciones en las que tanto DTMF como la voz están en recognizeInputsType, la acción de reconocimiento actúa en el primer tipo de entrada recibido. Por ejemplo, si el usuario presiona primero un número del teclado, la acción de reconocimiento lo considera un evento DTMF y continúa escuchando los tonos DTMF. Si el usuario habla primero, la acción de reconocimiento considera que es un evento de reconocimiento de voz y escucha la entrada de voz.

Creación de una aplicación de JavaScript

Crea una nueva aplicación de JavaScript en el directorio del proyecto. Inicia un nuevo proyecto de Node.js con el siguiente comando. Esto crea un archivo package.json para el proyecto, que administra las dependencias del proyecto.

npm init -y

Instalación del paquete de Automatización de llamadas de Azure Communication Services

npm install @azure/communication-call-automation

Crea un nuevo archivo JavaScript en el directorio del proyecto, por ejemplo, asígnale el nombre app.js. Escriba el código JavaScript en este archivo.

Ejecuta la aplicación mediante Node.js con el comando siguiente.

node app.js

Establecimiento de una llamada

En este punto debe estar familiarizado con el inicio de llamadas. Para más información sobre cómo realizar una llamada, consulte Inicio rápido: Realización de una llamada saliente.

Llamada a la acción de reconocimiento

Cuando la aplicación responde a la llamada, puede proporcionar información sobre cómo reconocer la entrada del participante y reproducir un mensaje.

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

En el caso de los flujos de conversión de voz en texto, la acción de reconocimiento de automatización de llamadas también admite el uso de modelos de voz personalizados. Las características como los modelos de voz personalizados pueden ser útiles cuando se crea una aplicación que necesita escuchar palabras complejas que los modelos de conversión de voz en texto predeterminados pueden no comprender. Un ejemplo es cuando se está creando una aplicación para el sector de telemedicina y el agente virtual tiene que ser capaz de reconocer términos médicos. Puede obtener más información en Creación de un proyecto de voz personalizado.

Opciones de conversión de voz en 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); 

Speech-to-Text

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

Conversión de voz en texto o 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); 

Nota:

Si no se establecen parámetros, los valores predeterminados se aplican siempre que sea posible.

Recepción de actualizaciones de eventos de reconocimiento

Los desarrolladores pueden suscribirse a los eventos RecognizeCompleted y RecognizeFailed en la devolución de llamada del webhook registrado. Utilice esta devolución de llamada con lógica de negocios en la aplicación para determinar los pasos siguientes cuando se produzca uno de los eventos.

Ejemplo de cómo se puede deserializar el 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)); 
    } 
} 

Ejemplo de cómo se puede deserializar el evento RecognizeFailed:

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

Ejemplo de cómo se puede deserializar el evento RecognizeCanceled:

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

Requisitos previos

Para las características de IA

Especificaciones técnicas

Los parámetros siguientes están disponibles para personalizar la función Recognize:

Parámetro Tipo Valor predeterminado (si no se especifica) Descripción Requerido u Opcional
Prompt

(Para más información, consulte Personalización de indicaciones de voz para los usuarios con la acción Reproducir).
FileSource, TextSource Sin establecer Mensaje que se va a reproducir antes de reconocer la entrada. Opcionales
InterToneTimeout TimeSpan 2 segundos

Min: 1 segundo
Máximo: 60 segundos
Limite en segundos que Azure Communication Services espera a que el autor de la llamada presione otro dígito (tiempo de espera entre dígitos). Opcional
InitialSegmentationSilenceTimeoutInSeconds Entero 0.5 segundos Cuánto tiempo espera la acción de reconocimiento para la entrada antes de considerarlo un tiempo de espera. Consulte Reconocimiento de voz. Opcionales
RecognizeInputsType Enum dtmf Tipo de entrada que se reconoce. Las opciones son dtmf, choices, speech y speechordtmf. Obligatorio
InitialSilenceTimeout TimeSpan 5 segundos

Min: 0 segundos
Máximo: 300 segundos (DTMF)
Máximo: 20 segundos (opciones)
Máximo: 20 segundos (voz)
El tiempo de espera de silencio inicial ajusta la cantidad de audio que no es de voz permitida antes de una frase antes de que el intento de reconocimiento termine en un resultado "sin coincidencia". Consulte Reconocimiento de voz. Opcional
MaxTonesToCollect Entero Sin valor predeterminado

Min: 1
Número de dígitos que un desarrollador espera como entrada del participante. Obligatorio
StopTones IEnumeration<DtmfTone> Sin establecer Los participantes de dígitos pueden presionar para escapar de un evento DTMF por lotes. Opcionales
InterruptPrompt Bool True Si el participante tiene la capacidad de interrumpir el playMessage presionando un dígito. Opcionales
InterruptCallMediaOperation Bool True Si se establece esta marca, se interrumpe la operación multimedia de llamada actual. Por ejemplo, si se reproduce algún audio, se interrumpe esa operación y se inicia el reconocimiento. Opcionales
OperationContext String Sin establecer Cadena que los desarrolladores pueden pasar la acción intermedia, útil para permitir que los desarrolladores almacenen contexto sobre los eventos que reciben. Opcionales
Phrases String Sin establecer Lista de frases que se asocian a la etiqueta. Escuchar cualquiera de estas frases da como resultado un reconocimiento correcto. Obligatorio
Tone Cadena Sin establecer Tono que se debe reconocer si el usuario decide presionar un número en lugar de usar la voz. Opcionales
Label String Sin establecer Valor clave para el reconocimiento. Obligatorio
Language Cadena En-us Idioma que se usa para el reconocimiento de la voz. Opcionales
EndSilenceTimeout TimeSpan 0.5 segundos La pausa final del hablante usada para detectar el resultado final que se genera como voz. Opcionales

Nota:

En situaciones en las que tanto DTMF como la voz están en recognizeInputsType, la acción de reconocimiento actúa en el primer tipo de entrada recibido. Por ejemplo, si el usuario presiona primero un número del teclado, la acción de reconocimiento lo considera un evento DTMF y continúa escuchando los tonos DTMF. Si el usuario habla primero, la acción de reconocimiento considera que es un evento de reconocimiento de voz y escucha la entrada de voz.

Creación de una nueva aplicación de Python

Configuración de un entorno virtual de Python para el proyecto

python -m venv play-audio-app

Activación del entorno virtual

En Windows, use el siguiente comando:

.\ play-audio-quickstart \Scripts\activate

En Unix, use el comando siguiente:

source play-audio-quickstart /bin/activate

Instalación del paquete de Automatización de llamadas de Azure Communication Services

pip install azure-communication-callautomation

Cree el archivo de aplicación en el directorio del proyecto, por ejemplo, asígnele el nombre app.py. Escriba el código Python en este archivo.

Ejecuta la aplicación mediante Python con el comando siguiente.

python app.py

Establecimiento de una llamada

En este punto debe estar familiarizado con el inicio de llamadas. Para más información sobre cómo realizar una llamada, consulte Inicio rápido: Realización de una llamada saliente.

Llamada a la acción de reconocimiento

Cuando la aplicación responde a la llamada, puede proporcionar información sobre cómo reconocer la entrada del participante y reproducir un mensaje.

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

En el caso de los flujos de conversión de voz en texto, la acción de reconocimiento de automatización de llamadas también admite el uso de modelos de voz personalizados. Las características como los modelos de voz personalizados pueden ser útiles cuando se crea una aplicación que necesita escuchar palabras complejas que los modelos de conversión de voz en texto predeterminados pueden no comprender. Un ejemplo es cuando se está creando una aplicación para el sector de telemedicina y el agente virtual tiene que ser capaz de reconocer términos médicos. Puede obtener más información en Creación de un proyecto de voz personalizado.

Opciones de conversión de voz en 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")  

Speech-to-Text

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

Conversión de voz en texto o 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") 

Nota:

Si no se establecen parámetros, los valores predeterminados se aplican siempre que sea posible.

Recepción de actualizaciones de eventos de reconocimiento

Los desarrolladores pueden suscribirse a los eventos RecognizeCompleted y RecognizeFailed en la devolución de llamada del webhook registrado. Utilice esta devolución de llamada con lógica de negocios en la aplicación para determinar los pasos siguientes cuando se produzca uno de los eventos.

Ejemplo de cómo se puede deserializar el 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); 

Ejemplo de cómo se puede deserializar el evento RecognizeFailed:

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

Ejemplo de cómo se puede deserializar el evento RecognizeCanceled:

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

Códigos de evento

Estado Código SubCode Mensaje
RecognizeCompleted 200 8531 Acción completada, número máximo de dígitos recibidos.
RecognizeCompleted 200 8514 Acción completada a medida que se detectó el tono de detención.
RecognizeCompleted 400 8508 Error de acción, se canceló la operación.
RecognizeCompleted 400 8532 Error de acción: se alcanzó el tiempo de espera de silencio entre dígitos.
RecognizeCanceled 400 8508 Error de acción, se canceló la operación.
RecognizeFailed 400 8510 Ha habido un error, se ha alcanzado el tiempo de espera de silencio inicial.
RecognizeFailed 500 8511 Error de acción al intentar reproducir el símbolo del sistema.
RecognizeFailed 500 8512 Error interno desconocido del servidor.
RecognizeFailed 400 8510 Error de acción, se alcanzó el tiempo de espera de silencio inicial
RecognizeFailed 400 8532 Error de acción: se alcanzó el tiempo de espera de silencio entre dígitos.
RecognizeFailed 400 8565 Ha habido un error, solicitud incorrecta a los servicios de Azure AI. Compruebe los parámetros de entrada.
RecognizeFailed 400 8565 Ha habido un error, solicitud incorrecta a los servicios de Azure AI. No se puede procesar la carga proporcionada, comprueba la entrada de origen de reproducción.
RecognizeFailed 401 8565 Ha habido un error, error de autenticación de los servicios de Azure AI.
RecognizeFailed 403 8565 Ha habido un error, solicitud prohibida a los servicios de Azure AI, la suscripción gratuita usada por la solicitud ha agotado la cuota.
RecognizeFailed 429 8565 Ha habido un error, las solicitudes superaron el número de solicitudes simultáneas permitidas para la suscripción de servicios de Azure AI.
RecognizeFailed 408 8565 Ha habido un error, se agota el tiempo de espera de la solicitud a los servicios de Azure AI.
RecognizeFailed 500 8511 Error de acción al intentar reproducir el símbolo del sistema.
RecognizeFailed 500 8512 Error interno desconocido del servidor.

Restricciones conocidas

  • No se admite DTMF en banda. En su lugar, use RFC 2833 DTMF.
  • Los mensajes de texto a voz admiten un máximo de 400 caracteres, si el mensaje es mayor se recomienda usar SSML para acciones de reproducción basadas en la conversión de texto a voz.
  • En escenarios en los que se supera el límite de cuota del servicio de voz, puede solicitar aumentar este limite siguiendo los pasos descritos en Cuotas y límites del servicio de voz.

Limpieza de recursos

Si quiere limpiar y quitar una suscripción a Communication Services, puede eliminar el recurso o grupo de recursos. Al eliminar el grupo de recursos, también se elimina cualquier otro recurso que esté asociado a él. Obtenga más información sobre la limpieza de recursos.

Pasos siguientes