Статей по использованию сервисов распознавания речи в asterisk от Google и Яндекса на Хабре уже есть несколько. Но всегда хочется сделать что-нибудь свое и как-нибудь по-своему.
Так вот хотелось сделать быстрый голосовой вызов абонентов из адресной книжки. Когда в организации работаешь с несколькими десятками человек каждый день иногда забываешь и путаешь внутренние номера абонентов (а кнопок быстрого набора на всех не хватает: ). Поэтому просто надо, чтобы нажал кнопочку, сказал «Зина из третьего мобильный» и тебе отвечает Зина из третьего на своем мобильном.
Короткое видео с демонстрацией работы
Написал небольшой AGI-сервер на node.js. Многие реализуют логику работы AGI в диалплане как запуск скриптов из папки agi-bin, но можно запустить серверное приложение на каком-нибудь сетевом порту и обрабатывать запросы от asterisk'а.
В диалплане asterisk'а нам нужна практически одна строка, которая перенаправит управление ходом звонка из диалплана в наше приложение voicer.
//extensions.conf
[default]
exten => 1000,1,AGI(agi://192.168.2.1:3000/)
При этом надо четко понимать, что если логика формирования диалплана перенесена из asterisk'а на AGI, но вся работа все равно происходит на asterisk'е.
Далее. Позвонив на номер 1000 (1) мы слышим приветствие (3), затем произносим имя, asterisk записывает файл(4), AGI-сервис отправляет его в Яндекс или Google на распознавание(5), получает вариант распознавания, ищет его в своем списке (6), в случае нахождения удачного варианта совершает вызов на указанный номер (7).
Схема работы voicer.
Как запустить у себя voicer?
А. Устанавливаем приложение
- Копируем репозиторий и устанавливаем зависимости
Б. Настраиваем сервис распознавания
- Google. Получаем ключ
- Или Яндекс. Получаем ключ
В. Настраиваем поиск имени (об этом далее)
Г. Настраиваем диалплан по примеру выше
Д. Запускаем приложение, делаем тестовый звонок.
(Подробная пошаговая установка с командами приведена в readme)
Как работает поиск по слову?
В приложении прикладывается тестовый json-файл, заполнив в котором соответствие имени и канала можно получить готовый файл для поиска совпадений. Канал в данном случае это канал в понимании asterisk'а. Например, SIP/123 или Local/8913XXXXXX@outbound. Т.е. если напротив «Маша» будет SIP/123, то asterisk соединит вас с каналом SIP/123, а напротив «Маша мобильный» будет SIP/8913XXXYYYY@gate, то вызов пойдет на номер через контекст gate. Конечно, исходящая связь должна быть настроена на asterisk'е заранее.
Пример файла:
[{
"name": "Василий",
"channel": "SIP/Sf12345678"
},
{
"name": "Василий Мобильный",
"channel": "Local/8913XXXXXXX@outbound"
}]
В приложении приложены скрипты поиска по mongodb и mysql, можно модифицировать под имеющуюся у вас адресную книгу.
Дополнительно
Также в настройках необходимо указать директорию, где должны сохраняться записанные файлы, и директорию, где брать файлы, чтобы отправлять их на сервис распознавания.
Казалось бы это одна директория, но это так пока вы запускаете voicer на той же машине, что и работает у вас asterisk. Если у вас asterisk и voicer работают на разных машинах (мой случай), то директория для записи — это директория на машине c asterisk (AGI-сервер говорит asterisk'у куда записать файл с тем, что произнес абонент), а директория с файлами для распознавания — это та же директория с записанными файлами примонтированная к машине с работающим voicer'ом.
—
Репозиторий приложения на гитхабе Надеюсь кому-нибудь пригодится такой вариант реализации голосового быстрого набора на asterisk.
Ссылки на используемые npm в приложении: ding-dong (мой форк node-agi) — AGI сервер с обертками на AGI-команды, yandex-speech, google-speech — обертки на голосовые сервисы Яндекса и Google.
Имея возможность сравнить сервисы распознавания речи, могу отметить более четкое распознавание фамилий и имен Google'ом. Яндекс, например, плохо различал Пахомова (определял как «Плохо»), Виталя («Детали») и т.п.
Автор: antirek