Строка 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
Онлайн-вариант: 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 | Нет | Хорошее | Минимальная |
| 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, которая не зависит от сети и лимитов внешнего сервиса.