Перейти к основному содержимому
Версия: Bbrain 2.0

Документация: ROS2 пакет speech_recognizer

Общее описание

Пакет speech_recognizer обеспечивает офлайн-распознавание речи на основе библиотеки Vosk. Пакет содержит две независимые ноды, которые могут работать одновременно:

  • KWS (Keyword Spotting) — непрерывное обнаружение ключевых фраз (wake words) и быстрых команд в аудиопотоке.
  • ASR (Automatic Speech Recognition) — распознавание команд или произвольной речи по запросу (активируется через сервис).

Обе ноды получают аудио из топика respeaker_driver и используют локальные Vosk-модели (без подключения к интернету).


Архитектура

┌─────────────────────────┐
│ respeaker_driver │
│ pub: audio/main │
└───────────┬─────────────┘
│ AudioData
┌───────────┴─────────────┐
▼ ▼
┌───────────────────┐ ┌───────────────────┐
│ KWS Node │ │ ASR Node │
│ │ │ │
│ Непрерывное │ │ По запросу │
│ обнаружение │ │ (set_mode → 1/2) │
│ wake phrases + │ │ │
│ fast commands │ │ Grammar / Free │
│ │ │ │
│ pub: wake_phrases │ │ pub: commands │
│ pub: fast_commands│ │ pub: frees │
└───────────────────┘ └───────────────────┘

Нода 1: KWS (Keyword Spotting) — kws.py

Описание

Непрерывно слушает аудиопоток и ищет в нём заданные ключевые фразы (wake phrases) и быстрые команды (fast commands). Использует Vosk с жёсткой грамматикой (только заданные фразы), что обеспечивает высокую точность при ограниченном словаре.

Режимы работы

РежимКодОписание
Off0Распознавание отключено, аудио игнорируется
On1Активное обнаружение ключевых фраз и быстрых команд

Топики

Публикуемые

ТопикТипПо умолчаниюОписание
<namespace>/wake_phrasesstd_msgs/msg/Stringwake_phrasesОбнаруженная ключевая фраза
<namespace>/fast_commandsstd_msgs/msg/Stringfast_commandsОбнаруженная быстрая команда

Подписки

ТопикТипПо умолчаниюОписание
/respeaker_driver/audio/mainrobohead_interfaces/msg/AudioDataнастраиваетсяВходной аудиопоток

Сервисы

<namespace>/set_mode

ПолеЗначение
Типrobohead_interfaces/srv/SimpleCommand
Запрос dataОписание
0Выключить распознавание
1Включить распознавание
Ответ dataОписание
0 или 1Установленный режим
текущий режимЕсли запрошен недопустимый режим

Параметры конфигурации

Файл: config/speech_recognizer_kws.yaml

ПараметрТипПо умолчаниюОписание
default_modeint0Начальный режим (0 — off, 1 — on)
sample_rateint16000Частота дискретизации (должна совпадать с respeaker_driver)
model_pathstring"vosk-model-small-ru-0.22"Имя каталога модели (относительно speech_recognizer/speech_recognizer/model/)
wake_phrasesstring[]["слушай робот"]Список ключевых фраз для обнаружения
fast_commandsstring[]["громче", "тише", "стоп"]Список быстрых команд
ros.service_name.set_modestring"set_mode"Имя сервиса управления режимом
ros.topic_name.wake_phrasesstring"wake_phrases"Имя топика ключевых фраз
ros.topic_name.fast_commandsstring"fast_commands"Имя топика быстрых команд
ros.topic_name.audio_inputstring"/respeaker_driver/audio/main"Входной аудиотопик

Логика работы

  1. При поступлении аудиоданных передаёт их в Vosk-распознаватель с грамматикой (wake_phrases + fast_commands).
  2. Когда Vosk формирует финальный результат (AcceptWaveformtrue), текст проверяется:
    • Если совпадает с одной из wake_phrases → публикуется в wake_phrases.
    • Если совпадает с одной из fast_commands → публикуется в fast_commands.
  3. Режим не переключается автоматически — KWS остаётся активным до явного отключения через сервис.

Нода 2: ASR (Automatic Speech Recognition) — asr.py

Описание

Распознаёт команды или произвольную речь по запросу. Предназначен для сценария: KWS обнаружил wake phrase → внешняя логика включает ASR → ASR распознаёт одну команду → автоматически выключается.

Режимы работы

РежимКодОписание
Off0Распознавание отключено
Grammar1Распознавание из заданного списка команд. После распознавания (или таймаута) автоматически переключается в режим 0
Free2Свободное распознавание (полный словарь модели). Остаётся активным до явного отключения

Топики

Публикуемые

ТопикТипПо умолчаниюОписание
<namespace>/commandsstd_msgs/msg/StringcommandsРаспознанная команда или текст

Специальные значения:

ЗначениеОписание
__TIMEOUT__Опубликовано, если в режиме Grammar не было распознано ни одной команды в течение t_start_max секунд (настраивается параметром timeout_text)

Подписки

ТопикТипПо умолчаниюОписание
/respeaker_driver/audio/mainrobohead_interfaces/msg/AudioDataнастраиваетсяВходной аудиопоток

Сервисы

<namespace>/set_mode

ПолеЗначение
Типrobohead_interfaces/srv/SimpleCommand
Запрос dataОписание
0Выключить распознавание
1Включить режим Grammar (распознавание из списка команд)
2Включить режим Free (свободное распознавание)
Ответ dataОписание
0, 1 или 2Установленный режим
текущий режимЕсли запрошен недопустимый режим

Параметры конфигурации

Файл: config/speech_recognizer_asr.yaml

ПараметрТипПо умолчаниюОписание
default_modeint0Начальный режим (0/1/2)
sample_rateint16000Частота дискретизации
model_pathstring"vosk-model-small-ru-0.22"Имя каталога модели
timeout_textstring"__TIMEOUT__"Текст, публикуемый при таймауте в режиме Grammar
t_start_maxdouble5.0Максимальное время ожидания начала речи (сек). Если за это время речь не обнаружена — таймаут
t_enddouble0.5Время тишины после последнего слова для завершения фразы (сек)
t_maxdouble6.0Максимальная длительность одной фразы (сек)
commandsstring[]["покажи уши", "поздоровайся"]Список распознаваемых команд (для режима Grammar)
ros.service_name.set_modestring"set_mode"Имя сервиса
ros.topic_name.commandsstring"commands"Имя топика результатов
ros.topic_name.audio_inputstring"/respeaker_driver/audio/main"Входной аудиотопик

Логика работы — режим Grammar (mode=1)

  1. Внешняя логика вызывает set_mode(1).
  2. ASR начинает передавать аудио в Vosk с грамматикой из commands.
  3. Vosk использует эндпоинтер с настройками t_start_max, t_end, t_max:
    • Если речь не начинается за t_start_max секунд → таймаут.
    • Если после последнего слова тишина t_end секунд → фраза завершена.
    • Если фраза длится более t_max секунд → принудительное завершение.
  4. Результат проверяется в final_result и partial_result:
    • Найденная команда → публикуется в commands.
    • Ничего не найдено → публикуется __TIMEOUT__.
  5. Режим автоматически переключается в 0 (Off).

Логика работы — режим Free (mode=2)

  1. Внешняя логика вызывает set_mode(2).
  2. ASR распознаёт произвольную речь (полный словарь модели).
  3. Каждая распознанная фраза публикуется в commands.
  4. Режим автоматически переключается в 0 (Off).

Типовой сценарий использования

1. KWS работает в режиме 1 (непрерывно слушает)
2. Пользователь говорит "слушай робот"
3. KWS публикует "слушай робот" в wake_phrases
4. Внешняя логика получает wake phrase → вызывает ASR set_mode(1)
5. ASR начинает распознавание команды
6. Пользователь говорит "покажи уши"
7. ASR публикует "покажи уши" в commands → автоматически переключается в mode=0
8. Внешняя логика выполняет команду
9. KWS продолжает слушать wake phrases

Сборка

colcon build --symlink-install --packages-select robohead_interface speech_recognizer

Launch-файлы

ВАЖНО: перед запуском распознавания убедитесь, что запущен пакет respeaker_driver, который публикует аудио-данные с микрофона - иначе распознавать будет нечего.

Запуск только KWS

ros2 launch speech_recognizer kws.launch.py

Namespace: /kws/...

Запуск только ASR

ros2 launch speech_recognizer asr.launch.py

Namespace: /asr/...

Запуск обеих нод

ros2 launch speech_recognizer speech_recognizer.launch.py

Namespace: /speech_recognizer/kws/... и /speech_recognizer/asr/...


Примеры взаимодействия

Из командной строки

ros2 launch speech_recognizer speech_recognizer.launch.py
# Включить KWS
ros2 service call /speech_recognizer/kws/set_mode robohead_interfaces/srv/SimpleCommand "{data: 1}"

# Включить ASR в режиме Grammar
ros2 service call /speech_recognizer/asr/set_mode robohead_interfaces/srv/SimpleCommand "{data: 1}"

# Включить ASR в режиме Free
ros2 service call /speech_recognizer/asr/set_mode robohead_interfaces/srv/SimpleCommand "{data: 2}"

# Выключить ASR
ros2 service call /speech_recognizer/asr/set_mode robohead_interfaces/srv/SimpleCommand "{data: 0}"

# Слушать wake phrases
ros2 topic echo /speech_recognizer/kws/wake_phrases

# Слушать быстрые команды
ros2 topic echo /speech_recognizer/kws/fast_commands

# Слушать распознанные команды ASR
ros2 topic echo /speech_recognizer/asr/commands

Модели Vosk

Модели располагаются в каталоге speech_recognizer/speech_recognizer/model/. Путь задаётся параметром model_path (имя каталога).

МодельРазмерОписание
vosk-model-small-ru-0.22~45 МБКомпактная русская модель (рекомендуется)
vosk-model-ru-0.42~1.8 ГБПолная русская модель (высокая точность), но чрезмерно тяжёлая для Raspberry Pi 5

Скачать модели: https://alphacephei.com/vosk/models