Condividi tramite


Personalizzare le richieste vocali agli utenti con azione di riproduzione

Questa guida consente di iniziare a riprodurre file audio ai partecipanti utilizzando l'azione di riproduzione fornita tramite l’SDK di automazione delle chiamate di Servizi di comunicazione di Azure.

Prerequisiti

Per le funzionalità di intelligenza artificiale

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

Il pacchetto NuGet può essere ottenuto qui, se non è già stato fatto.

(Facoltativo) Preparare il file audio se si desidera usare i file audio per la riproduzione di richieste

Crea un file audio, se non ne hai già uno, da usare per la riproduzione di richieste e messaggi ai partecipanti. Il file audio deve essere ospitato in un percorso accessibile a Servizi di comunicazione di Azure con un supporto per l'autenticazione. Tenete a disposizione una copia dell'URL da utilizzare quando si richiede di riprodurre il file audio. Servizi di comunicazione di Azure supporta entrambi i tipi di file MP3 con ID3V2TAG e i file WAV, PCM mono a 16 bit con frequenza di campionamento a 16 KHz. .

È possibile testare la creazione di un file audio personalizzato utilizzando la sintesi vocale con lo strumento Creazione di contenuto audio.

(Facoltativo) Connettere il servizio cognitivo di Azure al servizio di comunicazione di Azure

Se si vogliono usare le funzionalità di sintesi vocale, è necessario connettere il Servizio cognitivo di Azure al servizio di comunicazione di Azure.

Stabilire una chiamata

A questo punto è necessario avere familiarità con le chiamate di avvio; per maggiori informazioni su come effettuare una chiamata, seguire la guida introduttiva. È 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); 

Riprodurre audio

Una volta stabilita la chiamata, sono disponibili più opzioni per la modalità di riproduzione dell'audio. Puoi riprodurre audio al partecipante che ha partecipato alla chiamata o riprodurre audio a tutti i partecipanti della chiamata.

Origine riproduzione - File audio

Per riprodurre audio ai partecipanti usando file audio, è necessario assicurarsi che il file audio sia un file WAV, mono e 16 KHz. Per riprodurre file audio, è necessario assicurarsi di fornire a Servizi di comunicazione di Azure un URI a un file host in un percorso in cui Servizi di comunicazione di Azure possano accedervi. Il tipo FileSource nell'SDK può essere usato per specificare i file audio per l'azione di riproduzione.

var playSource = new FileSource(new Uri(audioUri));

//Multiple FileSource Prompts, if you want to play multiple audio files in one request you can provide them in a list.
//var playSources = new List<PlaySource>() { new FileSource(new Uri("https://www2.cs.uic.edu/~i101/SoundFiles/StarWars3.wav")), new FileSource(new Uri("https://www2.cs.uic.edu/~i101/SoundFiles/preamble10.wav")) };

Origine riproduzione - Sintesi vocale

Per riprodurre un audio con la sintesi vocale tramite Servizi di Azure AI, è necessario fornire il testo che si vuole riprodurre, nonché SourceLocale e VoiceKind o il VoiceName che si desidera utilizzare. Tutti i nomi vocali supportati dai servizi di intelligenza artificiale di Azure sono supportati dall'elenco completo qui.

String textToPlay = "Welcome to Contoso";

// Provide SourceLocale and VoiceKind to select an appropriate voice. 
var playSource = new TextSource(textToPlay, "en-US", VoiceKind.Female);

//Multiple TextSource prompt, if you want to play multiple text prompts in one request you can provide them in a list.
//var playSources = new List<PlaySource>() { new TextSource("recognize prompt one") { VoiceName = SpeechToTextVoice }, new TextSource("recognize prompt two") { VoiceName = SpeechToTextVoice }, new TextSource(content) { VoiceName = SpeechToTextVoice } };
String textToPlay = "Welcome to Contoso"; 
 
// Provide VoiceName to select a specific voice. 
var playSource = new TextSource(textToPlay, "en-US-ElizabethNeural");

//Multiple TextSource prompt, if you want to play multiple text prompts in one request you can provide them in a list.
//var playSources = new List<PlaySource>() { new TextSource("recognize prompt one") { VoiceName = SpeechToTextVoice }, new TextSource("recognize prompt two") { VoiceName = SpeechToTextVoice }, new TextSource(content) { VoiceName = SpeechToTextVoice } };

Origine riproduzione - Sintesi vocale con SSML

Se si vuole personalizzare ulteriormente l'output di sintesi vocale con i servizi di intelligenza artificiale di Azure, è possibile usare il linguaggio di markup di sintesi vocale SSML quando si richiama l'azione di riproduzione tramite Automazione delle chiamate. Con SSML è possibile ottimizzare l’intonazione, mettere in pausa, migliorare la pronuncia, modificare la velocità di pronuncia, regolare il volume e attribuire più voci.

String ssmlToPlay = "<speak version=\"1.0\" xmlns=\"http://www.w3.org/2001/10/synthesis\" xml:lang=\"en-US\"><voice name=\"en-US-JennyNeural\">Hello World!</voice></speak>"; 

var playSource = new SsmlSource(ssmlToPlay);

Modelli vocali personalizzati

Se si vogliono migliorare le richieste e includere modelli vocali personalizzati, l'azione di riproduzione Sintesi vocale ora supporta queste voci personalizzate. Si tratta di un'ottima opzione se si sta cercando di offrire ai clienti un'esperienza più locale, personalizzata o in situazioni in cui i modelli predefiniti potrebbero non coprire le parole e gli accenti che si sta tentando di pronunciare. Per altre informazioni sulla creazione e la distribuzione di modelli personalizzati, vedere questa guida.

Esempio di testo regolare con nomi di voce personalizzata

String textToPlay = "Welcome to Contoso"; 
 
// Provide VoiceName and CustomVoiceEndpointId to select custom voice. 
var playSource = new TextSource(textToPlay)
    {
        VoiceName = "YourCustomVoiceName",
        CustomVoiceEndpointId = "YourCustomEndpointId"
    };

Esempio di nomi di voce personalizzata con SSML


var playSource = new SsmlSource(ssmlToPlay,"YourCustomEndpointId");

Dopo aver deciso quale playSource si vuole usare per la riproduzione audio, è possibile scegliere se riprodurre l'audio a un partecipante specifico o a tutti i partecipanti.

