ivanoff
ivanoff.org.ua
Simpleness CMS
music
asterisk

english language русский язык
 
Голосовые меню openIVR

Система для проектирования голосовых меню.

Используем: Asterisk v 1.2 и старше, Perl

Пользователь создает ivr-файл с правилами для голосового меню. Файл состоит из блоков, каждый блок содержит набор команд, разделенных символом ";".

Правила перехода по нажатию клавиши определяются командой press. Пример:
press(
1=>menu1,
2=>menu2,
#=>repeat,
);
В примере возможен переход к блокам [menu1] и [menu2] по нажатию соответственно клавиш 1 и 2 во время проигрывания голосового сообщения, паузы или выполнения agi-скрипта. По нажатию символа "#" происходит повтор текущего блока. Для того, чтобы "обнулить" таблицу переходов необходимо выполнить команду press() без аргументов.

Воспроизведение осуществляется по команде play. Примеры записи:
play('ru/happy_ny_2010');
play(file=>'sample',repeat=>3,pause=>2);
В качестве параметров команды play может выступать либо имя проигрываемого файла, либо набор значений (имя файла, количество воспроизведений, пауза между воспроизведениями)

Для выполнения agi скрипта необходимо воспользоваться командой agi: agi('name_script.agi'). Возращаемое значение - номер нажатой клавиши.

Для установки переменных для agi скрипта используется команда set: set(var=value)
Для установки случайного значения переменной для agi скрипта используется команда random. Список значений, которые будут случайным образом выбираться для установки значения перечисляются через запятую: random(var_rnd=value1,value2,value3)
Команда goto необходима для безусловного перехода меду блоками: goto(block_name)

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

Команда pause задает паузу в секундах. Если командой press задана таблица переходов, pause будет ожидать нажатия клавиши и осуществит переход, если клавиша из таблицы переходов была нажата.

Команда dial - набрать номер. Пример: dial(SIP/1003) После набора номера осуществляется переход к текущему меню (из которого происходил набор)

Команда call - переход на определенный extension в Asterisk. Пример: call(incoming_calls,s,2) После перехода программа IVR завершает свою работу.

Команда hangup служит для обрыва текущей связи.

После того, как правила ivr будут написаны, есть возможность проверить его на ошибки.
В проверке отлавливаются 3 типа ошибок и 2 типа предупреждений:
ERROR: No data or main menu block in 'file' - Нет данных в файле
ERROR: block 'block' has dublicates - Дубликат названий блоков
ERROR: Link to unknown block 'block1' in 'command' command of 'block' block - Ссылка на неизвестный блок
WARNING: Unknown command 'command' in 'block' block - Неизвестная команда
WARNING: Unknown key 'key' in 'command' command of 'block' block - Неизвестный ключ в команде.
Если во время проверки обнаружена ошибка, выполнение ivr не производится.
При обнаружении предупреждений, ivr выполняется, ошибки игнорируются.

Вся информация о звонившем и его действиях заносятся в базу данных. Сообщения программы и информация о звонках записываются в log-файлы.

Использование в asterisk:
[ivr-main]
exten => s,1,agi(openivr.pl,main) ;main - имя ivr-файла
exten => s,n,Hangup()
exten => h,1,DeadAGI(openivr.pl)

Пример ivr-файла:
[main_menu]
play('ru/happy_ny_2010'); //remove this after 01/15/10
press(
1=>weather, //go to "weather" block if 1 was pressed
2=>time, //go to "time" block if 2 was pressed
#=>repeat, //repeating if isnt "repeat" block
0=>main_menu, //repeating too
);
play(
file=>'audio-content/index', //file to play
repeat=>3, //count of playing
pause=>2, //pause in sec between plays
);
press; //nothing to press
play('ru/sorry_you_havent_chose');
hangup;

//run agi time
[time]
press(#=>repeat,0=>return);
agi('time.agi');
pause(2);
return();

//run agi weather
[weather]
press(#=>repeat,0=>return,1=>_set.voice1,2=>_set.voice2,3=>_set.random_voice);
agi('weather.agi');
play(file=>'ru/return_or_change_voice',repeat=>3,pause=>2);
return;

// set of voice variables
[_set.voice1]
set(voice=v1);return;
[_set.voice2]
set(voice=v2);return;
[_set.random_voice]
random(voice=v1,v2);return;