Raccogliere l'input dell'utente con l'azione di riconoscimento

Questa guida consente di iniziare a riconoscere l'input DTMF fornito dai partecipanti tramite l’SDK di automazione delle chiamate di Servizi di comunicazione di Azure.

Prerequisiti

Per le funzionalità di intelligenza artificiale

Specifiche tecniche

Per personalizzare la funzione di riconoscimento sono disponibili i parametri seguenti:

Parametro Type Impostazione predefinita (se non specificato) Descrizione Obbligatorio o facoltativo
Prompt

Per i dettagli, vedere Personalizzare i prompt vocali agli utenti con l'azione di riproduzione
FileSource, TextSource Non impostato Il messaggio da riprodurre prima di riconoscere l'input. Facoltativo
InterToneTimeout TimeSpan 2 secondi

Min: 1 secondo
max: 60 secondi
Limite in secondi in cui Servizi di comunicazione di Azure attende che il chiamante prema un altro numero (timeout tra numeri). Facoltativo
InitialSegmentationSilenceTimeoutInSeconds Intero 0,5 secondi Per quanto tempo l'azione di riconoscimento attende l'input prima di considerarlo un timeout. Vedere Come riconoscere la voce. Facoltativo
RecognizeInputsType Enum dtmf Tipo di input riconosciuto. Le opzioni sono dtmf, choices, speech e speechordtmf. Richiesto
InitialSilenceTimeout TimeSpan 5 secondi

Min: 0 secondi
Max: 300 secondi (DTMF)
Max: 20 secondi (Opzioni)
Max: 20 secondi (Parlato)
Il timeout del silenzio iniziale regola la quantità di audio non vocale consentito prima di una frase, prima che il tentativo di riconoscimento termini con un risultato "nessuna corrispondenza". Vedere Come riconoscere la voce. Facoltativo
MaxTonesToCollect Intero Nessun valore predefinito

Min: 1
Numero di numeri previsti dallo sviluppatore come input del partecipante. Richiesto
StopTones IEnumeration<DtmfTone> Non impostato I partecipanti al numero possono premere per uscire da un evento DTMF batch. Facoltativo
InterruptPrompt Bool Vero Se il partecipante ha la possibilità di interrompere il playMessage premendo un numero. Facoltativo
InterruptCallMediaOperation Bool Vero Se questo flag è impostato, interrompe l'operazione multimediale di chiamata corrente. Ad esempio, se viene riprodotto un audio interrompe l'operazione e avvia il riconoscimento. Facoltativo
OperationContext String Non impostato Stringa che gli sviluppatori possono passare a metà azione, utile per consentire agli sviluppatori di archiviare il contesto sugli eventi ricevuti. Facoltativo
Phrases String Non impostato Elenco di frasi associate all'etichetta. L'ascolto di una di queste frasi comporta un riconoscimento riuscito. Richiesto
Tone String Non impostato Tono da riconoscere se l'utente decide di premere un numero invece di usare il parlato. Facoltativo
Label String Non impostato Valore della chiave per il riconoscimento. Richiesto
Language String En-us Lingua usata per il riconoscimento vocale. Facoltativo
EndSilenceTimeout TimeSpan 0,5 secondi La pausa finale del parlante viene usata per rilevare il risultato finale generato come voce. Facoltativo

Nota

In situazioni in cui sia DTMF che la voce sono in recognizeInputsType, l'azione di riconoscimento agisce sul primo tipo di input ricevuto. Ad esempio, se l'utente preme prima un numero del tastierino, l'azione di riconoscimento lo considera un evento DTMF e continua ad ascoltare i toni DTMF. Se l'utente parla prima, l'azione di riconoscimento lo considera un riconoscimento vocale e ascolterà l'input vocale.

Creare una nuova applicazione C#

Nella finestra della console del sistema operativo usare il comando dotnet per creare una nuova applicazione Web.

dotnet new web -n MyApplication

Installare il pacchetto NuGet

Ottenere il pacchetto NuGet da Raccolta NuGet | Azure.Communication.CallAutomation. Seguire queste istruzioni per installare il pacchetto.

Stabilire una chiamata

