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
- Cuenta de Azure con una suscripción activa; para más información, consulte Creación de una cuenta gratuita.
- Un recurso de Azure Communication Services. Consulte Creación de un recurso de Azure Communication Services. Anote la cadena de conexión de este recurso.
- Cree una nueva aplicación de servicio web mediante el SDK de automatización de llamadas.
- La biblioteca de .NET más reciente para el sistema operativo.
- El último paquete NuGet.
Para las características de IA
- Crea y conecta los servicios de Azure AI al recurso de Azure Communication Services.
- Crea un subdominio personalizado para el recurso de servicios de Azure AI.
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
- Cuenta de Azure con una suscripción activa; para más información, consulte Creación de una cuenta gratuita.
- Un recurso de Azure Communication Services. Consulte Creación de un recurso de Azure Communication Services
- Cree una nueva aplicación de servicio web mediante el SDK de automatización de llamadas.
- Kit de desarrollo de Java, versión 8 o posterior.
- Apache Maven.
Para las características de IA
- Crea y conecta los servicios de Azure AI al recurso de Azure Communication Services.
- Crea un subdominio personalizado para el recurso de servicios de Azure AI.
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
- Cuenta de Azure con una suscripción activa: consulte Crear una cuenta gratuita.
- Un recurso de Azure Communication Services. Consulte Creación de un recurso de Azure Communication Services. Anote la cadena de conexión de este recurso.
- Cree una nueva aplicación de servicio web mediante el SDK de automatización de llamadas.
- Tener Node.js instalado, puedes instalarlo desde su sitio web oficial.
Para las características de IA
- Crea y conecta los servicios de Azure AI al recurso de Azure Communication Services.
- Crea un subdominio personalizado para el recurso de servicios de Azure AI.
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
- Cuenta de Azure con una suscripción activa: consulte Crear una cuenta gratuita.
- Un recurso de Azure Communication Services. Consulte Creación de un recurso de Azure Communication Services. Anote la cadena de conexión de este recurso.
- Cree una nueva aplicación de servicio web mediante el SDK de automatización de llamadas.
- Instale Python desde python.org.
Para las características de IA
- Crea y conecta los servicios de Azure AI al recurso de Azure Communication Services.
- Crea un subdominio personalizado para el recurso de servicios de Azure AI.
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
- Más información sobre la Recopilación de entradas de usuario
- Más información sobre la Reproducción de audio en la llamada
- Más información sobre la automatización de llamadas