Rhasspy в Docker Compose: готовый файл
«Алекса, включи свет» звучит удобно ровно до тех пор, пока вы не задумаетесь, куда улетает запись вашего голоса и что с ней происходит дальше. 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) |
|---|---|---|
| STT | Pocketsphinx | Kaldi или Vosk |
| TTS | espeak (роботизированный, но мгновенный) | Piper (естественный голос) |
| Wake Word | Porcupine (лёгкий, всегда) | Porcupine (без изменений) |
| Intent | fsticuffs | fsticuffs или 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 ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →