В Asterisk с версии 1.4 предусмотрен API для сопряжения с системами распознавания речи. Данный API позволяет стандартным образом предоставить возможность распознавания речи приложениям, построенным на базе Asterisk. На данный момент мне известны модули для коммерческих систем Lumenvox и Nuace. Есть некоторая попытка написать клиент-серверное решение для Sphinx, эта реализация может служить хорошим учебным пособием по написанию модуля для системы ASR, так как другие примеры отсутствуют. Данный API используется в рамках VXML интерпретатора от i6net — VXI* для задач распознавания речи.
Я немного расскажу о API в плане написания модуля для сопряжения Asterisk с системой распознавания речи. Материала по этой теме толком нет, нужно смотреть исходные коды. Для справедливости стоит отметить, что исходники в этой части далеко не сложны, да и систем распознавания не много, чтобы написание таких модулей являлось частой задачей.
Немного по терминологии:
- ASR (Automatic Speech Recognition) — автоматическое распознавание речи
- грамматика — это описание в некотором виде (чаще XML) структуры произносимых фраз. Служит для сужения спектра возможных результатов распознавания на выходе. При использовании грамматик распознавание может происходить статистически, а результатам на выходе даваться оценки по вероятности успешности распознавания
- n-best — режим выдачи результатов распознавания, когда в качестве результата система ASR выдает несколько фраз (обычно 3-5) с различными оценками. При этом структура IVR может давать возможность перебрать эти варианты без дополнительного обращения к ASR
Для реализации полноценного общения с системой распознавания речи нужно реализовать следующие типы функций:
- create — функция должна инициализировать структуры системы ASR. Все индивидуальные данные хранятся в специальном поле структуры ast_speech
- destroy — соответственно освободить все ресурсы, занятые для распознавания
- load_grammar — загрузить грамматику
- unload_grammar — выгрузить грамматику
- activate_grammar — активировать загруженную ранее грамматику для распознавания последующего фрагмента речи
- deactivate_grammar — деактивировать грамматику, использованную при распознавании. В последующем возможно её повторно активировать
- write — функция, вызовом которой голосовые кадры передаются в систему распознавания (при этом передается как массив данным, а не как структура ast_frame). Передаются они в режиме реального времени, поэтому если есть возможность — ввод/вывод здесь лучше сделать асинхронным. Так же если конкретный ASR не обнаруживает конец произнесенных фраз, в этой функции нужно обнаруживать окончание произнесенной фразы (например через ast_dsp). Так же могут возникнуть проблемы, связанные с тем, что Asterisk передает голос с частотой дискретизации 8КГц, а система распознавания принимает фреймы в другом формате (возможно даже в нескольких форматах, в зависимости от языка распознавания)
- dtmf — предназначена для передачи в систему ASR сведений о dtmf тонах. Через write записываются только
- start — функция, позволяющая подготовить систему распознавания непосредственно перед началом приема аудио потока
- change — изменения типа результата, ожидаемого Астериском. Одинарный или n-best.
- change_results_type — реализовать если ASR умеет возвращать не только самый подходящий вариант распознавания, но и несколько с меньшей вероятностью совпадения. При этом IVR может спросить какой вариант пользователь имел ввиду, если основной вариант не подходит.
- get — получить результат распознавания
Курсивом обозначены те функции, которые лично мне реализовывать не пришлось, они показались мне либо заложенными под специфические возможности ASR системы, под которую API первоначально разрабатывался. Указатели на перечисленные функции записываются в структуру ast_speech_engine вмести с именем средства распознавания и регистрируются с помощью функции ast_speech_register
По файлам в исходном коде Asterisk функции распределены следующим образом:
- speechrec.h — заголовочный файл, где описаны три группы флагов, структуры и функции, используемые в API
- Флаги — состояние речи в текущем сеансе, состояние системы распознавания, тип результата
- Структуры — состояние текущей сессии распознавания, набор функций ASR, хранение результатов распознавания
- Функции для обращения к API из других модулей Asterisk
- app_speech_utils.c — приложения диалплана, используемые при работе с распознаванием речи из диалплана. Очень полезный материал для изучения, как и в каких ситуациях вызываются те или иные функции из создаваемого модуля
- speech.txt — описание приложений диалплана и функций из res_speech.c, при этом документ написан из рассчёта на использование готового модуля распознавания, а не как инструкция по написанию такового
- res_speech.c — самый бесполезный в плане изучения файл. Практически каждая функция — вызов функций из модуля активированной системы распознавания
© Иллюстрация к статье как всегда из flickr