Поделиться через


Управление действиями мультимедиа в ходе вызова с помощью автоматизации вызовов

Служба автоматизации вызовов использует интерфейс REST API для получения запросов на действия и предоставления ответов, чтобы сообщить, был ли запрос успешно отправлен или нет. Из-за асинхронного характера вызова большинство действий имеют соответствующие события, которые активируются при успешном завершении или сбое действия. В этой статье рассматриваются действия, доступные разработчикам во время звонков, например SendDTMF и ContinuousDtmfRecognition. Действия сопровождаются примером кода по вызову конкретного действия.

Служба автоматизации вызовов поддерживает другие действия для управления вызовами и записями, которые не включены в эту статью.

Note

Автоматизация вызовов в настоящее время не взаимодействует с Microsoft Teams. Действия, такие как выполнение или перенаправление вызова пользователю Teams или воспроизведение звука пользователю Teams с помощью службы автоматизации вызовов, не поддерживаются.

Prerequisites

Для всех примеров client кода — это CallAutomationClient объект, который можно создать, как показано, и callConnection является CallConnection объектом, полученным из Answer или CreateCall ответа. Вы также можете получить его из событий обратного вызова, получаемых приложением.

var callAutomationClient = new CallAutomationClient("<Azure Communication Services connection string>");

Отправка DTMF

Вы можете отправлять двухтональные многочастотные (DTMF) сигналы внешнему участнику. Эта возможность может оказаться полезной, если вы уже на вызове и хотите пригласить другого участника, у которого есть номер расширения или использовать интерактивное меню голосового ответа.

Note

Эта функция поддерживается только для внешних участников в общедоступных телефонных сетях и поддерживает отправку не более 18 тонов одновременно.

Метод SendDtmfAsync

Отправьте список тонов DTMF внешнему участнику.

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); 

Когда ваше приложение отправляет сигналы DTMF, вы получаете уведомления о событиях. Вы можете использовать события SendDtmfTonesCompleted и SendDtmfTonesFailed для создания бизнес-логики в вашем приложении, чтобы определить дальнейшие действия.

Пример SendDtmfTonesCompleted события:

if (acsEvent is SendDtmfTonesCompleted sendDtmfCompleted) 
{ 
    logger.LogInformation("Send DTMF succeeded, context={context}", sendDtmfCompleted.OperationContext); 
} 

Пример SendDtmfTonesFailed события:

if (acsEvent is SendDtmfTonesFailed sendDtmfFailed) 
{ 
    logger.LogInformation("Send dtmf failed: result={result}, context={context}", 
        sendDtmfFailed.ResultInformation?.Message, sendDtmfFailed.OperationContext); 
} 

Непрерывное распознавание DTMF

Вы можете подписаться на получение непрерывных тонов DTMF в течение всего звонка. Приложение получает тон DTMF, когда целевой участник нажимает клавишу на клавиатуре. Тоны отправляются в ваше приложение по очереди, когда участник нажимает на кнопки.

Метод StartContinuousDtmfRecognitionAsync

Начните обнаружение тонов DTMF, которые отправляет участник.

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

Когда ваше приложение больше не хочет получать от участника тоны DTMF, используйте метод StopContinuousDtmfRecognitionAsync, чтобы сообщить Службам коммуникации Azure прекратить их обнаружение.

StopContinuousDtmfRecognitionAsync

Прекратите отслеживание тонов DTMF, отправленных участником.

var continuousDtmfRecognitionOptions = new ContinuousDtmfRecognitionOptions(new PhoneNumberIdentifier(callerPhonenumber)) 
{ 
    OperationContext = "dtmf-reco-on-c2" 
}; 

var startContinuousDtmfRecognitionAsyncResult = await callAutomationClient.GetCallConnection(callConnectionId) 
    .GetCallMedia() 
    .StartContinuousDtmfRecognitionAsync(continuousDtmfRecognitionOptions); 

Приложение получает обновления событий при успешном выполнении или сбое этих действий. Эти события можно использовать для создания пользовательской бизнес-логики, чтобы настроить следующий шаг, который приложение должно предпринять при получении этих обновлений событий.

Событие ContinuousDtmfRecognitionToneReceived

Пример того, как можно обрабатывать сигнал DTMF, который был успешно обнаружен.

