ivanoff
ivanoff.org.ru
asterisk
music
 
Голосовые меню openIVR

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

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

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

Правила перехода по нажатию клавиши определяются командой 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;