Skip to content

About

Silero TTS backend service. Can be used with Home Assistant and Rhasspy.

Topics

Resources

Stars

59 stars

Watchers

5 watching

Forks

Repository files navigation

Silero TTS Service

Локальный синтез русской и украинской речи для Home Assistant и Rhasspy

Release Docker Pulls Supports amd64 Architecture Supports aarch64 Architecture MIT License

Сервис превращает текст в естественную речь с помощью моделей Silero и отдаёт её по HTTP API, совместимому с MaryTTS. Работает полностью локально: никаких облаков, подписок и задержек сети. Интернет нужен только один раз, чтобы скачать модель.

Я сделал этот проект, потому что готовые решения для умного дома говорили по-русски плохо. Вдохновлялся проектом silero-ha-http-tts от Gromina и довёл идею до готового сервиса с настройками и Docker образами.

voice-xenia.mp4

🔈 GitHub запускает видео без звука, включите его кнопкой динамика в плеере.

Содержание

Возможности

  • 🗣️ Естественные голоса — 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.

Установка

Аддон Home Assistant

Добавить репозиторий в Home Assistant

  1. Нажмите кнопку выше или добавьте репозиторий https://github.com/Navatusein/Silero-TTS-Service вручную: Настройки → Дополнения → Магазин дополнений → ⋮ → Репозитории.
  2. Установите аддон Silero TTS, выберите язык на вкладке «Конфигурация» и запустите его.
  3. Подключите сервис к Home Assistant, указав host: localhost.

Docker

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

Создайте 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.

Подключение к Home Assistant

Добавьте в configuration.yaml:

tts:
  - platform: marytts
    host: localhost # Адрес сервера, для аддона localhost
    port: 9898
    codec: WAVE_FILE
    voice: xenia # Голос из таблицы выше

Язык задаётся в настройках сервиса, параметр language интеграции MaryTTS не используется.

Подключение к Rhasspy

  1. В настройках Rhasspy, в разделе Text to Speech, выберите модуль MaryTTS.
  2. Сохраните настройки, Rhasspy перезагрузится.
  3. Укажите адрес сервера с путём /process, например http://192.168.1.10:9898/process.
  4. Нажмите Refresh и выберите голос из списка.
  5. Сохраните настройки ещё раз.

Настройки Rhasspy

Обработка текста

Перед синтезом текст проходит нормализацию: так 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

Эмодзи и разметка Markdown удаляются: заголовки, списки, выделение, ссылки и код. Ответ LLM ассистента можно передавать как есть.

# Погода ☀️
- Сегодня **тепло**, плюс 25 <d>градус</d>
- Ветер [слабый](https://example.com) 🌬️

Будет озвучено: «Погода. Сегодня тепло, плюс двадцать пять градусов. Ветер слабый.»

markdown.mp4

🔈 GitHub запускает видео без звука, включите его кнопкой динамика в плеере.

SSML

С помощью 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 запускает видео без звука, включите его кнопкой динамика в плеере.

API

Метод Путь Описание
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, с которого всё началось.

About

Silero TTS backend service. Can be used with Home Assistant and Rhasspy.

Topics

Resources

Stars

59 stars

Watchers

5 watching

Forks

Releases

Packages

Used by

Contributors

Languages