A questo punto si dovrebbe avere familiarità con le chiamate di avvio. Per altre informazioni sull'esecuzione di una chiamata, vedere Avvio rapido: effettuare una chiamata in uscita. È anche possibile usare il frammento di codice fornito qui per comprendere come rispondere a una chiamata.

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

Chiamare l'azione di riconoscimento

Quando l'applicazione risponde alla chiamata, è possibile fornire informazioni sul riconoscimento dell'input del partecipante e sulla riproduzione di una richiesta.

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

Per i flussi di riconoscimento vocale, l'azione di riconoscimento di Automazione chiamate supporta anche l'uso di modelli di riconoscimento vocale personalizzato. Le funzionalità come i modelli di riconoscimento vocale personalizzato possono essere utili quando si crea un'applicazione che deve ascoltare parole complesse che i modelli di riconoscimento vocale predefiniti potrebbero non comprendere. Un esempio è la creazione di un'applicazione per il settore della telemedicina; l'agente virtuale deve essere in grado di riconoscere i termini medici. Per altre informazioni, vedere Creare un progetto di riconoscimento vocale personalizzato.

Opzioni di riconoscimento 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);

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

Riconoscimento vocale o DTMF

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

Nota

Se i parametri non sono impostati, le impostazioni predefinite vengono applicate laddove possibile.

Ricezione degli aggiornamenti degli eventi di riconoscimento

Gli sviluppatori possono sottoscrivere eventi RecognizeCompleted eRecognizeFailed nel callback del webhook registrato. Questo callback può essere usato con la logica di business nell'applicazione per determinare i passaggi successivi quando si verifica uno degli eventi.

Esempio di come è possibile deserializzare l'evento RecognizeCompleted:

if (acsEvent is RecognizeCompleted recognizeCompleted) 
{ 
    switch (recognizeCompleted.RecognizeResult) 
    { 
        case DtmfResult dtmfResult: 
            //Take action for Recognition through DTMF 
            var tones = dtmfResult.Tones; 
            logger.LogInformation("Recognize completed succesfully, tones={tones}", tones); 
            break; 
        case ChoiceResult choiceResult: 
            // Take action for Recognition through Choices 
            var labelDetected = choiceResult.Label; 
            var phraseDetected = choiceResult.RecognizedPhrase; 
            // If choice is detected by phrase, choiceResult.RecognizedPhrase will have the phrase detected, 
            // If choice is detected using dtmf tone, phrase will be null 
            logger.LogInformation("Recognize completed succesfully, labelDetected={labelDetected}, phraseDetected={phraseDetected}", labelDetected, phraseDetected);
            break; 
        case SpeechResult speechResult: 
            // Take action for Recognition through Choices 
            var text = speechResult.Speech; 
            logger.LogInformation("Recognize completed succesfully, text={text}", text); 
            break; 
        default: 
            logger.LogInformation("Recognize completed succesfully, recognizeResult={recognizeResult}", recognizeCompleted.RecognizeResult); 
            break; 
    } 
} 

Esempio di come è possibile deserializzare l'evento RecognizeFailed:

if (acsEvent is RecognizeFailed recognizeFailed) 
{ 
    if (MediaEventReasonCode.RecognizeInitialSilenceTimedOut.Equals(recognizeFailed.ReasonCode)) 
    { 
        // Take action for time out 
        logger.LogInformation("Recognition failed: initial silencev time out"); 
    } 
    else if (MediaEventReasonCode.RecognizeSpeechOptionNotMatched.Equals(recognizeFailed.ReasonCode)) 
    { 
        // Take action for option not matched 
        logger.LogInformation("Recognition failed: speech option not matched"); 
    } 
    else if (MediaEventReasonCode.RecognizeIncorrectToneDetected.Equals(recognizeFailed.ReasonCode)) 
    { 
        // Take action for incorrect tone 
        logger.LogInformation("Recognition failed: incorrect tone detected"); 
    } 
    else 
    { 
        logger.LogInformation("Recognition failed, result={result}, context={context}", recognizeFailed.ResultInformation?.Message, recognizeFailed.OperationContext); 
    } 
} 

Esempio di come è possibile deserializzare l'evento RecognizeCanceled:

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

Prerequisiti

Per le funzionalità di intelligenza artificiale

Specifiche tecniche

Per personalizzare la funzione di riconoscimento sono disponibili i parametri seguenti:

