Сервис превращает текст в естественную речь с помощью моделей Silero и отдаёт её по HTTP API, совместимому с MaryTTS. Работает полностью локально: никаких облаков, подписок и задержек сети. Интернет нужен только один раз, чтобы скачать модель.
Я сделал этот проект, потому что готовые решения для умного дома говорили по-русски плохо. Вдохновлялся проектом silero-ha-http-tts от Gromina и довёл идею до готового сервиса с настройками и Docker образами.
voice-xenia.mp4
🔈 GitHub запускает видео без звука, включите его кнопкой динамика в плеере.
- Возможности
- Установка
- Настройки
- Подключение к Home Assistant
- Подключение к Rhasspy
- Обработка текста
- API
- Вывод звука на Bluetooth колонку
- Разработка
- История изменений
- 🗣️ Естественные голоса — 5 русских и украинский голос на моделях Silero
v5_1иv4. - 🏠 Аддон Home Assistant — устанавливается в пару кликов, настройки в интерфейсе HA.
- 🔢 Числа словами — целые и дробные, через точку и через запятую: «23.5» → «двадцать три целых пять десятых».
- 📚 Склонение по числу —
21 <d>яблоко</d>→ «двадцать одно яблоко»,2 <d>нова</d> <d>книга</d>→ «дві нові книги». - 🤖 Готов к ответам LLM — эмодзи и разметка Markdown удаляются перед синтезом.
- 🎛️ SSML и эффекты — паузы, скорость и высота речи, эффекты SoX вроде эха.
- ⚡ Кеширование — повторяющиеся фразы озвучиваются мгновенно.
- 🔇 Озвучивание ошибок — по желанию колонка скажет «Ошибка синтеза речи» вместо тишины.
- 🧩 API MaryTTS — работает со встроенной интеграцией MaryTTS в Home Assistant и с Rhasspy.
- Нажмите кнопку выше или добавьте репозиторий
https://github.com/Navatusein/Silero-TTS-Serviceвручную:Настройки → Дополнения → Магазин дополнений → ⋮ → Репозитории. - Установите аддон Silero TTS, выберите язык на вкладке «Конфигурация» и запустите его.
- Подключите сервис к Home Assistant, указав
host: localhost.
docker run -d -p 9898:9898 -m 1g -e LANGUAGE=ru -v silero-models:/usr/app/models --name silero-tts-service navatusein/silero-tts-serviceСоздайте docker-compose.yml:
services:
silero-tts-service:
image: navatusein/silero-tts-service
container_name: silero-tts-service
restart: unless-stopped
ports:
- "9898:9898"
volumes:
- ./models:/usr/app/models
environment:
LANGUAGE: ru
NUMBER_OF_THREADS: 4
deploy:
resources:
limits:
memory: 1GИ запустите:
docker compose up -dОбразы публикуются в Docker Hub и GitHub Container Registry для amd64 и aarch64 (Raspberry Pi 4/5 и другие ARM устройства). Том для моделей нужен, чтобы модель не скачивалась заново при пересоздании контейнера.
Настройки передаются переменными окружения контейнера. В аддоне Home Assistant те же настройки задаются на вкладке «Конфигурация» в нижнем регистре.
| Переменная | Описание | Значения | По умолчанию |
|---|---|---|---|
LANGUAGE |
Язык синтеза речи | ru, uk, multi |
ru |
NUMBER_OF_THREADS |
Количество потоков процессора для синтеза | от 1 до количества ядер |
4 |
SAMPLE_RATE |
Частота дискретизации аудио | 8000, 24000, 48000 |
48000 |
SOX_PARAM |
Параметры SoX для эффектов: эхо, тембр, басы | например reverb 50 50 10 |
пусто |
HA_FIX |
Добавляет паузу в конец ответа на POST /process, чтобы Home Assistant не обрезал окончание фразы |
true, false |
false |
VOICE_TTS_ERRORS |
При ошибке /process возвращает аудио «Ошибка синтеза речи» вместо ответа 400. Подробности ошибки пишутся в лог |
true, false |
false |
MODELS_DIRECTORY |
Папка для скачанных моделей | путь | ./models |
Голоса для каждого языка:
| Язык | Код | Голоса |
|---|---|---|
| Русский | ru |
aidar baya kseniya xenia eugene |
| Українська | uk |
mykyta random |
🔊 Послушать голоса
aidar
voice-aidar.mp4
🔈 GitHub запускает видео без звука, включите его кнопкой динамика в плеере.
baya
voice-baya.mp4
🔈 GitHub запускает видео без звука, включите его кнопкой динамика в плеере.
kseniya
voice-kseniya.mp4
🔈 GitHub запускает видео без звука, включите его кнопкой динамика в плеере.
xenia
voice-xenia.mp4
🔈 GitHub запускает видео без звука, включите его кнопкой динамика в плеере.
eugene
voice-eugene.mp4
🔈 GitHub запускает видео без звука, включите его кнопкой динамика в плеере.
mykyta
voice-mykyta.mp4
🔈 GitHub запускает видео без звука, включите его кнопкой динамика в плеере.
Эти же примеры в формате MP3 лежат в docs/audio.
Добавьте в configuration.yaml:
tts:
- platform: marytts
host: localhost # Адрес сервера, для аддона localhost
port: 9898
codec: WAVE_FILE
voice: xenia # Голос из таблицы вышеЯзык задаётся в настройках сервиса, параметр language интеграции MaryTTS не используется.
- В настройках Rhasspy, в разделе Text to Speech, выберите модуль MaryTTS.
- Сохраните настройки, Rhasspy перезагрузится.
- Укажите адрес сервера с путём
/process, напримерhttp://192.168.1.10:9898/process. - Нажмите Refresh и выберите голос из списка.
- Сохраните настройки ещё раз.
Перед синтезом текст проходит нормализацию: так Silero не спотыкается о цифры, латиницу и разметку.
Числа читаются словами, дроби можно писать через точку или запятую.
Текст с цифрой 1. На улице 23,5 градуса, а влажность 64.8 процента.
numbers.mp4
🔈 GitHub запускает видео без звука, включите его кнопкой динамика в плеере.
Возьмите слово в тег <d>, и сервис согласует его с числом. Если склонить нужно несколько слов, каждое берётся в свой тег, а прилагательные согласуются с последним словом по роду.
У меня было 15 <d>яблоко</d>. Мне осталось работать 21 <d>рабочий</d> <d>день</d>.
declension.mp4
🔈 GitHub запускает видео без звука, включите его кнопкой динамика в плеере.
Для украинского языка работает так же, дроби читаются нормативно: «двадцять три цілих п'ять десятих».
На вулиці 23,5 градуса. У мене 21 <d>гривня</d>, 2 <d>нова</d> <d>книга</d> і 5 <d>яблуко</d>.
numbers-uk.mp4
🔈 GitHub запускает видео без звука, включите его кнопкой динамика в плеере.
Слова на латинице читаются транслитом.
Lorem ipsum dolor sit amet.
translit.mp4
🔈 GitHub запускает видео без звука, включите его кнопкой динамика в плеере.
Эмодзи и разметка Markdown удаляются: заголовки, списки, выделение, ссылки и код. Ответ LLM ассистента можно передавать как есть.
# Погода ☀️
- Сегодня **тепло**, плюс 25 <d>градус</d>
- Ветер [слабый](https://example.com) 🌬️Будет озвучено: «Погода. Сегодня тепло, плюс двадцать пять градусов. Ветер слабый.»
markdown.mp4
🔈 GitHub запускает видео без звука, включите его кнопкой динамика в плеере.
С помощью SSML можно управлять паузами и просодией речи.
<p>
Когда я просыпаюсь, <prosody rate="x-slow">я говорю довольно медленно</prosody>.
Потом я начинаю говорить своим обычным голосом,
<prosody pitch="x-high"> а могу говорить тоном выше </prosody>,
или <prosody pitch="x-low">наоборот, ниже</prosody>.
Потом, если повезет – <prosody rate="fast">я могу говорить и довольно быстро.</prosody>
А еще я умею делать паузы любой длины, например две секунды <break time="2000ms"/>.
<p>
Также я умею делать паузы между параграфами.
</p>
<p>
<s>И также я умею делать паузы между предложениями</s>
<s>Вот например как сейчас</s>
</p>
</p>ssml.mp4
🔈 GitHub запускает видео без звука, включите его кнопкой динамика в плеере.
| Метод | Путь | Описание |
|---|---|---|
GET |
/process?VOICE=xenia&INPUT_TEXT=Привет |
Синтезирует речь и возвращает WAV файл |
POST |
/process |
То же самое, параметры VOICE и INPUT_TEXT в теле запроса (application/x-www-form-urlencoded) |
GET |
/voices |
Список голосов для текущего языка |
GET |
/settings |
Текущие настройки сервера |
GET |
/clear_cache |
Очищает кеш синтезированных фраз |
Имена параметров не чувствительны к регистру, вместо INPUT_TEXT можно передать text. Если параметр не указан, сервер вернёт 400.
curl -o speech.wav "http://localhost:9898/process?voice=xenia&text=Привет, мир!"Для локального запуска нужны Python 3.14 и SoX в PATH:
python -m venv .venv
.venv/bin/pip install -r requirements.txt # Windows: .venv\Scripts\pip
.venv/bin/python main.py # Windows: .venv\Scripts\pythonНастройки для локального запуска удобно хранить в файле .env в корне проекта, имена переменных такие же, как в таблице настроек.
Для ручной проверки API есть коллекция Postman: docs/postman/Silero-TTS-Service.postman_collection.json. В ней запросы для русского и украинского языка, проверки ответов и примеры обработки текста.
Релиз собирается GitHub Actions при пуше тега версии, например 3.0.0: образы для amd64 и aarch64 публикуются в Docker Hub и GHCR, создаётся черновик релиза. Версия тега должна совпадать с version в app/config.py и silero-tts/config.yaml. Описание образа на Docker Hub берётся из docs/dockerhub/README.md и обновляется при каждом релизе.
- Silero — за открытые модели синтеза речи.
- Gromina — за проект silero-ha-http-tts, с которого всё началось.