Riprodurre audio a tutti i partecipanti

In questo scenario, l'audio viene riprodotto a tutti i partecipanti alla chiamata.

var playResponse = await callAutomationClient.GetCallConnection(callConnectionId) 
    .GetCallMedia() 
    .PlayToAllAsync(playSource); 

Supporto per il barge-in

Durante gli scenari in cui si riproduce l'audio in ciclo a tutti i partecipanti, ad esempio la sala di attesa, è possibile riprodurre audio ai partecipanti nella sala di attesa e mantenerli aggiornati sul loro numero nella coda. Quando usi il supporto barge-in, l'audio in corso verrà annullato e riprodotto il nuovo messaggio. Quindi, per continuare a riprodurre l'audio originale, eseguire un'altra richiesta di riproduzione.

var GoodbyePlaySource = new TextSource("Good bye")
{
    VoiceName = "en-US-NancyNeural"
};

PlayToAllOptions playOptions = new PlayToAllOptions(GoodbyePlaySource)
{
    InterruptCallMediaOperation = false,
    OperationCallbackUri = new Uri(callbackUriHost),
    Loop = true
};

await callConnectionMedia.PlayToAllAsync(playOptions);

// Interrupt media with text source

// Option1:
var interrupt = new TextSource("Interrupt prompt message")
{
    VoiceName = "en-US-NancyNeural"
};

PlayToAllOptions playInterrupt = new PlayToAllOptions(interrupt)
{
    InterruptCallMediaOperation = true,
    OperationCallbackUri = new Uri(callbackUriHost),
    Loop = false
};

await callConnectionMedia.PlayToAllAsync(playInterrupt);

/*
Option2: Interrupt media with file source
var interruptFile = new FileSource(new Uri(<AUDIO URL>));
PlayToAllOptions playFileInterrupt = new PlayToAllOptions(interruptFile)
{
    InterruptCallMediaOperation = true,
    OperationCallbackUri = new Uri(callbackUriHost),
    Loop = false
};
await callConnectionMedia.PlayToAllAsync(playFileInterrupt);
*/

Riprodurre audio a un partecipante specifico

In questo scenario, l'audio viene riprodotto a un partecipante specifico.

var playTo = new List<CommunicationIdentifier> { targetParticipant }; 
var playResponse = await callAutomationClient.GetCallConnection(callConnectionId) 
    .GetCallMedia() 
    .PlayAsync(playSource, playTo); 

Riprodurre più richieste audio

Tutte le azioni di riproduzione supportano la possibilità di inviare più origini di riproduzione con una sola richiesta. Ciò significa che si invia un elenco di richieste da riprodurre in un'unica soluzione, invece di effettuare le richieste singolarmente.

Riprodurre audio in ciclo

È possibile usare l'opzione loop per riprodurre musica che viene eseguita a ciclo continuo finché l'applicazione non è pronta ad accettare il chiamante. In alternativa, passare al passaggio logico successivo in base alla logica di business delle applicazioni.

var playOptions = new PlayToAllOptions(playSource) 
{ 
    Loop = true 
}; 
var playResult = await callAutomationClient.GetCallConnection(callConnectionId) 
    .GetCallMedia() 
    .PlayToAllAsync(playOptions); 

Migliorare la riproduzione con la memorizzazione nella cache dei file audio

Se si riproduce lo stesso file audio più volte, l'applicazione può fornire a Servizi di comunicazione di Azure il SourceID per il file audio. Servizi di comunicazione di Azure memorizza nella cache questo file audio per 1 ora.

Nota

La memorizzazione nella cache dei file audio non è adatta alle richieste dinamiche. Se si modifica l'URL fornito in Servizi di comunicazione di Azure, l'URL memorizzato nella cache non viene aggiornato immediatamente. L'aggiornamento verrà eseguito dopo la scadenza della cache esistente.

var playTo = new List<CommunicationIdentifier> { targetParticipant }; 
var playSource = new FileSource(new Uri(audioUri)) 
{ 
    PlaySourceCacheId = "<playSourceId>" 
}; 
var playResult = await callAutomationClient.GetCallConnection(callConnectionId) 
    .GetCallMedia() 
    .PlayAsync(playSource, playTo); 

Gestire gli aggiornamenti degli eventi di azione di riproduzione

L'applicazione riceve gli aggiornamenti degli eventi del ciclo di vita delle azioni sull'URL di callback fornito al servizio di Automazione delle chiamate al momento della risposta alla chiamata. Esempio di aggiornamento dell'evento di riproduzione riuscito.

Esempio di come è possibile deserializzare l'evento PlayCompleted:

if (acsEvent is PlayCompleted playCompleted) 
{ 
    logger.LogInformation("Play completed successfully, context={context}", playCompleted.OperationContext); 
} 

Esempio di come è possibile deserializzare l'evento PlayStarted:

if (acsEvent is PlayStarted playStarted) 
{ 
    logger.LogInformation("Play started successfully, context={context}", playStarted.OperationContext); 
} 

Esempio di come è possibile deserializzare l'evento PlayFailed:

if (acsEvent is PlayFailed playFailed) 
{ 
    if (MediaEventReasonCode.PlayDownloadFailed.Equals(playFailed.ReasonCode)) 
    { 
        logger.LogInformation("Play failed: download failed, context={context}", playFailed.OperationContext); 
    } 
    else if (MediaEventReasonCode.PlayInvalidFileFormat.Equals(playFailed.ReasonCode)) 
    { 
        logger.LogInformation("Play failed: invalid file format, context={context}", playFailed.OperationContext); 
    } 
    else 
    { 
        logger.LogInformation("Play failed, result={result}, context={context}", playFailed.ResultInformation?.Message, playFailed.OperationContext); 
    } 
} 

Per altre informazioni sugli altri eventi supportati, visitare il Documento di panoramica di Automazione delle chiamate.

Annulla azione di riproduzione

Annullare tutte le operazioni multimediali, tutte le operazioni multimediali in sospeso vengono annullate. Questa azione annulla anche altre azioni di riproduzione in coda.

var cancelResult = await callAutomationClient.GetCallConnection(callConnectionId) 
    .GetCallMedia() 
    .CancelAllMediaOperationsAsync(); 

Esempio di come è possibile deserializzare l'evento PlayCanceled:

if (acsEvent is PlayCanceled playCanceled) 
{ 
    logger.LogInformation("Play canceled, context={context}", playCanceled.OperationContext); 
} 

Prerequisiti

Per le funzionalità di intelligenza artificiale

Creare una nuova applicazione Java

Nella finestra del terminale o di comando, passare alla directory in cui creare l'applicazione Java. Eseguire il comando illustrato di seguito 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 precedente crea una directory con lo stesso nome dell'argomento artifactId. In questa directory, la directory src/main/java contiene il codice sorgente del progetto, la directory src/test/java contiene l'origine di test.

Notare che il passaggio 'generate' ha creato una directory con lo stesso nome di artifactId. In questa directory, la directory src/main/java contiene codice sorgente, la directory src/test/java contiene test e il file pom.xml è il modello a oggetti del progetto o POM.

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

Il pacchetto SDK di automazione delle chiamate di Servizi di comunicazione di Azure viene recuperato dal feed di sviluppo di Azure SDK.

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

(Facoltativo) Preparare il file audio se si desidera usare i file audio per la riproduzione di richieste

Crea un file audio, se non ne hai già uno, da usare per la riproduzione di richieste e messaggi ai partecipanti. Il file audio deve essere ospitato in un percorso accessibile a Servizi di comunicazione di Azure con un supporto per l'autenticazione. Tenete a disposizione una copia dell'URL da utilizzare quando si richiede di riprodurre il file audio. Servizi di comunicazione di Azure supporta entrambi i tipi di file MP3 con ID3V2TAG e i file WAV, PCM mono a 16 bit con frequenza di campionamento a 16 KHz. .

È possibile testare la creazione di un file audio personalizzato utilizzando la sintesi vocale con lo strumento Creazione di contenuto audio.

(Facoltativo) Connettere il servizio cognitivo di Azure al servizio di comunicazione di Azure

Se si vogliono usare le funzionalità di sintesi vocale, è necessario connettere il Servizio cognitivo di Azure al servizio di comunicazione di Azure.

Aggiorna App.java con il codice

Nell'editor preferito aprire App.java file e aggiornarlo con il codice fornito nella sezione Aggiorna app.java con il codice.

Stabilire una chiamata

A questo punto è necessario avere familiarità con le chiamate di avvio; per maggiori informazioni su come effettuare una chiamata, seguire la guida introduttiva. È 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(); 

Riprodurre audio

Una volta stabilita la chiamata, sono disponibili più opzioni per la modalità di riproduzione dell'audio. Puoi riprodurre audio al partecipante che ha partecipato alla chiamata o riprodurre audio a tutti i partecipanti della chiamata.

Origine riproduzione - File audio

Per riprodurre audio ai partecipanti usando file audio, è necessario assicurarsi che il file audio sia un file WAV, mono e 16 KHz. Per riprodurre file audio, è necessario assicurarsi di fornire a Servizi di comunicazione di Azure un URI a un file host in un percorso in cui Servizi di comunicazione di Azure possano accedervi. Il tipo FileSource nell'SDK può essere usato per specificare i file audio per l'azione di riproduzione.

var playSource = new FileSource(new Uri(audioUri));

/* Multiple FileSource Prompts
var p1 = new FileSource().setUrl("https://www2.cs.uic.edu/~i101/SoundFiles/StarWars3.wav");
var p2 = new FileSource().setUrl("https://www2.cs.uic.edu/~i101/SoundFiles/preamble10.wav");

var playSources = new ArrayList();
playSources.add(p1);
playSources.add(p2);
*/

Origine riproduzione - Sintesi vocale

Per riprodurre un audio con la sintesi vocale tramite Servizi di Azure AI, è necessario fornire il testo che si vuole riprodurre, nonché SourceLocale e VoiceKind o il VoiceName che si desidera utilizzare. Tutti i nomi vocali supportati dai servizi di intelligenza artificiale di Azure sono supportati dall'elenco completo qui.

// Provide SourceLocale and VoiceKind to select an appropriate voice.
var playSource = new TextSource() 
    .setText(textToPlay) 
    .setSourceLocale("en-US") 
    .setVoiceKind(VoiceKind.FEMALE);

/* Multiple Prompt list setup: Multiple TextSource prompt

var p1 = new TextSource().setText("recognize prompt one").setSourceLocale("en-US").setVoiceKind(VoiceKind.FEMALE);
var p2 = new TextSource().setText("recognize prompt two").setSourceLocale("en-US").setVoiceKind(VoiceKind.FEMALE);
var p3 = new TextSource().setText(content).setSourceLocale("en-US").setVoiceKind(VoiceKind.FEMALE);

var playSources = new ArrayList();
playSources.add(p1);
playSources.add(p2);
playSources.add(p3);
*/
// Provide VoiceName to select a specific voice.
var playSource = new TextSource() 
    .setText(textToPlay) 
    .setVoiceName("en-US-ElizabethNeural");

/* Multiple Prompt list setup: Multiple TextSource prompt

var p1 = new TextSource().setText("recognize prompt one").setVoiceName("en-US-NancyNeural");
var p2 = new TextSource().setText("recognize prompt two").setVoiceName("en-US-NancyNeural");
var p3 = new TextSource().setText(content).setVoiceName("en-US-NancyNeural");

var playSources = new ArrayList();
playSources.add(p1);
playSources.add(p2);
playSources.add(p3);
*/

Origine riproduzione - Sintesi vocale di SSML

String ssmlToPlay = "<speak version=\"1.0\" xmlns=\"http://www.w3.org/2001/10/synthesis\" xml:lang=\"en-US\"><voice name=\"en-US-JennyNeural\">Hello World!</voice></speak>"; 
var playSource = new SsmlSource() 
    .setSsmlText(ssmlToPlay);

Modelli vocali personalizzati

Se si vogliono migliorare le richieste e includere modelli vocali personalizzati, l'azione di riproduzione Sintesi vocale ora supporta queste voci personalizzate. Si tratta di un'ottima opzione se si sta cercando di offrire ai clienti un'esperienza più locale, personalizzata o in situazioni in cui i modelli predefiniti potrebbero non coprire le parole e gli accenti che si sta tentando di pronunciare. Per altre informazioni sulla creazione e la distribuzione di modelli personalizzati, vedere questa guida.

Esempio di testo regolare con nomi di voce personalizzata