Parametro Type Impostazione predefinita (se non specificato) Descrizione Obbligatorio o facoltativo
Prompt

Per i dettagli, vedere Personalizzare i prompt vocali agli utenti con l'azione di riproduzione
FileSource, TextSource Non impostato Il messaggio da riprodurre prima di riconoscere l'input. Facoltativo
InterToneTimeout TimeSpan 2 secondi

Min: 1 secondo
max: 60 secondi
Limite in secondi in cui Servizi di comunicazione di Azure attende che il chiamante prema un altro numero (timeout tra numeri). Facoltativo
InitialSegmentationSilenceTimeoutInSeconds Intero 0,5 secondi Per quanto tempo l'azione di riconoscimento attende l'input prima di considerarlo un timeout. Vedere Come riconoscere la voce. Facoltativo
RecognizeInputsType Enum dtmf Tipo di input riconosciuto. Le opzioni sono dtmf, choices, speech e speechordtmf. Richiesto
InitialSilenceTimeout TimeSpan 5 secondi

Min: 0 secondi
Max: 300 secondi (DTMF)
Max: 20 secondi (Opzioni)
Max: 20 secondi (Parlato)
Il timeout del silenzio iniziale regola la quantità di audio non vocale consentito prima di una frase, prima che il tentativo di riconoscimento termini con un risultato "nessuna corrispondenza". Vedere Come riconoscere la voce. Facoltativo
MaxTonesToCollect Intero Nessun valore predefinito

Min: 1
Numero di numeri previsti dallo sviluppatore come input del partecipante. Richiesto
StopTones IEnumeration<DtmfTone> Non impostato I partecipanti al numero possono premere per uscire da un evento DTMF batch. Facoltativo
InterruptPrompt Bool Vero Se il partecipante ha la possibilità di interrompere il playMessage premendo un numero. Facoltativo
InterruptCallMediaOperation Bool Vero Se questo flag è impostato, interrompe l'operazione multimediale di chiamata corrente. Ad esempio, se viene riprodotto un audio interrompe l'operazione e avvia il riconoscimento. Facoltativo
OperationContext String Non impostato Stringa che gli sviluppatori possono passare a metà azione, utile per consentire agli sviluppatori di archiviare il contesto sugli eventi ricevuti. Facoltativo
Phrases String Non impostato Elenco di frasi associate all'etichetta. L'ascolto di una di queste frasi comporta un riconoscimento riuscito. Richiesto
Tone String Non impostato Tono da riconoscere se l'utente decide di premere un numero invece di usare il parlato. Facoltativo
Label String Non impostato Valore della chiave per il riconoscimento. Richiesto
Language String En-us Lingua usata per il riconoscimento vocale. Facoltativo
EndSilenceTimeout TimeSpan 0,5 secondi La pausa finale del parlante viene usata per rilevare il risultato finale generato come voce. Facoltativo

Nota

In situazioni in cui sia DTMF che la voce sono in recognizeInputsType, l'azione di riconoscimento agisce sul primo tipo di input ricevuto. Ad esempio, se l'utente preme prima un numero del tastierino, l'azione di riconoscimento lo considera un evento DTMF e continua ad ascoltare i toni DTMF. Se l'utente parla prima, l'azione di riconoscimento lo considera un riconoscimento vocale e ascolterà l'input vocale.

Creare una nuova applicazione Java

Nella finestra del terminale o di comando, passare alla directory in cui creare l'applicazione Java. Eseguire il comando mvn per generare il progetto Java dal modello maven-archetype-quickstart.

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

Il comando mvn crea una directory con lo stesso nome dell'argomentoartifactId. La directory src/main/java contiene il codice sorgente del progetto. La directory src/test/java contiene l'origine del testo.

Tenere presente che il passaggio generate ha creato una directory con lo stesso nome di artifactId. La directory src/main/java contiene il codice sorgente. La directory src/test/java contiene test. Il file pom.xml è il POM (Project Object Model) del progetto.

Aggiornare il file POM dell'applicazione per usare Java 8 o versione successiva.

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

Aggiungere riferimenti ai pacchetti

Nel file POM, aggiungere il riferimento seguente per il progetto:

azure-communication-callautomation

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

Stabilire una chiamata

