MAATRIX / Блог / Rhasspy в Docker Compose: готовый файл

Rhasspy в Docker Compose: готовый файл

MAATRIX

«Алекса, включи свет» звучит удобно ровно до тех пор, пока вы не задумаетесь, куда улетает запись вашего голоса и что с ней происходит дальше. Rhasspy решает эту проблему буквально — вся обработка речи идёт локально, ни один звуковой файл не покидает вашу сеть. Ниже — рабочий docker-compose.yml, разбор архитектуры «мастер + сателлит» (потому что микрофон физически должен быть у вас дома, а не в дата-центре) и связка с Home Assistant через MQTT.

Обсудить статью, задать вопрос или начать новую тему

Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.

Перейти в сообщество →

Почему Rhasspy, а не облачный ассистент

Rhasspy — открытый голосовой стек: распознавание речи (STT), распознавание намерений (intent recognition) и синтез речи (TTS) полностью офлайн. Ни Google, ни Amazon, ни какой-либо внешний сервис не участвуют — вся цепочка «вы сказали → устройство поняло → устройство сделало» замыкается внутри вашей сети.

Стоит сразу проговорить честный нюанс: активная разработка самого Rhasspy как отдельного проекта в последние годы замедлилась — его автор перешёл к работе над протоколом Wyoming, который сейчас использует Home Assistant в своём встроенном голосовом конвейере Assist (тот же принцип: openWakeWord + faster-whisper + Piper, всё локально). Wyoming-путь — более новый и активнее развивающийся, если вы начинаете с нуля и уже сидите в экосистеме Home Assistant, его стоит рассмотреть в первую очередь. Rhasspy при этом никуда не делся, стабилен, работает, и остаётся более гибким там, где нужна тонкая настройка намерений (intents) через sentences.ini или интеграция не только с Home Assistant, а с произвольным MQTT-топиком или HTTP-хуком — этим и хорош этот разбор.

Из практических причин выбрать именно Rhasspy:

  • полный офлайн — работает даже без интернета на сервере, если модели уже скачаны;
  • гибкая система намерений через простой текстовый формат, без обучения нейросети под каждую фразу;
  • поддержка нескольких языков в одном профиле, включая русский;
  • лёгкая интеграция с Home Assistant, Node-RED или произвольным скриптом через MQTT.

Архитектура: мастер на сервере и сателлит у микрофона

Ключевой момент, который многие упускают: Rhasspy — это не один контейнер, который «просто слушает». Микрофон и колонка физически должны быть в помещении, где вы говорите, а тяжёлые модели распознавания речи (особенно Kaldi) выгоднее считать на машине с приличным CPU. Отсюда стандартная схема:

  • Мастер (master) — контейнер на VPS или домашнем сервере, держит профиль, обучает намерения, крутит STT/TTS-движки и веб-интерфейс на порту 12101;
  • Сателлит (satellite) — лёгкий Rhasspy в режиме --mic-mode рядом с микрофоном (обычно Raspberry Pi с USB-микрофоном или ReSpeaker HAT), который стримит аудио на мастер по сети и получает обратно ответ для колонки.

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

Практичный вариант для тех, кто арендует сервер: STT-движок (самая тяжёлая часть — Kaldi для непрерывного распознавания или Vosk) считается на сервере с нормальным CPU, а дома остаётся только Raspberry Pi-сателлит, который просто передаёт звук по сети. Это снимает нагрузку с малинки и позволяет использовать более точные модели, чем на Pi Zero потянуть.

Нужен сервер под эту задачу?

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.

Арендовать сервер

Готовый docker-compose.yml для мастера

Базовый вариант, рассчитанный на запуск мастер-инстанса на VPS или домашнем сервере с профилем ru:

services:
  rhasspy:
    container_name: rhasspy
    image: rhasspy/rhasspy:latest
    restart: unless-stopped
    ports:
      - "12101:12101"
    volumes:
      - ./profiles:/profiles
    environment:
      - TZ=Europe/Moscow
    command: --user-profiles /profiles --profile ru

Что здесь важно:

  • микрофон и звуковая карта хосту не нужны, если это чистый мастер без прямого прослушивания — устройство /dev/snd не пробрасывается специально;
  • ./profiles — единственная директория, которая хранит состояние: обученные намерения, профиль языка, кэш моделей STT/TTS. Именно её нужно бэкапить;
  • образ без явного тега версии (latest) в данном случае осознанный выбор — у Rhasspy нет частых релизов с ломающими изменениями, но перед продакшен-использованием стоит зайти на Docker Hub и посмотреть актуальные теги, чтобы зафиксировать конкретную версию вручную;
  • порт 12101 — веб-интерфейс, где настраиваются профиль, намерения и тестируется распознавание прямо из браузера (можно загрузить аудио или использовать встроенный микрофон-тест).

Создайте директорию и поднимите контейнер:

mkdir -p ~/rhasspy/profiles
cd ~/rhasspy
docker compose up -d

Первый запуск скачивает модели STT/TTS для выбранного профиля — это может занять несколько минут в зависимости от языка и выбранного движка распознавания. Прогресс виден в логах контейнера: docker compose logs -f rhasspy.

Если планируете держать сателлит на той же машине (без разделения на комнаты), добавьте проброс аудио-устройств и запустите с --mic-mode wav:

    devices:
      - /dev/snd:/dev/snd
    command: --user-profiles /profiles --profile ru --mic-mode wav

Профиль: язык, движок распознавания и голос

