Быстрый голосовой набор на Asterisk

    Статей по использованию сервисов распознавания речи в 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?


    А. Устанавливаем приложение
    • Копируем репозиторий и устанавливаем зависимости

    Б. Настраиваем сервис распознавания

    В. Настраиваем поиск имени (об этом далее)
    Г. Настраиваем диалплан по примеру выше
    Д. Запускаем приложение, делаем тестовый звонок.

    (Подробная пошаговая установка с командами приведена в 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'ом. Яндекс, например, плохо различал Пахомова (определял как «Плохо»), Виталя («Детали») и т.п.
    Поделиться публикацией
    Похожие публикации
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама
    Комментарии 15
    • +3
      Asterisk всё больше и больше набирает популярность — что не может не радовать!
      • +4
        Красиво. А насколько реально таким же образом сохранять текстовые «конспекты» звонков? Я имею в виду — что, если после разговора отправить его запись на распознавание — получим ли мы более или менее читабельный результат?
        • +1
          кстати да очень интересно!? Пробовали? Есть какие результаты?
          • +2
            Нет, к сожалению. Вот только пришла в голову такая идея, после прочтения поста. Планирую сейчас и попробовать.
            • +1
              Классно! Спасибо.
              По поводу записи диктовки, шансов на вменяемый текст — мало. Для примера, можно прочитать небольшой отрывок из любого текста. При длинном предложении распознавание начинает сильно тупить.
            • 0
              Подписываюсь на результаты проб распознавания звонков.

              У Яндекса в этом API есть ограничение на размер файла, но у них есть возможность загружать большие файлы отдельным образом — они мне даже python-скрипт присылали, который все типа правильно засылает к ним.
        • +1
          Подобная система.
          Тоже на Asterisk сделана.
          • +1
            На базе технологий Центра Речевых Технологий. Если бы у ЦРТ был публичный HTTP API для распознавания (для синтеза речи у ЦРТ есть voicefabric.ru), то можно было бы к voicer'у прикрутить как яндекс и google.

            Но… решение ЦРТ приобретается в виде MRCP-сервера и интегрируется через Asterisk Speech Recognition API ( wiki.asterisk.org/wiki/display/AST/Speech+Recognition+API), что приводит нас к несколько иному виду системы. Схема от ЦРТ www.speechpro.ru/files/product/barishnya/images/barishnya_837.jpg

            Спасибо за наводку: ЦРТ открыл демо-доступ к Барышне, заценил интерфейс bar.speechpro.ru и примеры файлов грамматик bar.speechpro.ru/grammars/ALL.xml

            В Барышне ведется учет обращений и топ популярных запросов на распознавание. Может добавить в voicer?
          • +1
            Не хватает подтверждения того, что имя распозналось верно. Как в Siri, например:
            Фрагмент из ситкома \"Теория большого взрыва\", сцена с Siri

            • 0
              Тогда теряется скорость набора. Я, например, даже убрал приветствие, заменив ее коротким бипом. Бип, «Лёня Голубков мобильный», и пошел вызов. Или «попробуйте еще раз».

              Но, в целом, часто действительно требуется подтверждение, поэтому можно отправить распознаное на TTS для получения записи. Для этого в моих npm-ках yandex-speech, google-speech есть и на TTS обертка.
              • +1
                Мы пользуемся внутри ЦРТ Барышней уже 4 года.
                Могу сказать, что мы ее долго «пилили», что бы ей было действительно удобно пользоваться в реальной жизни.
                Например, при ошибках распознавания мы ранее говорили об этом абоненту и предлагали повторить запрос, на это уходило 3-5 сек. Когда ты пользуешься системой каждый день по 50 раз, то знаешь наизусть все фразы и они сильно раздражают. Поэтому у нас сейчас вместо многих сообщений просто короткие но разные звуковые «бибигалки».
                В результате у нас 2 версии системы: для внешнего мира и неподготовленного пользователя и для внутреннего пользования с максимально быстрым взаимодействием, без всяких «бла-бла». В этом случае она реально удобнее и быстрее DTMF.
                • 0
                  И это я вам рассказывал в предыдущем комментарии как устроено взаимодействие Барышни с астериском? Больше не буду: )

                  В РЖД недавно встречал на одном из номеров 8-800 сервис проверки наличия билетов, и там есть распознавание станции отправления и прибытия. Это не технологии ЦРТ?
                  • +1
                    Да, это один из наших первых крупных проектов. Там стоит распознавание слитной речи. Можно в одном предложении сказать куда хотите поехать, откуда и когда и она вам зачитает список поездов и свободные места в них. Подробнее здесь.

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