// Provide VoiceName and  to select a specific voice.
var playSource = new TextSource() 
    .setText(textToPlay) 
    .setCustomVoiceName("YourCustomVoiceName")
    .setCustomVoiceEndpointId("YourCustomEndpointId");

Esempio di nomi di voce personalizzata con SSML

String ssmlToPlay = "<speak version=\"1.0\" xmlns=\"http://www.w3.org/2001/10/synthesis\" xml:lang=\"en-US\"><voice name=\"YourCustomVoiceName\">Hello World!</voice></speak>"; 
var playSource = new SsmlSource() 
    .setSsmlText(ssmlToPlay)
    .setCustomVoiceEndpointId("YourCustomEndpointId");

Dopo aver deciso quale playSource si vuole usare per la riproduzione audio, è possibile scegliere se riprodurre l'audio a un partecipante specifico o a tutti i partecipanti.

Riprodurre audio a tutti i partecipanti

In questo scenario, l'audio viene riprodotto a tutti i partecipanti alla chiamata.

var playOptions = new PlayToAllOptions(playSource); 
var playResponse = callAutomationClient.getCallConnectionAsync(callConnectionId) 
    .getCallMediaAsync() 
    .playToAllWithResponse(playOptions) 
    .block(); 
log.info("Play result: " + playResponse.getStatusCode()); 

Supporto per il barge-in

Durante gli scenari in cui si riproduce l'audio in ciclo a tutti i partecipanti, ad esempio la sala di attesa, è possibile riprodurre audio ai partecipanti nella sala di attesa e mantenerli aggiornati sul loro numero nella coda. Quando usi il supporto barge-in, l'audio in corso verrà annullato e riprodotto il nuovo messaggio. Quindi, per continuare a riprodurre l'audio originale, eseguire un'altra richiesta di riproduzione.

// Option1: Interrupt media with text source
var textPlay = new TextSource()
    .setText("First Interrupt prompt message")
    .setVoiceName("en-US-NancyNeural");

var playToAllOptions = new PlayToAllOptions(textPlay)
    .setLoop(false)
    .setOperationCallbackUrl(appConfig.getBasecallbackuri())
    .setInterruptCallMediaOperation(false);

client.getCallConnection(callConnectionId)
    .getCallMedia()
    .playToAllWithResponse(playToAllOptions, Context.NONE);

/*
Option2: Interrupt media with text source
client.getCallConnection(callConnectionId)
    .getCallMedia()
    .playToAll(textPlay);
*/

/*
Option1: Barge-in with file source
var interruptFile = new FileSource()
    .setUrl("https://www2.cs.uic.edu/~i101/SoundFiles/StarWars3.wav");

var playFileOptions = new PlayToAllOptions(interruptFile)
    .setLoop(false)
    .setOperationCallbackUrl(appConfig.getBasecallbackuri())
    .setInterruptCallMediaOperation(true);

client.getCallConnection(callConnectionId)
    .getCallMedia()
    .playToAllWithResponse(playFileOptions, Context.NONE);

Option2: Barge-in with file source
client.getCallConnection(callConnectionId)
    .getCallMedia()
    .playToAll(interruptFile);
*/

Riprodurre audio a un partecipante specifico

In questo scenario, l'audio viene riprodotto a un partecipante specifico.

var playTo = Arrays.asList(targetParticipant); 
var playOptions = new PlayOptions(playSource, playTo); 
var playResponse = callAutomationClient.getCallConnectionAsync(callConnectionId) 
    .getCallMediaAsync() 
    .playWithResponse(playOptions) 
    .block(); 

Riprodurre audio in ciclo

È possibile usare l'opzione loop per riprodurre musica che viene eseguita a ciclo continuo finché l'applicazione non è pronta ad accettare il chiamante. In alternativa, passare al passaggio logico successivo in base alla logica di business delle applicazioni.

var playOptions = new PlayToAllOptions(playSource) 
    .setLoop(true); 
var playResponse = callAutomationClient.getCallConnectionAsync(callConnectionId) 
    .getCallMediaAsync() 
    .playToAllWithResponse(playOptions) 
    .block(); 

Migliorare la riproduzione con la memorizzazione nella cache dei file audio

Se si riproduce lo stesso file audio più volte, l'applicazione può fornire a Servizi di comunicazione di Azure il SourceID per il file audio. Servizi di comunicazione di Azure memorizza nella cache questo file audio per 1 ora.

Nota

La memorizzazione nella cache dei file audio non è adatta alle richieste dinamiche. Se si modifica l'URL fornito in Servizi di comunicazione di Azure, l'URL memorizzato nella cache non viene aggiornato immediatamente. L'aggiornamento verrà eseguito dopo la scadenza della cache esistente.

var playTo = Arrays.asList(targetParticipant); 
var playSource = new FileSource() 
    .setUrl(audioUri) \
    .setPlaySourceCacheId("<playSourceId>"); 
var playOptions = new PlayOptions(playSource, playTo); 
var playResponse = callAutomationClient.getCallConnectionAsync(callConnectionId) 
    .getCallMediaAsync() 
    .playWithResponse(playOptions) 
    .block(); 

Gestire gli aggiornamenti degli eventi di azione di riproduzione

L'applicazione riceve gli aggiornamenti degli eventi del ciclo di vita delle azioni sull'URL di callback fornito al servizio di Automazione delle chiamate al momento della risposta alla chiamata. Esempio di aggiornamento dell'evento di riproduzione riuscito.

Esempio di come è possibile deserializzare l'evento PlayCompleted:

if (acsEvent instanceof PlayCompleted) { 
    PlayCompleted event = (PlayCompleted) acsEvent; 
    log.info("Play completed, context=" + event.getOperationContext()); 
} 

Esempio di come è possibile deserializzare l'evento PlayStarted:

if (acsEvent instanceof PlayStarted) { 
    PlayStarted event = (PlayStarted) acsEvent; 
    log.info("Play started, context=" + event.getOperationContext()); 
} 

Esempio di come è possibile deserializzare l'evento PlayFailed:

if (acsEvent instanceof PlayFailed) { 
    PlayFailed event = (PlayFailed) acsEvent; 
    if (ReasonCode.Play.DOWNLOAD_FAILED.equals(event.getReasonCode())) { 
        log.info("Play failed: download failed, context=" + event.getOperationContext()); 
    } else if (ReasonCode.Play.INVALID_FILE_FORMAT.equals(event.getReasonCode())) { 
        log.info("Play failed: invalid file format, context=" + event.getOperationContext()); 
    } else { 
        log.info("Play failed, result=" + event.getResultInformation().getMessage() + ", context=" + event.getOperationContext()); 
    } 
} 

Per altre informazioni sugli altri eventi supportati, visitare il Documento di panoramica di Automazione delle chiamate.

Annulla azione di riproduzione

Annullare tutte le operazioni multimediali, tutte le operazioni multimediali in sospeso vengono annullate. Questa azione annulla anche altre azioni di riproduzione in coda.

var cancelResponse = callAutomationClient.getCallConnectionAsync(callConnectionId) 
    .getCallMediaAsync() 
    .cancelAllMediaOperationsWithResponse() 
    .block(); 
log.info("Cancel result: " + cancelResponse.getStatusCode()); 

Esempio di come è possibile deserializzare l'evento PlayCanceled:

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

Prerequisiti

Per le funzionalità di intelligenza artificiale

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, ad esempio denominandolo app.js. Scrivere il codice JavaScript in questo file. Eseguire l'applicazione usando Node.js con il comando seguente. Questo codice esegue il codice JavaScript scritto.

node app.js

(Facoltativo) Preparare il file audio se si desidera usare i file audio per la riproduzione di richieste

Crea un file audio, se non ne hai già uno, da usare per la riproduzione di richieste e messaggi ai partecipanti. Il file audio deve essere ospitato in un percorso accessibile a Servizi di comunicazione di Azure con un supporto per l'autenticazione. Tenete a disposizione una copia dell'URL da utilizzare quando si richiede di riprodurre il file audio. Servizi di comunicazione di Azure supporta entrambi i tipi di file MP3 con ID3V2TAG e i file WAV, PCM mono a 16 bit con frequenza di campionamento a 16 KHz.

È possibile testare la creazione di un file audio personalizzato utilizzando la sintesi vocale con lo strumento Creazione di contenuto audio.

(Facoltativo) Connettere il servizio cognitivo di Azure al servizio di comunicazione di Azure

Se si vogliono usare le funzionalità di sintesi vocale, è necessario connettere il Servizio cognitivo di Azure al servizio di comunicazione di Azure.

Stabilire una chiamata

A questo punto è necessario avere familiarità con le chiamate di avvio; per maggiori informazioni su come effettuare una chiamata, seguire la guida introduttiva. È anche possibile usare il frammento di codice fornito qui per comprendere come rispondere a una chiamata.

const callIntelligenceOptions: CallIntelligenceOptions = { "<https://sample-callback-uri>" }; 
        const answerCallOptions: AnswerCallOptions = { callIntelligenceOptions: callIntelligenceOptions };
  
await acsClient.answerCall("<Incoming call context>", "<https://sample-callback-uri>", answerCallOptions); 

Riprodurre audio

Una volta stabilita la chiamata, sono disponibili più opzioni per la modalità di riproduzione dell'audio. Puoi riprodurre audio al partecipante che ha partecipato alla chiamata o riprodurre audio a tutti i partecipanti della chiamata.

Origine riproduzione - File audio

Per riprodurre audio ai partecipanti usando file audio, è necessario assicurarsi che il file audio sia un file WAV, mono e 16 KHz. Per riprodurre file audio, è necessario assicurarsi di fornire a Servizi di comunicazione di Azure un URI a un file host in un percorso in cui Servizi di comunicazione di Azure possano accedervi. Il tipo FileSource nell'SDK può essere usato per specificare i file audio per l'azione di riproduzione.

const playSource: FileSource = { url: audioUri, kind: "fileSource" };

Origine riproduzione - Sintesi vocale

Per riprodurre un audio con la sintesi vocale tramite Servizi di Azure AI, è necessario fornire il testo che si vuole riprodurre, nonché SourceLocale e VoiceKind o il VoiceName che si desidera utilizzare. Tutti i nomi vocali supportati dai servizi di intelligenza artificiale di Azure sono supportati dall'elenco completo qui.

const textToPlay = "Welcome to Contoso"; 
// Provide SourceLocale and VoiceKind to select an appropriate voice. 
const playSource: TextSource = { text: textToPlay, sourceLocale: "en-US", voiceKind: VoiceKind.Female, kind: "textSource" }; 
const textToPlay = "Welcome to Contoso"; 
// Provide VoiceName to select a specific voice. 
const playSource: TextSource = { text: textToPlay, voiceName: "en-US-ElizabethNeural", kind: "textSource" }; 

Origine riproduzione - Sintesi vocale con SSML

Se si vuole personalizzare ulteriormente l'output di sintesi vocale con i servizi di intelligenza artificiale di Azure, è possibile usare il linguaggio di markup di sintesi vocale SSML quando si richiama l'azione di riproduzione tramite Automazione delle chiamate. Con SSML è possibile ottimizzare l’intonazione, mettere in pausa, migliorare la pronuncia, modificare la velocità di pronuncia, regolare il volume e attribuire più voci.

const ssmlToPlay = "<speak version=\"1.0\" xmlns=\"http://www.w3.org/2001/10/synthesis\" xml:lang=\"en-US\"><voice name=\"en-US-JennyNeural\">Hello World!</voice></speak>"; 
const playSource: SsmlSource = { ssmlText: ssmlToPlay, kind: "ssmlSource" }; 

Modelli vocali personalizzati

Se si vogliono migliorare le richieste e includere modelli vocali personalizzati, l'azione di riproduzione Sintesi vocale ora supporta queste voci personalizzate. Si tratta di un'ottima opzione se si sta cercando di offrire ai clienti un'esperienza più locale, personalizzata o in situazioni in cui i modelli predefiniti potrebbero non coprire le parole e gli accenti che si sta tentando di pronunciare. Per altre informazioni sulla creazione e la distribuzione di modelli personalizzati, vedere questa guida.

Esempio di testo regolare con nomi di voce personalizzata

const textToPlay = "Welcome to Contoso";
// Provide VoiceName and CustomVoiceEndpointID to play your custom voice
const playSource: TextSource = { text: textToPlay, voiceName: "YourCustomVoiceName", customVoiceEndpointId: "YourCustomEndpointId"}

