Compartilhar via


Personalizar comandos de voz para usuários com a ação “Reproduzir”

Este guia ajudará você a começar a reproduzir arquivos de áudio para os participantes usando a ação de reprodução fornecida por meio do SDK de Automação de Chamada dos Serviços de Comunicação do Azure.

Pré-requisitos

Para recursos de IA

Criar um aplicativo em C#

Na janela do console do sistema operacional, use o comando dotnet para criar um aplicativo Web.

dotnet new web -n MyApplication

Instalar o pacote NuGet

O pacote NuGet pode ser obtido aqui, caso você ainda não o tenha feito.

(Opcional) Prepare seu arquivo de áudio se quiser usar arquivos de áudio para reproduzir prompts

Crie um arquivo de áudio, se você ainda não tiver um, para usar para reproduzir prompts e mensagens para os participantes. O arquivo de áudio deve ser hospedado em um local acessível aos Serviços de Comunicação do Azure com suporte para autenticação. Mantenha uma cópia da URL disponível para você usar ao solicitar a reprodução do arquivo de áudio. Os Serviços de Comunicação do Azure dão suporte a tipos de arquivo de arquivos MP3 com ID3V2TAG e arquivos WAV, PCM mono de 16 bits a 16 KHz de taxa de amostra. .

Você pode testar a criação de seu próprio arquivo de áudio usando a nossa síntese de Fala com a ferramenta Criação de Conteúdo de Áudio.

(Opcional) Conecte seu Serviço Cognitivo do Azure aos Serviços de Comunicação do Azure

Se você quiser usar recursos de Conversão de Texto em Fala, será necessário conectar seu Serviço Cognitivo do Azure aos Serviços de Comunicação do Azure.

Estabelecer uma chamada

Neste ponto, você deve estar familiarizado com as chamadas iniciais, se precisar saber mais sobre como fazer uma chamada, siga nosso guia de início rápido. Você também pode usar o trecho de código fornecido aqui para entender como atender a uma chamada.

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

Reproduzir áudio

Uma vez que a chamada tenha sido estabelecida, existem várias opções de como você pode querer reproduzir o áudio. Você pode reproduzir áudio para o participante que acabou de ingressar na chamada ou reproduzir áudio para todos os participantes na chamada.

Origem da reprodução – Arquivo de áudio

Para reproduzir áudio para os participantes usando arquivos de áudio, você precisa verificar se o arquivo de áudio é um arquivo WAV, mono e 16 KHz. Para reproduzir arquivos de áudio, você precisa fornecer aos Serviços de Comunicação do Azure um URI para um arquivo hospedado em um local onde os Serviços de Comunicação do Azure possam acessá-lo. O tipo FileSource em nosso SDK pode ser usado para especificar arquivos de áudio para a ação de reprodução.

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

Origem da reprodução – Conversão de Texto em Fala

Para reproduzir áudio usando Conversão de Texto em Fala por meio dos serviços de IA do Azure, você precisa fornecer o texto que deseja reproduzir, bem como o SourceLocale e o VoiceKind ou o VoiceName que você deseja usar. Há suporte para todos os nomes de voz compatíveis com os serviços de IA do Azure. Veja a lista completa aqui.

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

Origem da reprodução – Conversão de Texto em Fala com SSML

Se você quiser personalizar ainda mais sua saída de Conversão de Texto em Fala com os serviços de IA do Azure, poderá usar SSML de Linguagem de Marcação de Síntese de Fala ao invocar sua ação de reprodução por meio da Automação de Chamadas. Com o SSML, você pode ajustar o tom, pausar, melhorar a pronúncia, alterar a taxa de fala, ajustar o volume e atribuir várias vozes.

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

Modelos de voz personalizados

Se você quiser aprimorar mais seus prompts e incluir modelos de voz personalizados, a ação de reprodução Conversão de Texto em Fala agora dá suporte a essas vozes personalizadas. São uma ótima opção se você estiver tentando dar aos clientes uma experiência mais local e personalizada ou tiver situações em que os modelos padrão podem não abranger as palavras e os sotaques que você está tentando pronunciar. Para saber mais sobre como criar e implantar modelos personalizados, você pode ler este guia.

Exemplo de texto regular de nomes de voz personalizados

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

Exemplo de SSML de nomes de voz personalizados


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

