Collecter les entrées utilisateur avec l’action de reconnaissance

Ce guide vous permet de vous familiariser avec la reconnaissance des entrées DTMF fournies par les participants via le kit SDK Call Automation d’Azure Communication Services.

Prérequis

Pour les fonctionnalités d’intelligence artificielle

Spécifications techniques

Les paramètres suivants sont disponibles pour personnaliser la fonction Recognize :

Paramètre Type Par défaut (si non spécifié) Description Obligatoire ou facultatif
Prompt

(pour plus d’informations sur l’action de lecture, consultez ce guide pratique)
FileSource, TextSource Non défini Il s’agit du message que vous souhaitez lire avant de reconnaître l’entrée. Facultatif
InterToneTimeout TimeSpan 2 secondes

Min : 1 seconde
Max : 60 secondes
Limite de temps en secondes pendant laquelle Azure Communication Services attend que l’appelant appuie sur un autre chiffre (délai d’expiration inter-chiffres). Facultatif
InitialSegmentationSilenceTimeoutInSeconds Entier 0,5 secondes Durée pendant laquelle l’action Recognize attend l’entrée avant de considérer que le délai d’expiration a été atteint. En savoir plus ici. Facultatif
RecognizeInputsType Enum dtmf Type d’entrée reconnu. Les options sont dtmf, choix, message et speechordtmf. Requis
InitialSilenceTimeout TimeSpan 5 secondes

Min : 0 seconde
Max : 300 secondes (DTMF)
Max : 20 secondes (Choix)
Max : 20 secondes (Message)
Le délai d’expiration du silence initial ajuste la quantité d’audio non vocal autorisée avant une expression avant que la tentative de reconnaissance se termine par un résultat « aucune correspondance ». En savoir plus ici. Facultatif
MaxTonesToCollect Entier Pas de valeur par défaut

Min : 1
Nombre de chiffres attendus par un développeur en tant qu’entrée du participant. Requis
StopTones IEnumeration<DtmfTone> Non défini Le chiffre sur lequel les participants peuvent appuyer pour échapper à un événement DTMF de lot. Facultatif
InterruptPrompt Bool True Si le participant a la possibilité d’interrompre le playMessage en appuyant sur un chiffre. Facultatif
InterruptCallMediaOperation Bool True Si cet indicateur est défini, il interrompt l’opération de média d’appel actuelle. Par exemple, si un audio est lu, il interrompt cette opération et lance la reconnaissance. Facultatif
OperationContext Chaîne Non défini Chaîne que les développeurs peuvent passer à mi-action, utile pour permettre aux développeurs de stocker le contexte concernant les événements qu’ils reçoivent. Facultatif
Phrases Chaîne Non défini Liste d’expressions associées à l’étiquette, si l’une de ces expressions est entendue, elle est considérée comme une reconnaissance réussie. Requis
Ton Chaîne Non défini Tonalité à reconnaître, si l’utilisateur décide d’appuyer sur un chiffre au lieu d’utiliser la fonctionnalité de message. Facultatif
Étiquette Chaîne Non défini La valeur clé pour la reconnaissance. Requis
Langue Chaîne En-us La langue utilisée pour reconnaître le message. Facultatif
EndSilenceTimeout TimeSpan 0,5 secondes La dernière pause de l’orateur utilisée pour détecter le résultat final généré en tant que message. Facultatif

Remarque

Dans les situations où dtmf et message se trouvent dans recognizeInputsType, l’action de reconnaissance agit sur le premier type d’entrée reçu, c’est-à-dire que si l’utilisateur appuie d’abord sur un chiffre de pavé numérique, l’action de reconnaissance la considère comme un événement dtmf et continue à écouter les tonalités dtmf. Si l’utilisateur parle d’abord, l’action de reconnaissance considère cette action comme une reconnaissance vocale et écoute l’entrée vocale.

Créer une application C#

Dans la fenêtre de console de votre système d’exploitation, utilisez la commande dotnet pour créer une application web.

dotnet new web -n MyApplication

Installez le package NuGet

Le package NuGet peut être obtenu ici, si ce n’est déjà fait.

Établir un appel

À ce stade, vous devez être familiarisé avec le démarrage des appels. Pour en savoir plus sur la procédure pour passer un appel, suivez notre guide de démarrage rapide. Vous pouvez également utiliser l’extrait de code fourni ici, pour comprendre comment répondre à un appel.

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

Appeler l’action Recognize

Lorsque votre application répond à l’appel, vous pouvez fournir des informations sur la reconnaissance des entrées des participants et la lecture d’une invite.

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

Pour les flux de reconnaissance vocale, l’action Call Automation recognize prend également en charge l’utilisation de modèles vocaux personnalisés. Les fonctionnalités telles que les modèles de reconnaissance vocale personnalisée peuvent être utiles lorsque vous créez une application devant écouter des mots complexes que les modèles de reconnaissance vocale par défaut sont susceptibles de ne pas pouvoir comprendre, un bon exemple peut être lorsque vous générez une application pour le secteur de la télémédecine et que votre agent virtuel doit être en mesure de reconnaître les termes médicaux. Vous pouvez en savoir plus sur la création et le déploiement de modèles vocaux personnalisés ici.

Choix de reconnaissance vocale

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

Reconnaissance vocale

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

Reconnaissance vocale ou DTMF

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

Remarque

Si les paramètres ne sont pas définis, les valeurs par défaut sont appliquées si possible.

Réception des mises à jour des événements Recognize

Les développeurs peuvent s’abonner aux événements RecognizeCompleted et RecognizeFailed sur le rappel webhook qu’ils ont inscrit pour l’appel, afin de créer une logique métier dans leur application pour déterminer les étapes à suivre quand l’un des événements mentionnés précédemment se produit.

Exemple de désérialisation de l’événement 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; 
    } 
} 

Exemple de désérialisation de l’événement 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); 
    } 
} 

Exemple de désérialisation de l’événement RecognizeCanceled :

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

Prérequis

Pour les fonctionnalités d’intelligence artificielle

Spécifications techniques

Les paramètres suivants sont disponibles pour personnaliser la fonction Recognize :

Paramètre Type Par défaut (si non spécifié) Description Obligatoire ou facultatif
Prompt

(pour plus d’informations sur l’action de lecture, consultez ce guide pratique)
FileSource, TextSource Non défini Il s’agit du message que vous souhaitez lire avant de reconnaître l’entrée. Facultatif
InterToneTimeout TimeSpan 2 secondes

Min : 1 seconde
Max : 60 secondes
Limite de temps en secondes pendant laquelle Azure Communication Services attend que l’appelant appuie sur un autre chiffre (délai d’expiration inter-chiffres). Facultatif
InitialSegmentationSilenceTimeoutInSeconds Entier 0,5 secondes Durée pendant laquelle l’action Recognize attend l’entrée avant de considérer que le délai d’expiration a été atteint. En savoir plus ici. Facultatif
RecognizeInputsType Enum dtmf Type d’entrée reconnu. Les options sont dtmf, choix, message et speechordtmf. Requis
InitialSilenceTimeout TimeSpan 5 secondes

Min : 0 seconde
Max : 300 secondes (DTMF)
Max : 20 secondes (Choix)
Max : 20 secondes (Message)
Le délai d’expiration du silence initial ajuste la quantité d’audio non vocal autorisée avant une expression avant que la tentative de reconnaissance se termine par un résultat « aucune correspondance ». En savoir plus ici. Facultatif
MaxTonesToCollect Entier Pas de valeur par défaut

