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


Как управлять мультимедиа-действиями во время вызова с помощью автоматизации вызовов

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

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

Примечание.

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

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

  1. Руководство по концепциям автоматизации вызовов, описывающее модель программирования действий и обратные вызовы событий.
  2. Сведения об идентификаторах пользователей, таких как CommunicationUserIdentifier и PhoneNumberIdentifier, используемых в этом руководстве.
  3. Узнайте больше о том, как управлять и направлять вызовы с помощью системы автоматизации вызовов, которая обучает основам работы с вызовами.

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

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

Отправка DTMF

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

Примечание.

Это поддерживается только для внешних участников ТСОП и допускает отправку не более 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 остановить обнаружение тонов DTMF.

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 тоны.

Событие Ошибка Непрерывного Распознавания DTMF

Пример того, как можно обрабатывать ситуацию, когда обнаружение тонов DTMF не удалось.

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

Событие остановки непрерывного распознавания DTMF

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

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

Удержание

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

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

Прекращение удержания

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

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

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

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

Потоковая передача звука (открытая предварительная версия)

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

Транскрибирование в режиме реального времени (общедоступная предварительная версия)

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

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

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

Существующая операция Сегмент вызова Допустимо Запрещено
PlayToAll Главная PlayToAll, Распознать(не групповой вызов), PlayTo, Распознать(групповой вызов), Отправить DTMF, Начать непрерывное распознавание DTMF нет
Распознать (негрупповый вызов) Главная PlayToAll, Распознать(Не групповый вызов), PlayTo, Распознать(Групповой вызов), ОтправитьDTMF, НачатьНепрерывноеРаспознаваниеDtmf нет
Воспроизведение Под Воспроизведение для всех, Распознать (не групповый звонок) PlayTo, Recognize (Групповой вызов), Отправить DTMF, Начать непрерывное распознавание DTMF
Распознать (Групповой вызов) Под PlayToAll, Распознать (Не групповой вызов) PlayTo, Recognize(Групповой вызов), Отправить DTMF, Начать непрерывное распознавание DTMF (StartContinuousDtmfRecognition)
SendDTMF Под PlayToAll, Распознать (Не групповый вызов) PlayTo, Распознать(Групповой вызов), Отправить DTMF, Начать непрерывное распознавание DTMF
StartContinuousDtmfRecognition Под PlayToAll, Recognize(обычный вызов), PlayTo, Recognize(групповой вызов), SendDTMF, StartContinuousDtmfRecognition нет