Depois de decidir qual playSource deseja usar para reproduzir o áudio, você pode escolher se deseja reproduzi-lo para um participante específico ou para todos os participantes.

Reproduzir áudio para todos os participantes

Nesse cenário, o áudio será reproduzido para todos os participantes na chamada.

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

Suporte para invasão

Durante cenários em que você está reproduzindo áudio em loop para todos os participantes, por exemplo, em um lobby de espera, você pode estar reproduzindo áudio para os participantes no lobby e mantendo-os atualizados quanto ao número deles na fila. Quando você usa o suporte para invasão, isso cancelará o áudio em andamento e reproduzirá sua nova mensagem. Depois, se você quisesse continuar reproduzindo seu áudio original, faria outra solicitação de reprodução.

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

Reproduzir áudio para um participante específico

Nesse cenário, o áudio será reproduzido para um participante específico.

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

Reproduzir vários prompts de áudio

Todas as ações de reprodução dão suporte à capacidade de enviar várias fontes de reprodução com apenas uma solicitação. Isso significa que você envia uma lista de prompts a serem reproduzidos de uma só vez, em vez de fazer essas solicitações individualmente.

Reproduzir áudio em loop

Você pode usar a opção de loop para tocar música de espera que faz um loop até que seu aplicativo esteja pronto para aceitar o chamador. Ou avance o chamador para a próxima etapa lógica com base na lógica de negócios de seus aplicativos.

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

Aprimorar a reprodução com o cache de arquivo de áudio

Se você estiver reproduzindo o mesmo arquivo de áudio várias vezes, seu aplicativo poderá fornecer aos Serviços de Comunicação do Azure a sourceID do arquivo de áudio. Os Serviços de Comunicação do Azure armazenam esse arquivo de áudio em cache por 1 hora.

Observação

O cache de arquivos de áudio não é adequado para prompts dinâmicos. Se você alterar a URL fornecida para os Serviços de Comunicação do Azure, a URL armazenada em cache não será atualizada imediatamente. A atualização ocorrerá depois que o cache existente expirar.

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

Manipular atualizações de eventos de ação de reprodução

Seu aplicativo recebe atualizações de evento de ciclo de vida de ação na URL de retorno de chamada fornecida ao serviço de Automação de Chamadas no momento da resposta à chamada. Um exemplo de uma atualização de evento de reprodução bem-sucedida.

Exemplo de como você pode desserializar o evento PlayCompleted:

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

Exemplo de como você pode desserializar o evento PlayStarted:

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

Exemplo de como você pode desserializar o 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); 
    } 
} 

Para saber mais sobre outros eventos com suporte, visite o documento de visão geral da Automação de Chamadas.

Cancelar a ação de reprodução

Ao cancelar todas as operações de mídia, todas as operações de mídia pendentes serão canceladas. Essa ação também cancelará outras ações de reprodução na fila.

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

Exemplo de como você pode desserializar o evento PlayCanceled:

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

Pré-requisitos

Para recursos de IA

Criar um aplicativo Java

Em seu terminal ou janela de comando, navegue até o diretório no qual você deseja criar o seu aplicativo Java. Execute o comando mostrado aqui para gerar o projeto Java do modelo maven-archetype-quickstart.

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

O comando anterior cria um diretório com o mesmo nome que o argumento artifactId. Neste diretório, o diretório src/main/java contém o código-fonte do projeto e o diretório src/test/java contém a fonte de teste.

Observe que a etapa "gerar" criou um diretório com o mesmo nome que o artifactId. Neste diretório, o diretório src/main/java contém o código-fonte, o diretório src/test/java contém testes e o arquivo pom.xml é o POM (Modelo de Objeto do Projeto).

Atualize o arquivo POM dos seus aplicativos para usar o Java 8 ou superior.

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

Adicionar referências do pacote

No arquivo POM, adicione a referência a seguir para o projeto.

azure-communication-callautomation

O pacote do SDK de Automação de Chamadas dos Serviços de Comunicação do Azure é recuperado do Feed de Desenvolvimento do SDK do Azure.

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

(Opcional) Prepare seu arquivo de áudio se quiser usar arquivos de áudio para reproduzir prompts