Профиль в Rhasspy — это набор настроек одного языка/локали: какой движок STT слушать, каким голосом отвечать, какой wake word ловить. Открыв веб-интерфейс на http://ваш-сервер:12101, во вкладке Settings выбираются:

  • Speech to Text — Pocketsphinx (лёгкий, но менее точный, хорош для сателлита на слабом Pi), Kaldi (точнее, требовательнее к CPU, лучше держать на сервере) или Vosk (компромисс, неплохо работает на русском);
  • Text to Speech — здесь удобно подключить Piper (тот же движок, что и в связке с Home Assistant): голоса из репозитория rhasspy/piper-voices на Hugging Face совместимы напрямую, установка и подбор голоса подробно разобраны в статье про Piper TTS на VPS;
  • Wake Word — Porcupine (требует бесплатный ключ доступа для некоммерческого использования) или Snowboy-совместимые модели для активации по кодовому слову без постоянной передачи звука на сервер;
  • Intent Recognition — fsticuffs (по умолчанию, работает на регулярных выражениях из ваших фраз, быстро и без обучения) или более гибкий fuzzywuzzy, если хотите прощать пользователю опечатки и вариации формулировок.

Таблица типичного распределения нагрузки между движками:

КомпонентЛёгкий вариант (Pi/слабый VPS)Точный вариант (сервер с 2+ vCPU)
STTPocketsphinxKaldi или Vosk
TTSespeak (роботизированный, но мгновенный)Piper (естественный голос)
Wake WordPorcupine (лёгкий, всегда)Porcupine (без изменений)
Intentfsticuffsfsticuffs или fuzzywuzzy

Wake word почти всегда стоит держать лёгким и локальным на сателлите — именно он постоянно слушает эфир, и гонять непрерывный поток на сервер до момента активации бессмысленно и небезопасно с точки зрения приватности.

Намерения: sentences.ini вместо обучения нейросети

Вместо того чтобы обучать модель на размеченных данных, Rhasspy использует текстовый формат намерений — вы описываете шаблоны фраз, а система сама строит грамматику. Файл sentences.ini внутри профиля выглядит так:

[СветВключить]
включи (свет | лампу) [в (кухне | спальне | гостиной){room}]

[СветВыключить]
выключи (свет | лампу) [в (кухне | спальне | гостиной){room}]

[Температура]
(какая | какая сейчас) температура [в (кухне | спальне | гостиной){room}]

Скобки [] — необязательная часть фразы, круглые () с вертикальной чертой — варианты слов, фигурные {} — именованный слот, значение которого попадёт в JSON-ответ намерения. После правки sentences.ini через веб-интерфейс (вкладка Sentences) нужно нажать «Train» — переобучение грамматики занимает секунды, это не нейросеть, а построение конечного автомата поверх ваших шаблонов.

Готовое намерение приходит в виде JSON с распознанным intent.name и заполненными слотами (room: "кухне"), это удобно отдавать дальше — в Home Assistant, Node-RED или собственный обработчик на Python через REST API /api/text-to-intent.

Интеграция с Home Assistant и MQTT

Если у вас уже развёрнут Home Assistant в Docker Compose, у него есть готовая интеграция Rhasspy (Settings → Devices & Services → Add Integration → Rhasspy) — достаточно указать адрес мастер-контейнера, и распознанные намерения автоматически превращаются в вызовы сервисов Home Assistant (включить свет, узнать температуру и так далее) без ручного проброса через MQTT.

Если Home Assistant не используется или нужна более гибкая логика (например, реакция не на «включить свет», а на произвольную команду для скрипта), Rhasspy публикует распознанные намерения в MQTT-топик hermes/intent/<IntentName> — на этот топик подписывается любой обработчик, в том числе Node-RED, который умеет строить логику по нодам без единой строчки кода. Для этого в docker-compose.yml мастера добавьте переменную с адресом брокера:

    environment:
      - TZ=Europe/Moscow
    command: >
      --user-profiles /profiles --profile ru
      --mqtt-host mosquitto --mqtt-port 1883

Если брокер MQTT уже используется для Zigbee-устройств (Zigbee2MQTT из связки с Home Assistant — разбор в статье про настройку Zigbee2MQTT на VPS), Rhasspy можно подключить к тому же брокеру — отдельный инстанс Mosquitto ради голосового ассистента не нужен, все компоненты умного дома спокойно живут на одном MQTT.

Нужен сервер под эту задачу?

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.

Арендовать сервер

Нужны сами нейросети для контента?

Генерируйте изображения, видео и озвучку нейросетями на falapi.io — десятки моделей в одном окне. Оплата картой РФ и по СБП.

Частые вопросы

Обязательно ли разделять Rhasspy на мастер и сателлит?

Нет, если у вас одна точка прослушивания и сервер физически стоит в том же помещении. Для нескольких комнат или для аренды VPS в дата-центре разделение — единственный рабочий вариант, потому что микрофон должен быть у вас дома.

Нужен ли GPU для распознавания речи?

Нет, все штатные движки Rhasspy (Pocketsphinx, Kaldi, Vosk) работают на CPU. Для домашнего использования с десятками команд хватает 2 vCPU без видеокарты, разница между движками — в точности и задержке, а не в требованиях к железу.

Работает ли Rhasspy без интернета вообще?

Да, после первой загрузки моделей STT/TTS вся цепочка распознавания и ответа работает офлайн. Интернет нужен только для первичной загрузки моделей и, при желании, для получения ключа Porcupine под wake word.

Чем Rhasspy отличается от встроенного Assist в Home Assistant?

Assist использует более новый протокол Wyoming и активнее развивается, но менее гибкий в настройке произвольных намерений через текстовые шаблоны. Rhasspy лучше подходит, если у вас нестандартная логика команд или интеграция не только с Home Assistant.

Как перенести обученные намерения на новый сервер?

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

Обсудить статью, задать вопрос или начать новую тему

Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.

Перейти в сообщество →