Esempio di nomi di voce personalizzata con SSML

const ssmlToPlay = "<speak version=\"1.0\" xmlns=\"http://www.w3.org/2001/10/synthesis\" xml:lang=\"en-US\"><voice name=\"YourCustomVoiceName\">Hello World!</voice></speak>"; 
const playSource: SsmlSource = { ssmlText: ssmlToPlay, kind: "ssmlSource", customVoiceEndpointId: "YourCustomEndpointId"}; 

Dopo aver deciso quale playSource si vuole usare per la riproduzione audio, è possibile scegliere se riprodurre l'audio a un partecipante specifico o a tutti i partecipanti.

Riprodurre audio - Tutti i partecipanti

In questo scenario, l'audio viene riprodotto a tutti i partecipanti alla chiamata.

await callAutomationClient.getCallConnection(callConnectionId) 
    .getCallMedia() 
    .playToAll([ playSource ]);

Supporto per il barge-in

Durante gli scenari in cui si riproduce l'audio in ciclo a tutti i partecipanti, ad esempio la sala di attesa, è possibile riprodurre audio ai partecipanti nella sala di attesa e mantenerli aggiornati sul loro numero nella coda. Quando usi il supporto barge-in, l'audio in corso verrà annullato e riprodotto il nuovo messaggio. Quindi, per continuare a riprodurre l'audio originale, eseguire un'altra richiesta di riproduzione.

// Interrupt media with text source 
//Option1:

const playSource: TextSource = { text: "Interrupt prompt", voiceName: "en-US-NancyNeural", kind: "textSource" };

const interruptOption: PlayToAllOptions = { 
loop: false, 
interruptCallMediaOperation: true, 
operationContext: "interruptOperationContext", 
operationCallbackUrl: process.env.CALLBACK_URI + "/api/callbacks" 
}; 

await callConnectionMedia.playToAll([playSource], interruptOption); 

/*
// Interrupt media with file source 

Option2: 

const playSource: FileSource = { 
url: MEDIA_URI + "MainMenu.wav", 
kind: "fileSource" 
}; 

const interruptOption: PlayToAllOptions = { 
loop: false, 
interruptCallMediaOperation: true, 
operationContext: "interruptOperationContext", 
operationCallbackUrl: process.env.CALLBACK_URI + "/api/callbacks" 
}; 

await callConnectionMedia.playToAll([playSource], interruptOption); 
*/

Riprodurre audio - Partecipante specifico

In questo scenario, l'audio viene riprodotto a un partecipante specifico.

await callAutomationClient.getCallConnection(callConnectionId) 
    .getCallMedia() 
    .play([ playSource ], [ targetParticipant ]); 

Riprodurre audio in ciclo

È possibile usare l'opzione loop per riprodurre musica che viene eseguita a ciclo continuo finché l'applicazione non è pronta ad accettare il chiamante. In alternativa, passare al passaggio logico successivo in base alla logica di business delle applicazioni.

const playOptions: PlayOptions = { loop: true }; 
await callAutomationClient.getCallConnection(callConnectionId) 
    .getCallMedia() 
    .playToAll([ playSource ], playOptions); 

Migliorare la riproduzione con la memorizzazione nella cache dei file audio

Se si riproduce lo stesso file audio più volte, l'applicazione può fornire a Servizi di comunicazione di Azure il SourceID per il file audio. Servizi di comunicazione di Azure memorizza nella cache questo file audio per 1 ora.

Nota

La memorizzazione nella cache dei file audio non è adatta alle richieste dinamiche. Se si modifica l'URL fornito in Servizi di comunicazione di Azure, l'URL memorizzato nella cache non viene aggiornato immediatamente. L'aggiornamento verrà eseguito dopo la scadenza della cache esistente.

const playSource: FileSource = { url: audioUri, playsourcacheid: "<playSourceId>", kind: "fileSource" }; 
await callAutomationClient.getCallConnection(callConnectionId) 
.getCallMedia() 
.play([ playSource ], [ targetParticipant ]);

Gestire gli aggiornamenti degli eventi di azione di riproduzione

L'applicazione riceve gli aggiornamenti degli eventi del ciclo di vita delle azioni sull'URL di callback fornito al servizio di Automazione delle chiamate al momento della risposta alla chiamata.

Esempio di come è possibile deserializzare l'evento PlayCompleted:

if (event.type === "Microsoft.Communication.PlayCompleted") { 
    console.log("Play completed, context=%s", eventData.operationContext); 
} 

Esempio di come è possibile deserializzare l'evento PlayFailed:

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

Esempio di come è possibile deserializzare l'evento PlayStarted:

if (event.type === "Microsoft.Communication.PlayStarted") { 
    console.log("Play started: data=%s", JSON.stringify(eventData)); 
} 

Per altre informazioni sugli altri eventi supportati, visitare il Documento di panoramica di Automazione delle chiamate.

Annulla azione di riproduzione

Annullare tutte le operazioni multimediali, tutte le operazioni multimediali in sospeso vengono annullate. Questa azione annulla anche altre azioni di riproduzione in coda.

await callAutomationClient.getCallConnection(callConnectionId) 
.getCallMedia() 
.cancelAllOperations();

Esempio di come è possibile deserializzare l'evento PlayCanceled:

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

Prerequisiti

Per le funzionalità di intelligenza artificiale

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, ad esempio denominandolo app.py. Scrivere il codice Python in questo file.

Eseguire l'applicazione usando Python con il comando seguente per eseguire il codice.

python app.py

(Facoltativo) Preparare il file audio se si desidera usare i file audio per la riproduzione di richieste

Crea un file audio, se non ne hai già uno, da usare per la riproduzione di richieste e messaggi ai partecipanti. Il file audio deve essere ospitato in un percorso accessibile a Servizi di comunicazione di Azure con un supporto per l'autenticazione. Tenete a disposizione una copia dell'URL da utilizzare quando si richiede di riprodurre il file audio. Servizi di comunicazione di Azure supporta entrambi i tipi di file MP3 e i file WAV, PCM mono a 16 bit con frequenza di campionamento a 16 KHz. .

È possibile testare la creazione di un file audio personalizzato utilizzando la sintesi vocale con lo strumento Creazione di contenuto audio.

(Facoltativo) Connettere il servizio cognitivo di Azure al servizio di comunicazione di Azure