Crie um arquivo de áudio, se você ainda não tiver um, para usar para reproduzir prompts e mensagens para os participantes. O arquivo de áudio deve ser hospedado em um local acessível aos Serviços de Comunicação do Azure com suporte para autenticação. Mantenha uma cópia da URL disponível para você usar ao solicitar a reprodução do arquivo de áudio. Os Serviços de Comunicação do Azure dão suporte a tipos de arquivo de arquivos MP3 com ID3V2TAG e arquivos WAV, PCM mono de 16 bits a 16 KHz de taxa de amostra. .

Você pode testar a criação de seu próprio arquivo de áudio usando a nossa síntese de Fala com a ferramenta Criação de Conteúdo de Áudio.

(Opcional) Conecte seu Serviço Cognitivo do Azure aos Serviços de Comunicação do Azure

Se você quiser usar recursos de Conversão de Texto em Fala, será necessário conectar seu Serviço Cognitivo do Azure aos Serviços de Comunicação do Azure.

Atualizar App.java com código

Em seu editor de escolha, abra o arquivo App.java e atualize-o com o código fornecido na seção Atualizar app.java com código.

Estabelecer uma chamada

Neste ponto, você deve estar familiarizado com as chamadas iniciais, se precisar saber mais sobre como fazer uma chamada, siga nosso guia de início rápido. Você também pode usar o trecho de código fornecido aqui para entender como atender a uma chamada.

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

Reproduzir áudio

Uma vez que a chamada tenha sido estabelecida, existem várias opções de como você pode querer reproduzir o áudio. Você pode reproduzir áudio para o participante que acabou de ingressar na chamada ou reproduzir áudio para todos os participantes na chamada.

Origem da reprodução – Arquivo de áudio

Para reproduzir áudio para os participantes usando arquivos de áudio, você precisa verificar se o arquivo de áudio é um arquivo WAV, mono e 16 KHz. Para reproduzir arquivos de áudio, você precisa fornecer aos Serviços de Comunicação do Azure um URI para um arquivo hospedado em um local onde os Serviços de Comunicação do Azure possam acessá-lo. O tipo FileSource em nosso SDK pode ser usado para especificar arquivos de áudio para a ação de reprodução.

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

Origem da reprodução – Conversão de Texto em Fala

Para reproduzir áudio usando Conversão de Texto em Fala por meio dos serviços de IA do Azure, você precisa fornecer o texto que deseja reproduzir, bem como o SourceLocale e o VoiceKind ou o VoiceName que você deseja usar. Há suporte para todos os nomes de voz compatíveis com os serviços de IA do Azure. Veja a lista completa aqui.

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

Origem da reprodução – Conversão de Texto em Fala 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);

Modelos de voz personalizados

Se você quiser aprimorar mais seus prompts e incluir modelos de voz personalizados, a ação de reprodução Conversão de Texto em Fala agora dá suporte a essas vozes personalizadas. São uma ótima opção se você estiver tentando dar aos clientes uma experiência mais local e personalizada ou tiver situações em que os modelos padrão podem não abranger as palavras e os sotaques que você está tentando pronunciar. Para saber mais sobre como criar e implantar modelos personalizados, você pode ler este guia.

Exemplo de texto regular de nomes de voz personalizados

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

Exemplo de SSML de nomes de voz personalizados

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

Depois de decidir qual playSource deseja usar para reproduzir o áudio, você pode escolher se deseja reproduzi-lo para um participante específico ou para todos os participantes.

Reproduzir áudio para todos os participantes

Nesse cenário, o áudio será reproduzido para todos os participantes na chamada.

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

Suporte para invasão

Durante cenários em que você está reproduzindo áudio em loop para todos os participantes, por exemplo, em um lobby de espera, você pode estar reproduzindo áudio para os participantes no lobby e mantendo-os atualizados quanto ao número deles na fila. Quando você usa o suporte para invasão, isso cancelará o áudio em andamento e reproduzirá sua nova mensagem. Depois, se você quisesse continuar reproduzindo seu áudio original, faria outra solicitação de reprodução.

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

Reproduzir áudio para um participante específico

Nesse cenário, o áudio será reproduzido para um participante específico.

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

Reproduzir áudio em loop

Você pode usar a opção de loop para tocar música de espera que faz um loop até que seu aplicativo esteja pronto para aceitar o chamador. Ou avance o chamador para a próxima etapa lógica com base na lógica de negócios de seus aplicativos.

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

Aprimorar a reprodução com o cache de arquivo de áudio

