Как настроить голосовое уведомление о записи разговора

Как настроить голосовое уведомление о записи разговора и что делать, если оно не было воспроизведено? Разбираем варианты реализации средствами SBC и АТС и показываем примеры настройки для Asterisk и Cisco UCM.

Требования к уведомлению о записи разговора

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

Как правило, уведомление реализуется на уровне IVR – клиент соединяется с платформой контакт-центра, которая воспроизводит соответствующее сообщение и только после этого направляет входящий звонок свободному оператору.

Но в ряде стран требования регуляторов могут быть жестче:
  1. клиент должен быть уведомлен о ведущейся записи
  2. само уведомление должно попасть в запись разговора
  3. если уведомление не было воспроизведено по техническим причинам, звонок НЕ должен быть записан
Как это реализовать?

Почему нет универсального решения

Плохая новость – универсального способа, который бы работал с любой АТС или платформой контакт-центра, нет. Причина в том, что уведомление, которое воспроизводится непосредственно во время разговора, требует вмешательства в голосовой поток. Значит, поток должен проходить через дополнительный компонент, который добавляет в него уведомление. А это дополнительная точка отказа.

Хорошая новость – многие коммуникационные решения предоставляют встроенные средства для реализации такого сценария. Их и рассмотрим.

Вариант 1 – проигрывание средствами SBC

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

Так, например, уведомление может быть проиграно средствами SBC AudioCodes:
  • для проигрывания уведомления перед подключением оператора контакт-центра можно использовать функционал воспроизведения аудио (Pre-connect / Early Media)
  • для проигрывания уведомления непосредственно в уже установленном соединении можно использовать механизмы Prerecorded Tones и Message Manipulation.
Подобные инструменты есть и у большинства других крупных вендоров SBC типа Ribbon, Oracle или Cisco CUBE.

Вариант 2 – специальные средства АТС

Некоторые АТС предоставляют свои проприетарные механизмы управления звонками для решения поставленной задачи.
Примеры:

Настройка уведомления в Asterisk

Здесь все решается настройкой dialplan. Перед началом разговора (или сразу после ответа абонента) вызывается Playback() с заранее записанным файлом-объявлением. Подробная инструкция – в конце статьи.

Настройка уведомления в Cisco UCM

Здесь сложнее, и придется немного попрограммировать. Вам понадобится создать JTAPI-приложение, которое подключается к CUCM как CTI-клиент (через Application User) и мониторит нужные линии, отслеживая события звонков. Для проигрывания уведомления скрипт инициирует подключение через built-in bridge еще одного участника – IVR-сервера или CTI Route Point, который проигрывает WAV-файл прямо во время разговора. После проигрывания эта третья служебная нога отключается, не затрагивая основной звонок.

В зависимости от вендора используемых коммуникационных решений могут быть и другие способы проигрывания уведомления.

Что делать, если уведомление не было воспроизведено

Если уведомления не было, то звонок НЕ должен быть записан.
А это задача системы записи, и ее реализация опять же зависит от вендора коммуникационной системы.
Например, в профессиональных системах записи для Cisco описанный выше метод уже реализован. А если он реализован на стороне самого рекордера, то и обработка результатов проигрывания (уведомление проиграно или произошел сбой) должна выполняться на стороне системы записи.

А в случае с Asterisk можно использовать тот же dialplan:
  • использовать ${PLAYBACKSTATUS} – устанавливается автоматически после Playback() и принимает значения SUCCESS, FAILED
  • если FAILED, то отправлять специальный POST-запрос в систему записи, которая должна его обработать
Есть схожая задача? Наишите нам – обсудим.

Приложение – Детали настройки уведомления о записи в Asterisk

Настройка уведомления для входящих звонков

Сама логика маршрутизации звонков и проигрывания файлов пишется в dialplan (extensions.conf). Чтобы при входящем звонке на номера операторов 100–199 (1xx) проигрывалось голосовое уведомление, нужно настроить соответствующий контекст в файле /etc/asterisk/extensions.conf.

Пример dialplan (extensions.conf)
Добавьте в контекст, в который поступают входящие звонки (например, [from-internal], следующий код:

[from-internal]
; Шаблон _1XX означает паттерн: первая цифра – 1, затем – любые две цифры от 0 до 9
exten => _1XX,1,NoOp(Входящий звонок на номер 1xx: ${EXTEN})

; 2. Отвечаем на канал (необходимо перед проигрыванием некоторых аудиофайлов)
same => n,Answer()

; 3. Проигрываем голосовое уведомление (файл должен лежать в /var/lib/asterisk/sounds/)
; Указывайте имя файла БЕЗ расширения (например, .wav или .gsm)
same => n,Playback(custom-audio-message)

; 4. Что делать дальше после разговора? Например, положить трубку:
same => n,Hangup()

Настройка уведомления для исходящих звонков

Чтобы при исходящем звонке от внутреннего абонента 1XX на мобильные номера вида 7995XXXXXXX проигрывать голосовое уведомление удаленному (вызываемому) абоненту, нужно использовать опцию A в функции Dial(). Эта опция воспроизводит файл вызываемому абоненту сразу после того, как он поднимет трубку, но до того, как оба абонента будут соединены для разговора.

Пример dialplan (extensions.conf)
Добавьте в контекст, в который поступают ваши входящие звонки (например, [to-external], следующий код:

[to-external]
; Шаблон для внутренних абонентов 1XX при звонке на номера 7995XXXXXXX
exten => _7995XXXXXXX/_[1]XX,1,NoOp(Звонок от ${CALLERID(num)} на внешний номер ${EXTEN} с уведомлением)

; Проигрываем файл "custom-audio-message" удаленному абоненту после поднятия трубки
same => n,Dial(PJSIP/${EXTEN}@my-outbound-trunk,,A(custom-audio-message))

; Что делать дальше после разговора? Положить трубку:
same => n,Hangup()

Как это работает:
_7995XXXXXXX/_[1]XX – это шаблон сопоставления. Звонок уйдет по этому маршруту только в том случае, если набранный номер соответствует 7995XXXXXXX, а CallerID вызывающего (внутреннего) абонента соответствует 1XX.

PJSIP/${EXTEN}@my-outbound-trunk – отправка звонка на ваш внешний транк (замените PJSIP на SIP, если используете старый драйвер chan_sip, и укажите имя SIP-транка).

A(custom-audio-message) – ключевая опция. custom-audio-message – это имя звукового файла (без расширения .wav или .mp3), который должен лежать в директории (по умолчанию обычно /var/lib/asterisk/sounds/).
Остались вопросы?
Присылайте свои запросы или задавайте уточняющие вопросы
Отправить запрос