Дмитрий Рашевский
06.11.2019
61

Голосовой набор в Asterisk

Введение Регистрация в сервисе wit.ai и получение API ключа Установка NodeJS и библиотеки voicer Настройка AGI сервера Скрипт парсинга внутренних номеров и присвоенных им имен Установка и конфигурирование supervisord Добавление диалплана Заключение Введение Думаю каждому помнится удобный функционал мобильных телефонов Nokia, когда можно было позвонить абоненту, лишь произнеся его имя. В данной статье мы рассмотрим […]

  1. Введение
  2. Регистрация в сервисе wit.ai и получение API ключа
  3. Установка NodeJS и библиотеки voicer
  4. Настройка AGI сервера
  5. Скрипт парсинга внутренних номеров и присвоенных им имен
  6. Установка и конфигурирование supervisord
  7. Добавление диалплана
  8. Заключение

Введение

Думаю каждому помнится удобный функционал мобильных телефонов Nokia, когда можно было позвонить абоненту, лишь произнеся его имя. В данной статье мы рассмотрим прекрасную разработку Дмитриева Сергея, которая написана на NodeJS и позволяет реализовать функционал быстрого голосового набора в Asterisk.

Все описанные действия в статье на сервере телефонии необходимо выполнять от имени суперпользователя (root). Установка и настройка производилась на предустановленной системе CentOS 6.10 (Final) + Asterisk 13.28.1 + FreePBX 13.

Регистрация в сервисе wit.ai и получение API ключа