A questo punto si dovrebbe avere familiarità con le chiamate di avvio. Per altre informazioni sull'esecuzione di una chiamata, vedere Avvio rapido: effettuare una chiamata in uscita. È anche possibile usare il frammento di codice fornito qui per comprendere come rispondere a una chiamata.

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

Chiamare l'azione di riconoscimento

Quando l'applicazione risponde alla chiamata, è possibile fornire informazioni sul riconoscimento dell'input del partecipante e sulla riproduzione di una richiesta.

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

Per i flussi di riconoscimento vocale, l'azione di riconoscimento di Automazione chiamate supporta anche l'uso di modelli di riconoscimento vocale personalizzato. Le funzionalità come i modelli di riconoscimento vocale personalizzato possono essere utili quando si crea un'applicazione che deve ascoltare parole complesse che i modelli di riconoscimento vocale predefiniti potrebbero non comprendere. Un esempio è la creazione di un'applicazione per il settore della telemedicina; l'agente virtuale deve essere in grado di riconoscere i termini medici. Per altre informazioni, vedere Creare un progetto di riconoscimento vocale personalizzato.

Opzioni di riconoscimento 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();

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

Riconoscimento vocale o DTMF

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

Nota

Se i parametri non sono impostati, le impostazioni predefinite vengono applicate laddove possibile.

Ricezione degli aggiornamenti degli eventi di riconoscimento

Gli sviluppatori possono sottoscrivere eventi RecognizeCompleted eRecognizeFailed nel callback del webhook registrato. Questo callback può essere usato con la logica di business nell'applicazione per determinare i passaggi successivi quando si verifica uno degli eventi.

Esempio di come è possibile deserializzare l'evento RecognizeCompleted:

if (acsEvent instanceof RecognizeCompleted) { 
    RecognizeCompleted event = (RecognizeCompleted) acsEvent; 
    RecognizeResult recognizeResult = event.getRecognizeResult().get(); 
    if (recognizeResult instanceof DtmfResult) { 
        // Take action on collect tones 
        DtmfResult dtmfResult = (DtmfResult) recognizeResult; 
        List<DtmfTone> tones = dtmfResult.getTones(); 
        log.info("Recognition completed, tones=" + tones + ", context=" + event.getOperationContext()); 
    } else if (recognizeResult instanceof ChoiceResult) { 
        ChoiceResult collectChoiceResult = (ChoiceResult) recognizeResult; 
        String labelDetected = collectChoiceResult.getLabel(); 
        String phraseDetected = collectChoiceResult.getRecognizedPhrase(); 
        log.info("Recognition completed, labelDetected=" + labelDetected + ", phraseDetected=" + phraseDetected + ", context=" + event.getOperationContext()); 
    } else if (recognizeResult instanceof SpeechResult) { 
        SpeechResult speechResult = (SpeechResult) recognizeResult; 
        String text = speechResult.getSpeech(); 
        log.info("Recognition completed, text=" + text + ", context=" + event.getOperationContext()); 
    } else { 
        log.info("Recognition completed, result=" + recognizeResult + ", context=" + event.getOperationContext()); 
    } 
} 

Esempio di come è possibile deserializzare l'evento RecognizeFailed:

if (acsEvent instanceof RecognizeFailed) { 
    RecognizeFailed event = (RecognizeFailed) acsEvent; 
    if (ReasonCode.Recognize.INITIAL_SILENCE_TIMEOUT.equals(event.getReasonCode())) { 
        // Take action for time out 
        log.info("Recognition failed: initial silence time out"); 
    } else if (ReasonCode.Recognize.SPEECH_OPTION_NOT_MATCHED.equals(event.getReasonCode())) { 
        // Take action for option not matched 
        log.info("Recognition failed: speech option not matched"); 
    } else if (ReasonCode.Recognize.DMTF_OPTION_MATCHED.equals(event.getReasonCode())) { 
        // Take action for incorrect tone 
        log.info("Recognition failed: incorrect tone detected"); 
    } else { 
        log.info("Recognition failed, result=" + event.getResultInformation().getMessage() + ", context=" + event.getOperationContext()); 
    } 
} 

Esempio di come è possibile deserializzare l'evento RecognizeCanceled:

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

Prerequisiti

