Настройка собственных команд и ключевых слов для распознавания
Распознаванием ключевых слов занимается ROS-нода ~kws_recognizer. Распознаванием команд занимается ROS-нода ~cmds_recognizer. После внесения изменений ниже, нужно перезагрузить весь пакет voice_recognizer_pocketspinx целиком, чтобы изменения вступили в силу.
Ниже приведен пример, который позволяет настроить движок pocketsphinx для распознавания ключевой фразы "Слушай, Робот!" и двух команд: "покажи левое ухо" и "покажи правое ухо".
Настройка распознавания ключевого слова (фразы) "Слушай, Робот!"
В файл voice_recognizer_pocketsphinx/config/kwslist.txt
впишите то ключевое слово (или слова), которое вы хотите распознавать. В нашем случае, получится:
слушайробот/1e-40/
Значение 1e-40 - это пороговое значение срабатывания.
Настройка распознавания команд
Файл 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> = покажи ( левое | правое ) ухо ;
Грамматика сформирована!
Создание фонетического словаря
Теперь необходимо сформировать словарь произношений слов, которые должны распознаваться.
Файл 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
Дождитесь формирования фонетического словаря - это займёт около минуты.

Скрипт сгенерирует два файла 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",
}
Сохраните файл и перезагрузите Робо-Голову.
Настройка параметров распознавания ключевой фразы
В случаях, если Робо-Голова плохо распознает ключевую фразу или наоборот, слышит её тогда, когда ничего не произносилось можно попробовать отредактировать некоторые параметры распознования.
В файле
robohead_ws/src/robohead/robohead_controller/config/voice_recognizer_pocketsphinx/kwslist.txt
ключеваяфраза/1e-40/
значение 1e-40 - это пороговое значение срабатывания. Для улучшения распознавания попробуйте уменьшать число 40 , для ухудшения наоборот увеличивать.
Файл
robohead_ws/src/robohead/robohead_controller/config/voice_recognizer_pocketsphinx/voice_recognizer_pocketsphinx_kws.yaml
buffer_size: 10 # Количество фреймов, которые подаются на вход модели распознавания
Для улучшения распознавания попробуйте уменьшать число 10 , для ухудшения наоборот увеличивать.
Last updated