Se você estiver reproduzindo o mesmo arquivo de áudio várias vezes, seu aplicativo poderá fornecer aos Serviços de Comunicação do Azure a sourceID do arquivo de áudio. Os Serviços de Comunicação do Azure armazenam esse arquivo de áudio em cache por 1 hora.

Observação

O cache de arquivos de áudio não é adequado para prompts dinâmicos. Se você alterar a URL fornecida para os Serviços de Comunicação do Azure, a URL armazenada em cache não será atualizada imediatamente. A atualização ocorrerá depois que o cache existente expirar.

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

Manipular atualizações de eventos de ação de reprodução

Seu aplicativo recebe atualizações de evento de ciclo de vida de ação na URL de retorno de chamada fornecida ao serviço de Automação de Chamadas no momento da resposta à chamada. Um exemplo de uma atualização de evento de reprodução bem-sucedida.

Exemplo de como você pode desserializar o evento PlayCompleted:

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

Exemplo de como você pode desserializar o evento PlayStarted:

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

Exemplo de como você pode desserializar o 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()); 
    } 
} 

Para saber mais sobre outros eventos com suporte, visite o documento de visão geral da Automação de Chamadas.

Cancelar a ação de reprodução

Ao cancelar todas as operações de mídia, todas as operações de mídia pendentes serão canceladas. Essa ação também cancelará outras ações de reprodução na fila.

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

Exemplo de como você pode desserializar o evento PlayCanceled:

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

Pré-requisitos

Para recursos de IA

Criar um aplicativo JavaScript

Crie um novo aplicativo JavaScript no diretório do seu projeto. Inicialize um novo projeto Node.js com o comando a seguir. Isso cria um arquivo package.json para seu projeto, que é usado para gerenciar as dependências do projeto.

npm init -y

Instale o pacote de Automação de Chamadas dos Serviços de Comunicação do Azure

npm install @azure/communication-call-automation

Crie um novo arquivo JavaScript no diretório do seu projeto, por exemplo, nomeie-o app.js. Grave seu código JavaScript nesse arquivo. Execute seu aplicativo usando o Node.js com o seguinte comando. Esse código executa o código JavaScript que você gravou.

node app.js

(Opcional) Prepare seu arquivo de áudio se quiser usar arquivos de áudio para reproduzir prompts

Crie um arquivo de áudio, se você ainda não tiver um, para usar para reproduzir prompts e mensagens para os participantes. O arquivo de áudio deve ser hospedado em um local acessível aos Serviços de Comunicação do Azure com suporte para autenticação. Mantenha uma cópia da URL disponível para você usar ao solicitar a reprodução do arquivo de áudio. Os Serviços de Comunicação do Azure dão suporte a tipos de arquivo de arquivos MP3 com ID3V2TAG e arquivos WAV, PCM mono de 16 bits a 16 KHz de taxa de amostra.

Você pode testar a criação de seu próprio arquivo de áudio usando a nossa síntese de Fala com a ferramenta Criação de Conteúdo de Áudio.

(Opcional) Conecte seu Serviço Cognitivo do Azure aos Serviços de Comunicação do Azure

Se você quiser usar recursos de Conversão de Texto em Fala, será necessário conectar seu Serviço Cognitivo do Azure aos Serviços de Comunicação do Azure.

Estabelecer uma chamada

Neste ponto, você deve estar familiarizado com as chamadas iniciais, se precisar saber mais sobre como fazer uma chamada, siga nosso guia de início rápido. Você também pode usar o trecho de código fornecido aqui para entender como atender a uma chamada.

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

Reproduzir áudio

Uma vez que a chamada tenha sido estabelecida, existem várias opções de como você pode querer reproduzir o áudio. Você pode reproduzir áudio para o participante que acabou de ingressar na chamada ou reproduzir áudio para todos os participantes na chamada.

Origem da reprodução – Arquivo de áudio

Para reproduzir áudio para os participantes usando arquivos de áudio, você precisa verificar se o arquivo de áudio é um arquivo WAV, mono e 16 KHz. Para reproduzir arquivos de áudio, você precisa fornecer aos Serviços de Comunicação do Azure um URI para um arquivo hospedado em um local onde os Serviços de Comunicação do Azure possam acessá-lo. O tipo FileSource em nosso SDK pode ser usado para especificar arquivos de áudio para a ação de reprodução.

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

Origem da reprodução – Conversão de Texto em Fala

