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
- Conta do Azure com uma assinatura ativa, para obter detalhes, veja Criar uma conta gratuitamente.
- Recurso dos Serviços de Comunicação do Azure. Veja Criar um recurso dos Serviços de Comunicação do Azure. Salve a cadeia de conexão para esse recurso.
- Crie um aplicativo de serviço Web usando o SDK de Automação de Chamadas.
- A versão mais recente da biblioteca .NET para seu sistema operacional.
- Obtenha o pacote NuGet mais recente.
Para recursos de IA
- Crie e conecte os serviços de IA do Azure ao seu recurso dos Serviços de Comunicação do Azure.
- Crie um subdomínio personalizado para seu recurso de serviços de IA do Azure.
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
- Conta do Azure com uma assinatura ativa, para obter detalhes, veja Criar uma conta gratuitamente.
- Recurso dos Serviços de Comunicação do Azure. Veja Criar um recurso dos Serviços de Comunicação do Azure
- Crie um aplicativo de serviço Web usando o SDK de Automação de Chamadas.
- Java Development Kit versão 8 ou superior.
- Apache Maven.
Para recursos de IA
- Crie e conecte os serviços de IA do Azure ao seu recurso dos Serviços de Comunicação do Azure.
- Crie um subdomínio personalizado para seu recurso de serviços de IA do Azure.
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
- Conta do Azure com uma assinatura ativa, para obter detalhes, veja Criar uma conta gratuitamente.
- Recurso dos Serviços de Comunicação do Azure. Veja Criar um recurso dos Serviços de Comunicação do Azure. Salve a cadeia de conexão para esse recurso.
- Crie um aplicativo de serviço Web usando o SDK de Automação de Chamadas.
- Se o Node.js estiver instalado, poderá instalá-lo em seu site oficial.
Para recursos de IA
- Crie e conecte os serviços de IA do Azure ao seu recurso dos Serviços de Comunicação do Azure.
- Crie um subdomínio personalizado para seu recurso de serviços de IA do Azure.
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
- Conta do Azure com uma assinatura ativa, para obter detalhes, veja Criar uma conta gratuitamente.
- Recurso dos Serviços de Comunicação do Azure. Veja Criar um recurso dos Serviços de Comunicação do Azure. Salve a cadeia de conexão para esse recurso.
- Crie um aplicativo de serviço Web usando o SDK de Automação de Chamadas.
- Se tiver o Python instalado, você pode instalá-lo no site oficial.
Para recursos de IA
- Crie e conecte os serviços de IA do Azure ao seu recurso dos Serviços de Comunicação do Azure.
- Crie um subdomínio personalizado para seu recurso de serviços de IA do Azure.
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
- Saiba mais sobre a Automação de Chamadas
- Saiba mais sobre como Coletar entrada de usuário em uma chamada