Per le funzionalità di intelligenza artificiale

Specifiche tecniche

Per personalizzare la funzione di riconoscimento sono disponibili i parametri seguenti:

Parametro Type Impostazione predefinita (se non specificato) Descrizione Obbligatorio o facoltativo
Prompt

Per i dettagli, vedere Personalizzare i prompt vocali agli utenti con l'azione di riproduzione
FileSource, TextSource Non impostato Il messaggio da riprodurre prima di riconoscere l'input. Facoltativo
InterToneTimeout TimeSpan 2 secondi

Min: 1 secondo
max: 60 secondi
Limite in secondi in cui Servizi di comunicazione di Azure attende che il chiamante prema un altro numero (timeout tra numeri). Facoltativo
InitialSegmentationSilenceTimeoutInSeconds Intero 0,5 secondi Per quanto tempo l'azione di riconoscimento attende l'input prima di considerarlo un timeout. Vedere Come riconoscere la voce. Facoltativo
RecognizeInputsType Enum dtmf Tipo di input riconosciuto. Le opzioni sono dtmf, choices, speech e speechordtmf. Richiesto
InitialSilenceTimeout TimeSpan 5 secondi

Min: 0 secondi
Max: 300 secondi (DTMF)
Max: 20 secondi (Opzioni)
Max: 20 secondi (Parlato)
Il timeout del silenzio iniziale regola la quantità di audio non vocale consentito prima di una frase, prima che il tentativo di riconoscimento termini con un risultato "nessuna corrispondenza". Vedere Come riconoscere la voce. Facoltativo
MaxTonesToCollect Intero Nessun valore predefinito

Min: 1
Numero di numeri previsti dallo sviluppatore come input del partecipante. Richiesto
StopTones IEnumeration<DtmfTone> Non impostato I partecipanti al numero possono premere per uscire da un evento DTMF batch. Facoltativo
InterruptPrompt Bool Vero Se il partecipante ha la possibilità di interrompere il playMessage premendo un numero. Facoltativo
InterruptCallMediaOperation Bool Vero Se questo flag è impostato, interrompe l'operazione multimediale di chiamata corrente. Ad esempio, se viene riprodotto un audio interrompe l'operazione e avvia il riconoscimento. Facoltativo
OperationContext String Non impostato Stringa che gli sviluppatori possono passare a metà azione, utile per consentire agli sviluppatori di archiviare il contesto sugli eventi ricevuti. Facoltativo
Phrases String Non impostato Elenco di frasi associate all'etichetta. L'ascolto di una di queste frasi comporta un riconoscimento riuscito. Richiesto
Tone String Non impostato Tono da riconoscere se l'utente decide di premere un numero invece di usare il parlato. Facoltativo
Label String Non impostato Valore della chiave per il riconoscimento. Richiesto
Language String En-us Lingua usata per il riconoscimento vocale. Facoltativo
EndSilenceTimeout TimeSpan 0,5 secondi La pausa finale del parlante viene usata per rilevare il risultato finale generato come voce. Facoltativo

Nota

In situazioni in cui sia DTMF che la voce sono in recognizeInputsType, l'azione di riconoscimento agisce sul primo tipo di input ricevuto. Ad esempio, se l'utente preme prima un numero del tastierino, l'azione di riconoscimento lo considera un evento DTMF e continua ad ascoltare i toni DTMF. Se l'utente parla prima, l'azione di riconoscimento lo considera un riconoscimento vocale e ascolterà l'input vocale.

Creare una nuova applicazione JavaScript

Creare una nuova applicazione JavaScript nella directory del progetto. Inizializzare un nuovo progetto Node.js con il comando seguente. Verrà creato un file package.json per il progetto, che viene usato per gestire le dipendenze del progetto.

npm init -y

Installare il pacchetto di Automazione delle chiamate di Servizi di comunicazione di Azure

npm install @azure/communication-call-automation

Creare un nuovo file JavaScript nella directory del progetto, denominandolo, ad esempio, app.js. Scrivere il codice JavaScript in questo file.

Eseguire l'applicazione usando Node.js con il comando seguente.

node app.js

Stabilire una chiamata

A questo punto si dovrebbe avere familiarità con le chiamate di avvio. Per altre informazioni sull'esecuzione di una chiamata, vedere Avvio rapido: effettuare una chiamata in uscita.

