IVR
Материал из Xgu.ru
IVR (Interactive Voice Response) — технология, позволяющая человеку взаимодействовать с компьютерной системой,
передавая ей сигналы с помощью клавиатуры или голоса[1] и получая от неё ответы голосом.
Взаимодействие, чаще всего, производится по телефону, а сигналы пользователя передаются с помощью DTMF-последовательностей.
Технология IVR используется чаще всего, чтобы сократить нагрузку на людей в системах массового обслуживания по телефону,
например, в банках, страховых компаниях, телекоммуникационных операторах и других.
[править] Настройка IVR в Астериске
Настройка IVR в Астериске выполняется через диалплан.
Пример простейшего IVR в Астериске:
exten => _41XX,1,Answer exten => _41XX,n,Wait(1) exten => _41XX,n,Record(/tmp/proba${EXTEN:2}:gsm,3) exten => _41XX,n,Playback(/tmp/proba${EXTEN:2}) exten => 5211,1,Answer exten => 5211,n,Playback(/tmp/proba99) exten => 5211,n,WaitExten() exten => 1,1,Playback(/tmp/proba01) exten => 1,n,Goto(demo1,5211,1) exten => 2,1,Playback(/tmp/proba02) exten => 2,n,Goto(demo1,5211,1) exten => 3,1,Playback(/tmp/proba03) exten => 3,n,Goto(demo1,5211,1) exten => 0,1,Playback(/tmp/proba98) exten => 0,n,Hangup
Сначала на разных расширениях, начинающихся на 41, мы записываем фразы, а затем используем их по номеру 5211.
Используются фразы 01,02,03,98 и 99. Они образуют интерактивное меню, в котором:
- 99 — приветствие;
- 98 — прощание;
- 01,02,03 — три пункта, доступных после приветствия.
Меню зациклено. Выход из него возможен по нажатию любой клавиши за исключением 1,2,3 или 0. При нажатии 0 производится прощание и завершение разговора. При нажатии остальных клавиш производится завершение разговора без сообщений.
Есть специальные расширения, которые позволяют сделать диалог более удобным:
- t — завершение по таймауту;
- i — неверное нажатие.
Если в приведённый выше диалплан добавить строки:
exten => i,1,Playback(/tmp/proba97) exten => i,n,Goto(demo1,5211,1) exten => t,1,Playback(/tmp/proba98) exten => t,n,Hangup
то в случае неверного набора будет проигрываться сообщение 97 и происходить возврат в основное меню, а в случае таймаута будет производиться прощание.
Пример крутого разветвлённого меню:
[deeper] exten => s,1,Background(demo-nomatch) ;exten => s,1,AGI(festival-script.pl|"deeper menu") exten => s,2,Goto,options|s|1 [options] exten => s,1,Background(demo-instruct) ;exten => s,1,AGI(festival-script.pl|"options menu") exten => 1,1,Goto,deeper|s|1 exten => 2,1,Goto,sales|s|1 [sales] exten => s,1,Background(demo-thanks) ;exten => s,1,AGI(festival-script.pl|"sales menu") exten => 0,1,Goto,from-sip|1000 exten => 1,1,Goto,Menu|s|1 [Menu] exten => s,1,Background(demo-congrats) ;exten => s,1,AGI(festival-script.pl|"menu menu") exten => 1,1,Goto,sales|s|1 exten => 2,1,Goto,options|s|1 exten => i,1,Goto,s exten => t,1,Goto,s ;The specific method to enter the menu is up to you but I used my sip phone to test. [from-sip] exten => 100,1,Answer exten => 100,2,Goto,Menu|s|1
Ещё более навороченное:
[local] ... exten => 4800,1,Answer exten => 4800,n,Goto(Menu,s,1) [Menu] exten => s,1,Answer exten => s,n,Background(/tmp/my-vitae) exten => s,n(osnova),Background(/tmp/my-osnovnoe-menu) exten => s,n,WaitExten(3) exten => s,n,Background(/tmp/my-please) exten => s,n,WaitExten(3) exten => t,1,Background(/tmp/my-timeout) exten => i,1,Background(/tmp/my-ne-to-davish) exten => i,n,Wait(1) exten => i,n,Goto(Menu,s,osnova) exten => 1,1,Goto(submenu1-spravka,s,1) exten => 2,1,Goto(submenu2-service,s,1) exten => 3,1,Goto(submenu3-people,s,1) exten => 9,1,Goto(Menu,s,osnova) [submenu1-spravka] exten => s,1,Answer exten => s,n,Background(/tmp/my-spravka-menu) exten => t,1,Background(/tmp/my-timeout) exten => i,1,Background(/tmp/my-ne-to-davish) exten => i,n,Wait(1) exten => i,n,Goto(,s,1) exten => 0,1,Goto(Menu,s,osnova) exten => 9,1,Goto(,s,1) [submenu2-service] exten => s,1,Answer exten => s,n,Background(/tmp/my-slugeb-menu) exten => s,n,WaitExten(3) exten => s,n,Background(/tmp/my-please) exten => s,n,WaitExten(3) exten => t,1,Background(/tmp/my-timeout) exten => i,1,Background(/tmp/my-ne-to-davish) exten => i,n,Wait(1) exten => i,n,Goto(,s,1) exten => 1,1,System(/usr/local/bin/say-sys-info df) exten => 1,n,Wait(1) exten => 1,n,Playback(/tmp/sys-info) exten => 1,n,Wait(2) exten => 1,n,Goto(,s,1) exten => 2,1,System(/usr/local/bin/say-sys-info loadavg) exten => 2,n,Wait(1) exten => 2,n,Playback(/tmp/sys-info) exten => 2,n,Wait(2) exten => 2,n,Goto(,s,1) exten => 3,1,System(/usr/local/bin/say-sys-info ps) exten => 3,n,Wait(1) exten => 3,n,Playback(/tmp/sys-info) exten => 3,n,Wait(2) exten => 3,n,Goto(,s,1) exten => 0,1,Goto(Menu,s,osnova) exten => 9,1,Goto(,s,1) [submenu3-people] exten => s,1,Answer exten => s,n,Background(/tmp/my-ludi-menu) exten => t,1,Background(/tmp/my-timeout) exten => i,1,Background(/tmp/my-ne-to-davish) exten => i,n,Wait(1) exten => i,n,Goto(,s,1) exten => 1,1,Dial(SIP/202,10,m) exten => 1,n,Hangup exten => 2,1,Voicemail(203) exten => 2,n,Goto(,s,1) exten => 0,1,Goto(Menu,s,osnova) exten => 9,1,Goto(,s,1)
[править] Дополнительная информация
- IVR – голосовое дерево — IVR – голосовое дерево на Asterisk
- Interactive voice response menus (англ.) — построение интерактивных голосовых меню с помощью Asterisk
- Record (англ.) на asteriskgruru.com — подробнее о действии Record() из диалплана Астериска