Min : 1
Nombre de chiffres attendus par un développeur en tant qu’entrée du participant. Requis
StopTones IEnumeration<DtmfTone> Non défini Le chiffre sur lequel les participants peuvent appuyer pour échapper à un événement DTMF de lot. Facultatif
InterruptPrompt Bool True Si le participant a la possibilité d’interrompre le playMessage en appuyant sur un chiffre. Facultatif
InterruptCallMediaOperation Bool True Si cet indicateur est défini, il interrompt l’opération de média d’appel actuelle. Par exemple, si un audio est lu, il interrompt cette opération et lance la reconnaissance. Facultatif
OperationContext Chaîne Non défini Chaîne que les développeurs peuvent passer à mi-action, utile pour permettre aux développeurs de stocker le contexte concernant les événements qu’ils reçoivent. Facultatif
Phrases Chaîne Non défini Liste d’expressions associées à l’étiquette, si l’une de ces expressions est entendue, elle est considérée comme une reconnaissance réussie. Requis
Ton Chaîne Non défini Tonalité à reconnaître, si l’utilisateur décide d’appuyer sur un chiffre au lieu d’utiliser la fonctionnalité de message. Facultatif
Étiquette Chaîne Non défini La valeur clé pour la reconnaissance. Requis
Langue Chaîne En-us La langue utilisée pour reconnaître le message. Facultatif
EndSilenceTimeout TimeSpan 0,5 secondes La dernière pause de l’orateur utilisée pour détecter le résultat final généré en tant que message. Facultatif

Remarque

Dans les situations où dtmf et message se trouvent dans recognizeInputsType, l’action de reconnaissance agit sur le premier type d’entrée reçu, c’est-à-dire que si l’utilisateur appuie d’abord sur un chiffre de pavé numérique, l’action de reconnaissance la considère comme un événement dtmf et continue à écouter les tonalités dtmf. Si l’utilisateur parle d’abord, l’action de reconnaissance considère cette action comme une reconnaissance vocale et écoute l’entrée vocale.

Créer une application Java

Dans votre terminal ou votre fenêtre Commande, accédez au répertoire dans lequel vous souhaitez créer votre application Java. Exécutez la mvn commande pour générer le projet Java à partir du modèle de démarrage rapide maven-archetype.

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

La mvn commande crée un répertoire portant le même nom que artifactId l’argument. Sous ce répertoire, le répertoire src/main/java contient le code source du projet, le répertoire src/test/java contient la source de test.

Remarquez que l’étape « générer » a créé un répertoire portant le même nom que l’ID de l’artefact. Sous ce répertoire, le répertoire src/main/java contient le code source, le répertoire src/test/java contient les tests et le fichier pom.xml est le modèle d’objet du projet (POM).

Mettez à jour le fichier POM de vos applications pour utiliser Java 8 ou version ultérieure.

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

Ajouter des références de package

Dans votre fichier POM, ajoutez la référence suivante au projet

azure-communication-callautomation

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

Établir un appel

À ce stade, vous devez être familiarisé avec le démarrage des appels. Pour en savoir plus sur la procédure pour passer un appel, suivez notre guide de démarrage rapide. Vous pouvez également utiliser l’extrait de code fourni ici, pour comprendre comment répondre à un appel.

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

Appeler l’action Recognize

Lorsque votre application répond à l’appel, vous pouvez fournir des informations sur la reconnaissance des entrées des participants et la lecture d’une invite.

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

Pour les flux de reconnaissance vocale, l’action Call Automation recognize prend également en charge l’utilisation de modèles vocaux personnalisés. Les fonctionnalités telles que les modèles de reconnaissance vocale personnalisée peuvent être utiles lorsque vous créez une application devant écouter des mots complexes que les modèles de reconnaissance vocale par défaut sont susceptibles de ne pas pouvoir comprendre, un bon exemple peut être lorsque vous générez une application pour le secteur de la télémédecine et que votre agent virtuel doit être en mesure de reconnaître les termes médicaux. Vous pouvez en savoir plus sur la création et le déploiement de modèles vocaux personnalisés ici.

Choix de reconnaissance vocale

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

Reconnaissance vocale

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

Reconnaissance vocale ou DTMF

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

Remarque