if (acsEvent is ContinuousDtmfRecognitionToneReceived continuousDtmfRecognitionToneReceived) 
{ 
	logger.LogInformation("Tone detected: sequenceId={sequenceId}, tone={tone}", 
	continuousDtmfRecognitionToneReceived.SequenceId, 
        continuousDtmfRecognitionToneReceived.Tone); 
} 

Службы коммуникации Azure SequenceId вам предоставляются в рамках мероприятия ContinuousDtmfRecognitionToneReceived. Ваше приложение может использовать это для восстановления порядка, в котором участник ввел сигналы DTMF.

Событие ContinuousDtmfRecognitionFailed

Пример того, что делать при сбое обнаружения тонов DTMF.

if (acsEvent is ContinuousDtmfRecognitionToneFailed continuousDtmfRecognitionToneFailed) 
{ 
    logger.LogInformation("Start continuous DTMF recognition failed, result={result}, context={context}", 
        continuousDtmfRecognitionToneFailed.ResultInformation?.Message, 
        continuousDtmfRecognitionToneFailed.OperationContext); 
} 

Событие ContinuousDtmfRecognitionStopped

Пример того, что делать при остановке непрерывного распознавания DTMF. Может быть, ваше приложение вызвало StopContinuousDtmfRecognitionAsync событие или вызов закончился.

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

Hold

Действие удержания позволяет разработчикам временно приостановить беседу между участником и системой или агентом. Эта функция полезна в ситуациях, когда участника нужно перевести к другому агенту или отделу, или когда агенту необходимо проконсультироваться с руководителем перед тем, как продолжить беседу. В течение этого времени вы можете воспроизвести аудиосообщение для удерживаемого участника.

// 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

Действие снятия удержания позволяет разработчикам возобновить беседу между участником и системой или агентом, который был ранее приостановлен. Когда участник снимается с удержания, он снова может слышать систему и агента.

var unHoldOptions = new UnholdOptions(target) 
{ 
    OperationContext = "UnHoldPstnParticipant" 
}; 

// Option 1
var UnHoldParticipant = await callMedia.UnholdAsync(unHoldOptions);

/* 
// Option 2
var UnHoldParticipant = await callMedia.UnholdAsync(target);
*/

Потоковая передача звука

С помощью потоковой передачи звука вы можете подписаться на потоки звука в режиме реального времени из текущего вызова. Дополнительные сведения о начальном этапе работы с потоковой передачей звука и информации о событиях обратного вызова при потоковой передаче звука см. в кратком руководстве: потоковая передача звука на серверной стороне.

Транскрибирование в режиме реального времени

Используя транскрибирование в режиме реального времени, вы можете получить доступ к динамическим транскрибированиям для звука текущего звонка. Дополнительные сведения о начале работы с транскрибированием в режиме реального времени и сведениями о событиях обратного вызова транскрибирования в режиме реального времени см. в статье "Добавление транскрибирования в режиме реального времени" в приложение.

Таблица совместимости действий мультимедиа

В следующей таблице показано, какие операции мультимедиа разрешены к выполнению или постановке в очередь, если предыдущая операция по-прежнему выполняется или находится в очереди.

Существующая операция Вызов ноги Allowed Disallowed
PlayToAll Main PlayToAll Recognize(Non-Group Call) PlayTo Recognize(Group Call) SendDTMF StartContinuousDtmfRecognition None
Recognize(Non-Group Call) Main PlayToAll Recognize(Non-Group Call) PlayTo Recognize(Group Call) SendDTMF StartContinuousDtmfRecognition None
PlayTo Sub PlayToAll, Recognize(Non-Group Call) PlayTo Recognize(Group Call) SendDTMF StartContinuousDtmfRecognition
Recognize(Group Call) Sub PlayToAll, Recognize(Non-Group Call) PlayTo Recognize(Group Call) SendDTMF StartContinuousDtmfRecognition
SendDTMF Sub PlayToAll, Recognize(Non-Group Call) PlayTo Recognize(Group Call) SendDTMF StartContinuousDtmfRecognition
StartContinuousDtmfRecognition Sub PlayToAll, Recognize(Non-Group Call),PlayTo, Recognize(Group Call), SendDTMF,StartContinuousDtmfRecognition None