Partilhar via


Personalizar prompts de voz para usuários com a ação Reproduzir

Este guia irá ajudá-lo a começar a reproduzir ficheiros de áudio para os participantes utilizando a ação de reprodução fornecida através do SDK de Automação de Chamadas dos Serviços de Comunicação do Azure.

Pré-requisitos

Para recursos de IA

Criar um novo aplicativo C#

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

dotnet new web -n MyApplication

Instalar o pacote NuGet

O pacote NuGet pode ser obtido aqui, se você ainda não o fez.

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

Crie um arquivo de áudio, se 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 do URL disponível para você usar ao solicitar a reprodução do arquivo de áudio. Os Serviços de Comunicação do Azure suportam ambos os tipos de ficheiros MP3 com ficheiros ID3V2TAG e WAV, PCM mono de 16 bits a uma taxa de amostragem de 16 KHz. .

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

(Opcional) Conectar o Serviço Cognitivo do Azure ao Serviço de Comunicação do Azure

Se você quiser usar os recursos de conversão de texto em fala, é necessário conectar o Serviço Cognitivo do Azure ao Serviço de Comunicação do Azure.

Estabeleça uma chamada

A esta altura, você deve estar familiarizado com o início de chamadas, se precisar saber mais sobre como fazer uma chamada, siga nosso início rápido. Você também pode usar o trecho de código fornecido aqui para entender como atender 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, há várias opções de como você pode querer reproduzir o áudio. Pode reproduzir áudio para o participante que aderiu à chamada ou reproduzir áudio para todos os participantes na chamada.

Reproduzir fonte - Arquivo de áudio

Para reproduzir áudio para os participantes usando arquivos de áudio, você precisa se certificar de que 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")) };

Reproduzir fonte - Text-To-Speech

Para reproduzir áudio usando o Text-To-Speech por meio dos serviços de IA do Azure, você precisa fornecer o texto que deseja reproduzir, bem como SourceLocale e VoiceKind ou o VoiceName que deseja usar. Suportamos todos os nomes de voz suportados pelos serviços de IA do Azure, 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 } };

Reproduzir fonte - Text-To-Speech com SSML

Se quiser personalizar ainda mais a sua saída de Conversão de Texto em Voz com os serviços de IA do Azure, pode utilizar SSML da Linguagem de Marcação de Síntese de Fala ao invocar a sua ação de reprodução através da Automatização de Chamadas. Com 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ê deseja aprimorar mais seus prompts e incluir modelos de voz personalizados, a ação de reprodução Text-To-Speech agora suporta essas vozes personalizadas. Estas são uma ótima opção se você estiver tentando oferecer aos clientes uma experiência mais local e personalizada ou tiver situações em que os modelos padrão podem não cobrir as palavras e acentos que você está tentando pronunciar. Para saber mais sobre como criar e implantar modelos personalizados, leia este guia.

Nomes de voz personalizados exmaple de texto regular

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 você deseja usar para reproduzir á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 é reproduzido para todos os participantes na chamada.

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

Suporte para barcaça-in

Durante cenários em que você está reproduzindo áudio em loop para todos os participantes, por exemplo, aguardando lobby, você pode reproduzir áudio para os participantes no lobby e mantê-los atualizados sobre o número deles na fila. Quando você usa o suporte de barcaça, isso cancelará o áudio em andamento e reproduzirá sua nova mensagem. Então, se você quisesse continuar a reproduzir 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 é 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 jogo suportam a capacidade de enviar várias fontes de jogo com apenas um pedido. Isso significa que você envia uma lista de prompts para jogar 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 reproduzir música em espera que faz loops 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); 

Melhore a reprodução com cache de arquivos 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 o ID de origem do arquivo de áudio. Os Serviços de Comunicação do Azure armazenam em cache esse arquivo de áudio por 1 hora.

Nota

