Partilhar via


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:

  1. 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.
  2. Saiba mais sobre identificadores de usuário como CommunicationUserIdentifier e PhoneNumberIdentifier usados neste guia.
  3. 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);
*/