Chiamare l'azione di riconoscimento

Quando l'applicazione risponde alla chiamata, è possibile fornire informazioni sul riconoscimento dell'input del partecipante e sulla riproduzione di una richiesta.

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

Per i flussi di riconoscimento vocale, l'azione di riconoscimento di Automazione chiamate supporta anche l'uso di modelli di riconoscimento vocale personalizzato. Le funzionalità come i modelli di riconoscimento vocale personalizzato possono essere utili quando si crea un'applicazione che deve ascoltare parole complesse che i modelli di riconoscimento vocale predefiniti potrebbero non comprendere. Un esempio è la creazione di un'applicazione per il settore della telemedicina; l'agente virtuale deve essere in grado di riconoscere i termini medici. Per altre informazioni, vedere Creare un progetto di riconoscimento vocale personalizzato.

Opzioni di riconoscimento 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); 

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

Riconoscimento vocale o DTMF

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

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

Nota

Se i parametri non sono impostati, le impostazioni predefinite vengono applicate laddove possibile.

Ricezione degli aggiornamenti degli eventi di riconoscimento

Gli sviluppatori possono sottoscrivere eventi RecognizeCompleted eRecognizeFailed nel callback del webhook registrato. Questo callback può essere usato con la logica di business nell'applicazione per determinare i passaggi successivi quando si verifica uno degli eventi.

Esempio di come è possibile deserializzare l'evento RecognizeCompleted:

if (event.type === "Microsoft.Communication.RecognizeCompleted") { 
    if (eventData.recognitionType === "dtmf") { 
        const tones = eventData.dtmfResult.tones; 
        console.log("Recognition completed, tones=%s, context=%s", tones, eventData.operationContext); 
    } else if (eventData.recognitionType === "choices") { 
        const labelDetected = eventData.choiceResult.label; 
        const phraseDetected = eventData.choiceResult.recognizedPhrase; 
        console.log("Recognition completed, labelDetected=%s, phraseDetected=%s, context=%s", labelDetected, phraseDetected, eventData.operationContext); 
    } else if (eventData.recognitionType === "speech") { 
        const text = eventData.speechResult.speech; 
        console.log("Recognition completed, text=%s, context=%s", text, eventData.operationContext); 
    } else { 
        console.log("Recognition completed: data=%s", JSON.stringify(eventData, null, 2)); 
    } 
} 

Esempio di come è possibile deserializzare l'evento RecognizeFailed:

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

Esempio di come è possibile deserializzare l'evento RecognizeCanceled:

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

Prerequisiti

Per le funzionalità di intelligenza artificiale

Specifiche tecniche

Per personalizzare la funzione di riconoscimento sono disponibili i parametri seguenti:

Parametro Type Impostazione predefinita (se non specificato) Descrizione Obbligatorio o facoltativo
Prompt

Per i dettagli, vedere Personalizzare i prompt vocali agli utenti con l'azione di riproduzione
FileSource, TextSource Non impostato Il messaggio da riprodurre prima di riconoscere l'input. Facoltativo
InterToneTimeout TimeSpan 2 secondi

Min: 1 secondo
max: 60 secondi
Limite in secondi in cui Servizi di comunicazione di Azure attende che il chiamante prema un altro numero (timeout tra numeri). Facoltativo
InitialSegmentationSilenceTimeoutInSeconds Intero 0,5 secondi Per quanto tempo l'azione di riconoscimento attende l'input prima di considerarlo un timeout. Vedere Come riconoscere la voce. Facoltativo
RecognizeInputsType Enum dtmf Tipo di input riconosciuto. Le opzioni sono dtmf, choices, speech e speechordtmf. Richiesto
InitialSilenceTimeout TimeSpan 5 secondi

Min: 0 secondi
Max: 300 secondi (DTMF)
Max: 20 secondi (Opzioni)
Max: 20 secondi (Parlato)
Il timeout del silenzio iniziale regola la quantità di audio non vocale consentito prima di una frase, prima che il tentativo di riconoscimento termini con un risultato "nessuna corrispondenza". Vedere Come riconoscere la voce. Facoltativo
MaxTonesToCollect Intero Nessun valore predefinito

