Como controlar ações de mídia mid-call com o Call Automation
A Automação de Chamadas usa uma interface de API REST para receber solicitações de ações e fornecer respostas para notificar se a solicitação foi enviada com êxito ou não. Devido à natureza assíncrona da chamada, a maioria das ações tem eventos correspondentes que são acionados quando a ação é concluída com êxito ou falha. Este guia aborda as ações disponíveis para desenvolvedores durante chamadas, como Enviar DTMF e Reconhecimento DTMF contínuo. As ações são acompanhadas de um código de exemplo sobre como invocar a referida ação.
A Automação de Chamadas suporta várias outras ações para gerenciar chamadas e gravações que não estão incluídas neste guia.
Nota
Atualmente, a automação de chamadas não interopera com o Microsoft Teams. Não há suporte para ações como fazer, redirecionar uma chamada para um usuário do Teams ou reproduzir áudio para um usuário do Teams usando o Call Automation.
Como pré-requisito, recomendamos que você leia os artigos abaixo para aproveitar ao máximo este guia:
- Guia de conceitos de automação de chamadas que descreve o modelo de programação de eventos de ação e retornos de chamada de eventos.
- Saiba mais sobre identificadores de usuário como CommunicationUserIdentifier e PhoneNumberIdentifier usados neste guia.
- Saiba mais sobre como controlar e direcionar chamadas com a Automação de chamadas, que ensina como lidar com os conceitos básicos de lidar com uma chamada.
Para todos os exemplos de código, client
é o objeto CallAutomationClient que pode ser criado conforme mostrado e callConnection
é o objeto CallConnection obtido da resposta Answer ou CreateCall. Você também pode obtê-lo de eventos de retorno de chamada recebidos pelo seu aplicativo.
var callAutomationClient = new CallAutomationClient("<Azure Communication Services connection string>");
Enviar DTMF
Você pode enviar tons DTMF para um participante externo, o que pode ser útil quando você já está em uma chamada e precisa convidar outro participante que tenha um número de ramal ou um menu IVR para navegar.
Nota
Isso só é suportado para participantes PSTN externos e suporta o envio de um máximo de 18 tons de cada vez.
Método SendDtmfAsync
Envie uma lista de tons DTMF para um participante externo.
var tones = new DtmfTone[] { DtmfTone.One, DtmfTone.Two, DtmfTone.Three, DtmfTone.Pound };
var sendDtmfTonesOptions = new SendDtmfTonesOptions(tones, new PhoneNumberIdentifier(calleePhonenumber))
{
OperationContext = "dtmfs-to-ivr"
};
var sendDtmfAsyncResult = await callAutomationClient.GetCallConnection(callConnectionId)
.GetCallMedia()
.SendDtmfTonesAsync(sendDtmfTonesOptions);
Quando seu aplicativo envia esses tons DTMF, você recebe atualizações de eventos. Você pode usar os SendDtmfTonesCompleted
eventos e SendDtmfTonesFailed
para criar lógica de negócios em seu aplicativo para determinar as próximas etapas.
Exemplo de evento SendDtmfTonesCompleted
if (acsEvent is SendDtmfTonesCompleted sendDtmfCompleted)
{
logger.LogInformation("Send DTMF succeeded, context={context}", sendDtmfCompleted.OperationContext);
}
Exemplo de SendDtmfTonesFailed
if (acsEvent is SendDtmfTonesFailed sendDtmfFailed)
{
logger.LogInformation("Send dtmf failed: result={result}, context={context}",
sendDtmfFailed.ResultInformation?.Message, sendDtmfFailed.OperationContext);
}
Reconhecimento DTMF contínuo
Você pode se inscrever para receber tons DTMF contínuos durante toda a chamada. Seu aplicativo recebe tons DTMF quando o participante alvo pressiona uma tecla em seu teclado. Estes tons são enviados para a sua aplicação, um a um, à medida que o participante os pressiona.
Método StartContinuousDtmfRecognitionAsync
Comece a detetar tons DTMF enviados por um participante.
await callAutomationClient.GetCallConnection(callConnectionId)
.GetCallMedia()
.StartContinuousDtmfRecognitionAsync(new PhoneNumberIdentifier(c2Target), "dtmf-reco-on-c2");
Quando seu aplicativo não deseja mais receber tons DTMF do participante, você pode usar o método para informar os StopContinuousDtmfRecognitionAsync
Serviços de Comunicação do Azure para parar de detetar tons DTMF.
StopContinuousDtmfRecognitionAsync
Pare de detetar tons DTMF enviados pelo participante.
var continuousDtmfRecognitionOptions = new ContinuousDtmfRecognitionOptions(new PhoneNumberIdentifier(callerPhonenumber))
{
OperationContext = "dtmf-reco-on-c2"
};
var startContinuousDtmfRecognitionAsyncResult = await callAutomationClient.GetCallConnection(callConnectionId)
.GetCallMedia()
.StartContinuousDtmfRecognitionAsync(continuousDtmfRecognitionOptions);
Seu aplicativo recebe atualizações de eventos quando essas ações são bem-sucedidas ou falham. Você pode usar esses eventos para criar uma lógica de negócios personalizada para configurar a próxima etapa que seu aplicativo precisa executar quando receber essas atualizações de eventos.
Evento ContinuousDtmfRecognitionToneReceived
Exemplo de como você pode lidar com um tom DTMF detetado com êxito.
if (acsEvent is ContinuousDtmfRecognitionToneReceived continuousDtmfRecognitionToneReceived)
{
logger.LogInformation("Tone detected: sequenceId={sequenceId}, tone={tone}",
continuousDtmfRecognitionToneReceived.SequenceId,
continuousDtmfRecognitionToneReceived.Tone);
}
Os Serviços de Comunicação do Azure fornecem um SequenceId
como parte do ContinuousDtmfRecognitionToneReceived
evento, que seu aplicativo pode usar para reconstruir a ordem na qual o participante inseriu os tons DTMF.
Evento ContinuousDtmfRecognitionFailed
Exemplo de como você pode lidar quando a deteção de tom DTMF falha.
if (acsEvent is ContinuousDtmfRecognitionToneFailed continuousDtmfRecognitionToneFailed)
{
logger.LogInformation("Start continuous DTMF recognition failed, result={result}, context={context}",
continuousDtmfRecognitionToneFailed.ResultInformation?.Message,
continuousDtmfRecognitionToneFailed.OperationContext);
}
Evento ContinuousDtmfRecogntionStopped
Exemplo de como lidar quando o reconhecimento DTMF contínuo parou, isso pode ser porque seu aplicativo invocou o StopContinuousDtmfRecognitionAsync
evento ou porque a chamada terminou.
if (acsEvent is ContinuousDtmfRecognitionStopped continuousDtmfRecognitionStopped)
{
logger.LogInformation("Continuous DTMF recognition stopped, context={context}", continuousDtmfRecognitionStopped.OperationContext);
}
Em Espera
A ação de retenção permite que os desenvolvedores interrompam temporariamente uma conversa entre um participante e um sistema ou agente. Isso pode ser útil em cenários em que o participante precisa ser transferido para outro agente ou departamento ou quando o agente precisa consultar um supervisor em segundo plano antes de continuar a conversa. Durante esse período, você pode optar por reproduzir o áudio para o participante que está em espera.
// Option 1: Hold without additional options
await callAutomationClient.GetCallConnection(callConnectionId)
.GetCallMedia().HoldAsync(c2Target);
/*
// Option 2: Hold with play source
PlaySource playSource = /* initialize playSource */;
await callAutomationClient.GetCallConnection(callConnectionId)
.GetCallMedia().HoldAsync(c2Target, playSource);
// Option 3: Hold with options
var holdOptions = new HoldOptions(target)
{
OperationCallbackUri = new Uri(""),
OperationContext = "holdcontext"
};
await callMedia.HoldAsync(holdOptions);
*/
Unhold
A ação de não retenção permite que os desenvolvedores retomem uma conversa entre um participante e um sistema ou agente que foi pausado anteriormente. Quando o participante for retirado, poderá ouvir novamente o sistema ou agente.
var unHoldOptions = new UnholdOptions(target)
{
OperationContext = "UnHoldPstnParticipant"
};
// Option 1
var UnHoldParticipant = await callMedia.UnholdAsync(unHoldOptions);
/*
// Option 2
var UnHoldParticipant = await callMedia.UnholdAsync(target);
*/
Streaming de áudio (pré-visualização pública)
O streaming de áudio permite-lhe subscrever fluxos de áudio em tempo real a partir de uma chamada em curso. Para obter orientações mais detalhadas sobre como começar a usar o streaming de áudio e informações sobre eventos de retorno de chamada de streaming de áudio, consulte esta página.
Transcrição em tempo real (pré-visualização pública)
A transcrição em tempo real permite que você acesse transcrições ao vivo para o áudio de uma chamada em andamento. Para obter orientações mais detalhadas sobre como começar a usar a transcrição em tempo real e informações sobre eventos de retorno de chamada de transcrição em tempo real, consulte esta página.
Tabela de compatibilidade de ações de mídia
A tabela a seguir ilustra quais operações de mídia podem ser executadas/enfileiradas se uma operação anterior ainda estiver em execução/enfileirada.
Operação existente | Perna de chamada | Permitido | Não permitido |
---|---|---|---|
PlayToAll | Principal | PlayToAll, Recognize(Chamada sem grupo), PlayTo, Recognize(Chamada de grupo), SendDTMF, StartContinuousDtmfRecognition | Nenhuma |
Reconhecer(Chamada sem grupo) | Principal | PlayToAll, Recognize(Chamada sem grupo), PlayTo, Recognize(Chamada de grupo), SendDTMF, StartContinuousDtmfRecognition | Nenhuma |
Reproduzir em | Sub | PlayToAll, Reconhecer (chamada sem grupo) | PlayTo, Recognize(Chamada de Grupo), SendDTMF, StartContinuousDtmfRecognition |
Reconhecer (Chamada em Grupo) | Sub | PlayToAll, Reconhecer (chamada sem grupo) | PlayTo, Recognize(Chamada de Grupo), SendDTMF, StartContinuousDtmfRecognition |
SendDTMF | Sub | PlayToAll, Reconhecer (chamada sem grupo) | PlayTo, Recognize(Chamada de Grupo), SendDTMF, StartContinuousDtmfRecognition |
StartContinuousDtmfRecognition | Sub | PlayToAll, Recognize(Non-Group Call),PlayTo, Recognize(Group Call), SendDTMF, StartContinuousDtmfRecognition | Nenhuma |