Si les paramètres ne sont pas définis, les valeurs par défaut sont appliquées si possible.

Réception des mises à jour des événements Recognize

Les développeurs peuvent s’abonner aux événements RecognizeCompleted et RecognizeFailed sur le rappel de webhook inscrit. Ce rappel peut être utilisé avec une logique métier dans votre application pour déterminer les étapes suivantes quand l’un des événements se produit.

Exemple de désérialisation de l’événement 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()); 
    } 
} 

Exemple de désérialisation de l’événement 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()); 
    } 
} 

Exemple de désérialisation de l’événement RecognizeCanceled :

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

Prérequis

Pour les fonctionnalités d’intelligence artificielle

Spécifications techniques

Les paramètres suivants sont disponibles pour personnaliser la fonction Recognize :

Paramètre Type Par défaut (si non spécifié) Description Obligatoire ou facultatif
Prompt

(pour plus d’informations sur l’action de lecture, consultez ce guide pratique)
FileSource, TextSource Non défini Il s’agit du message que vous souhaitez lire avant de reconnaître l’entrée. Facultatif
InterToneTimeout TimeSpan 2 secondes

Min : 1 seconde
Max : 60 secondes
Limite de temps en secondes pendant laquelle Azure Communication Services attend que l’appelant appuie sur un autre chiffre (délai d’expiration inter-chiffres). Facultatif
InitialSegmentationSilenceTimeoutInSeconds Entier 0,5 secondes Durée pendant laquelle l’action Recognize attend l’entrée avant de considérer que le délai d’expiration a été atteint. En savoir plus ici. Facultatif
RecognizeInputsType Enum dtmf Type d’entrée reconnu. Les options sont dtmf, choix, message et speechordtmf. Requis
InitialSilenceTimeout TimeSpan 5 secondes

Min : 0 seconde
Max : 300 secondes (DTMF)
Max : 20 secondes (Choix)
Max : 20 secondes (Message)
Le délai d’expiration du silence initial ajuste la quantité d’audio non vocal autorisée avant une expression avant que la tentative de reconnaissance se termine par un résultat « aucune correspondance ». En savoir plus ici. Facultatif
MaxTonesToCollect Entier Pas de valeur par défaut

Min : 1
Nombre de chiffres attendus par un développeur en tant qu’entrée du participant. Requis
StopTones IEnumeration<DtmfTone> Non défini Le chiffre sur lequel les participants peuvent appuyer pour échapper à un événement DTMF de lot. Facultatif
InterruptPrompt Bool True Si le participant a la possibilité d’interrompre le playMessage en appuyant sur un chiffre. Facultatif
InterruptCallMediaOperation Bool True Si cet indicateur est défini, il interrompt l’opération de média d’appel actuelle. Par exemple, si un audio est lu, il interrompt cette opération et lance la reconnaissance. Facultatif
OperationContext Chaîne Non défini Chaîne que les développeurs peuvent passer à mi-action, utile pour permettre aux développeurs de stocker le contexte concernant les événements qu’ils reçoivent. Facultatif
Phrases Chaîne Non défini Liste d’expressions associées à l’étiquette, si l’une de ces expressions est entendue, elle est considérée comme une reconnaissance réussie. Requis
Ton Chaîne Non défini Tonalité à reconnaître, si l’utilisateur décide d’appuyer sur un chiffre au lieu d’utiliser la fonctionnalité de message. Facultatif
Étiquette Chaîne Non défini La valeur clé pour la reconnaissance. Requis
Langue Chaîne En-us La langue utilisée pour reconnaître le message. Facultatif
EndSilenceTimeout TimeSpan 0,5 secondes La dernière pause de l’orateur utilisée pour détecter le résultat final généré en tant que message. Facultatif

Remarque

Dans les situations où dtmf et message se trouvent dans recognizeInputsType, l’action de reconnaissance agit sur le premier type d’entrée reçu, c’est-à-dire que si l’utilisateur appuie d’abord sur un chiffre de pavé numérique, l’action de reconnaissance la considère comme un événement dtmf et continue à écouter les tonalités dtmf. Si l’utilisateur parle d’abord, l’action de reconnaissance considère cette action comme une reconnaissance vocale et écoute l’entrée vocale.

Créer une application JavaScript

Créez une nouvelle application JavaScript dans votre répertoire de projet. Initialisez un nouveau projet Node.js en exécutant la commande suivante. Cela crée un fichier package.json pour votre projet, qui est utilisé pour gérer les dépendances de votre projet.

npm init -y

Installez le package d’automation des appels d’Azure Communication Services

npm install @azure/communication-call-automation

Créez un nouveau fichier JavaScript dans votre répertoire de projet, nommez-le par exemple app.js. Vous écrivez votre code JavaScript dans ce fichier. Exécutez votre application en utilisant Node.js à l’aide de la commande suivante. Cela exécute le code JavaScript que vous avez écrit.

node app.js

Établir un appel

À ce stade, vous devez être familiarisé avec le démarrage des appels. Pour en savoir plus sur la procédure pour passer un appel, suivez notre guide de démarrage rapide. Dans ce démarrage rapide, nous créons un appel sortant.

Appeler l’action Recognize

Lorsque votre application répond à l’appel, vous pouvez fournir des informations sur la reconnaissance des entrées des participants et la lecture d’une invite.

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

Pour les flux de reconnaissance vocale, l’action Call Automation recognize prend également en charge l’utilisation de modèles vocaux personnalisés. Les fonctionnalités telles que les modèles de reconnaissance vocale personnalisée peuvent être utiles lorsque vous créez une application devant écouter des mots complexes que les modèles de reconnaissance vocale par défaut sont susceptibles de ne pas pouvoir comprendre, un bon exemple peut être lorsque vous générez une application pour le secteur de la télémédecine et que votre agent virtuel doit être en mesure de reconnaître les termes médicaux. Vous pouvez en savoir plus sur la création et le déploiement de modèles vocaux personnalisés ici.

Choix de reconnaissance vocale

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

Reconnaissance vocale

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

Reconnaissance vocale ou DTMF

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

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

Remarque

Si les paramètres ne sont pas définis, les valeurs par défaut sont appliquées si possible.

Réception des mises à jour des événements Recognize

Les développeurs peuvent s’abonner aux événements RecognizeCompleted et RecognizeFailed sur le rappel webhook qu’ils ont inscrit pour l’appel, afin de créer une logique métier dans leur application pour déterminer les étapes à suivre quand l’un des événements mentionnés précédemment se produit.

Exemple de désérialisation de l’événement 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)); 
    } 
} 

Exemple de désérialisation de l’événement RecognizeFailed :

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

Exemple de désérialisation de l’événement RecognizeCanceled :

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

Prérequis

Pour les fonctionnalités d’intelligence artificielle

Spécifications techniques

Les paramètres suivants sont disponibles pour personnaliser la fonction Recognize :

Paramètre Type Par défaut (si non spécifié) Description Obligatoire ou facultatif
Prompt

(pour plus d’informations sur l’action de lecture, consultez ce guide pratique)
FileSource, TextSource Non défini Il s’agit du message que vous souhaitez lire avant de reconnaître l’entrée. Facultatif
InterToneTimeout TimeSpan 2 secondes

Min : 1 seconde
Max : 60 secondes
Limite de temps en secondes pendant laquelle Azure Communication Services attend que l’appelant appuie sur un autre chiffre (délai d’expiration inter-chiffres). Facultatif
InitialSegmentationSilenceTimeoutInSeconds Entier 0,5 secondes Durée pendant laquelle l’action Recognize attend l’entrée avant de considérer que le délai d’expiration a été atteint. En savoir plus ici. Facultatif
RecognizeInputsType Enum dtmf Type d’entrée reconnu. Les options sont dtmf, choix, message et speechordtmf. Requis
InitialSilenceTimeout TimeSpan 5 secondes

Min : 0 seconde
Max : 300 secondes (DTMF)
Max : 20 secondes (Choix)
Max : 20 secondes (Message)
Le délai d’expiration du silence initial ajuste la quantité d’audio non vocal autorisée avant une expression avant que la tentative de reconnaissance se termine par un résultat « aucune correspondance ». En savoir plus ici. Facultatif
MaxTonesToCollect Entier Pas de valeur par défaut

Min : 1
Nombre de chiffres attendus par un développeur en tant qu’entrée du participant. Requis
StopTones IEnumeration<DtmfTone> Non défini Le chiffre sur lequel les participants peuvent appuyer pour échapper à un événement DTMF de lot. Facultatif
InterruptPrompt Bool True Si le participant a la possibilité d’interrompre le playMessage en appuyant sur un chiffre. Facultatif
InterruptCallMediaOperation Bool True Si cet indicateur est défini, il interrompt l’opération de média d’appel actuelle. Par exemple, si un audio est lu, il interrompt cette opération et lance la reconnaissance. Facultatif
OperationContext Chaîne Non défini Chaîne que les développeurs peuvent passer à mi-action, utile pour permettre aux développeurs de stocker le contexte concernant les événements qu’ils reçoivent. Facultatif
Phrases Chaîne Non défini Liste d’expressions associées à l’étiquette, si l’une de ces expressions est entendue, elle est considérée comme une reconnaissance réussie. Requis
Ton Chaîne Non défini Tonalité à reconnaître, si l’utilisateur décide d’appuyer sur un chiffre au lieu d’utiliser la fonctionnalité de message. Facultatif
Étiquette Chaîne Non défini La valeur clé pour la reconnaissance. Requis
Langue Chaîne En-us La langue utilisée pour reconnaître le message. Facultatif
EndSilenceTimeout TimeSpan 0,5 secondes La dernière pause de l’orateur utilisée pour détecter le résultat final généré en tant que message. Facultatif

Remarque

Dans les situations où dtmf et message se trouvent dans recognizeInputsType, l’action de reconnaissance agit sur le premier type d’entrée reçu, c’est-à-dire que si l’utilisateur appuie d’abord sur un chiffre de pavé numérique, l’action de reconnaissance la considère comme un événement dtmf et continue à écouter les tonalités dtmf. Si l’utilisateur parle d’abord, l’action de reconnaissance considère cette action comme une reconnaissance vocale et écoute l’entrée vocale.

Créer une application Python

Configurez un environnement virtuel Python pour votre projet

python -m venv play-audio-app

Activer votre environnement virtuel

Dans Windows, utilisez la commande suivante :

.\ play-audio-quickstart \Scripts\activate

Dans Unix, utilisez la commande suivante :

source play-audio-quickstart /bin/activate

Installez le package d’automation des appels d’Azure Communication Services

pip install azure-communication-callautomation

Créez votre fichier d'application dans votre répertoire de projet, nommez-le par exemple app.py. Vous écrivez votre code Python dans ce fichier.

Exécutez votre application en utilisant Python à l’aide de la commande suivante. Cela exécute le code Python que vous avez écrit.

python app.py

Établir un appel

À ce stade, vous devez être familiarisé avec le démarrage des appels. Pour en savoir plus sur la procédure pour passer un appel, suivez notre guide de démarrage rapide. Dans ce démarrage rapide, nous créons un appel sortant.

Appeler l’action Recognize

Lorsque votre application répond à l’appel, vous pouvez fournir des informations sur la reconnaissance des entrées des participants et la lecture d’une invite.

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

