Голосовой набор в Asterisk для CentOS 7
Введение Регистрация в сервисе wit.ai и получение API ключа Установка NodeJS и библиотеки voicer Настройка AGI сервера Скрипт парсинга внутренних номеров и присвоенных им имен Установка и конфигурирование supervisord Добавление диалплана Заключение Введение В данной статье мы рассмотрим прекрасную разработку Дмитриева Сергея, которая написана на NodeJS и позволяет реализовать функционал быстрого голосового набора в Asterisk. […]
- Введение
- Регистрация в сервисе wit.ai и получение API ключа
- Установка NodeJS и библиотеки voicer
- Настройка AGI сервера
- Скрипт парсинга внутренних номеров и присвоенных им имен
- Установка и конфигурирование supervisord
- Добавление диалплана
- Заключение
Введение
В данной статье мы рассмотрим прекрасную разработку Дмитриева Сергея, которая написана на NodeJS и позволяет реализовать функционал быстрого голосового набора в Asterisk.
Регистрация в сервисе 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”.
2. Далее нам предлагается авторизоваться в системе (см. рис 2). Это выполняется нажатием на зеленую кнопку «Authorize wit-ai»
3. Третьим пунктом указываем свою почту и небольшую информацию для чего будет использоваться сервис. И завершаем регистрацию в wit.ai нажатием на зеленую кнопку.
4. Когда завершили регистрацию, мы можем приступить к шагу получения API ключа. Для этого надо перейти в раздел настроек — «Settings» — и заполнить поля, соответствующие для данного приложения.
- App Name – название вашего проекта/приложения в сервисе wit.ai
- Default Timezone – временная зона, откуда будут поступать запросы к серверу
- Language – планируемый язык для распознавания
Нужный нам токен находится в поле «Server Access Token». В дальнейшем именно его мы и будем использовать.
Установка 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.
Второй командой мы выполняем получение исполняемого файла, позволяющего подключить репозитории NodeJS нужной версии.
И в окончании этого действия системной командой yum выполняем установку NodeJS на сервер.
Как только установили nodejs приступим к установке программы voicer. И для установки AGI сервера потребуются две команды
# npm install voicer -g
# npm install pm2 -g
Первая команда устанавливает на сервер AGI сервер voicer, а вторая устанавливает диспечер процессов NodeJS
Настройка 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
Скрипт парсинга внутренних номеров и присвоенных им имен
В прошлом пункте мы рассмотрели состав конфигурационного файла. В этом файле присутствует параметр 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 и помести м нее наш конфигурационный файл 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
Теперь создадим файл службы запуска/остановки 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
Добавление диалплана
Остался последний штрих, чтобы все заработало. Это добавить несколько строк диалпла. Для этого в файл /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, после звукового сигнала произнеся имя сотрудника, система автоматически соединит с указанным в конфигурационном файле внутренним номером.
Заключение
В этой статьи мы разобрали, как установить NodeJS и какое приложение отвечает за AGI сервер. Посмотрели, как настроить AGI сервер для корректной работы. Также в рамках этой статьи рассмотрели установку и настройку Supervisor, что помогло нам запустить AGI сервер voicer как службу. В Centos 7 добавление службы отличается от Centos 6 из-за systemd. Поэтому было рассмотрено, как добавлять в Centos дополнительную службу. А также был дан пример как использовать это в связке с Астриск и какие строки диалплана необходимо указать для вызова нужного коллеги.
В заключении хочется отметить что при внимательном рассмотрении и понимании материала, этот функционал можно использовать и на входящие маршруты. Также его можно использовать и для голосового набора внешних абонентов.
Остались вопросы?
Я - Першин Артём, менеджер компании Voxlink. Хотите уточнить детали или готовы оставить заявку? Укажите номер телефона, я перезвоню в течение 3-х секунд.
категории
- DECT
- Linux
- Вспомогательный софт при работе с Asterisk
- Интеграция с CRM и другими системами
- Интеграция с другими АТС
- Использование Elastix
- Использование FreePBX
- Книга
- Мониторинг и траблшутинг
- Настройка Asterisk
- Настройка IP-телефонов
- Настройка VoIP-оборудования
- Новости и Статьи
- Подключение операторов связи
- Разработка под Asterisk
- Установка Asterisk
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 сим-карты и настроить маршрутизацию вызовов по наиболее выгодному тарифу. Всё это позволяет экономить с первых минут пользования станцией.
Я не совсем понимаю Ваш кусок диалплана. при успешном распознавании вызов переходит в контекст default, 4й приоритет, добавочный номер 7777
Добрый день. Все не так, по скриншоту ниже вы можете заметить, при успешном выполнении переходит к следующей строке диалплана.
При отрицательном результате:
переходит в контекст default, 4й приоритет, добавочный номер 777