Para reproduzir áudio usando Conversão de Texto em Fala por meio dos serviços de IA do Azure, você precisa fornecer o texto que deseja reproduzir, bem como o SourceLocale e o VoiceKind ou o VoiceName que você deseja usar. Há suporte para todos os nomes de voz compatíveis com os serviços de IA do Azure. Veja a lista completa aqui.

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" }; 

Origem da reprodução – Conversão de Texto em Fala com SSML

Se você quiser personalizar ainda mais sua saída de Conversão de Texto em Fala com os serviços de IA do Azure, poderá usar SSML de Linguagem de Marcação de Síntese de Fala ao invocar sua ação de reprodução por meio da Automação de Chamadas. Com o SSML, você pode ajustar o tom, pausar, melhorar a pronúncia, alterar a taxa de fala, ajustar o volume e atribuir várias vozes.

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" }; 

Modelos de voz personalizados

Se você quiser aprimorar mais seus prompts e incluir modelos de voz personalizados, a ação de reprodução Conversão de Texto em Fala agora dá suporte a essas vozes personalizadas. São uma ótima opção se você estiver tentando dar aos clientes uma experiência mais local e personalizada ou tiver situações em que os modelos padrão podem não abranger as palavras e os sotaques que você está tentando pronunciar. Para saber mais sobre como criar e implantar modelos personalizados, você pode ler este guia.

Exemplo de texto regular de nomes de voz personalizados

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

Exemplo de SSML de nomes de voz personalizados

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"}; 

Depois de decidir qual playSource deseja usar para reproduzir o áudio, você pode escolher se deseja reproduzi-lo para um participante específico ou para todos os participantes.

Reproduzir áudio – Todos os participantes

Nesse cenário, o áudio será reproduzido para todos os participantes na chamada.

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

Suporte para invasão

Durante cenários em que você está reproduzindo áudio em loop para todos os participantes, por exemplo, em um lobby de espera, você pode estar reproduzindo áudio para os participantes no lobby e mantendo-os atualizados quanto ao número deles na fila. Quando você usa o suporte para invasão, isso cancelará o áudio em andamento e reproduzirá sua nova mensagem. Depois, se você quisesse continuar reproduzindo seu áudio original, faria outra solicitação de reprodução.

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

Reproduzir áudio – Participante específico

Nesse cenário, o áudio será reproduzido para um participante específico.

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

Reproduzir áudio em loop

Você pode usar a opção de loop para tocar música de espera que faz um loop até que seu aplicativo esteja pronto para aceitar o chamador. Ou avance o chamador para a próxima etapa lógica com base na lógica de negócios de seus aplicativos.

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

Aprimorar a reprodução com o cache de arquivo de áudio

Se você estiver reproduzindo o mesmo arquivo de áudio várias vezes, seu aplicativo poderá fornecer aos Serviços de Comunicação do Azure a sourceID do arquivo de áudio. Os Serviços de Comunicação do Azure armazenam esse arquivo de áudio em cache por 1 hora.

Observação

O cache de arquivos de áudio não é adequado para prompts dinâmicos. Se você alterar a URL fornecida para os Serviços de Comunicação do Azure, a URL armazenada em cache não será atualizada imediatamente. A atualização ocorrerá depois que o cache existente expirar.

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

Manipular atualizações de eventos de ação de reprodução

Seu aplicativo recebe atualizações de evento de ciclo de vida de ação na URL de retorno de chamada fornecida ao serviço de Automação de Chamadas no momento da resposta à chamada.

Exemplo de como você pode desserializar o evento PlayCompleted:

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

Exemplo de como você pode desserializar o evento PlayFailed:

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

Exemplo de como você pode desserializar o evento PlayStarted:

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

Para saber mais sobre outros eventos com suporte, visite o documento de visão geral da Automação de Chamadas.

Cancelar a ação de reprodução

Ao cancelar todas as operações de mídia, todas as operações de mídia pendentes serão canceladas. Essa ação também cancelará outras ações de reprodução na fila.

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

Exemplo de como você pode desserializar o evento PlayCanceled:

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

Pré-requisitos

Para recursos de IA

Criar um novo aplicativo Python

Configurar um ambiente virtual Python para seu projeto

python -m venv play-audio-app

Ativar seu ambiente virtual

No Windows, use o seguinte comando:

.\ play-audio-quickstart \Scripts\activate

No Unix, use o seguinte comando:

