Автоматизация голосового меню

Благодарность за разработку и внедрение Трофимову С.С.

 

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

Собственно тут описание немногих действий, проделанных нами.

Первое (и единственное в указанном файле) — файл extensions.conf. Добавляем в начале файла, после контекста [general], контекст [globals] . И в нём указываем переменную для счётчика повторов меню:

;====================ASTERISK==============
#include «phones.tree»

[general]
static=yes
writeprotect=no
clearglobalvars=no

[globals]
index=0

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

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

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

Далее листинг файла с пояснениями от создателей.

[phones-tree]

exten => s,1,Answer()
;podnimaem trubku
exten => s,n,WaitExten(1)
exten => s,n,Background(/home/records/1-hello)    ;Проигрываем приветствие: «Здраствуйте, Вы позвонили в………»

 
exten => s,n,Set(index=$[${index}+1]) 
;ustanavlivaem schetchik povtorov menu      Здесь мы устанавливаем счётчик повторов. К объявленной переменной index каждый раз прибавляем по 1. Первую добавляем сразу (первое прочтение меню).
exten => s,n,Gotoif($[«${index}»>=»3″]?hangup:next)
;proveryaem kolichestvo povtorov    Этой строкой проверяем текущее значение счётчика. Если значение больше или равно 3 — направляем в команду «Положить трубку».

exten => s,n(next),Background(/home/records/2-zvezdochka)  ;Проигрываем: Чтобы перевести телефон в тоновый режим — нажмите *.
exten => s,n,Background(/home/records/3-personal)
exten => s,n,Background(/home/records/4-commercial)
exten => s,n,Background(/home/records/5-buhgal)
exten => s,n,Background(/home/records/6-dogovor)
exten => s,n,Background(/home/records/7-fax)
exten => s,n,Background(/home/records/8-nomer)
exten => s,n,Background(/home/records/9-povtor)
;proigrivaem privetstvie Предыдущие строки проигрывают файлы с номерами отделов, факсов, повторов меню и набором номера абонента.
exten => s,n,WaitExten(8)
;zhdem 8 sekund  Здесь даём время звонящему выбрать пункт меню или набрать номер абонента.

exten => s,n,Goto(s,4)
;povtoryaem menu Если звонящий ничего не нажал — возвращаемся на счётчик повторов, который прибавит единицу.

exten => s,n(hangup),Hangup()
;kladem trubku po usloviyu Если значение счётчика достигло порогового значения — кладём трубку.

;exten => s,n,Dial(SIP/47800)
;nabiraem sekretarya Теперь закомментированно — секретаря больше нет.

exten => 1,1,Queue(group_1)
;perevodin zvonok v kadry
exten => 2,1,Queue(group_2)
;perevodin zvonok v commercheskiy otdel
exten => 3,1,Queue(group_3)
;perevodin zvonok v buhgalteriu
exten => 5,1,Queue(group_5)
;perevodin zvonok v dogovornoy otdel
exten => 9,1,Queue(group_9)
;perevodin zvonok v fax
exten => 0,1,Goto(s,4)
;povtoryaem privetstvie
; Это правила перевода звонков в соответствии с выбранным пунктом меню

exten => _478XX,1,Dial(SIP/${EXTEN})
;esli nomer nabran

exten => i,1,Playback(/home/records/0-invalid)
;esli nomer nepravilniy proigrivaem soobshenie Проигрываем сообщение о неправильном номере
exten => i,n,WaitExten(1)
exten => i,n,Goto(s,4)
;esli nomer nepravilniy povtiryaem menu Повторяем голосовое меню

Собственно остаётся только зайти в консоль астериска и выполнить:
dialplan reload (перезапуск правил)

Немного пояснений:

Первое: почему счётчик воткнули после первого голосового файла, а не перед всем меню?
Потому, что в первом файле мы здороваемся и представляем нашу организацию. Это достаточно проделать один раз.

Второе: почему звуковые файлы меню проигрываются командой Background, а файл с сообщением о неправильном наборе номера командой Playback?
В первом случае звонящему необязательно дожидаться пока прозвучит всё меню. Он может нажать любую кнопку в любой момент и она будет обработана.
В случае с неправильным номером, пока девушка не закончит свою речь, ни одна нажатая кнопка воспринята системой не будет. Иначе, нажав произвольную комбинацию клавиш,  велик шанс того, что одна из нажатых кнопок окажется пунктом меню. И звонок пойдёт в отдел, назначенный этой кнопке.

Третье: в идеале, перед тем как положить трубку, хорошо бы записать звуковой файл «Вы ничего не выбрали. Всего доброго» и проигрывать его. Но мы это не сделали по разным причинам.

В планах доработать меню до полного распределения звонков по специалистам. Но это когда-нибудь…