O armazenamento em cache de arquivos de áudio não é adequado para prompts dinâmicos. Se você alterar a URL fornecida aos Serviços de Comunicação do Azure, ela não atualizará a URL armazenada em cache 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); 

Lidar com atualizações de eventos de ação de reprodução

Seu aplicativo recebe atualizações de eventos do ciclo de vida da ação na URL de retorno de chamada que foi fornecida ao serviço de Automação de Chamadas no momento de atender a chamada. Um exemplo de uma atualização bem-sucedida do evento de jogo.

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 suportados, visite o documento de visão geral da automação de chamadas.

Cancelar ação de reprodução

Cancele todas as operações de mídia, todas as operações de mídia pendentes são canceladas. Esta ação também cancela outras ações de reprodução em 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 uma nova aplicação Java

No seu terminal ou janela de comando, navegue até o diretório onde você gostaria de criar sua aplicação Java. Execute o comando mostrado aqui para gerar o projeto Java a partir 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 do artifactId argumento. Neste diretório, src/main/java o diretório contém o código-fonte do projeto, src/test/java o diretório contém a fonte de teste.

Você percebe que a etapa 'gerar' criou um diretório com o mesmo nome que o artifactId. Neste diretório, src/main/java o diretório contém código-fonte, src/test/java o diretório contém testes e pom.xml o arquivo é o Project Object Model ou POM do projeto.

Atualize o arquivo POM de seus aplicativos para usar 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 de pacote

No arquivo POM, adicione a seguinte referência 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 desejar usar arquivos de áudio para reproduzir prompts

Crie um arquivo de áudio, se 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 do URL disponível para você usar ao solicitar a reprodução do arquivo de áudio. Os Serviços de Comunicação do Azure suportam ambos os tipos de ficheiros MP3 com ficheiros ID3V2TAG e WAV, PCM mono de 16 bits a uma taxa de amostragem de 16 KHz. .

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

(Opcional) Conectar o Serviço Cognitivo do Azure ao Serviço de Comunicação do Azure

Se você quiser usar os recursos de conversão de texto em fala, é necessário conectar o Serviço Cognitivo do Azure ao Serviço de Comunicação do Azure.

Atualizar App.java com código

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

Estabeleça uma chamada

A esta altura, você deve estar familiarizado com o início de chamadas, se precisar saber mais sobre como fazer uma chamada, siga nosso início rápido. Você também pode usar o trecho de código fornecido aqui para entender como atender 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, há várias opções de como você pode querer reproduzir o áudio. Pode reproduzir áudio para o participante que aderiu à chamada ou reproduzir áudio para todos os participantes na chamada.

Reproduzir fonte - Arquivo de áudio

Para reproduzir áudio para os participantes usando arquivos de áudio, você precisa se certificar de que 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);
*/

Reproduzir fonte - Text-To-Speech

Para reproduzir áudio usando o Text-To-Speech por meio dos serviços de IA do Azure, você precisa fornecer o texto que deseja reproduzir, bem como SourceLocale e VoiceKind ou o VoiceName que deseja usar. Suportamos todos os nomes de voz suportados pelos serviços de IA do Azure, 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);
*/

Reproduzir fonte - SSML de conversão de texto em fala

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ê deseja aprimorar mais seus prompts e incluir modelos de voz personalizados, a ação de reprodução Text-To-Speech agora suporta essas vozes personalizadas. Estas são uma ótima opção se você estiver tentando oferecer aos clientes uma experiência mais local e personalizada ou tiver situações em que os modelos padrão podem não cobrir as palavras e acentos que você está tentando pronunciar. Para saber mais sobre como criar e implantar modelos personalizados, leia este guia.

Nomes de voz personalizados exmaple de texto regular

// 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 você deseja usar para reproduzir á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 é 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 barcaça-in

Durante cenários em que você está reproduzindo áudio em loop para todos os participantes, por exemplo, aguardando lobby, você pode reproduzir áudio para os participantes no lobby e mantê-los atualizados sobre o número deles na fila. Quando você usa o suporte de barcaça, isso cancelará o áudio em andamento e reproduzirá sua nova mensagem. Então, se você quisesse continuar a reproduzir 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 é 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 reproduzir música em espera que faz loops 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(); 

Melhore a reprodução com cache de arquivos 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 o ID de origem do arquivo de áudio. Os Serviços de Comunicação do Azure armazenam em cache esse arquivo de áudio por 1 hora.

Nota

O armazenamento em cache de arquivos de áudio não é adequado para prompts dinâmicos. Se você alterar a URL fornecida aos Serviços de Comunicação do Azure, ela não atualizará a URL armazenada em cache 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(); 

Lidar com atualizações de eventos de ação de reprodução

Seu aplicativo recebe atualizações de eventos do ciclo de vida da ação na URL de retorno de chamada que foi fornecida ao serviço de Automação de Chamadas no momento de atender a chamada. Um exemplo de uma atualização bem-sucedida do evento de jogo.

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 suportados, visite o documento de visão geral da automação de chamadas.

Cancelar ação de reprodução

Cancele todas as operações de mídia, todas as operações de mídia pendentes são canceladas. Esta ação também cancela outras ações de reprodução em 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 subscrição ativa, para obter detalhes, consulte Criar uma conta gratuitamente.
  • Recurso dos Serviços de Comunicação do Azure. Consulte Criar um recurso dos Serviços de Comunicação do Azure. Salve a cadeia de conexão para este recurso.
  • Crie um novo aplicativo de serviço Web usando o SDK de automação de chamadas.
  • Tem Node.js instalado, você pode instalá-lo a partir de seu site oficial.

Para recursos de IA

Criar um novo aplicativo JavaScript

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

npm init -y

Instalar 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 projeto, por exemplo, nomeie-o app.js. Você escreve seu código JavaScript neste arquivo. Execute seu aplicativo usando o Node.js com o seguinte comando. Este código executa o código JavaScript que você escreveu.

node app.js

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

Crie um arquivo de áudio, se 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 do URL disponível para você usar ao solicitar a reprodução do arquivo de áudio. Os Serviços de Comunicação do Azure suportam ambos os tipos de ficheiros MP3 com ficheiros ID3V2TAG e WAV, PCM mono de 16 bits a uma taxa de amostragem de 16 KHz.

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

(Opcional) Conectar o Serviço Cognitivo do Azure ao Serviço de Comunicação do Azure

Se você quiser usar os recursos de conversão de texto em fala, é necessário conectar o Serviço Cognitivo do Azure ao Serviço de Comunicação do Azure.

Estabeleça uma chamada

A esta altura, você deve estar familiarizado com o início de chamadas, se precisar saber mais sobre como fazer uma chamada, siga nosso início rápido. Você também pode usar o trecho de código fornecido aqui para entender como atender 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, há várias opções de como você pode querer reproduzir o áudio. Pode reproduzir áudio para o participante que aderiu à chamada ou reproduzir áudio para todos os participantes na chamada.

Reproduzir fonte - Arquivo de áudio

Para reproduzir áudio para os participantes usando arquivos de áudio, você precisa se certificar de que 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" };

Reproduzir fonte - Text-To-Speech

Para reproduzir áudio usando o Text-To-Speech por meio dos serviços de IA do Azure, você precisa fornecer o texto que deseja reproduzir, bem como SourceLocale e VoiceKind ou o VoiceName que deseja usar. Suportamos todos os nomes de voz suportados pelos serviços de IA do Azure, 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" }; 

Reproduzir fonte - Text-To-Speech com SSML

Se quiser personalizar ainda mais a sua saída de Conversão de Texto em Voz com os serviços de IA do Azure, pode utilizar SSML da Linguagem de Marcação de Síntese de Fala ao invocar a sua ação de reprodução através da Automatização de Chamadas. Com 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ê deseja aprimorar mais seus prompts e incluir modelos de voz personalizados, a ação de reprodução Text-To-Speech agora suporta essas vozes personalizadas. Estas são uma ótima opção se você estiver tentando oferecer aos clientes uma experiência mais local e personalizada ou tiver situações em que os modelos padrão podem não cobrir as palavras e acentos que você está tentando pronunciar. Para saber mais sobre como criar e implantar modelos personalizados, leia este guia.

Nomes de voz personalizados exmaple de texto regular

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 você deseja usar para reproduzir á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 é reproduzido para todos os participantes na chamada.

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

Suporte para barcaça-in

Durante cenários em que você está reproduzindo áudio em loop para todos os participantes, por exemplo, aguardando lobby, você pode reproduzir áudio para os participantes no lobby e mantê-los atualizados sobre o número deles na fila. Quando você usa o suporte de barcaça, isso cancelará o áudio em andamento e reproduzirá sua nova mensagem. Então, se você quisesse continuar a reproduzir 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 é 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 reproduzir música em espera que faz loops 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); 

Melhore a reprodução com cache de arquivos 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 o ID de origem do arquivo de áudio. Os Serviços de Comunicação do Azure armazenam em cache esse arquivo de áudio por 1 hora.

Nota

O armazenamento em cache de arquivos de áudio não é adequado para prompts dinâmicos. Se você alterar a URL fornecida aos Serviços de Comunicação do Azure, ela não atualizará a URL armazenada em cache 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 ]);

Lidar com atualizações de eventos de ação de reprodução

Seu aplicativo recebe atualizações de eventos do ciclo de vida da ação na URL de retorno de chamada que foi fornecida ao serviço de Automação de Chamadas no momento de atender a 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 suportados, visite o documento de visão geral da automação de chamadas.

Cancelar ação de reprodução

Cancele todas as operações de mídia, todas as operações de mídia pendentes são canceladas. Esta ação também cancela outras ações de reprodução em 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 subscrição ativa, para obter detalhes, consulte Criar uma conta gratuitamente.
  • Recurso dos Serviços de Comunicação do Azure. Consulte Criar um recurso dos Serviços de Comunicação do Azure. Salve a cadeia de conexão para este recurso.
  • Crie um novo aplicativo de serviço Web usando o SDK de automação de chamadas.
  • Tenha o Python instalado, você pode instalar a partir do site oficial.

Para recursos de IA

Criar uma aplicação Python nova

Configurar um ambiente virtual Python para o seu projeto

python -m venv play-audio-app

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

Instalar 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. Você escreve seu código Python neste arquivo.

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

python app.py

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

Crie um arquivo de áudio, se 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 do URL disponível para você usar ao solicitar a reprodução do arquivo de áudio. Os Serviços de Comunicação do Azure suportam ambos os tipos de ficheiros MP3 e WAV, PCM mono de 16 bits a uma taxa de amostragem de 16 KHz. .

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

(Opcional) Conectar o Serviço Cognitivo do Azure ao Serviço de Comunicação do Azure

Se você quiser usar os recursos de conversão de texto em fala, é necessário conectar o Serviço Cognitivo do Azure ao Serviço de Comunicação do Azure.

Estabeleça uma chamada

A esta altura, você deve estar familiarizado com o início de chamadas, se precisar saber mais sobre como fazer uma chamada, siga nosso início rápido. Você também pode usar o trecho de código fornecido aqui para entender como atender 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, há várias opções de como você pode querer reproduzir o áudio. Pode reproduzir áudio para o participante que aderiu à chamada ou reproduzir áudio para todos os participantes na chamada.

Reproduzir fonte - Arquivo de áudio

Para reproduzir áudio para os participantes usando arquivos de áudio, você precisa se certificar de que 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
# )

Reproduzir fonte - Text-To-Speech

