Настройка голосового меню (IVR) на Asterisk

Обновлено Обновлено: Опубликовано Опубликовано:

Тематические термины: IVRAsterisk.

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

Принцип настройки

IVR настраивается в плане набора Aterisk (dialplan) — в конфигурационном файле extensions.conf.

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

Записать голосовое приветствие с просьбой ввода номера можно с помощью различных программ звукозаписи. Asterisk работает с форматами .waw, .gsm. В случае наличия другого формата, можно воспользоваться пакетом для конвертации — sox. Также можно загрузить и установить готовый список голосов на русском, который частично, можно использовать.

Базовая настройка

Открываем конфигурационный файл:

vi /etc/asterisk/extensions.conf

Вводим:

[outcaling]
...
exten => 222,1,Answer()
 same => n,Background(basic-pbx-ivr-main)
exten => _XXX,1,Dial(SIP/${EXTEN},,m)

* в данном примере, при звонке на номер 222 нам проигрывается голосовая запись basic-pbx-ivr-main (из каталога /var/lib/asterisk/sounds/<язык>). Когда мы вводим трехзначный добавочный номер, нас соединяет Asterisk с этим номером. Предполагается, что наш основной диалплан называется outcaling.

Перезапускаем настройки диалплана:

asterisk -x "dialplan reload"

Голосовое дерево

Теперь настроим возможность выбора отдела, с которым абонент захочет соединиться.

Приводим наш диалплан к следующему виду:

vi /etc/asterisk/extensions.conf

exten => 333,1,Answer()
exten => 333,2,Background(basic-pbx-ivr-main)
exten => 333,3,WaitExten(5)
exten => 1,1,Goto(managers,s,1)
exten => 2,1,Goto(support,s,1)

[managers]
exten => s,1,Ringing
 same => n,Wait(1)
 same => n,Background(/var/lib/asterisk/sounds/wav/managers)
 same => n,Waitexten(5)
exten => 1,1,Dial(SIP/201)
exten => 2,1,Dial(SIP/202)
exten => 0,1,Goto(outcaling,333,1)

[support]
exten => s,1,Ringing
 same => n,Wait(1)
 same => n,Background(/var/lib/asterisk/sounds/wav/support)
 same => n,Waitexten(5)
exten => 1,1,Dial(SIP/101)
exten => 2,1,Dial(SIP/102)
exten => 0,1,Goto(outcaling,333,1)

* где:

  • 333 — внутренний номер, позвонив на который мы услышим голосовое меню.
  • WaitExten(5) — система ожидает ввода номера в течение 5 секунд.
  • 1,1,Goto(managers,s,1) — если абонент ввел 1, переходим к диалплану managers, пункту s,1.
  • 2,1,Goto(support,s,1) — если абонент ввел 2, переходим к диалплану support, пункту s,1.
  • Background(/var/lib/asterisk/sounds/wav/managers) — запись голосового меню для managers.
  • Background(/var/lib/asterisk/sounds/wav/support) — запись голосового меню для support.

Перечитываем настройки диалплана:

asterisk -x "dialplan reload"

Таймаут по времени ожидания и неправильные действия

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

Данное поведения указывается в диалплане с помощью ключей t и i. Добавим их в наш конфиг:

vi /etc/asterisk/extensions.conf

exten => 333,1,Answer()
 same => n,Background(basic-pbx-ivr-main)
 same => n,WaitExten(5)
exten => 1,1,Goto(managers,s,1)
exten => 2,1,Goto(support,s,1)
exten => t,1,Dial(SIP/101)
exten => i,1,Background(invalid)
 same => n,Goto(outcaling,333,3)

...

 * где t,1,Dial(SIP/101) — позвонить по номеру 101, если будет превышен таймаут ожидания; i,1,Background(invalid) — сообщить о том, что введен неправильный номер.

Если не работает донабор

Если во время тестирования возникнут проблемы при донаборе внутреннего номера, необходимо проверить режим DTMF. В двух словах, это аналоговый сигнал для набора телефонного номера. Он может отправляться разными способами: inband, rfc2833 / rfc4733, info. При возникновении проблем, попробуйте в настройках клиента выставить rfc2833 или inband.

На стороне Asterisk также можно настроить sip-пир на определенный способ передачи DTMF:

vi /etc/asterisk/sip.conf

dtmfmode=rfc2833

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

Примеры настроек

Рассмотрим некоторые дополнительные примеры настроек диалплана, которые будут полезны при конфигурировании автоинформатора.

1. Расписание

а) Мы можем вызывать различные контексты диалплана в зависимости от времени суток. Для этого вызываем приложение GotoIfTime:

exten => <номер>,1,NoOp(Задаем расписание колл-центра)
 same => n,GotoIfTime(08:00-19:59,mon-fri,*,*?working_hours,s,1)
 same => n,Goto(not_working_hours,s,1)

[working_hours]
exten => s,1,NoOp(Рабочие часы)
 same => ...

[not_working_hours]
exten => s,1,NoOp(Нерабочие часы)
 same => ...

* в данном примере при звонке с 08 до 20:00 в будние дни нас перекинет в контекст working_hours, иначе — в not_working_hours.

б) Чтобы во время нашей работы в рабочие часы мы могли проверить работу автоинформатора в нерабочее время, можно задать исключение для определенного номера:

exten => <номер>,1,NoOp(Задаем расписание колл-центра)
 same => n,GotoIf($["${CALLERID(num)}" = "9062504869"]?not_working_hours,s,1)
 same => n,GotoIfTime(08:00-19:59,mon-fri,*,*?working_hours,s,1)
 same => n,Goto(not_working_hours,s,1)

...

* в данном примере мы добавили строку с проверкой исходящего номера. Если мы звоним с телефона 9062504869, то звонок всегда перекидывать в контекст not_working_hours.

в) Также мы можем менять направление диалплана в зависимости от времени:

exten => s,1,NoOp(Разные пути в зависимости от времени и дня)
 same => n,GotoIfTime(10:00-13:59,mon-fri,*,*?true:false)
 same => n(true),NoOp(TRUE)
 same => n,Background(wav/true)
 same => n,Hangup()
 same => n(false),NoOp(FALSE)
 same => n,Background(wav/false)
 same => n,Hangup()

* в данном примере мы проиграем файл wav/true, если звонок будет совершен в будние дни с 10 до 14, и wav/false — в любое другое время.

# Серверы # Телефония
Дмитрий Моск — частный мастер
Была ли полезна вам эта инструкция?

Да            Нет