Pour les flux de reconnaissance vocale, l’action Call Automation recognize prend également en charge l’utilisation de modèles vocaux personnalisés. Les fonctionnalités telles que les modèles de reconnaissance vocale personnalisée peuvent être utiles lorsque vous créez une application devant écouter des mots complexes que les modèles de reconnaissance vocale par défaut sont susceptibles de ne pas pouvoir comprendre, un bon exemple peut être lorsque vous générez une application pour le secteur de la télémédecine et que votre agent virtuel doit être en mesure de reconnaître les termes médicaux. Vous pouvez en savoir plus sur la création et le déploiement de modèles vocaux personnalisés ici.

Choix de reconnaissance vocale

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

Reconnaissance vocale

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

Reconnaissance vocale ou DTMF

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

Remarque

Si les paramètres ne sont pas définis, les valeurs par défaut sont appliquées si possible.

Réception des mises à jour des événements Recognize

Les développeurs peuvent s’abonner aux événements RecognizeCompleted et RecognizeFailed sur le rappel webhook qu’ils ont inscrit pour l’appel, afin de créer une logique métier dans leur application pour déterminer les étapes à suivre quand l’un des événements mentionnés précédemment se produit.

Exemple de désérialisation de l’événement 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); 

Exemple de désérialisation de l’événement RecognizeFailed :

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

Exemple de désérialisation de l’événement RecognizeCanceled :

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

Codes d’événement

État Code Sous-code Message
RecognizeCompleted 200 8531 Action terminée, chiffres max reçus.
RecognizeCompleted 200 8514 L’action s’est terminée lorsqu’un ton d’arrêt a été détecté.
RecognizeCompleted 400 8508 Échec de l’action, l’opération a été annulée.
RecognizeCompleted 400 8532 Échec de l’action, délai d’expiration du silence inter-chiffres atteint.
RecognizeCanceled 400 8508 Échec de l’action, l’opération a été annulée.
RecognizeFailed 400 8510 Échec de l’action, délai d’expiration du silence initial atteint.
RecognizeFailed 500 8511 Échec de l’action, échec rencontré lors de la tentative de lecture de l’invite.
RecognizeFailed 500 8512 Erreur interne du serveur inconnue.
RecognizeFailed 400 8510 Échec de l’action, délai d’expiration du silence initial atteint
RecognizeFailed 400 8532 Échec de l’action, délai d’expiration du silence inter-chiffres atteint.
RecognizeFailed 400 8565 Échec de l’action, requête incorrecte à Azure AI services. Vérifiez les paramètres d’entrée.
La reconnaissance a échoué 400 8565 Échec de l’action, requête incorrecte à Azure AI services. Impossible de traiter la charge utile fournie, vérifiez l’entrée source de lecture
RecognizeFailed 401 8565 Échec de l’action, erreur d’authentification d’Azure AI services.
RecognizeFailed 403 8565 Échec de l’action, requête interdite à Azure AI services, abonnement gratuit utilisé par la requête hors quota.
RecognizeFailed 429 8565 L’action a échoué, les requêtes ont dépassé le nombre de requêtes simultanées autorisées pour l’abonnement à Azure AI services.
RecognizeFailed 408 8565 Échec de l’action, délai de requête à Azure AI services expiré.
RecognizeFailed 500 8511 Échec de l’action, échec rencontré lors de la tentative de lecture de l’invite.
RecognizeFailed 500 8512 Erreur interne du serveur inconnue.

Limitations connues

  • DTMF en bande non pris en charge, utilisez plutôt RFC 2833 DTMF.
  • Les invites de texte de synthèse vocale prennent en charge un maximum de 400 caractères, si votre invite est plus longue, nous vous suggérons d’utiliser SSML pour les actions de lecture basées sur la synthèse vocale.
  • Pour les scénarios où vous dépassez votre limite de quota de service Speech, vous pouvez demander à augmenter cette limite en suivant les étapes décrites ici.

Nettoyer les ressources

Si vous voulez nettoyer et supprimer un abonnement Communication Services, vous pouvez supprimer la ressource ou le groupe de ressources. La suppression du groupe de ressources efface également les autres ressources qui y sont associées. Apprenez-en davantage sur le nettoyage des ressources.

Étapes suivantes