Partager via


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 de développement logiciel (SDK) Automatisation des appels 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, consultez Personnaliser les invites vocales destinées aux utilisateurs avec l’action de lecture)
FileSource, TextSource Non défini Le message à 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 Integer 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. Consultez Comment reconnaître la voix. Facultatif
RecognizeInputsType Enum dtmf Type d’entrée reconnu. Les options sont dtmf, choices, speech 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 ». Consultez Comment reconnaître la voix. Facultatif
MaxTonesToCollect Integer 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 des expressions associées à l’étiquette. Entendre une de ces expressions entraîne une reconnaissance réussie. Requis
Tone 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
Label Chaîne Non défini La valeur clé pour la reconnaissance. Requis
Language 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ù une numérotation DTMF et de la voix se trouvent dans le recognizeInputsType, l’action de reconnaissance agit sur le premier type d’entrée reçu. Par exemple, si l’utilisateur appuie d’abord sur un numéro du pavé numérique, l’action de reconnaissance considère cela comme un événement DTMF et continue d’écouter les tonalités DTMF. Si l’utilisateur parle d’abord, l’action de reconnaissance considère cela comme un événement de 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

Obtenir le package NuGet auprès de la Galerie NuGet | Azure.Communication.CallAutomation. Suivez les instructions pour installer le package.

Établir un appel

À ce stade, vous devez être familiarisé avec le démarrage des appels. Pour plus d’informations sur la façon d’effectuer un appel, consultez Démarrage rapide : Effectuer un appel sortant. 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 Reconnaître d’Automatisation des appels prend également en charge l’utilisation de modèles vocaux personnalisés. Les fonctionnalités telles que les modèles vocaux personnalisés peuvent être utiles quand vous créez une application qui doit écouter des mots complexes que les modèles de reconnaissance vocale par défaut peuvent ne pas comprendre. C’est par exemple le cas de la création d’une application pour le secteur de la télémédecine, où votre agent virtuel doit être en mesure de reconnaître des termes médicaux. Vous pouvez en savoir plus dans Créer un projet de reconnaissance vocale personnalisée.

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 du webhook inscrit. Utilisez ce rappel avec une logique métier dans votre application pour déterminer les étapes suivantes quand un des événements 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, consultez Personnaliser les invites vocales destinées aux utilisateurs avec l’action de lecture)
FileSource, TextSource Non défini Le message à 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 Integer 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. Consultez Comment reconnaître la voix. Facultatif
RecognizeInputsType Enum dtmf Type d’entrée reconnu. Les options sont dtmf, choices, speech 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 ». Consultez Comment reconnaître la voix. Facultatif
MaxTonesToCollect Integer 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 des expressions associées à l’étiquette. Entendre une de ces expressions entraîne une reconnaissance réussie. Requis
Tone 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
Label Chaîne Non défini La valeur clé pour la reconnaissance. Requis
Language 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ù une numérotation DTMF et de la voix se trouvent dans le recognizeInputsType, l’action de reconnaissance agit sur le premier type d’entrée reçu. Par exemple, si l’utilisateur appuie d’abord sur un numéro du pavé numérique, l’action de reconnaissance considère cela comme un événement DTMF et continue d’écouter les tonalités DTMF. Si l’utilisateur parle d’abord, l’action de reconnaissance considère cela comme un événement de 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 commande mvn crée un répertoire portant le même nom que l’argument artifactId. Le répertoire src/main/java contient le code source du projet. Le répertoire src/test/java contient la source du test.

Notez que l’étape generate a créé un répertoire portant le même nom que le artifactId. Le répertoire src/main/java contient le code source. Le répertoire src/test/java contient des tests. Le fichier pom.xml est le POM (Project Object Model) du projet.

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 pour le 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 plus d’informations sur la façon d’effectuer un appel, consultez Démarrage rapide : Effectuer un appel sortant. 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 Reconnaître d’Automatisation des appels prend également en charge l’utilisation de modèles vocaux personnalisés. Les fonctionnalités telles que les modèles vocaux personnalisés peuvent être utiles quand vous créez une application qui doit écouter des mots complexes que les modèles de reconnaissance vocale par défaut peuvent ne pas comprendre. C’est par exemple le cas de la création d’une application pour le secteur de la télémédecine, où votre agent virtuel doit être en mesure de reconnaître des termes médicaux. Vous pouvez en savoir plus dans Créer un projet de reconnaissance vocale personnalisée.

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 du webhook inscrit. Utilisez ce rappel avec une logique métier dans votre application pour déterminer les étapes suivantes quand 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, consultez Personnaliser les invites vocales destinées aux utilisateurs avec l’action de lecture)
FileSource, TextSource Non défini Le message à 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 Integer 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. Consultez Comment reconnaître la voix. Facultatif
RecognizeInputsType Enum dtmf Type d’entrée reconnu. Les options sont dtmf, choices, speech 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 ». Consultez Comment reconnaître la voix. Facultatif
MaxTonesToCollect Integer 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 des expressions associées à l’étiquette. Entendre une de ces expressions entraîne une reconnaissance réussie. Requis
Tone 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
Label Chaîne Non défini La valeur clé pour la reconnaissance. Requis
Language 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ù une numérotation DTMF et de la voix se trouvent dans le recognizeInputsType, l’action de reconnaissance agit sur le premier type d’entrée reçu. Par exemple, si l’utilisateur appuie d’abord sur un numéro du pavé numérique, l’action de reconnaissance considère cela comme un événement DTMF et continue d’écouter les tonalités DTMF. Si l’utilisateur parle d’abord, l’action de reconnaissance considère cela comme un événement de 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. Ceci crée un fichier package.json pour votre projet, qui gère 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 fichier JavaScript dans votre répertoire de projet, en le nommant par exemple app.js. Écrivez votre code JavaScript dans ce fichier.

