Управляем Linux-десктопом с помощью голосовых команд

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

Чтобы научить Linux понимать проговариваемые слова, применяются системы распознавания речи (CMU), наиболее известная и работоспособная из которых носит имя Sphinx. Разработкой этого движка занимается университет Карнеги-Меллона, хотя отдельные доработки также производили сотрудники Массачусетского технологического института и корпорация Sun Microsystems. Качество распознавания «Сфинкса» еще далеко от идеала, он постоянно дает сбои и совершенно не способен разобрать слитную речь. Однако его возможностей вполне достаточно для организации системы исполнения простых голосовых команд, что и демонстрируют такие проекты, как Gnome Voice Control и PerlBox.

Альтернатива Sphinx - движок Julius японского происхождения. По качеству распознавания Julius не уступает Sphinx, однако имеет два изъяна: а) отсутствие хорошей акустической модели для английского языка (для русского более-менее нормальной нет и для Sphinx), что означает гораздо более низкое качество распознавания (в конце статьи я расскажу, как обойти эту проблему), и б) он использует внешний движок генерации акустической модели (обучения) HTK, разрабатываемый под руководством Microsoft в Кэмбридже (а это значит, что движок хоть и открыт, но использовать его можно только в личных целях).

Для систем синтеза существует масса различных оберток, упрощающих использование. Для Sphinx это уже не развиваемый PerlBox и созданный в рамках Google Summer Of Code апплет для среды Gnome под названием Gnome Voice Control. Отличная графическая оболочка для Julius - программа Simon, написанная с использованием библиотеки Qt4.

Пингвин! Лежать!

Перед тем, как перейти к установке и настройке системы распознавания речи следует уяснить, что ни один из открытых движков, будь то Sphinx, Julius или какой-то менее известный проект, не способен на 100% верно разобрать речь, даже если она будет принадлежать актеру с хорошо поставленным голосом. Однако при правильной тренировке программы (которая также включает в себя и подгонку под особенности произношения конкретного человека) ее вполне можно научить корректно распознавать простые двух-словные команды почти в 100% случаев.

И вот здесь нас ждет очень неприятный сюрприз: наиболее известная и распространенная CMU Sphinx (которая, кстати, имеет целых четыре параллельно развиваемых версии, одна из которых написана на Java) до сих пор находится в стадии «вечной альфы», пользоваться которой (не говоря уже о тренировке) обычному пользователю довольно затруднительно. Существует, конечно, утилита Gnome Voice Control, существенно упрощающая процесс общения с программой, но работает она только в Gnome. Поэтому мы воспользуемся Julius, который хоть и имеет некоторые проблемы, но очень прост в использовании.

Julius есть в репозиториях многих дистрибутивов, поэтому его не придется собирать из исходников. В Ubuntu для установки достаточно выполнить команду:

$ sudo aptitude install julius

Чтобы научить Julius понимать английский язык, понадобятся файлы акустической модели, содержащие статистическое представление звуков, которые может воспринимать движок. Акустическая модель строится путем обработки звуковых файлов (с начитанными человеком фрагментами текстов) специальными программами (например, из пакета HTK). Наиболее правильно самому наговорить эти фрагменты и, таким образом, научить движок распознавать свой голос (в том числе, интонацию и ошибки произношения) и словосочетания, которые нужны именно вам. Тогда процент правильного распознавания будет стремиться к значению 100. Однако все это сложно, требует определенной подготовки и времени, поэтому пока мы ограничимся акустической моделью, распространяемой с сайта www.voxforge.org. Для этого надо установить пакет julius-voxforge:

$ sudo aptitude install julius-voxforge

Теперь можно приступить к настройке, которая фактически включает в себя только процесс создания словаря: списка слов, который должен уметь распознавать движок, и объяснение того, как эти слова могут между собой сопоставляться. Нужно это для двух целей: во-первых, движок должен знать произношение слов и понимать их, а во-вторых, сократив словарь всего до нескольких фраз, мы значительно повысим качество распознавания. Для простоты возьмем стандартные словари, распространяемые вместе с пакетом julius-voxforge:

$ mkdir ~/julius-grammar
$ cp /usr/share/doc/julius-voxforge/examples/* ~/julius-grammar
$ cd ~/julius-grammar
$ gunzip * 2>&1 | grep -v ignored

Просмотрев файл sample.voca, вы заметите, что он содержит совсем небольшой список слов, таких как call, get, dial и т.д., а также их фонетическое представление (что-то вроде транскрипции), файл sample.grammar содержит правила, в каких комбинациях эти слова могут быть использованы. Не беспокойтесь, если он кажется непонятным, это нормально :).

Попробуем изменить файлы так, чтобы подогнать их под нашу задачу, которой будет… допустим, управление аудиоплеером. Итак, откройте файл sample.voca и добавьте в него следующее (удалив прежнее содержимое):

% NS_B
<s>     sil

% NS_E
</s>    sil

% ID
  DO    d uw

% COMMAND
  PLAY      p l ey
  NEXT      n eh k s t
  PREV      p r iy v
  SILENCE   s ay l ax n s

В файл sample.grammar поместите строку:

S: NS_B ID COMMAND NS_E

Все это значит, что движок должен понимать словосочетания, которые состоят из: тишина (NS_B), слов «do» (ID), «play», «next», «prev» или «silence» (COMMAND), тишина (NS_E). Говоря проще, вы можешь сказать «Do play», и машина вас поймет, в то время как слова «Hello World» будут для него инопланетным языком. Хорошая особенность короткого словаря в том, что, даже если вы скажете что-то вроде «Du pray», движок, скорее всего, распознает это как «Do play», а не как-нибудь иначе (в английском десятки и сотни слов звучат почти одинаково).

Теперь, не выходя из каталога, выполните команду для генерации файлов sample.dfa sample.term и sample.dict:

$ mkdfa sample

Это все. Можете протестировать julius с помощью команды:

$ julius -input mic -C julian.jconf

После появления строки "<<< please speak >>>" начинайте говорить определенные выше фразы. Чтобы движок правильно их понял, говорите слитно, как это делают англоговорящие (голоса которых и были использованы для создания акустической модели voxforge), без перерыва между словами. При таком способе произношения движок работает на удивление хорошо, лично у меня ни одного сбоя на 10 фраз. Если вы полуте худшие результаты, стоит поработать над произношением и купить хороший микрофон.

Конечно, пока от программы мало толку, поэтому мы должны создать Dialog manager, то есть, программу (скрипт), которая будет отвечать за перевод голосовых команд в команды на исполнение. К счастью, сделать это просто, достаточно прицепить на выход Julius стандартный ввод скрипта, который будет обрабатывать печатаемые программой фразы. Например, скрипт для управления audacious на языке python может выглядеть так:

def parse(line):
    params = [param.lower() for param in line.split() if param]
    commands = {
        'play': 'audacious2 -p',
        'silence': 'audacious2 -u',
        'next': 'audacious2 -f',
        'prev': 'audacious2 -r',
    }
    if params[1] in commands: os.popen(commands[params[1]])

Сохраните его под именем command.py и запускайте julius следующим образом:

$ julius -quiet -input mic -C julian.jconf 2>/dev/null | ./command.py

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

 

Добавить комментарий

Обратная связь

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

пишите мне на netdm@mail.ru