Голосовой набор реализован на базе мини AGI сервера и имеет возможность работы с такими распространёнными сервисами распознавания голоса как Yandex SpeechKit Cloud, Google Speech(и данные сервисы ранее рассматривались у нас на сайте Синтез речи средствами yandex speech / Автоответчик с распознаванием речи или принятие заявок в автоматическом режиме. Но в данной статье мы рассмотрим новый для нас сервис распознавания голоса Wit.AI с которым мини AGI сервер так же способен работать. Также в данном разделе, будет рассмотрена регистрация в сервисе голосового распознавания речи — wit.ai, где можно будет получить API токен данного сервиса для дальнейшей работы.

1. Сначала необходимо пройти регистрацию на сайте wit.ai. Она возможна с помощью двух способов: через GitHub или через Facebook. В этой статье была пройдена регистрация через Github, для этого на главной странице необходимо нажать зеленую кнопку “Log in with GitHub”.

Регистрация в wit.ai с помощью GitHub
Регистрация в wit.ai с помощью GitHub
Чтобы пройти авторизацию через GitHub, вам необходимо уже иметь свой аккаунт на данном сервисе.

2. Далее нам предлагается авторизоваться в системе (см. рис 2). Это выполняется нажатием на зеленую кнопку «Authorize wit-ai»

Авторизация в GitHub
Авторизация в GitHub

3. Третьим пунктом указываем свою почту и небольшую информацию для чего будет использоваться сервис. И завершаем регистрацию в wit.ai нажатием на зеленую кнопку.

Завершение регистрации
Завершение регистрации

4. Когда завершили регистрацию, мы можем приступить к шагу получения API ключа. Для этого надо перейти в раздел настроек – «Settings» – и заполнить поля, соответствующие для данного приложения.

  • App Name – название вашего проекта/приложения в сервисе wit.ai
  • Default Timezone – временная зона, откуда будут поступать запросы к серверу
  • Language – планируемый язык для распознавания
После смены значений Default Timezone и Language появится кнопка для применения настроек. Её необходимо будет обязательно нажать, чтобы можно было сохранить внесенные вами изменения

Нужный нам токен находится в поле «Server Access Token». В дальнейшем именно его мы и будем использовать.

Получение API ключа wit.ai
Получение API ключа wit.ai

Установка NodeJS и библиотеки voicer

В предыдущем пункте мы разобрали, как реистрироваться в сервисе wit.ai и узнали, где брать API ключ. Теперь для реализации голосового набора необходимо установить некоторые пакеты. И в этом разделе мы установим некоторые из них — приложение voicer, написанное на java script, но чтобы оно корректно работало необходимо на сервер установить NodeJS. Далее рассмотрим процесс установки NodeJS и voicer.

1. Подключаемся к серверу по SSH и выполним следующие команды

# yum -y groupinstall “Development Tools”
# curl --silent --location https://rpm.nodesource.com/setup_8.x | bash -
# yum -y install nodejs

Первой командой мы устанавливаем из репозиториев компоненты разработчика для Centos.

Устанавливаемые пакеты командой yum -y groupinstall “Development Tools”
Устанавливаемые пакеты командой yum -y groupinstall “Development Tools”

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

В этой статье используется версия 8
Установка репозиториев NodeJS
Установка репозиториев NodeJS

И в окончании этого действия системной командой yum выполняем установку NodeJS на сервер.

Установка NodeJS из репозиториев
Установка NodeJS из репозиториев

Как только установили nodejs приступим к установке программы voicer. И для установки AGI сервера потребуются две команды

# npm install voicer -g
# npm install pm2 -g

Первая команда устанавливает на сервер AGI сервер voicer, а вторая устанавливает диспечер процессов NodeJS

npm – это менеджер установки пакетов nodejs. Если провести аналогию, то он схож с yum в Centos, pip – в python, cpan – в perl.
Установка AGI сервера
Установка AGI сервера

Настройка AGI сервера

Ранее мы выполнили установку NodeJS и AGI сервера voicer. Теперь необходимо выполнить корректную настройку AGI сервера. Далее в этом разделе мы разберем где находится конфиг voicer и в каком виде, он должен быть представлен, чтобы запустить без ошибок наше приложение.

Сперва создадим директорию, где будет располагаться конфигурационный файл voicer’а и сам файл конфигурации.

# mkdir /etc/voicer
# mkdir /etc/voicer/data
# vim /etc/voicer/config.js

Тело файла config.js должно быть следующего вида:

module.exports ={
    agi: {
        port: 3000
    },
    processing: {
        totalAttempts: 2,
        playGreeting: true,
        playBeepBeforeRecording: false
    },
    asterisk: {
        sounds: {
            onErrorBeforeFinish: 'invalid',
            onErrorBeforeRepeat: 'invalid',
            greeting: 'beep'
        },
        recognitionDialplanVars: {
            status: 'RECOGNITION_RESULT',
            target: 'RECOGNITION_TARGET'
        }
    },
    record: {
        directory: '/tmp',
        type: 'wav',
        duration: 2,
    },
    recognize: {
        directory: '/tmp',
        type: 'witai',    // ['yandex', 'google', 'witai']
        options: {
            developer_key: ''
        }
    },
    lookup: {
        type: 'file',
        options: {
            dataFile: 'data/peernames.json'
        }
    }
};

В данном блоке необходимо заменить на свои данные следующие пункты:

  • developer_key: ” – здесь указывается API ключ, который мы рассмотрели в первом разделе статьи.
  • type: ‘witai’ — указывается название используемого сервиса для распознавания речи.
  • port: 3000 – указывается порт, который будет прослушиваться AGI сервером. По умолчанию – 3000
Настройки файла config.js
Настройки файла config.js
Для того чтобы AGI сервер обращался корректно к созданному конфигурационному файлу, закрепим системную переменную: export VOICER_CONFIGFILE=/etc/voicer/config.js. Также добавим эту переменную в файл .bash_profile.
Добавление переменной VOICER_CONFIGFILE
Добавление переменной VOICER_CONFIGFILE

Скрипт парсинга внутренних номеров и присвоенных им имен

В прошлом пункте мы рассмотрели состав конфигурационного файла. В этом файле присутствует параметр dataFile со значением data/peernames.json. В этом файле должны находиться соответствие внутренних номеров с их именами. Поэтому в данном разделе рассмотрим заполнение этого файла с учетом данных из FreePBX.

Для этого нам потребуется написать небольшой bash скрипт парсинга значений  внутренних из FreePBX.

# nano /usr/src/parser.sh
Скрипт парсинга имен экстеншенов
Скрипт парсинга имен экстеншенов
#!/bin/bash -x

r="\33[0;31m"
g="\33[0;32m"
y="\33[0;33m"
n="\33[0m"
FILE=/etc/voicer/data/peernames.json

export PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

clear
echo -e "${y}Привет! Я скрипт выгрузки информации по внутренним номерам  ${n}"

rm -f $FILE && echo -e "${y}Я уже удалил предыдущий файлик и приступил к заполнению нового ${n}"

 for i in $(asterisk -rx 'sip show peers' | grep -P 'OK|UNKNOWN' | sed 's/\// /g' | awk '{print $1}'); do

        if [[ "${#i}" < 6 && -z "${i//[0-9]/}" ]];then
                #echo ${i}

                str=$( asterisk -rx "sip show peer $i" | grep "Reg. Contact : sip"; )
                #echo $str

                name=$( asterisk -rx "sip show peer $i" | grep "Callerid"; )
                #echo $name

                ext=${str##*'sip:'}
                ext=${ext%%'@'*}

                name=${name##*': "'}
                name=${name%%'" <'*}
                name=${name%%' '*}

                echo -e "\n  {\n    \"name\": \"$ext\",\n    \"target\": \"SIP/$ext\",\n    \"variants\": [\n      \"${name}\"\n    ]\n  }," >> $FILE
                echo -e "${g}Номерок $ext уже обработан и добавлен в список. Следующий…${n}"
        fi

done

sed -i -e '1 s/^/[/;' $FILE
echo ']' >> $FILE
echo -e "${y}Я закончил! До свидания! =^_^=${n}"

Сделаем файл исполняемым командой chmod +x /usr/local/bin/parser.sh и запустим его

/usr/local/bin/parser.sh

Установка и конфигурирование supervisor

Для того, чтобы AGI сервер работал, как служба воспользуемся функционалом Supervisor. Это менеджер процессов, упрощающий управление и состояние запущенных скриптов.

Далее в статье будет описана инструкция по установке и конфигурированию данной системы «демонизации».

# yum install python34
# yum install python34-setuptools
# easy_install-3.4 supervisor

Первой командой мы устанавливаем необходимые пакет python для дальнейшего скачивания и установки supervisord, вторая команда отвечает за установку системы на сервер.

Поскольку Supervisor поддерживает версию Python 2.7 и выше, вам необходимо будет выполнить установку python этой версии или выше. Выше использованы команды для установки Supervisord c поддержкой python 3.4
Установка Supervisor
Установка Supervisor

Далее создадим конфигурационный файл supervisord.conf

# echo_supervisord_conf > /etc/supervisord.conf

Теперь создадим файл службы запуска/остановки Supervisor

# nano /etc/rc.d/init.d/supervisord

Тело создаваемого файла будет выглядеть следующим образом:

#!/bin/bash

. /etc/rc.d/init.d/functions

RETVAL=0
DAEMON=/usr/bin/supervisord
PIDFILE=/var/run/supervisord.pid
start() {
        echo -n "Starting supervisord: "
        if [ -f $PIDFILE ]; then
                PID=`cat $PIDFILE`
                echo supervisord already running: $PID
                exit 2;
        else
                daemon  $DAEMON --pidfile $PIDFILE -c /etc/supervisord.conf
                RETVAL=$?
                [ $RETVAL -eq 0 ] && touch /var/lock/subsys/supervisord
                return $RETVAL
        fi
}
stop() {
        echo -n "Shutting down supervisord: "
        echo
        killproc -p $PIDFILE supervisord
        echo
        rm -f /var/lock/subsys/supervisord
        return 0
}
case "$1" in
    start)
 start
 ;;
    stop)
 stop
 ;;
    status)
 status supervisord
 ;;
    restart)
 stop
 start
 ;;
    *)
 echo "Usage: $0 {start|stop|status|restart}"
 RETVAL=1