Se si vogliono usare le funzionalità di sintesi vocale, è necessario connettere il Servizio cognitivo di Azure al servizio di comunicazione di Azure.

Stabilire una chiamata

A questo punto è necessario avere familiarità con le chiamate di avvio; per maggiori informazioni su come effettuare una chiamata, seguire la guida introduttiva. È anche possibile usare il frammento di codice fornito qui per comprendere come rispondere a una chiamata.

call_automation_client.answer_call(
    incoming_call_context="<Incoming call context>",
    callback_url="<https://sample-callback-uri>",
    cognitive_services_endpoint=COGNITIVE_SERVICE_ENDPOINT,
)

Riprodurre audio

Una volta stabilita la chiamata, sono disponibili più opzioni per la modalità di riproduzione dell'audio. Puoi riprodurre audio al partecipante che ha partecipato alla chiamata o riprodurre audio a tutti i partecipanti della chiamata.

Origine riproduzione - File audio

Per riprodurre audio ai partecipanti usando file audio, è necessario assicurarsi che il file audio sia un file WAV, mono e 16 KHz. Per riprodurre file audio, è necessario assicurarsi di fornire a Servizi di comunicazione di Azure un URI a un file host in un percorso in cui Servizi di comunicazione di Azure possano accedervi. Il tipo FileSource nell'SDK può essere usato per specificare i file audio per l'azione di riproduzione.

play_source = FileSource(url=audioUri)

#Play multiple audio files
#file_source1 = FileSource(MAIN_MENU_PROMPT_URI) 
#file_source2 = FileSource(MAIN_MENU_PROMPT_URI) 
#
# play_sources = [file_source1, file_source2]
# 
# call_connection_client.play_media_to_all(
#     play_source=play_sources,
#     interrupt_call_media_operation=False,
#     operation_context="multiplePlayContext",
#     operation_callback_url=CALLBACK_EVENTS_URI,
#     loop=False
# )

Origine riproduzione - Sintesi vocale

Per riprodurre un audio con la sintesi vocale tramite Servizi di Azure AI, è necessario fornire il testo che si vuole riprodurre, nonché SourceLocale e VoiceKind o il VoiceName che si desidera utilizzare. Tutti i nomi vocali supportati dai servizi di intelligenza artificiale di Azure sono supportati dall'elenco completo qui.

text_to_play = "Welcome to Contoso"

# Provide SourceLocale and VoiceKind to select an appropriate voice. 
play_source = TextSource(
    text=text_to_play, source_locale="en-US", voice_kind=VoiceKind.FEMALE
)
play_to = [target_participant]
call_automation_client.get_call_connection(call_connection_id).play_media(
    play_source=play_source, play_to=play_to
)

#Multiple text prompts
#play_source1 = TextSource(text="Hi, This is multiple play source one call media test.", source_locale="en-US", voice_kind=VoiceKind.FEMALE) 
#play_source2 = TextSource(text="Hi, This is multiple play source two call media test.", source_locale="en-US", voice_kind=VoiceKind.FEMALE)
#
#play_sources = [play_source1, play_source2]
#
#call_connection_client.play_media_to_all(
#    play_source=play_sources,
#    interrupt_call_media_operation=False,
#    operation_context="multiplePlayContext",
#    operation_callback_url=CALLBACK_EVENTS_URI,
#    loop=False
#)
text_to_play = "Welcome to Contoso"

# Provide VoiceName to select a specific voice. 
play_source = TextSource(text=text_to_play, voice_name="en-US-ElizabethNeural")
play_to = [target_participant]
call_automation_client.get_call_connection(call_connection_id).play_media(
    play_source=play_source, play_to=play_to
)

#Play multiple text prompts
#play_source1 = TextSource(text="Hi, This is multiple play source one call media test.", voice_name=SPEECH_TO_TEXT_VOICE) 
#play_source2 = TextSource(text="Hi, This is multiple play source two call media test.", voice_name=SPEECH_TO_TEXT_VOICE)
#
#play_sources = [play_source1, play_source2]
#
#call_connection_client.play_media_to_all(
#    play_source=play_sources,
#    interrupt_call_media_operation=False,
#    operation_context="multiplePlayContext",
#    operation_callback_url=CALLBACK_EVENTS_URI,
#    loop=False
#)

Origine riproduzione - Sintesi vocale con SSML

Se si vuole personalizzare ulteriormente l'output di sintesi vocale con i servizi di intelligenza artificiale di Azure, è possibile usare il linguaggio di markup di sintesi vocale SSML quando si richiama l'azione di riproduzione tramite Automazione delle chiamate. Con SSML è possibile ottimizzare l’intonazione, mettere in pausa, migliorare la pronuncia, modificare la velocità di pronuncia, regolare il volume e attribuire più voci.

ssmlToPlay = '<speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis" xml:lang="en-US"><voice name="en-US-JennyNeural">Hello World!</voice></speak>'

play_source = SsmlSource(ssml_text=ssmlToPlay)

play_to = [target_participant]

call_automation_client.get_call_connection(call_connection_id).play_media(
    play_source=play_source, play_to=play_to
)

Modelli vocali personalizzati

Se si vogliono migliorare le richieste e includere modelli vocali personalizzati, l'azione di riproduzione Sintesi vocale ora supporta queste voci personalizzate. Si tratta di un'ottima opzione se si sta cercando di offrire ai clienti un'esperienza più locale, personalizzata o in situazioni in cui i modelli predefiniti potrebbero non coprire le parole e gli accenti che si sta tentando di pronunciare. Per altre informazioni sulla creazione e la distribuzione di modelli personalizzati, vedere questa guida.

Esempio di testo regolare con nomi di voce personalizzata

text_to_play = "Welcome to Contoso"

# Provide VoiceName to select a specific voice. 
play_source = TextSource(text=text_to_play, voice_name="YourCustomVoiceName", custom_voice_endpoint_id = "YourCustomEndpointId")
play_to = [target_participant]
call_automation_client.get_call_connection(call_connection_id).play_media(
    play_source=play_source, play_to=play_to
)

Esempio di nomi di voce personalizzata con SSML

ssmlToPlay = '<speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis" xml:lang="en-US"><voice name="YourCustomVoiceName">Hello World!</voice></speak>'

play_source = SsmlSource(ssml_text=ssmlToPlay, custom_voice_endpoint_id="YourCustomEndpointId")