Exécutez votre application en utilisant Node.js à l’aide de la commande suivante.

node app.js

Établir un appel

À ce stade, vous devez être familiarisé avec le démarrage des appels. Pour plus d’informations sur la façon d’effectuer un appel, consultez Démarrage rapide : Effectuer 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 Reconnaître d’Automatisation des appels prend également en charge l’utilisation de modèles vocaux personnalisés. Les fonctionnalités telles que les modèles vocaux personnalisés peuvent être utiles quand vous créez une application qui doit écouter des mots complexes que les modèles de reconnaissance vocale par défaut peuvent ne pas comprendre. C’est par exemple le cas de la création d’une application pour le secteur de la télémédecine, où votre agent virtuel doit être en mesure de reconnaître des termes médicaux. Vous pouvez en savoir plus dans Créer un projet de reconnaissance vocale personnalisée.

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 du webhook inscrit. Utilisez ce rappel avec une logique métier dans votre application pour déterminer les étapes suivantes quand un des événements 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, consultez Personnaliser les invites vocales destinées aux utilisateurs avec l’action de lecture)
FileSource, TextSource Non défini Le message à 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 Integer 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. Consultez Comment reconnaître la voix. Facultatif
RecognizeInputsType Enum dtmf Type d’entrée reconnu. Les options sont dtmf, choices, speech 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 ». Consultez Comment reconnaître la voix. Facultatif
MaxTonesToCollect Integer 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 des expressions associées à l’étiquette. Entendre une de ces expressions entraîne une reconnaissance réussie. Requis
Tone 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
Label Chaîne Non défini La valeur clé pour la reconnaissance. Requis
Language 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ù une numérotation DTMF et de la voix se trouvent dans le recognizeInputsType, l’action de reconnaissance agit sur le premier type d’entrée reçu. Par exemple, si l’utilisateur appuie d’abord sur un numéro du pavé numérique, l’action de reconnaissance considère cela comme un événement DTMF et continue d’écouter les tonalités DTMF. Si l’utilisateur parle d’abord, l’action de reconnaissance considère cela comme un événement de 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, en le nommant par exemple app.py. Écrivez votre code Python dans ce fichier.

Exécutez votre application en utilisant Python à l’aide de la commande suivante.

python app.py

Établir un appel

À ce stade, vous devez être familiarisé avec le démarrage des appels. Pour plus d’informations sur la façon d’effectuer un appel, consultez Démarrage rapide : Effectuer 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 Reconnaître d’Automatisation des appels prend également en charge l’utilisation de modèles vocaux personnalisés. Les fonctionnalités telles que les modèles vocaux personnalisés peuvent être utiles quand vous créez une application qui doit écouter des mots complexes que les modèles de reconnaissance vocale par défaut peuvent ne pas comprendre. C’est par exemple le cas de la création d’une application pour le secteur de la télémédecine, où votre agent virtuel doit être en mesure de reconnaître des termes médicaux. Vous pouvez en savoir plus dans Créer un projet de reconnaissance vocale personnalisée.

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 du webhook inscrit. Utilisez ce rappel avec une logique métier dans votre application pour déterminer les étapes suivantes quand un des événements 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.
RecognizeFailed 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 la 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 Échec de l’action, 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

  • La numérotation DTMF intrabande n’est pas prise en charge. Utilisez plutôt RFC 2833 DTMF.
  • Les invites textuelles de synthèse vocale prennent en charge un maximum de 400 caractères. Si votre invite dépasse cette limite, nous vous conseillons d’utiliser SSML pour les actions de jeu basées sur la synthèse vocale.
  • Pour les scénarios où vous dépassez votre limite de quota du service Speech, vous pouvez demander une augmentation de cette limite en suivant les étapes décrites dans Quotas et limites des services Speech.

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