В продолжение серии статей об интеграции Asterisk и VoiceNavigator опишу интеграцию VoiceNavigator с FreeSWITCH.
На Хабре имеется несколько статей и упоминаний об FS, но с популярностью Asterisk он не сравнится))
FreeSWITCH, являясь продолжением и развитием идей заложенных в Asterisk, имеет действительно модульную архитектуру, где весь основной функционал, на сколько это возможно, вынесен в отдельные модули. Это позволяет обеспечить большую гибкость создаваемых решений, масштабируемых от софтфона до софтсвича. FreeSWITCH может быть использован в качестве коммутатора, АТС, медиа-шлюза или медиа-сервера для приложений IVR, использующих XML-файлы для управления алгоритмом обработки звонка.
Для FreeSWITCH в отличие от Asterisk нет необходимости отдельно компилировать UniMRCP. Поддержка UniMRCP уже добавлена и работает «из коробки» в виде модуля asr_tts/mod_unimrcp.
Ниже описывается установка FreeSWITCH, подключение к нему VoiceNavigator и создание тестового голосового приложения.
Установка FreeSWITCH
Установка FS описывалась и на Хабре и в других источниках, поэтому на ней остановлюсь кратко. Благо там все просто и доступно. Ниже описана установка на CentOS.
Скачиваем дистрибутив с www.freeswitch.org. На момент написания статьи последней версией дистрибутива является 1.0.6.
Перед компиляцией устанавливаем необходимые для работы FreeSWITCH и его модулей пакеты:
yum install autoconf automake libtool gcc-c++ ncurses-devel make expat-devel zlib zlib-devel libjpeg-devel unixODBC-devel openssl-devel gnutls-devel libogg-devel libvorbis-devel curl-devel gdbm gdbm-devel
Для добавления модуля UniMRCP в файле modules.conf раскомментируем строку asr_tts/mod_unimrcp.
Также необходимо раскомментировать languages/mod_perl для возможности работы с диалпланом из Perl.
Далее стандартная процедура компиляции:
./configure make make check make install make cd-sounds-install make cd-moh-install make cd-sounds-ru-install make samples
После установки FreeSWITCH уже настроен и готов к использованию.
Для включения использования русского языка, как языка по умолчанию, необходимо в /usr/local/freeswitch/conf/vars.xml добавить
<X-PRE-PROCESS cmd="set" data="default_language=ru"/>
Для запуска используется команда /usr/local/freeswitch/bin/freeswitch
Для проверки работоспособности настройте софтфон с параметрами user – 1000, password – 1234 и зарегистрировавшись на сервере позвоните на номер 5000. Если FreeSWITCH установился корректно Вы услышите тестовый IVR.
Подключение VoiceNavigator к FreeSWITCH
1) Добавим загрузку модуля mod_unimrcp.
Для этого в файл /usr/local/freeswitch/conf/autoload_configs/modules.conf.xml добавим
<load module="mod_unimrcp"/>
2) В папке /usr/local/freeswitch/conf/mrcp_profiles создадим файл vn.xml с профилем нашего MRCP-сервера.
<include> <!-- VoiceNavigator --> <profile name="vn" version="1"> <param name="server-ip" value="192.168.2.106"/> <!-- IP-адрес компьютера с VoiceNavigator --> <param name="server-port" value="8000"/> <!-- Порт подключения к MRCP-серверу --> <param name="resource-location" value=""/> <param name="speechsynth" value="tts"/> <param name="speechrecog" value="asr"/> <param name="rtp-ip" value="192.168.3.161"/> <!--IP-адрес компьютера с FreeSWITCH--> <param name="rtp-port-min" value="32768"/> <param name="rtp-port-max" value="33268"/> <param name="codecs" value="PCMU PCMA L16/96/8000"/> </profile> </include>
3) Сделаем только что созданный профиль используемым по умолчанию.
Для этого в файле /usr/local/freeswitch/conf/autoload_configs/unimrcp.conf.xml исправим строки с указанием дефолтовых профилей.
<!-- UniMRCP profile to use for TTS --> <param name="default-tts-profile" value="vn"/> <!-- UniMRCP profile to use for ASR --> <param name="default-asr-profile" value="vn"/>
4) Для разрешения FreeSWITCH взаимодействия с другими узлами отредактируем файл
/usr/local/freeswitch/conf/autoload_configs/acl.conf.xml, добавив в разрешенные узлы IP-адрес машины с VoiceNavigator.
<list name="domains" default="deny"> <node type="allow" domain="$${domain}"/> <!-- Разрешить для взаимодействия узел с адресом 192.168.2.106--> <node type="allow" cidr="192.168.2.106/32"/> </list>
На этом настройка подключения сервера с VoiceNavigator к FreeSWITCH завершена.
Создание тестового голосового приложения
1) Создадим файл грамматики digits.gram в папке /usr/local/freeswitch/grammar/
<?xml version="1.0"?> <grammar xmlns="http://www.w3.org/2001/06/grammar" xml:lang="ru-ru" version="1.0" mode="voice" root="test"> <rule id="test"> <one-of> <item>один</item> <item>два</item> <item>три</item> <item>четыре</item> <item>пять</item> <item>шесть</item> <item>семь</item> <item>восемь</item> <item>девять</item> <item>десять</item> </one-of> </rule> </grammar>
2) Создадим план набора в файле test_vn.xml и поместим его в /usr/local/freeswitch/conf/dialplan/
<?xml version="1.0" encoding="utf-8"?> <include> <context name="context_vn"> <extension name="welcome"> <condition field="destination_number" expression="^777$"> <action application="answer"/> <action application="set" data="tts_engine=unimrcp:vn"/> <action application="set" data="tts_voice=Мария8000"/> <action application="speak" data="Назовите число от одного до десяти!"/> <action application="detect_speech" data="unimrcp /usr/local/freeswitch/grammar/digits vn"/> <action application="sleep" data="10000"/> <action application="hangup"/> </condition> </extension> </context> </include>
Вы все еще считаете, что диалпланы FS неудобны и нечитабельны? По-моему вполне просто и понятно))
3) Чтобы иметь возможность вызова данного приложения, добавим в файл /usr/local/freeswitch/conf/dialplan/default.xml
<extension name="context_vn"> <condition field="destination_number" expression="^777$"> <action application="transfer" data="777 XML context_vn"/> </condition> </extension>
FreeSWITCH настроен и готов к проверке работы функций синтеза и распознавания.
Перезапустим FS для применения изменений.
Теперь можно позвонить на номер 777, чтобы проверить работу синтеза и распознавания. Система спрашивает число от одного до десяти и отображает в консоли результат распознавания.
А вот дальше самое интересное. Как получить этот результат и обработать? Если в Asterisk достаточно было отпарсить переменную ${RECOG_RESULT}, то в FreeSWITCH для этого используется более сложный механизм Event Socket. А точнее событие DETECTED_SPEECH со Speech-Type: detected-speech.
Тема работы с сокетами FreeSWITCH выходит за рамки этой статьи и заслуживает отдельного большого описания.
Для заинтересовавшихся можно посмотреть подробности здесь и здесь.