source play-audio-quickstart /bin/activate

Instale o pacote de Automação de Chamadas dos Serviços de Comunicação do Azure

pip install azure-communication-callautomation

Crie seu arquivo de aplicativo no diretório do projeto, por exemplo, nomeie-o app.py. Grave seu código Python nesse arquivo.

Execute seu aplicativo usando Python com o comando a seguir para executar o código.

python app.py

(Opcional) Prepare seu arquivo de áudio se quiser usar arquivos de áudio para reproduzir prompts

Crie um arquivo de áudio, se você ainda não tiver um, para usar para reproduzir prompts e mensagens para os participantes. O arquivo de áudio deve ser hospedado em um local acessível aos Serviços de Comunicação do Azure com suporte para autenticação. Mantenha uma cópia da URL disponível para você usar ao solicitar a reprodução do arquivo de áudio. Os Serviços de Comunicação do Azure dão suporte a tipos de arquivo de arquivos MP3 e WAV, PCM mono de 16 bits a 16 KHz de taxa de amostra. .

Você pode testar a criação de seu próprio arquivo de áudio usando a nossa síntese de Fala com a ferramenta Criação de Conteúdo de Áudio.

(Opcional) Conecte seu Serviço Cognitivo do Azure aos Serviços de Comunicação do Azure

Se você quiser usar recursos de Conversão de Texto em Fala, será necessário conectar seu Serviço Cognitivo do Azure aos Serviços de Comunicação do Azure.

Estabelecer uma chamada

Neste ponto, você deve estar familiarizado com as chamadas iniciais, se precisar saber mais sobre como fazer uma chamada, siga nosso guia de início rápido. Você também pode usar o trecho de código fornecido aqui para entender como atender a uma chamada.

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

Reproduzir áudio

Uma vez que a chamada tenha sido estabelecida, existem várias opções de como você pode querer reproduzir o áudio. Você pode reproduzir áudio para o participante que acabou de ingressar na chamada ou reproduzir áudio para todos os participantes na chamada.

Origem da reprodução – Arquivo de áudio

Para reproduzir áudio para os participantes usando arquivos de áudio, você precisa verificar se o arquivo de áudio é um arquivo WAV, mono e 16 KHz. Para reproduzir arquivos de áudio, você precisa fornecer aos Serviços de Comunicação do Azure um URI para um arquivo hospedado em um local onde os Serviços de Comunicação do Azure possam acessá-lo. O tipo FileSource em nosso SDK pode ser usado para especificar arquivos de áudio para a ação de reprodução.

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

Origem da reprodução – Conversão de Texto em Fala

Para reproduzir áudio usando Conversão de Texto em Fala por meio dos serviços de IA do Azure, você precisa fornecer o texto que deseja reproduzir, bem como o SourceLocale e o VoiceKind ou o VoiceName que você deseja usar. Há suporte para todos os nomes de voz compatíveis com os serviços de IA do Azure. Veja a lista completa aqui.

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

Origem da reprodução – Conversão de Texto em Fala com SSML

Se você quiser personalizar ainda mais sua saída de Conversão de Texto em Fala com os serviços de IA do Azure, poderá usar SSML de Linguagem de Marcação de Síntese de Fala ao invocar sua ação de reprodução por meio da Automação de Chamadas. Com o SSML, você pode ajustar o tom, pausar, melhorar a pronúncia, alterar a taxa de fala, ajustar o volume e atribuir várias vozes.

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
)

Modelos de voz personalizados

Se você quiser aprimorar mais seus prompts e incluir modelos de voz personalizados, a ação de reprodução Conversão de Texto em Fala agora dá suporte a essas vozes personalizadas. São uma ótima opção se você estiver tentando dar aos clientes uma experiência mais local e personalizada ou tiver situações em que os modelos padrão podem não abranger as palavras e os sotaques que você está tentando pronunciar. Para saber mais sobre como criar e implantar modelos personalizados, você pode ler este guia.

Exemplo de texto regular de nomes de voz personalizados

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
)

Exemplo de SSML de nomes de voz personalizados

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
)

Depois de decidir qual playSource deseja usar para reproduzir o áudio, você pode escolher se deseja reproduzi-lo para um participante específico ou para todos os participantes.

Reproduzir áudio – Todos os participantes

Reproduza um arquivo de áudio pré-gravado para todos os participantes na chamada.

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
)

