Голосовое меню на Cisco VoiceXML

 

 

Постановка задачи

Будем разрабатывать голосовое меню, ориентированное на голосовой шлюз (Voice Gateway) Cisco 3925, поддерживающую выполнение скриптов на VoiceXML.

В рабочие часы будет воспроизводиться приветствие и звонок будет переводиться на заданный внутренний номер

В нерабочее и выходные — специальное объявление, что, мол, звоните по будням.

 

 

Структура голосового меню

 

Структура голосового меню:

  • Маршрутизация входящего звонка на наш vxml-скрипт.

  • Временно́е условие

  • Воспроизведение звукового файла

  • Перевод звонка на внутренний номер

  • Загрузка и активация vxml-скрипта

 

 

 

Маршрутизация входящего звонка

 

Предположим, что номер у нас приходит от провайдера по обычной телефонной линии (pots) в виде 7XXXYYYZZZZ. Нужно создать новый dial-peer (маршрутизатор звонка) и указать, что маршрутизировать входящий звонок следует на сервис «test»:
 

gw#conf t
gw(config)#dial-peer voice 100 pots
gw(config-dial-peer)#description IVR-Test
gw(config-dial-peer)#incoming called-number 7XXXYYYZZZZ
gw(config-dial-peer)#service test

Звонок входит, но пока нет собственно приложения «test».

 

 

 

Временно́е условие

Пишем первый XML-блок.

Сперва инициализируем переменные, затем составляем нужное условие:
 

<!-- Time is in UTC -->
<!-- Day of week: 0 - sunday, 1 - monday ... 6 - sunday -->
<var name="VAR_Hour" expr="new Date().getHours()"/>
<var name="VAR_Day" expr="new Date().getDay()"/>
 
<!-- Time condition -->
<form id="IVR_TimeCondition">
    <block>
        <if cond="5 &lt;= VAR_Hour &amp;&amp; VAR_Hour &lt; 14 &amp;&amp; 0 &lt; VAR_Day &amp;&amp; VAR_Day &lt; 6">
            <goto next="#IVR_Business" />
        <else />
            <goto next="#IVR_NonBusiness" />
        </if>
    </block>
</form>

 

 

Файлы и XML-блок

Загружаем необходимые файлы в память, к примеру, с HTTP-сервера 192.168.0.10:
 

gw#mkdir test
gw#copy http://192.168.0.10/ivr1.wav flash0:/test/ivr1.wav
gw#copy http://192.168.0.10/ivr2.wav flash0:/test/ivr2.wav
 

XML-блок, который отвечает за объявление по выходным, выглядит так:
 

<!-- Non business hours -->
<form id="IVR_NonBusiness">
    <block>
        <prompt><audio src="flash0:/test/ivr2.wav"/></prompt>
    </block>
</form>

 

 

 

Маршрутизация на внутренний номер

Тут по схеме также небольшое приветствие (ivr1) и перевод звонка на заданный внутренний номер.

Перевод звонка осуществлялся с помощью адреса phone://EXT.

<!-- Business hours -->
<form id="IVR_Business">
    <block>
        <prompt><audio src="flash0:/test/ivr1.wav"/></prompt>
    </block>
    <transfer name="mycall" transferaudio="flash0:/test/music.wav" bridge="false" dest="phone://123">
        <filled>
            <log>TRANSFER RETURNED: <value expr="mycall"/></log>
        </filled>
    </transfer>
</form>

Параметр transferaudio — это звуковой файл, который будет играть, пока номер 123 не возьмёт трубку.

 

 

Загрузка и активация vxml-скрипта

Итак, теперь мы имеем окончательный скрипт test.vxml, и можно загружать его в шлюз.

Аналогично, с помощью HTTP-сервера:
 

gw#copy http://192.168.0.10/test.vxml flash0:/test/test.vxml
 

Активируем скрипт «test»:
 

gw#conf t
gw(config)#application
gw(config-app)#no service test flash0:/test/test.vxml
gw(config-app)#service test flash0:/test/test.vxml
 

Всё!

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

 

 

 10.11.2015

kmp