Дмитрий Рашевский
08.11.2019
245528

Голосовой набор в Asterisk для CentOS 7

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

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

Введение

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

Все описанные действия в статье на сервере телефонии необходимо выполнять от имени суперпользователя (root). Установка и настройка производилась на предустановленной системе CentOS 7.7.1908 (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: '/etc/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 python36
# yum install python36-setuptools
# easy_install-3.6 supervisor

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

Поскольку Supervisor поддерживает версию Python 2.7 и выше, вам необходимо будет выполнить установку python этой версии или выше. Выше использованы команды для установки Supervisord c поддержкой python 3.6
Установка Supervisor
Установка Supervisor
ОБРАТИТЕ ВНИМАНИЕ НА ДИРЕКТОРИИ ИСПОЛНЯЕМОГО ФАЙЛА SUPERVISORD. В ДАННОМ ПРИМЕРЕ ЭТО /usr/local/bin/supervisord. У ВАС ПУТЬ МОЖЕТ ОТЛИЧАТЬСЯ. ПУТЬ МОЖНО УВИДЕТЬ ПОСЛЕ ВЫПОЛНЕНИЯ КОМАНДЫ easy_install-3.6 supervisor

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

# mkdir /etc/supervisor/
# echo_supervisord_conf > /etc/supervisor/supervisord.conf

Теперь в файл конфигурации 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. Для этого создадим файл управления сервисом.  Необходимо в директорию /usr/lib/systemd/system добавить файл с именем supervisord.service. Заполним его следующими строками:

[Unit]
Description=Supervisor process control system for UNIX
Documentation=http://supervisord.org
After=network.target

[Service]
ExecStart=/usr/local/bin/supervisord -n -c /etc/supervisor/supervisord.conf
ExecStop=/usr/local/bin/supervisorctl  shutdown
ExecReload=/usr/local/bin/supervisorctl -c /etc/supervisor/supervisord.conf  reload
KillMode=process
Restart=on-failure
RestartSec=50s

[Install]
WantedBy=multi-user.target
  • ExecStart — указывается скрипт запуска supervisor
  • ExecStop — указывается скрипт остановки supervisor указывается параметр shutdown
  • ExecReload — указывается скрипт презапуска supervisord

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

# systemctl enable supervisord.service
# systemctl start supervisord.service
# 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 как службу. В Centos 7 добавление службы отличается от Centos 6 из-за systemd. Поэтому было рассмотрено, как добавлять в Centos дополнительную службу. А также был дан пример как использовать это в связке с Астриск и какие строки диалплана необходимо указать для вызова нужного коллеги.

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

Кейсы внедрения
Asterisk от VoxLink
Узнайте, какие крупные компании уже используют Asterisk в работе.
Скачать
Подписаться
Уведомить о
guest
2 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
igor
igor
19.08.2020 14:35

Я не совсем понимаю Ваш кусок диалплана. при успешном распознавании вызов переходит в контекст default, 4й приоритет, добавочный номер 7777

Дмитрий Рашевский
Дмитрий Рашевский
19.08.2020 17:00
Ответить на  igor

Добрый день. Все не так, по скриншоту ниже вы можете заметить, при успешном выполнении переходит к следующей строке диалплана.
При отрицательном результате:
переходит в контекст default, 4й приоритет, добавочный номер 777

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

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

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


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

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 сим-карты и настроить маршрутизацию вызовов по наиболее выгодному тарифу. Всё это позволяет экономить с первых минут пользования станцией.