Перейти к содержимому
Инструменты

Локальный синтез речи на русском — 4 голоса Piper без GPU

Локальный синтез речи на русском — 4 голоса Piper без GPU

Ставите локальный синтез речи на русском, синтезируете первую фразу — и движок произносит «зáмок» там, где нужен «замóк». Плюс перед ударной гласной не спасает: такого синтаксиса в документации Piper нет вообще.

Разбираю по шагам: как поднять движок на процессоре, где лежат четыре русских голоса и что реально работает с ударениями. Проверял на релизе v1.7.0 от 15 августа 2026 года.

Как запустить локальный синтез речи на русском без видеокарты

Piper — движок синтеза речи, который встраивает espeak-ng для фонемизации и считает на CPU. Актуальный репозиторий — OHF-Voice/piper1-gpl, лицензия GPL-3.0. Установка одной командой:

pip install piper-tts

Голоса качаются отдельным модулем. Имя собирается из локали и названия: язык, диктор, качество.

python3 -m piper.download_voices ru_RU-denis-medium

Файлы лягут в текущую папку. Другой каталог — через --data-dir. Синтез в файл выглядит так:

python3 -m piper -m ru_RU-denis-medium -f test.wav -- 'Это проверка.'

Уберёте -f — при установленном ffplay звук пойдёт сразу в колонки. Полезные флаги: --cuda для GPU через onnxruntime-gpu, --input-file для чтения текста из файлов, --sentence-silence для паузы между предложениями, --volume для множителя громкости и --no-normalize, если автоматическая нормализация громкости мешает.

Сервер вместо консоли

CLI грузит модель заново на каждый вызов. Для потока и для интеграции с чем угодно по HTTP документация прямо рекомендует сервер:

python3 -m pip install piper-tts[http]
python3 -m piper.http_server -m ru_RU-denis-medium

Порт по умолчанию 5000, меняется через --host и --port. На корне страницы простая веб-форма, где видно время синтеза, фонемы и их выравнивание по аудио. Дальше — обычный POST:

curl -X POST -H 'Content-Type: application/json' \
  -d '{ "text": "Это проверка." }' \
  -o test.wav localhost:5000/synthesize

Список голосов отдаёт /voices, информацию о текущем — /info.

Три параметра, которые слышно

В теле запроса к /synthesize есть length_scale — скорость речи, по умолчанию 1. Есть noise_scale — вариативность произношения. И noise_w_scale — вариативность длительности фонем. Ниже значения — ровнее и механичнее, выше — живее и грязнее. Это те самые ручки, которые ищут в интерфейсе и не находят: они в API, а не в кнопках.

Какие русские голоса лежат в piper-voices

В каталоге ru/ru_RU репозитория rhasspy/piper-voices четыре диктора: denis, dmitri, irina, ruslan. Послушать их можно на странице сэмплов Piper до скачивания.

Карточка модели denis medium сообщает конкретику: один диктор, частота дискретизации 22 050 Гц, датасет OHF-Voice/voice-datasets под лицензией CC0, а сама модель дообучена из английского голоса lessac medium. Русский голос вырос из английской модели — отсюда специфический тембр, который одни слышат как живой, другие как акцент. Отдельной лицензии на веса голоса в карточке нет, указана только лицензия датасета: если планируете продавать озвучку, это место надо уточнять у мейнтейнеров, а не додумывать. Подробно про то, какая лицензия TTS разрешает коммерческое использование, я разобрал отдельно.

Признаки, что у вас стоит не тот Piper

  • Вы расставляете ударения плюсами и ждёте результата. В документации Piper нет ни слова про плюс как знак ударения — движок не обязан его понимать.
  • В имени модели нет ru_RU. Значит, скачался англоязычный голос, и русский текст он будет читать по английским правилам.
  • Короткая фраза синтезируется несколько секунд. Это не тормоза модели, а перезагрузка весов на каждый запуск CLI — переходите на HTTP-сервер.
  • Вы ставили движок по инструкции со ссылками на готовые бинарники. Они ведут на архивный репозиторий rhasspy/piper версии 1.2.0, а актуальная ветка живёт в OHF-Voice/piper1-gpl.

Как поставить ударение вручную

Штатный механизм в Piper один: блоки сырых фонем espeak-ng в двойных квадратных скобках. Всё, что внутри [[ ]], движок не фонемизирует сам, а берёт как есть.

Сначала получаете фонемы нужного слова:

espeak-ng -v ru --ipa=3 -q "замок"

На выходе строка IPA. Её подставляете в текст: На горе стоял [[ ваши_фонемы ]]. Знак основного ударения в IPA — ˈ перед ударным слогом, и это ровно тот символ, который вы двигаете руками, когда движок ошибся. Способ трудоёмкий, зато детерминированный: никаких «модель сама разберётся».

Второй путь — препроцессор. RUAccent решает задачу «куда падает ударение», включая омографы вроде замка и замка, лицензия MIT, последний коммит 17 июля 2026 года. Готовой интеграции с Piper в его документации нет — связку между расстановщиком и фонемами придётся собирать самому. Зато на длинных текстах это единственный способ не сидеть над каждым словом.

Что сделать сейчас

  1. Поставьте piper-tts и скачайте ru_RU-denis-medium. Две команды, минуты три вместе с загрузкой весов.
  2. Прогоните текст, где заведомо есть омографы: замок, мука, орган. Так вы за один заход увидите, где движок промахивается именно на ваших текстах.
  3. Поднимите HTTP-сервер и подёргайте length_scale в диапазоне около единицы. Разница между 0,9 и 1,1 слышна сразу, дальше подбирается под задачу.
  4. Проблемные слова прогоните через espeak-ng --ipa=3 и зашейте фонемы в шаблон текста, а не правьте каждый раз руками.

Если после этого вам нужен не готовый диктор, а собственный тембр, следующий шаг — клонирование голоса локально без обучения: там другой класс моделей и другие требования к железу.

Источники