Como controlar ações de mídia com a Automação de Chamadas

A Automação de Chamadas usa uma interface da API REST para receber solicitações de ações e fornecer respostas para notificar se a solicitação foi enviada com êxito. Devido à natureza assíncrona da chamada, a maioria das ações tem eventos correspondentes que são disparados quando a ação é concluída com êxito ou quando 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 com amostas de código sobre como invocar a ação.

A Automação de Chamadas dá suporte a várias outras ações para gerenciar as chamadas e a gravação que não estão incluídas neste guia.

Observação

Atualmente, a Automação de Chamadas não interopera com o Microsoft Teams. Ações como fazer, redirecionar uma chamada para um usuário do Teams ou tocando áudio para um usuário do Teams usando a Automação de Chamadas não têm suporte.

Como pré-requisito, recomendamos que você leia os artigos abaixo para aproveitar ao máximo este guia:

  1. Guia de conceitos da Automação de Chamadas que descreve o modelo de programação de eventos de ação e os retornos de chamada de eventos.
  2. Saiba mais sobre os identificadores de usuário, como CommunicationUserIdentifier e PhoneNumberIdentifier, usados neste guia.
  3. Saiba mais sobre como controlar e orientar chamadas com a Automação de Chamadas, que ensina sobre como lidar com as noções básicas 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 dos eventos de retorno de chamada recebidos pelo 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á estiver em uma chamada e precisar convidar outro participante que tenha um número de extensão ou um menu IVR para navegar.

Observação

Isso só tem suporte para participantes PSTN externos e dá suporte ao envio de no máximo 18 tons por 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 eventos SendDtmfTonesCompleted 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 de DTMF contínuo

Você pode assinar para receber tons DTMF contínuos durante toda a chamada. Seu aplicativo recebe tons DTMF à medida que o participante de destino pressiona uma tecla em seu teclado. Esses tons são enviados ao aplicativo um a um enquanto o participante os pressiona.

Método StartContinuousDtmfRecognitionAsync

Comece a detectar tons DTMF enviados por um participante.

await callAutomationClient.GetCallConnection(callConnectionId) 
    .GetCallMedia() 
    .StartContinuousDtmfRecognitionAsync(new PhoneNumberIdentifier(c2Target), "dtmf-reco-on-c2"); 

Quando o aplicativo não quiser mais receber tons DTMF do participante, você poderá usar o método StopContinuousDtmfRecognitionAsync para permitir que os Serviços de Comunicação do Azure saibam para parar de detectar tons DTMF.

StopContinuousDtmfRecognitionAsync

Comece a detectar tons DTMF enviados por 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 detectado 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 uma SequenceId como parte do evento ContinuousDtmfRecognitionToneReceived, 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 detecçã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 foi interrompido, isso pode ser porque seu aplicativo invocou o evento StopContinuousDtmfRecognitionAsync ou porque a chamada terminou.

if (acsEvent is ContinuousDtmfRecognitionStopped continuousDtmfRecognitionStopped) 
{ 
    logger.LogInformation("Continuous DTMF recognition stopped, context={context}", continuousDtmfRecognitionStopped.OperationContext); 
} 

Hold

A ação de retenção permite que os desenvolvedores pausem 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 tempo, você pode optar por reproduzir á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);
*/

Desativar espera

A ação de retenção permite que os desenvolvedores resumem uma conversa entre um participante e um sistema ou agente que estava em pausa. Quando o participante for retirado da espera, ele poderá ouvir o sistema ou o agente novamente.

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 (versão prévia pública)

O streaming de áudio permite que você assine fluxos de áudio em tempo real de uma chamada em andamento. Para obter diretrizes mais detalhadas sobre como começar a usar a transmissão de áudio e informações sobre eventos de retorno de chamada de transmissão de áudio, consulte está página.

Transcrição em tempo real (versão prévia 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 diretrizes 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.