Доброго времени суток!
Сегодня разберем простейший IVR скрипт на vxml. На работе часто бывают случаи, когда нужно настроить автоответчик для правильного распределение звонка. Если у вас станция Cisco Call Manager Express, то удобнее будет это сделать на vxml. Начнём!
Voice XML - это язык XML, которая способствует взаимодействию абонента с приложением. VXML состоит из form и menu. form может использоваться для сбора данных от звонящего, для проигрывания подсказки (prompt) и т.д.. menu позволяет выбрать абоненту различные меню и переводят его к другим form или menu. Давайте попробуем кратко разобрать простой vxml скрипт:
<?xml version="1.0"?>
<vxml version="2.0" base="flash:IVR.vxml">
<var name="number"/> --------- Объявляем переменную number
<form id="main"> ---------- Создаем form с именем main
<property name="timeout" value="5s"/>
<block>
<prompt>
<audio src="flash:/IVR/WelcomePromt-Alaw.wav"/> ----- Указываем расположение файла Приветствие (Приветствие говорит: Здравствуйте! Вы позвонили ...... Наберите номер абонента или ждите ответа оператора)
</prompt>
</block>
<field name="get_phone_num" type="number"> ------- Используется для сбора набранного номера от звонящего. Тип вводимых данных номер. (Может быть boolean, date)
<grammar type="application/grammar+regex">[0-9][0-9][0-9][0-9]</grammar> ---- Формат набираемого номера четырехзначный
<filled>
<assign expr="'phone://'+get_phone_num" name="number"/> ---- Назначаем значение
<goto next="#TransferToDestNumber"/> ----- переводим в другой form для перевода звонка
</filled>
</field>
<catch event="noinput"> <goto next="#sek"/> </catch> ---- Если абонент ничего не нажал, то переводим его в form sek.
</form>
<form id="TransferToDestNumber"> ---------- Создаем form с именем TransferToDestNumber
<transfer name="mycall" connecttimeout="20s" destexpr="number" bridge="true"> --- Звонок переводится в набранный номер
<filled>
<if cond="mycall == 'busy'">
<prompt><audio src="flash:/IVR/busy-1.wav"/></prompt> ---- Проигрывается указанный звуковой файл, если набираемый номер занят
<elseif cond="mycall == 'noanswer'"/>
<prompt><audio src="flash:/IVR/absent.wav"/></prompt> ------ Проигрывается указанный звуковой файл, если набираемый номер не отвечает.
</if>
</filled>
</transfer>
</form>
<form id="sek"> --------- Создаем form с именем sek
<transfer name="mycall" connecttimeout="30s" dest="phone://1010" bridge="true">
<filled>
<if cond="mycall == 'busy'">
<prompt><audio src="flash:/IVR/busy-1.wav"/></prompt>
<elseif cond="mycall == 'noanswer'"/>
<prompt><audio src="flash:/IVR/absent.wav"/></prompt>
</if>
</filled>
</transfer>
</form>
</vxml>
Вот и всё. В данном скрипте не было примера с menu. Возможно будет в следующих статьях. Удачного всем дня!
Сегодня разберем простейший IVR скрипт на vxml. На работе часто бывают случаи, когда нужно настроить автоответчик для правильного распределение звонка. Если у вас станция Cisco Call Manager Express, то удобнее будет это сделать на vxml. Начнём!
Voice XML - это язык XML, которая способствует взаимодействию абонента с приложением. VXML состоит из form и menu. form может использоваться для сбора данных от звонящего, для проигрывания подсказки (prompt) и т.д.. menu позволяет выбрать абоненту различные меню и переводят его к другим form или menu. Давайте попробуем кратко разобрать простой vxml скрипт:
<?xml version="1.0"?>
<vxml version="2.0" base="flash:IVR.vxml">
<var name="number"/> --------- Объявляем переменную number
<form id="main"> ---------- Создаем form с именем main
<property name="timeout" value="5s"/>
<block>
<prompt>
<audio src="flash:/IVR/WelcomePromt-Alaw.wav"/> ----- Указываем расположение файла Приветствие (Приветствие говорит: Здравствуйте! Вы позвонили ...... Наберите номер абонента или ждите ответа оператора)
</prompt>
</block>
<field name="get_phone_num" type="number"> ------- Используется для сбора набранного номера от звонящего. Тип вводимых данных номер. (Может быть boolean, date)
<grammar type="application/grammar+regex">[0-9][0-9][0-9][0-9]</grammar> ---- Формат набираемого номера четырехзначный
<filled>
<assign expr="'phone://'+get_phone_num" name="number"/> ---- Назначаем значение
<goto next="#TransferToDestNumber"/> ----- переводим в другой form для перевода звонка
</filled>
</field>
<catch event="noinput"> <goto next="#sek"/> </catch> ---- Если абонент ничего не нажал, то переводим его в form sek.
</form>
<form id="TransferToDestNumber"> ---------- Создаем form с именем TransferToDestNumber
<transfer name="mycall" connecttimeout="20s" destexpr="number" bridge="true"> --- Звонок переводится в набранный номер
<filled>
<if cond="mycall == 'busy'">
<prompt><audio src="flash:/IVR/busy-1.wav"/></prompt> ---- Проигрывается указанный звуковой файл, если набираемый номер занят
<elseif cond="mycall == 'noanswer'"/>
<prompt><audio src="flash:/IVR/absent.wav"/></prompt> ------ Проигрывается указанный звуковой файл, если набираемый номер не отвечает.
</if>
</filled>
</transfer>
</form>
<form id="sek"> --------- Создаем form с именем sek
<transfer name="mycall" connecttimeout="30s" dest="phone://1010" bridge="true">
<filled>
<if cond="mycall == 'busy'">
<prompt><audio src="flash:/IVR/busy-1.wav"/></prompt>
<elseif cond="mycall == 'noanswer'"/>
<prompt><audio src="flash:/IVR/absent.wav"/></prompt>
</if>
</filled>
</transfer>
</form>
</vxml>
Вот и всё. В данном скрипте не было примера с menu. Возможно будет в следующих статьях. Удачного всем дня!
Нурхат, здравствуйте!
ОтветитьУдалитьПрошу Вашей помощи вот с какой хитрой проблемой со входящим DTMF.
Буду безмерно благодарен за хоть какие-то мысли как побороть проблему. Своей головы уже совершенно не хватает...
Дано:
Cisco 2900, CME, IVR на входящем dial-peer.
SIP транк от провайдера с вышестоящей HuaweiSoftX3000
DTMF Payload type 97 (a=fmtp:97 0-15)
Исходящие DTMF победил с помощью
"rtp payload-type nte 97" и, самое важное: "voice-class sip dtmf-relay force rtp-nte" - без этой команды DTMF ходить не хотел, хоть и payload type согласованный.
А вот со входящим DTMF беда - как только не крутил, но не проходит, хоть ты тресни. Скрипт рабочий - проверял звонком не на внешний номер, а на внутренний, на котором висит IVR. Пересмотрел уже кучу debug'ов, по-разному крутил настройки - безрезультатно.
Единственно, что смущает, если пристально смотреть SDP, то от провайдера приходит, "a=fmtp:97 0-15", а Cisco отдаёт "a=fmtp:97 0-16".
Насколько я понял, это лишь говорит о том, что Cisco поддерживает hook flash и никак влиять не должно. По крайней мере исходящие DTMF работают без проблем.
Озадачил уже провайдера этим вопросом, но пока всё традиционно: "у нас всё хорошо". Может есть ещё какая скрытая команда типа "voice-class sip dtmf-relay force rtp-nte" которая поможет с входящим DTMF при нестандартном payload type?
Добрый день! Извиняюсь за поздний ответ. Можете скинуть конфиг входящего диал-пира, где крутится IVR ?
Удалить