Настройка собственных команд и ключевых слов для распознавания

Распознаванием ключевых слов занимается ROS-нода ~kws_recognizer. Распознаванием команд занимается ROS-нода ~cmds_recognizer. После внесения изменений ниже, нужно перезагрузить весь пакет voice_recognizer_pocketspinx целиком, чтобы изменения вступили в силу.


Ниже приведен пример, который позволяет настроить движок pocketsphinx для распознавания ключевой фразы "Слушай, Робот!" и двух команд: "покажи левое ухо" и "покажи правое ухо".


Настройка распознавания ключевого слова (фразы) "Слушай, Робот!"

В файл voice_recognizer_pocketsphinx/config/kwslist.txt впишите то ключевое слово (или слова), которое вы хотите распознавать. В нашем случае, получится:

слушайробот/1e-40/

Значение 1e-40 - это пороговое значение срабатывания.

Ключевое слово (фраза) пишется без пробелов.

Для лучшего распознавания в ключевом слове должно быть 3-4 слога, вспоминте "Алиса", "Эй, Сири", "Окей, Гугл", "Слушай, Робот!".


Настройка распознавания команд

Файл voice_recognizer_pocketsphinx/config/gram.txt - здесь содержится описание формальной грамматики, на основе которой происходит распознавание команд.

Пакет использует регулярную грамматику FSG. То есть все предложения (команды), которые пакет должен уметь распознавать, строго определены.

Для задания FSG-грамматик в PocketSphinx используются файлы формата JSGF (Java Speech Grammar Format).

Например, научим пакет распознавать команды "покажи левое ухо" и "покажи правое ухо", в файл voice_recognizer_pocketsphinx/config/gram.txt запишем следующее:

#JSGF V1.0;

grammar robohead_cmds;

public <commands> = <command> ;

<command> = <command_1> | <command_2> ;

<command_1> = покажи левое ухо ;
<command_2> = покажи правое ухо ;

Или, 2-й вариант:

#JSGF V1.0;

grammar robohead_cmds;

public <commands> = <command> ;

<command> = <command_1> ;

<command_1> = покажи ( левое | правое ) ухо ;

Грамматика сформирована!

Обратите внимание, robohead_cmds - это поле grammar_name в файле конфигурации, а commands - поле rule_name.

см. конфигурационный файл ROS-нода ~cmds_recognizer


Создание фонетического словаря

Теперь необходимо сформировать словарь произношений слов, которые должны распознаваться.

Файл voice_recognizer_pocketsphinx/config/dictionary.txt - список вообще всех слов, которые должен распознавать пакет. В этот файл впишите все слова (и ключевые слова, и слова, входящие в состав команд), которые должен распознавать пакет. В частности, для нашего примера из двух команд ("покажи левое ухо" и "покажи правое ухо") и одного ключевого слова ("слушайробот"), имеем:

слушайробот
покажи
левое
правое
ухо

Далее этот файл dictionary.txt необходимо преобразовать в фонетический словарь dictionary.dict

Для этого используйте следующую команду:

~/robohead_ws/src/ru4sphinx/text2dict/dict2transcript.pl ~/robohead_ws/src/robohead/voice_recognizer_pocketsphinx/config/dictionary.txt ~/robohead_ws/src/robohead/voice_recognizer_pocketsphinx/config/dictionary.dict

Первый путь: ~/robohead_ws/src/robohead/voice_recognizer_pocketsphinx/config/dictionary.txt - это путь до файла, в котором лежит просто набор слов, которые необходимо распознавать.

Второй путь: ~/robohead_ws/src/robohead/voice_recognizer_pocketsphinx/config/dictionary.dict - это путь, куда будет сохранён фонетический словарь (произошения слов).

Обратите внимание, если вы измените название файла во втором пути, то не забудьте это отразить в конфигурационных файлах.

Дождитесь формирования фонетического словаря - это займёт около минуты.

Вывод на экран после формирования фонетического словаря