esac
exit $RETVAL
init файл для Supervisord
init файл для Supervisord

После создания файла дадим ему права на исполнение командой: chmod +x /etc/rc.d/init.d/supervisord.

Теперь в файл конфигурации supervisord.conf добавим строки

[program:voicer]
command=/usr/bin/voicer -c /etc/voicer/config.js -d /etc/voicer/data/peernames.json
user=root
autostart=true
autorestart=true
Конфиг supervisord
Конфиг supervisord

Выполним запуск Supervisor и проверим запустился ли модуль коннектор:

# service supervisord start
# ps aux | grep voicer
Запуск Supervisord
Запуск Supervisord

Добавление диалплана

Остался последний штрих, чтобы все заработало. Это добавить несколько строк диалпла. Для этого в файл /etc/asterisk/extensions_custom.conf добавим следующие строки:

[from-internal-custom]
exten=777,1,AGI(agi://localhost:3000)
exten=777,n,GotoIf($[${RECOGNITION_RESULT}=SUCCESS]?:default,777,4)
exten=777,n,Dial(${RECOGNITION_TARGET})

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

Вызов 777
Вызов 777

Заключение

В этой статье мы разобрали, как установить NodeJS и какое приложение отвечает за AGI сервер. Посмотрели, как настроить AGI сервер для корректной работы. Также в рамках этой статьи рассмотрели установку и настройку Supervisor, что помогло нам запустить AGI сервер voicer как службу. А также был дан пример как использовать это в связке с Астриск и какие строки диалплана необходимо указать для вызова нужного коллеги.

В заключении хочется отметить что при внимательном рассмотрении и понимании материала, этот функционал можно использовать и на входящие маршруты. Также его можно использовать и для голосового набора внешних абонентов.

 
avatar
  Подписаться  
Уведомление о

Остались вопросы?

Я - Першин Артём, менеджер компании Voxlink. Хотите уточнить детали или готовы оставить заявку? Укажите номер телефона, я перезвоню в течение 3-х секунд.

VoIP оборудование

ближайшие курсы

ближайшие Вебинары

ONLINE

Why Choose HUGE?

Unlimited pre-designed elements

Each and every design element is designed for retina ready display on all kind of devices

User friendly interface and design

Each and every design element is designed for retina ready display on all kind of devices

100% editable layered PSD files

Each and every design element is designed for retina ready display on all kind of devices

Created using shape layers

Each and every design element is designed for retina ready display on all kind of devices