play_to = [target_participant]

call_automation_client.get_call_connection(call_connection_id).play_media(
    play_source=play_source, play_to=play_to
)

Dopo aver deciso quale playSource si vuole usare per la riproduzione audio, è possibile scegliere se riprodurre l'audio a un partecipante specifico o a tutti i partecipanti.

Riprodurre audio - Tutti i partecipanti

Riprodurre un file audio preregistrato a tutti i partecipanti alla chiamata.

text_to_play = "Welcome to Contoso"

play_source = TextSource(text=text_to_play, voice_name="en-US-ElizabethNeural")

call_automation_client.get_call_connection(call_connection_id).play_media(
    play_source=play_source
)

Supporto per il barge-in

Durante gli scenari in cui si riproduce l'audio in ciclo a tutti i partecipanti, ad esempio la sala di attesa, è possibile riprodurre audio ai partecipanti nella sala di attesa e mantenerli aggiornati sul loro numero nella coda. Quando usi il supporto barge-in, l'audio in corso verrà annullato e riprodotto il nuovo messaggio. Quindi, per continuare a riprodurre l'audio originale, eseguire un'altra richiesta di riproduzione.

# Interrupt media with text source
# Option 1
play_source = TextSource(text="This is interrupt call media test.", voice_name=SPEECH_TO_TEXT_VOICE)
call_connection_client.play_media_to_all(
    play_source, 
    interrupt_call_media_operation=True, 
    operation_context="interruptContext", 
    operation_callback_url=CALLBACK_EVENTS_URI, 
    loop=False
)

# Interrupt media with file source
# Option 2
#play_source = FileSource(MAIN_MENU_PROMPT_URI)
#call_connection_client.play_media_to_all(
#    play_source, 
#    interrupt_call_media_operation=True, 
#    operation_context="interruptContext", 
#    operation_callback_url=CALLBACK_EVENTS_URI, 
#    loop=False
#)

Riprodurre audio - Partecipante specifico

Riprodurre un file audio preregistrato a un partecipante specifico della chiamata.

play_to = [target_participant]

call_automation_client.get_call_connection(call_connection_id).play_media(
    play_source=play_source, play_to=play_to
)

Riprodurre audio in ciclo

È possibile usare l'opzione loop per riprodurre musica che viene eseguita a ciclo continuo finché l'applicazione non è pronta ad accettare il chiamante. In alternativa, passare al passaggio logico successivo in base alla logica di business delle applicazioni.

text_to_play = "Welcome to Contoso"

play_source = TextSource(text=text_to_play, voice_name="en-US-ElizabethNeural")

call_automation_client.get_call_connection(call_connection_id).play_media(
    play_source=play_source, loop=True
)

Migliorare la riproduzione con la memorizzazione nella cache dei file audio

Se si riproduce lo stesso file audio più volte, l'applicazione può fornire a Servizi di comunicazione di Azure il SourceID per il file audio. Servizi di comunicazione di Azure memorizza nella cache questo file audio per 1 ora.

Nota

La memorizzazione nella cache dei file audio non è adatta alle richieste dinamiche. Se si modifica l'URL fornito in Servizi di comunicazione di Azure, l'URL memorizzato nella cache non viene aggiornato immediatamente. L'aggiornamento verrà eseguito dopo la scadenza della cache esistente.

play_source = FileSource(url=audioUri, play_source_cache_id="<playSourceId>")

play_to = [target_participant]

call_automation_client.get_call_connection(call_connection_id).play_media(
    play_source=play_source, play_to=play_to
)

Gestire gli aggiornamenti degli eventi di azione di riproduzione

L'applicazione riceve gli aggiornamenti degli eventi del ciclo di vita delle azioni sull'URL di callback fornito al servizio di Automazione delle chiamate al momento della risposta alla chiamata.

Esempio di come è possibile deserializzare l'evento PlayCompleted:

if event.type == "Microsoft.Communication.PlayCompleted":

    app.logger.info("Play completed, context=%s", event.data.get("operationContext"))

Esempio di come è possibile deserializzare l'evento PlayStarted:

if event.type == "Microsoft.Communication.PlayStarted":

    app.logger.info("Play started, context=%s", event.data.get("operationContext"))

Esempio di come è possibile deserializzare l'evento PlayFailed:

if event.type == "Microsoft.Communication.PlayFailed":

    app.logger.info("Play failed: data=%s", event.data)

Per altre informazioni sugli altri eventi supportati, visitare il Documento di panoramica di Automazione delle chiamate.

Annulla azione di riproduzione

Annullare tutte le operazioni multimediali, tutte le operazioni multimediali in sospeso vengono annullate. Questa azione annulla anche altre azioni di riproduzione in coda.

call_automation_client.get_call_connection(
    call_connection_id
).cancel_all_media_operations()

Esempio di come è possibile deserializzare l'evento PlayCanceled:

if event.type == "Microsoft.Communication.PlayCanceled":

    app.logger.info("Play canceled, context=%s", event.data.get("operationContext"))

Codici evento

Status Codice Sottocodice Message
PlayCompleted 200 0 Azione completata correttamente.
PlayCanceled 400 8508 Azione non riuscita. L'operazione è stata annullata.
PlayFailed 400 8535 Azione non riuscita. Formato file non valido.
PlayFailed 400 8536 Azione non riuscita. Impossibile scaricare il file.
PlayFailed 400 8565 Azione non riuscita, richiesta non valida ai servizi di intelligenza artificiale di Azure. Controllare i parametri di input.
PlayFailed 401 8565 Azione non riuscita. Errore di autenticazione dei servizi di intelligenza artificiale di Azure.
PlayFailed 403 8565 Azione non riuscita, richiesta non consentita ai servizi di intelligenza artificiale di Azure, sottoscrizione gratuita usata dalla richiesta esaurita della quota.
PlayFailed 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.
PlayFailed 408 8565 Azione non riuscita e timeout della richiesta ai servizi di intelligenza artificiale di Azure.
PlayFailed 500 9999 Errore interno sconosciuto del server
PlayFailed 500 8572 Azione non riuscita a causa dell'arresto del servizio di riproduzione.

Limitazioni note

  • 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 Vocale, è possibile richiedere di aumentare di tale quota seguendo i passaggi descritti qui.

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