Min: 1
Numero di numeri previsti dallo sviluppatore come input del partecipante. Richiesto
StopTones IEnumeration<DtmfTone> Non impostato I partecipanti al numero possono premere per uscire da un evento DTMF batch. Facoltativo
InterruptPrompt Bool Vero Se il partecipante ha la possibilità di interrompere il playMessage premendo un numero. Facoltativo
InterruptCallMediaOperation Bool Vero Se questo flag è impostato, interrompe l'operazione multimediale di chiamata corrente. Ad esempio, se viene riprodotto un audio interrompe l'operazione e avvia il riconoscimento. Facoltativo
OperationContext String Non impostato Stringa che gli sviluppatori possono passare a metà azione, utile per consentire agli sviluppatori di archiviare il contesto sugli eventi ricevuti. Facoltativo
Phrases String Non impostato Elenco di frasi associate all'etichetta. L'ascolto di una di queste frasi comporta un riconoscimento riuscito. Richiesto
Tone String Non impostato Tono da riconoscere se l'utente decide di premere un numero invece di usare il parlato. Facoltativo
Label String Non impostato Valore della chiave per il riconoscimento. Richiesto
Language String En-us Lingua usata per il riconoscimento vocale. Facoltativo
EndSilenceTimeout TimeSpan 0,5 secondi La pausa finale del parlante viene usata per rilevare il risultato finale generato come voce. Facoltativo

Nota

In situazioni in cui sia DTMF che la voce sono in recognizeInputsType, l'azione di riconoscimento agisce sul primo tipo di input ricevuto. Ad esempio, se l'utente preme prima un numero del tastierino, l'azione di riconoscimento lo considera un evento DTMF e continua ad ascoltare i toni DTMF. Se l'utente parla prima, l'azione di riconoscimento lo considera un riconoscimento vocale e ascolterà l'input vocale.

Creare una nuova applicazione Python

Configurare un ambiente virtuale Python per il progetto

python -m venv play-audio-app

Attivare l'ambiente virtuale

In Windows usare il comando seguente:

.\ play-audio-quickstart \Scripts\activate

Utilizzare il comando seguente su Unix:

source play-audio-quickstart /bin/activate

Installare il pacchetto di Automazione delle chiamate di Servizi di comunicazione di Azure

pip install azure-communication-callautomation

Creare il file dell’applicazione nella directory del progetto, denominandolo, ad esempio, app.py. Scrivere il codice Python in questo file.

Eseguire l'applicazione usando Python con il comando seguente.

python app.py

Stabilire una chiamata

A questo punto si dovrebbe avere familiarità con le chiamate di avvio. Per altre informazioni sull'esecuzione di una chiamata, vedere Avvio rapido: effettuare una chiamata in uscita.

Chiamare l'azione di riconoscimento

Quando l'applicazione risponde alla chiamata, è possibile fornire informazioni sul riconoscimento dell'input del partecipante e sulla riproduzione di una richiesta.

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

Per i flussi di riconoscimento vocale, l'azione di riconoscimento di Automazione chiamate supporta anche l'uso di modelli di riconoscimento vocale personalizzato. Le funzionalità come i modelli di riconoscimento vocale personalizzato possono essere utili quando si crea un'applicazione che deve ascoltare parole complesse che i modelli di riconoscimento vocale predefiniti potrebbero non comprendere. Un esempio è la creazione di un'applicazione per il settore della telemedicina; l'agente virtuale deve essere in grado di riconoscere i termini medici. Per altre informazioni, vedere Creare un progetto di riconoscimento vocale personalizzato.

Opzioni di riconoscimento 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")  

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

Riconoscimento vocale o DTMF

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

Nota

Se i parametri non sono impostati, le impostazioni predefinite vengono applicate laddove possibile.

Ricezione degli aggiornamenti degli eventi di riconoscimento

Gli sviluppatori possono sottoscrivere eventi RecognizeCompleted eRecognizeFailed nel callback del webhook registrato. Questo callback può essere usato con la logica di business nell'applicazione per determinare i passaggi successivi quando si verifica uno degli eventi.

Esempio di come è possibile deserializzare l'evento RecognizeCompleted:

