Центр речевых технологий (ЦРТ) corporate blog
Development of communication systems
October 2011 12

FreeSWITCH + mod_unimrcp + VoiceNavigator. Синтез и распознавание русской речи во FreeSWITCH

VoiceNavigator FreeSWITCH UniMRCP

В продолжение серии статей об интеграции 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 выходит за рамки этой статьи и заслуживает отдельного большого описания.
Для заинтересовавшихся можно посмотреть подробности здесь и здесь.
+4
7k 35
Comments 4
Top of the day