Para reproduzir áudio usando o Text-To-Speech por meio dos serviços de IA do Azure, você precisa fornecer o texto que deseja reproduzir, bem como SourceLocale e VoiceKind ou o VoiceName que deseja usar. Suportamos todos os nomes de voz suportados pelos serviços de IA do Azure, 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
#)

Reproduzir fonte - Text-To-Speech com SSML

Se quiser personalizar ainda mais a sua saída de Conversão de Texto em Voz com os serviços de IA do Azure, pode utilizar SSML da Linguagem de Marcação de Síntese de Fala ao invocar a sua ação de reprodução através da Automatização de Chamadas. Com 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ê deseja aprimorar mais seus prompts e incluir modelos de voz personalizados, a ação de reprodução Text-To-Speech agora suporta essas vozes personalizadas. Estas são uma ótima opção se você estiver tentando oferecer aos clientes uma experiência mais local e personalizada ou tiver situações em que os modelos padrão podem não cobrir as palavras e acentos que você está tentando pronunciar. Para saber mais sobre como criar e implantar modelos personalizados, leia este guia.

Nomes de voz personalizados exmaple de texto regular

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 você deseja usar para reproduzir á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 ficheiro á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 barcaça-in

Durante cenários em que você está reproduzindo áudio em loop para todos os participantes, por exemplo, aguardando lobby, você pode reproduzir áudio para os participantes no lobby e mantê-los atualizados sobre o número deles na fila. Quando você usa o suporte de barcaça, isso cancelará o áudio em andamento e reproduzirá sua nova mensagem. Então, se você quisesse continuar a reproduzir 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 da 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 reproduzir música em espera que faz loops 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
)

Melhore a reprodução com cache de arquivos 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 o ID de origem do arquivo de áudio. Os Serviços de Comunicação do Azure armazenam em cache esse arquivo de áudio por 1 hora.

Nota

O armazenamento em cache de arquivos de áudio não é adequado para prompts dinâmicos. Se você alterar a URL fornecida aos Serviços de Comunicação do Azure, ela não atualizará a URL armazenada em cache 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
)

Lidar com atualizações de eventos de ação de reprodução

Seu aplicativo recebe atualizações de eventos do ciclo de vida da ação na URL de retorno de chamada que foi fornecida ao serviço de Automação de Chamadas no momento de atender a 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 suportados, visite o documento de visão geral da automação de chamadas.

Cancelar ação de reprodução

Cancele todas as operações de mídia, todas as operações de mídia pendentes são canceladas. Esta ação também cancela outras ações de reprodução em 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
JogarConcluído 200 0 Ação concluída com êxito.
JogarCancelado 400 8508 A ação falhou, 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, não foi possível baixar o arquivo.
PlayFailed 400 8565 Falha na ação, solicitação incorreta para 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 serviços de IA do Azure, assinatura gratuita usada pela solicitação ficou sem cota.
PlayFailed 429 8565 Falha na ação, as solicitações excederam o número de solicitações simultâneas permitidas para a assinatura de serviços do Azure AI.
PlayFailed 408 8565 Falha na ação, a solicitação aos serviços de IA do Azure expirou.
PlayFailed 500 9999 Erro interno desconhecido do servidor
PlayFailed 500 8572 A ação falhou devido ao desligamento do serviço de reprodução.

Limitações conhecidas

  • Os prompts de texto de conversão de texto em fala suportam um máximo de 400 caracteres, se o prompt for maior do que isso, sugerimos usar 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, você pode solicitar o aumento desse lilmit seguindo as etapas descritas aqui.

Clean up resources (Limpar recursos)

Se quiser limpar e remover uma assinatura dos Serviços de Comunicação, você pode excluir o recurso ou grupo de recursos. A exclusão do grupo de recursos também exclui quaisquer outros recursos associados a ele. Saiba mais sobre a limpeza de recursos.

Próximos passos