if event.type == "Microsoft.Communication.RecognizeCompleted": 
    app.logger.info("Recognize completed: data=%s", event.data) 
    if event.data['recognitionType'] == "dtmf": 
        tones = event.data['dtmfResult']['tones'] 
        app.logger.info("Recognition completed, tones=%s, context=%s", tones, event.data.get('operationContext')) 
    elif event.data['recognitionType'] == "choices": 
        labelDetected = event.data['choiceResult']['label']; 
        phraseDetected = event.data['choiceResult']['recognizedPhrase']; 
        app.logger.info("Recognition completed, labelDetected=%s, phraseDetected=%s, context=%s", labelDetected, phraseDetected, event.data.get('operationContext')); 
    elif event.data['recognitionType'] == "speech": 
        text = event.data['speechResult']['speech']; 
        app.logger.info("Recognition completed, text=%s, context=%s", text, event.data.get('operationContext')); 
    else: 
        app.logger.info("Recognition completed: data=%s", event.data); 

Esempio di come è possibile deserializzare l'evento RecognizeFailed:

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

Esempio di come è possibile deserializzare l'evento RecognizeCanceled:

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

Codici evento

Status Codice Sottocodice Message
RecognizeCompleted 200 8531 Azione completata, numero massimo di numeri ricevuto.
RecognizeCompleted 200 8514 Azione completata quando è stato rilevato il tono di arresto.
RecognizeCompleted 400 8508 Azione non riuscita. L'operazione è stata annullata.
RecognizeCompleted 400 8532 Azione non riuscita. È stato raggiunto il timeout di silenzio tra numeri.
RecognizeCanceled 400 8508 Azione non riuscita. L'operazione è stata annullata.
RecognizeFailed 400 8510 Azione non riuscita. È stato raggiunto il timeout del silenzio iniziale.
RecognizeFailed 500 8511 Azione non riuscita. Errore durante il tentativo di riproduzione della richiesta.
RecognizeFailed 500 8512 Errore interno sconosciuto del server.
RecognizeFailed 400 8510 Azione non riuscita. È stato raggiunto il timeout del silenzio iniziale.
RecognizeFailed 400 8532 Azione non riuscita. È stato raggiunto il timeout di silenzio tra numeri.
RecognizeFailed 400 8565 Azione non riuscita. Richiesta non valida ai servizi di intelligenza artificiale di Azure. Controllare i parametri di input.
RecognizeFailed 400 8565 Azione non riuscita. Richiesta non valida ai servizi di intelligenza artificiale di Azure. Non è possibile elaborare il payload specificato. Controllare l'input dell'origine di riproduzione.
RecognizeFailed 401 8565 Azione non riuscita. Errore di autenticazione dei servizi di intelligenza artificiale di Azure.
RecognizeFailed 403 8565 Azione non riuscita, richiesta non consentita ai servizi di intelligenza artificiale di Azure, sottoscrizione gratuita usata dalla richiesta esaurita della quota.
RecognizeFailed 429 8565 Azione non riuscita, le richieste hanno superato il numero di richieste simultanee consentite per la sottoscrizione dei servizi di intelligenza artificiale di Azure.
RecognizeFailed 408 8565 Azione non riuscita e timeout della richiesta ai servizi di intelligenza artificiale di Azure.
RecognizeFailed 500 8511 Azione non riuscita. Errore durante il tentativo di riproduzione della richiesta.
RecognizeFailed 500 8512 Errore interno sconosciuto del server.

Limitazioni note

  • DTMF in banda non è supportato. Usare invece DTMF RFC 2833.
  • Le richieste di testo di sintesi vocale supportano un massimo di 400 caratteri, se la richiesta è più lunga di questa, è consigliabile usare SSML per le azioni di riproduzione basate su sintesi vocale.
  • Per gli scenari in cui si supera il limite di quota del servizio di riconoscimento vocale, è possibile richiedere di aumentare questo limite seguendo i passaggi descritti in Quote e limiti dei servizi di riconoscimento vocale.

Pulire le risorse

Se si vuole pulire e rimuovere una sottoscrizione a Servizi di comunicazione, è possibile eliminare la risorsa o il gruppo di risorse. L'eliminazione del gruppo di risorse comporta anche l'eliminazione di tutte le altre risorse associate. Altre informazioni sulla pulizia delle risorse.

Passaggi successivi