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

Голосовой набор в 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 как службу. А также был дан пример как использовать это в связке с Астриск и какие строки диалплана необходимо указать для вызова нужного коллеги.

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

Подписаться
Уведомление о
guest
0 Комментарий
Inline Feedbacks
View all comments

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

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

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

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

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

ONLINE

10 доводов в пользу Asterisk

Распространяется бесплатно.

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

Безопасен в использовании.

Любое программное обеспечение может стать объектом интереса злоумышленников, в том числе телефонная станция. Однако, сам Asterisk, а также операционная система, на которой он работает, дают множество инструментов защиты от любых атак. При грамотной настройке безопасности у злоумышленников нет никаких шансов попасть на станцию.

Надежен в эксплуатации.

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

Гибкий в настройке.

Зачастую возможности Asterisk ограничивает только фантазия пользователя. Ни один конструктор шаблонов не сравнится с Asterisk по гибкости настройки. Это позволяет решать с помощью Asterisk любые бизнес задачи, даже те, в которых выбор в его пользу не кажется изначально очевидным.

Имеет огромный функционал.

Во многом именно Asterisk показал какой должна быть современная телефонная станция. За многие годы развития функциональность Asterisk расширилась, а все основные возможности по-прежнему доступны бесплатно сразу после установки.

Интегрируется с любыми системами.

То, что Asterisk не умеет сам, он позволяет реализовать за счет интеграции. Это могут быть интеграции с коммерческими телефонными станциями, CRM, ERP системами, биллингом, сервисами колл-трекинга, колл-бэка и модулями статистики и аналитики.

Позволяет телефонизировать офис за считанные часы.

В нашей практике были проекты, реализованные за один рабочий день. Это значит, что утром к нам обращался клиент, а уже через несколько часов он пользовался новой IP-АТС. Безусловно, такая скорость редкость, ведь АТС – инструмент зарабатывания денег для многих компаний и спешка во внедрении не уместна. Но в случае острой необходимости Asterisk готов к быстрому старту.

Отличная масштабируемость.

Очень утомительно постоянно возвращаться к одному и тому же вопросу. Такое часто бывает в случае некачественного исполнения работ или выбора заведомо неподходящего бизнес-решения. С Asterisk точно не будет такой проблемы! Телефонная станция, построенная на Asterisk может быть масштабируема до немыслимых размеров. Главное – правильно подобрать оборудование.

Повышает управляемость бизнеса.

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

Снижает расходы на связь.

Связь между внутренними абонентами IP-АТС бесплатна всегда, независимо от их географического расположения. Также к Asterisk можно подключить любых операторов телефонии, в том числе GSM сим-карты и настроить маршрутизацию вызовов по наиболее выгодному тарифу. Всё это позволяет экономить с первых минут пользования станцией.