4 Ноя
2011
Рубрика: Asterisk
Автор:    2 комментария

IVR — голосовое дерево на Asterisk

IVR (Interactive Voice Response) – система, позволяющая организовать интерактивный звуковой интерфейс, управление которым осуществляется пользователем при помощи нажатий соответствующих клавиш на своем телефоне.

Основной составляющей является голосовое дерево – это список меню и подменю, а так же связанных с ними действий, к которым имеет доступ клиент.  Рассмотрим на примере процесс развертывания голосовых деревьев IVR с помощью программы для IP-телефонии Asterisk. Что нам для этого нужно:

  1. Система с установленной и настроенной программой.
  2. Заведенный в Asterisk телефонный номер.

При этом номер может быть заведен несколькими путями:

Рассмотрим структуру простого дерева, обычно это приветствие клиента и список базовых действий:

«Здравствуйте, Вас приветствует наша компания.

Для того чтобы связаться с директором — нажмите 1.

Для того чтобы связаться с заместителем директора — нажмите 2.

Для того чтобы вызвать дежурного – нажмите 3.

Для того чтобы прослушать информацию заново – нажмите 9.»

Если пользователь хочет выбрать действие «связаться с директором»  — он набирает цифру 1, и ему предлагается подменю, содержащее более детальную информацию:

«Вы выбрали связаться с директором.

Для того чтобы позвонить секретарю – нажмите 5.

Для того чтобы оставить сообщение на автоответчике – нажмите 6.

Для возврата в предыдущее меню – нажмите 0.»

Теперь, зная, какую структуру мы хотим придать нашему IVR дереву, и имея телефонный номер, при звонке на который активизируется IVR, например, 8-495-5555555, приступим к работе над кодом.

Первым делом в корневой папке программы требуется создать файл, который будет содержать дерево. Создадим такой файл с именем company.tree и запишем в него пока только одну строку:

[company_tree]

Следующим шагом необходимо отредактировать файл extensions.conf, в котором Asterisk содержит сведения о маршрутизации. Находится он в корневой папке программы /etc/asterisk.

В начало файла дописываем строку, которая подключит файл с деревом к плану маршрутизации:

#include «company.tree»

Далее перейдем к контексту входящих звонков, и сделаем указание на наш файл:

exten => 84955555555,1,Goto(company_tree,s,1)

Как только Asterisk обнаружит входящий звонок на указанный номер, он перейдет в контекст company_tree на первую строку «s», которая содержится в созданном нами файле. Вложенность необходима для предотвращения некорректной маршрутизации при пересечении контекстов в файле маршрутизации.

На данном этапе перейдем в файл company.tree и собственно начнем «строить»Ivr-дерево — добавим внего следующие строки:

exten => s,1,Answer()

#Отвечаем на входящий звонок

exten => s,2,Background(/home/ulaw/IVR-zapis)

#Проигрываем запись текста нашего голосового дерева*

exten => s,3,WaitExten(7)

#Немного времени на осмысление дерева и выбор интересующего направления, в данномслучае 7 секунд

exten => 1,1,Goto(otdel1,s,1)

#Делаем переход в контекст первого отдела по нажатию клавиши 1

exten => 2,1,Goto(otdel2,s,1)

#Аналогично

exten => 9,1,Set(FAXFILE=/tmp/fax/${STRFTIME(${EPOCH},,%Y%m%d_%H_%M_%S)}-from-${CALLERID(num)})

#Тут мы принимаем факсы, первым делом устанавливаемфаксимильному файлу -время во сколько пришел факс и с какого номера он пришел

exten => 9,2,ReceiveFax(${FAXFILE}.tif)

# Функция приема факса с именем который мы указали выше

exten => 9,3,System(sendEmail -f fax@company.com -t you@company.com -u «Входящийфакс.» -m»Вам пришел факс с номера ${CALLERID(num)} в ${STRFTIME(${EPOCH},,%H:%M:%S)}. Факс во вложении.»-a ${FAXFILE}.tif -o message-charset=UTF-8)

#Пересылка пришедшего файла на электропочту

exten => _XXX,1,Dial(SIP/${EXTEN}@YourAsterisk)

#Если тот кто звонит знает внутренний номер сотрудника, то для эта строчка для него:)

exten => t,1,Dial(SIP/внутренний номер секретаря@YourAsterisk)

#Этот звонок пойдет по таймауту на секретаря, если за 7 секунд в голосовом дереве небыло выбранонаправление

exten => i,1,Dial(SIP/внутренний номер секретаря@YourAsterisk)

#Этот звонок пойдет на секретаря, если абонент выбрал несуществующее направление

[otdel1]

# контекст пункта меню — первый отдел

exten => s,1, Background(/home/wav/otdel1)

# Проигрываем — «Вы находитесь в пункте меню отдел 1»

exten => s,2,Waitexten(7)

# Ждем решения позвонившего

exten => 1,1,Dial(SIP/внутренний номер@YourAsterisk)

#Соединяем со специалистом %X%

exten => 2,1,Dial(SIP/внутренний номер@YourAsterisk)

#Соединяем со специалистом %Y%

exten => t,1,Dial(SIP/внутренний номер@YourAsterisk)

#Соединяем с кем-нибудь по таймауту

exten => 0,1,Goto(company_tree,s,1)

#Делаем переход на вышестоящий пункт меню

На этом дерево готово. Осталось только обновить маршрутизацию астериска — для этогонеоходимо втерминале выполнить:

asterisk -r

dialplan reload

Так же следует помнить, что Asterisk работает с аудиофайлами в формате *.ulaw, но при записи пути к файлу это расширение не указывается. Например:

Background(/home/IVR/back_music)

Данная строка указывает на то, что для фонового звучания будет использован файл back_music.ulaw

Хорошей программой для работы с такими файлами является GXTranscoder, так же подойдут CoolEdit и Adobe Audition.

2 комментария

  • Супер, все понятно, все по полочкам. Спасибо, то что нужно.

  • добрый день!
    Подскажите, голосовое меню сделал, но когда хочу набрать внутренний номер абонента, к примеру 125, попадаю на первый контекст голосового меню #1

Что вы думаете об этом?