Suporte para invasão

Durante cenários em que você está reproduzindo áudio em loop para todos os participantes, por exemplo, em um lobby de espera, você pode estar reproduzindo áudio para os participantes no lobby e mantendo-os atualizados quanto ao número deles na fila. Quando você usa o suporte para invasão, isso cancelará o áudio em andamento e reproduzirá sua nova mensagem. Depois, se você quisesse continuar reproduzindo seu áudio original, faria outra solicitação de reprodução.

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

Reproduzir áudio – Participante específico

Reproduza um arquivo de áudio pré-gravado para um participante específico na chamada.

play_to = [target_participant]

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

Reproduzir áudio em loop

Você pode usar a opção de loop para tocar música de espera que faz um loop até que seu aplicativo esteja pronto para aceitar o chamador. Ou avance o chamador para a próxima etapa lógica com base na lógica de negócios de seus aplicativos.

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
)

Aprimorar a reprodução com o cache de arquivo de áudio

Se você estiver reproduzindo o mesmo arquivo de áudio várias vezes, seu aplicativo poderá fornecer aos Serviços de Comunicação do Azure a sourceID do arquivo de áudio. Os Serviços de Comunicação do Azure armazenam esse arquivo de áudio em cache por 1 hora.

Observação

O cache de arquivos de áudio não é adequado para prompts dinâmicos. Se você alterar a URL fornecida para os Serviços de Comunicação do Azure, a URL armazenada em cache não será atualizada imediatamente. A atualização ocorrerá depois que o cache existente expirar.

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
)

Manipular atualizações de eventos de ação de reprodução

Seu aplicativo recebe atualizações de evento de ciclo de vida de ação na URL de retorno de chamada fornecida ao serviço de Automação de Chamadas no momento da resposta à chamada.

Exemplo de como você pode desserializar o evento PlayCompleted:

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

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

Exemplo de como você pode desserializar o evento PlayStarted:

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

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

Exemplo de como você pode desserializar o evento PlayFailed:

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

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

Para saber mais sobre outros eventos com suporte, visite o documento de visão geral da Automação de Chamadas.

Cancelar a ação de reprodução

Ao cancelar todas as operações de mídia, todas as operações de mídia pendentes serão canceladas. Essa ação também cancelará outras ações de reprodução na fila.

call_automation_client.get_call_connection(
    call_connection_id
).cancel_all_media_operations()

Exemplo de como você pode desserializar o evento PlayCanceled:

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

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

Códigos de evento

Status Código Subcódigo Mensagem
PlayCompleted 200 0 Ação concluída com sucesso.
PlayCanceled 400 8508 Falha na ação, pois a operação foi cancelada.
PlayFailed 400 8535 Falha na ação, o formato do arquivo é inválido.
PlayFailed 400 8536 Falha na ação, o arquivo não pôde ser baixado.
PlayFailed 400 8565 Falha na ação, solicitação incorreta para os serviços de IA do Azure. Verifique os parâmetros de entrada.
PlayFailed 401 8565 Falha na ação, erro de autenticação dos serviços de IA do Azure.
PlayFailed 403 8565 Falha na ação, solicitação proibida para os serviços de IA do Azure, a assinatura gratuita usada pela solicitação esgotou a cota.
PlayFailed 429 8565 Falha na ação, as solicitações excederam o número de solicitações simultâneas permitidas para a assinatura dos serviços de IA do Azure.
PlayFailed 408 8565 Falha na ação, a solicitação para os serviços de IA do Azure atingiu o tempo limite.
PlayFailed 500 9999 Erro interno desconhecido do servidor
PlayFailed 500 8572 Falha na ação devido ao desligamento do serviço de reprodução.

Limitações conhecidas

  • Os prompts de texto de Conversão de Texto em Fala dão suporte a no máximo 400 caracteres. Se o prompt for maior do que isso, sugerimos o uso de SSML para ações de reprodução baseadas em Conversão de Texto em Fala.
  • Para cenários em que você excede o limite de cota do serviço de Fala, é possível solicitar o aumento desse limite seguindo as etapas descritas aqui.

Limpar os recursos

Se quiser limpar e remover uma assinatura dos Serviços de Comunicação, exclua o recurso ou o grupo de recursos. Excluir o grupo de recursos também exclui todos os recursos associados a ele. Saiba mais sobre como limpar recursos.

Próximas etapas