Скрипт сгенерирует два файла dictionary.dict.accent и dictionary.dict (названия могут отличаться, если вы ввели другое название файла во втором пути скрипта).

# dictionary.dict.accent
левое л+евое
покажи покаж+и
правое пр+авое
слушайробот сл+ушайробот
ухо +ухо
# dictionary.dict
левое ll je v ay i
покажи p ay k a zh yy
правое p r aa v ay i
слушайробот s l uu sh ay j r ay b ay t
ухо uu h ay

Файл dictionary.dict.accent содержит ударения в словах - просто промежуточный файл для генерации dictionary.dict. Его редактирование ни к чему не приведет. Файл dictionary.dict содержит последовательность фонем.

Если автоматическая генерация произношения вас не устраивает, вы можете вручную отредактировать файл dictionary.dict. Кроме того, можно добавить несколько вариантов произонешния для одного и того же слова.

Приведем отредактированный файл dictionary.dict для нашего примера из двух команд:

левое ll je v ay i
левое(2) ll je v oo je
покажи p ay k a zh yy
покажи(2) p oo k a zh yy
правое p r aa v ay i
правое(2) p r aa v oo je
слушайробот s l uu sh ay j r oo b ay t
ухо uu h ay
ухо(2) uu h oo

После создания всех вышеперечисленных файлов необходимо перезагрузить пакет и распознавание будет работать на новых данных.

Настройка распознавания ключевой фразы

Помимо того, что ключевую фразу нужно добавить в фонетический словарь, также нужно отразить, что именно по этой фразе будет происходить переход в стандартное действие std_attention для ожидания получения команды к выполнению.

Для этого необходимо отредактировать файл robohead_ws/src/robohead/robohead_controller/config/robohead_controller.yaml :

nano ~/robohead_ws/src/robohead/robohead_controller/config/robohead_controller.yaml

На строчке 9 замените стандартное ключевое слово, на то, которое вы установили:

low_voltage_threshold: 3.3
low_voltage_hysteresis: 0.2

camera_topic_name: "~usb_cam/image_raw"

robohead_controller_actions_match: { # сопоставление голововой команды из voice_recognizer_pocketsphinx/gram.txt и файла, запускаемого на исполнение
  "wait_action" : "robohead_controller_actions.std_wait.action",
  "low_bat_action" : "robohead_controller_actions.std_low_bat.action",
  "вашаключеваяфраза" : "robohead_controller_actions.std_attention.action",
  "покажи левое ухо": "robohead_controller_actions.std_left_ear.action",
  "покажи правое ухо": "robohead_controller_actions.std_right_ear.action",
  "покажи уши" : "robohead_controller_actions.std_ears.action",
  "сделай фото": "robohead_controller_actions.std_make_photo.action",
  "поздоровайся": "robohead_controller_actions.std_greeting.action",
  "следи за шариком": "robohead_controller_actions.std_ball_tracker.action",
}

Сохраните файл и перезагрузите Робо-Голову.

Настройка параметров распознавания ключевой фразы

В случаях, если Робо-Голова плохо распознает ключевую фразу или наоборот, слышит её тогда, когда ничего не произносилось можно попробовать отредактировать некоторые параметры распознования.

  1. В файле robohead_ws/src/robohead/robohead_controller/config/voice_recognizer_pocketsphinx/kwslist.txt

ключеваяфраза/1e-40/

значение 1e-40 - это пороговое значение срабатывания. Для улучшения распознавания попробуйте уменьшать число 40 , для ухудшения наоборот увеличивать.

  1. Файл robohead_ws/src/robohead/robohead_controller/config/voice_recognizer_pocketsphinx/voice_recognizer_pocketsphinx_kws.yaml

buffer_size: 10 # Количество фреймов, которые подаются на вход модели распознавания

Для улучшения распознавания попробуйте уменьшать число 10 , для ухудшения наоборот увеличивать.

Last updated