Голосовое дерево на Asterisk своими руками

из песочницы
Fullgrim 28 июня 2011 в 15:41 71,1k
image

Доброго времени суток хабражители.

Хотелось бы поделиться опытом развертывания голосовых деревьев (IVR), с помощью Asterisk.
Для этого нам понадобится:
  • Машина с установленным Asterisk`ом
  • Телефонный номер, заведенный в Asterisk посредством SIP/H.323 от провайдера ip-телефонии, либо посредством аналоговой линии/цифрового потока Е1 через платы Digium

Ниже я опишу как создать простое голосовое дерево. Главное от чего необходимо отталкиваться — это структура дерева.
Типичное дерево выглядит примерно так:
  • Здравствуйте вы позвонили в %companyname%
  • Для того, чтобы соединится с отделом 1 нажмите 1
  • Для того, чтобы соединится с отделом 2 нажмите 2
  • Чтобы отправить факс нажмите 9
  • Если вы знаете внутренний номер абонента, наберите его в тональном режиме или дождитесь ответа секретаря

Так же мы можем предложить позвонившему соединится необходимым специалистом из отдела, который он выбрал выше. Так, например, если он выбрал первый отдел, то мы можем воспроизвести ему следующую информацию:
  • Вы находитесь в пункте меню отдел 1
  • Чтобы соединится со специалистом по %X% нажмите 5
  • Чтобы соединится со специалистом по %Y% нажмите 6
  • Для возврата в предыдущее меню нажмите 0


Приступим к реализации! Допустим что у нас имеется номер 8-495-1234567 на котором мы будем «растить» наше дерево. Вся входящая и исходящая маршрутизация в Asterisk, как правило, расположена в файле extensions.conf, который находится в корневой папке астериска — /etc/asterisk. Я считаю, что Ivr-деревья удобнее создавать отдельными файлами поэтому создадим в корневой папке Asterisk файл company.tree и впишем в него пока одну лишь строчку:

[company_tree]

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

#include "company.tree"

Чтобы подгрузить недавно созданный файл в общий план маршрутизации Asterisk. Теперь перейдем основной контекст для входящих звонков (у всех он может называться по разному — general, from_pstn, from_e1 или как кому больше нравиться) и в него добавим следующую строчку:

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

При входящем звонке на номер 84951234567 Asterisk переведет нас в контекст company_tree на первую строку «s», который находится в файле company.tree, который мы благополучно подгрузили в общий план маршрутизации выше. Звучит немного запутанно, однако подобная вложенность поможет нам избежать случаев некорректной маршрутизации из-за пересечения нескольких контекстов в файле extensions.conf.

На данном этапе перейдем в файл 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/zapis1)». Для работы с данным форматом я использовал ПО — CoolEdit и Adobe Audition, если кто знает еще звуковые редакторы с поддержкой и конвертацией ulaw, напишите буду признателен.
Проголосовать:
+26
Сохранить: