TTS на Python для русского языка: синтез речи с нуля

Строка engine.say("Привет") в pyttsx3 вместо русской речи выдаёт неразборчивое бормотание или вообще молчит — это самый частый симптом, с которого начинается знакомство с TTS на Python. Причина почти всегда одна: в системе не установлен русскоязычный голос, и движок пытается прочитать кириллицу английским синтезатором.

Проблема решается за несколько минут, если понимать, как устроен стек синтеза речи в Python. В этой статье разберём рабочие библиотеки для русского TTS — от офлайн-решений до нейросетевых моделей, покажем готовый код и разберём типичные ошибки. Вам не потребуется опыт в машинном обучении: достаточно базового знания Python и установленного pip.

Как работает синтез речи в Python

Любая TTS-библиотека (Text-to-Speech) выполняет три шага: нормализует текст (превращает числа и сокращения в слова), строит фонетическое представление и генерирует аудиоволну. Для русского языка критичен второй шаг — без корректной обработки кириллицы и ударений речь звучит неестественно.

Существует два принципиально разных подхода. Системные движки (SAPI5 в Windows, eSpeak в Linux) работают офлайн, но звучат роботизированно. Нейросетевые модели (Silero, Edge-TTS) генерируют почти человеческую речь, но требуют скачивания модели или доступа к сети.

Выбор зависит от задачи: для озвучки уведомлений хватит системного голоса, для аудиокниг или голосового ассистента нужна нейросетевая модель.

Быстрый старт: pyttsx3 с русским голосом

Библиотека pyttsx3 — обёртка над системными движками, поэтому работает полностью офлайн. Установка стандартная:

pip install pyttsx3

Минимальный пример с выбором русского голоса:

import pyttsx3

engine = pyttsx3.init()

voices = engine.getProperty('voices')

for voice in voices:

if 'russian' in voice.name.lower() or 'ru' in voice.id.lower():

engine.setProperty('voice', voice.id)

break

engine.say("Привет, это тест русского синтеза речи")

engine.runAndWait()

Если цикл не нашёл ни одного голоса — в системе просто нет русского синтезатора. В Windows проверьте Параметры → Время и язык → Речь и добавьте русский языковой пакет. Точный путь может отличаться в зависимости от версии Windows, поэтому сверьтесь с настройками вашей системы.

⚠️ Внимание: вызов engine.runAndWait() блокирует выполнение программы до конца озвучивания. Если вы встраиваете TTS в цикл обработки событий (например, в GUI на Tkinter), интерфейс «зависнет» — выносите синтез в отдельный поток.

☑️ Проверка перед запуском pyttsx3

Выполнено: 0 / 4

Онлайн-вариант: gTTS от Google

Библиотека gTTS использует синтезатор Google Translate и даёт заметно более естественную русскую речь, чем системные голоса. Расплата — обязательное подключение к интернету и неофициальный API, который теоретически может измениться.

from gtts import gTTS

tts = gTTS(text="Привет, это синтез речи через Google", lang='ru')

tts.save("output.mp3")

Результат сохраняется в MP3-файл, который затем проигрывается любым плеером — например, через playsound или pygame. Обратите внимание: gTTS не умеет воспроизводить звук напрямую, только генерирует файл.

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

Нейросетевой синтез: Silero TTS

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

import torch

model, symbols, sample_rate, example_text, apply_tts = torch.hub.load(

repo_or_dir='snakers4/silero-models',

model='silero_tts',

language='ru',

speaker='v3_1_ru'

)

audio = apply_tts(text="Привет, это нейросетевой синтез речи",

model=model,

sample_rate=sample_rate)

Для работы потребуется установленный PyTorch — это самая «тяжёлая» зависимость из всех рассмотренных вариантов. Доступные голоса (например, aidar, baya, kseniya) передаются параметром speaker; актуальный список смотрите в репозитории проекта, так как набор моделей обновляется.

Когда нужен нейросетевой голос без установки PyTorch, рассмотрите edge-tts — неофициальный клиент к голосам Microsoft Edge. Он работает через сеть, но ставится одной командой и поддерживает русские голоса ru-RU-SvetlanaNeural и ru-RU-DmitryNeural:

pip install edge-tts

edge-tts --voice ru-RU-SvetlanaNeural --text "Привет, мир" --write-media out.mp3

📊 Какую TTS-библиотеку вы используете для русского языка?
pyttsx3 (системные голоса)
gTTS (Google)
Silero TTS
edge-tts (Microsoft)

Сравнение библиотек для русского TTS

Чтобы выбрать инструмент под свою задачу, сопоставьте ключевые характеристики. Таблица отражает общее поведение библиотек; конкретное качество голоса субъективно, поэтому лучше прослушать образцы самостоятельно.

БиблиотекаОфлайнКачество русской речиСложность установки
pyttsx3ДаРоботизированноеМинимальная
gTTSНетХорошееМинимальная
Silero TTSДа (после загрузки модели)Высокое, нейросетевоеТребует PyTorch
edge-ttsНетВысокое, нейросетевоеНизкая

Короткий ориентир по сценариям:

  • 🔇 Полностью офлайн-приложение — pyttsx3 или Silero.
  • 🎙️ Озвучка текстов для видео — Silero или edge-tts ради естественности.
  • Прототип за пять минут — gTTS, если интернет доступен.
  • 🤖 Голосовой ассистент — Silero: низкая задержка и нет зависимости от внешних API.

Типичные ошибки и их решение

Разберём сбои, которые встречаются чаще всего. Первая группа — проблемы с кодировкой: если вместо русской речи слышны паузы или чтение «по буквам», убедитесь, что исходный файл сохранён в UTF-8 и строка передаётся как обычный str, а не байты.

Вторая группа — ошибки окружения. В Linux для pyttsx3 нужен установленный движок espeak (ставится через пакетный менеджер), иначе инициализация падает с ошибкой. В Windows при отсутствии голосов проверьте языковые пакеты системы.

  • 🐛 Молчание без ошибок — не выбран русский голос или громкость volume выставлена в ноль.
  • 📦 ModuleNotFoundError — библиотека установлена в другое окружение; проверьте pip list в активном venv.
  • 🌐 Таймауты gTTS/edge-tts — нет сети или запрос блокируется; проверьте соединение.
  • 💾 Ошибка загрузки Silero — обрыв скачивания модели; удалите кэш ~/.cache/torch/hub и повторите.
⚠️ Внимание: не используйте gTTS и edge-tts в коммерческих продуктах без проверки условий использования соответствующих сервисов — оба решения опираются на неофициальные интерфейсы, и их стабильность не гарантирована.
Почему pyttsx3 «заикается» при повторных вызовах

Повторное создание engine внутри цикла приводит к утечкам и конфликтам движка. Создавайте объект pyttsx3.init() один раз на всю программу и переиспользуйте его, вызывая say() и runAndWait() по мере необходимости.

Настройка скорости, тона и сохранение в файл

В pyttsx3 скорость регулируется параметром rate, громкость — volume (от 0.0 до 1.0). Сохранение в файл вместо воспроизведения делается через save_to_file():

engine.setProperty('rate', 150)

engine.setProperty('volume', 0.9)

engine.save_to_file("Текст для озвучки", "output.wav")

engine.runAndWait()

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

Если нужна склейка нескольких аудиофрагментов в один файл, используйте pydub: она объединяет WAV/MP3 и позволяет вставлять паузы заданной длительности.

Часто задаваемые вопросы

Какая библиотека даёт самый естественный русский голос?

Из открытых решений наиболее естественную речь дают нейросетевые модели — Silero TTS и голоса Microsoft через edge-tts. Системные голоса через pyttsx3 звучат заметно механистичнее.

Можно ли использовать TTS полностью офлайн?

Да. pyttsx3 работает через системные движки и не требует сети вообще. Silero TTS скачивает модель один раз, после чего синтезирует речь локально.

Почему pyttsx3 читает русский текст с английским акцентом?

Выбран англоязычный голос. Переберите список engine.getProperty('voices') и установите голос с русской локалью; если такого нет — добавьте русский языковой пакет в настройках системы.

Как сохранить результат Silero в MP3?

Сохраните тензор в WAV через torchaudio.save(), затем сконвертируйте в MP3 с помощью pydub или ffmpeg.

Подходит ли gTTS для озвучки длинных текстов?

Технически — с ограничениями: длинный текст нужно разбивать на части и склеивать аудио. Для больших объёмов надёжнее локальная модель Silero, которая не зависит от сети и лимитов внешнего сервиса.