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 выходит за рамки этой статьи и заслуживает отдельного большого описания.
    Для заинтересовавшихся можно посмотреть подробности здесь и здесь.
    Центр речевых технологий (ЦРТ)
    0,00
    Компания
    Поделиться публикацией
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама

    Комментарии 4

      –1
      *функкциональность. Функционал.
        0
        Спасибо. Из приведенного примера интересна последовательность выполнения приложений speak, detect_speech и sleep. В логике астериска они бы выполнялись последовательно. Если я правильно понимаю здесь speek и detect_speech работают паралельно, а speech обеспечивает таймаут?
          0
          Весь таймаут тоже выжидать не обязательно. После получения события, можно сразу переходить к следующим пунктам. Но с событиями я пока сам до конца не разобрался. Если напишешь статью по работе в ESL, будет много благодарностей))
          0
          Точно сказать не могу, но думаю, что логика именно такая. Т.к. speak можно прервать (barge-in), то либо они должны запускаться параллельно, либо в FS очень уж быстро происходит запуск распознавания.

          Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

          Самое читаемое