Как поднять синтез речи на своём сервере
Публичные TTS-сервисы берут плату за каждый символ и получают ваш текст на входе — для приватного контента, ботов и потоковой озвучки это неудобно вдвойне. Синтез речи на сервере снимает оба ограничения: движок работает на вашем железе, текст никуда не уходит, а озвучка не тарифицируется по объёму. Разберём три рабочих движка — Piper, Silero и XTTS, — установку каждого и то, как обернуть синтез в API, которым пользуются приложения.
Содержание
- Зачем поднимать синтез речи на своём сервере
- Три движка синтеза: Piper, Silero и XTTS — что выбрать
- Быстрый путь: Piper на CPU за пять минут
- Путь для качества: XTTS и клонирование голоса на GPU
- Синтез речи как сервис: OpenAI-совместимый API
- Подводные камни: числа, лицензии, клонирование и данные
- Какой сервер под синтез речи брать в MAATRIX
Обсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →Зачем поднимать синтез речи на своём сервере
Задача возникает по-разному: озвучить статьи и книги в аудио, дать голос телефонному боту или IVR, встроить голосовой ответ в приложение, сделать контент доступным для незрячих пользователей, автоматизировать дубляж роликов. Во всех случаях на входе текст, на выходе — WAV или MP3 с голосом.
Облачные API решают это быстро, но с оговорками. OpenAI, ElevenLabs и подобные сервисы берут плату посимвольно или за голосовую минуту и получают ваш текст на обработку: для внутренних документов, диктовок с персональными данными, коммерческой тайны это неприемлемо при любой политике конфиденциальности провайдера. Добавьте квоты, задержки на пиковой нагрузке и то, что часть сервисов не принимает карты российских банков напрямую.
Свой синтез снимает все три ограничения разом: текст не покидает периметр, озвучка не лимитируется количеством символов, а скорость ответа зависит только от вашего железа. Цена вопроса — один раз поднять движок и обслуживать его самостоятельно. Дальше — какой движок брать под конкретную задачу и как его развернуть.
Три движка синтеза: Piper, Silero и XTTS — что выбрать
Для русского языка есть три рабочих варианта, и они закрывают разные задачи.
Piper — лёгкий движок на CPU, изначально сделанный для Home Assistant и офлайн-ассистентов. Синтезирует быстрее реального времени на одном ядре, весит по 20–60 МБ на голос, из коробки даёт несколько русских дикторов. Исходный репозиторий rhasspy/piper заброшен; сегодня активно поддерживается форк piper1-gpl от Open Home Foundation под лицензией GPL-3.0, а пакет на PyPI остался прежним — piper-tts.
Silero TTS — ещё легче, распространяется через torch.hub, отдельно ставить ничего, кроме PyTorch, не нужно: модель на 40–50 МБ подгружается прямо в процесс. Для русского работает модель v3_1_ru с дикторами aidar, baya, kseniya, xenia, eugene. Удобно, когда синтез — часть более крупного Python-приложения, а не отдельный сервис.
XTTS (Coqui TTS) — тяжеловес: звучит естественнее, передаёт интонацию и умеет клонировать голос по 10–20-секундному образцу. Требует GPU для комфортной скорости и лицензионно устроен иначе — модель распространяется под Coqui Public Model License, некоммерческой по умолчанию.
| Движок | Железо | Клонирование голоса | Лицензия |
|---|---|---|---|
| Piper | CPU | нет | GPL-3.0 (движок, форк piper1-gpl) |
| Silero | CPU | нет | см. репозиторий проекта |
| XTTS-v2 | GPU, от 6 ГБ VRAM | да | CPML, некоммерческая по умолчанию |
Дальше — установка первых двух и XTTS для тех, кому нужны качество и клонирование.
Развернуть за пару минут
Готовый образ на VPS MAATRIX: NVMe, AMD EPYC, root-доступ. Локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.
Развернуть WhisperБыстрый путь: Piper на CPU за пять минут
Ставим в изолированном окружении, чтобы не тащить зависимости в системный Python:
python3 -m venv /opt/tts/venv
/opt/tts/venv/bin/pip install piper-tts
Голосовые модели не входят в пакет — их скачивают отдельно с huggingface.co/rhasspy/piper-voices. Для русского берём среднее качество (22050 Гц, баланс размера и естественности):
mkdir -p /opt/tts/voices && cd /opt/tts/voices
wget https://huggingface.co/rhasspy/piper-voices/resolve/main/ru/ru_RU/irina/medium/ru_RU-irina-medium.onnx
wget https://huggingface.co/rhasspy/piper-voices/resolve/main/ru/ru_RU/irina/medium/ru_RU-irina-medium.onnx.json
Каждой модели нужны оба файла — .onnx с весами и .onnx.json с конфигурацией фонем; без второго Piper откажется стартовать. Синтез — это конвейер: текст на вход, файл на выход.
echo 'Сервер принял запрос и начал синтез.' | \
/opt/tts/venv/bin/piper --model /opt/tts/voices/ru_RU-irina-medium.onnx \
--output_file /tmp/out.wav
Через пару секунд на выходе WAV с голосом Ирины. Для второго диктора — ru_RU-denis-medium — та же схема, просто другая пара файлов. Ограничение честное: Piper не клонирует голос и не обучается на вашем образце — это набор готовых дикторов, не больше и не меньше.
Путь для качества: XTTS и клонирование голоса на GPU
Исходный пакет Coqui pip install TTS не обновляется — компания Coqui закрылась в начале 2024 года. Актуальный форк сообщества ставится как coqui-tts:
python3 -m venv /opt/xtts/venv
/opt/xtts/venv/bin/pip install coqui-tts
/opt/xtts/venv/bin/python -c "import torch; print(torch.cuda.is_available())"
False в выводе значит, что PyTorch не видит карту — проверьте nvidia-smi и версию CUDA-тулкита раньше, чем разбираться с синтезом. Чекпоинт модели весит на диске около 1,8–1,9 ГБ и при первом запуске спрашивает согласие с лицензией в интерактивном режиме. В сервисе без терминала это подвешивает процесс навсегда — задайте согласие переменной окружения заранее:
export COQUI_TOS_AGREED=1
Клонирование голоса по образцу — несколько строк:
from TTS.api import TTS
tts = TTS("tts_models/multilingual/multi-dataset/xtts_v2").to("cuda")
tts.tts_to_file(text="Готово, сервер озвучил ответ.", speaker_wav="sample.wav",
language="ru", file_path="out.wav")
speaker_wav — чистый образец голоса на 10–20 секунд без музыки и шума; чем чище запись, тем ближе клон. На карте с недостаточной VRAM получите ошибку CUDA out of memory (в актуальных версиях PyTorch — исключение torch.OutOfMemoryError). Для XTTS-v2 разработчики называют ориентиром от 6 ГБ VRAM, комфортно — 8 и больше с запасом под очередь запросов.
Синтез речи как сервис: OpenAI-совместимый API
Держать модель загруженной и отвечать по HTTP проще не писать с нуля. Готовый вариант — openedai-speech: обёртка, которая реализует эндпоинт /v1/audio/speech один в один с TTS API OpenAI и внутри использует Piper или XTTS.
docker run -d --name tts -p 8000:8000 \
-v /opt/tts/voices:/app/voices \
ghcr.io/matatonic/openedai-speech:latest
Соответствие голосов настраивается в voice_to_speaker.yaml — там имена вроде alloy или nova, знакомые по API OpenAI, привязываются к конкретным дикторам Piper или XTTS. Дальше любое приложение, ожидающее TTS API OpenAI, просто указывает свой сервер вместо api.openai.com:
curl -s http://127.0.0.1:8000/v1/audio/speech \
-H "Content-Type: application/json" \
-d '{"model":"tts-1","input":"Привет, мир","voice":"alloy"}' \
--output out.mp3
Для повторяющихся фраз — служебные уведомления, стандартные ответы бота — держите кэш по хешу текста: одна и та же строка озвучивается один раз, а не при каждом запросе. Длинные тексты разбивайте на предложения и синтезируйте по частям — так первый фрагмент аудио готов сразу, а не после обработки всей страницы.
Сервис слушает 127.0.0.1, наружу — только через Nginx с TLS и токеном в заголовке; ufw allow 22/tcp и ufw deny 8000/tcp закрывают порт от прямых обращений из интернета.
Подводные камни: числа, лицензии, клонирование и данные
Числа и сокращения. Движки читают текст как есть: «22.08» превращается в неловкое побуквенное произношение, а «т.д.» не разворачивается в «так далее», как ожидал бы слушатель. Разворачивайте числа и сокращения в слова на этапе подготовки текста — это дешевле, чем чинить интонацию постфактум.
Лицензии — не формальность. Piper распространяется под GPL-3.0 — это лицензия на код движка: она не запрещает генерировать и продавать озвучку синтезом, ограничения касаются распространения модифицированного кода самого движка, а не использования результата. С XTTS сложнее: модель под CPML некоммерческая по умолчанию, а компания, у которой полагалось покупать коммерческую лицензию, закрылась. Формально спросить не у кого — перед платным использованием стоит проконсультироваться с юристом, а не считать, что раз лицензиара нет, ограничение снялось само.
Клонирование чужого голоса. Технически нужно 10 секунд образца — юридически это не значит, что можно клонировать кого угодно. Голос физического лица в ряде трактовок относится к биометрическим персональным данным, и для его использования нужно согласие того, кому голос принадлежит. Для собственного голоса или диктора, начитавшего образец специально для проекта с письменным согласием, вопросов нет.
Диск и память. Синтезированные файлы копятся быстрее, чем кажется: минута речи в WAV 22050 Гц моно — это около 2,5 МБ. При потоковой озвучке настройте очистку временных файлов и ротацию логов заранее, а не когда df -h покажет 100%.
Какой сервер под синтез речи брать в MAATRIX
В каталоге apps.maatrix.io готового образа с движком синтеза пока нет — сервер отдаётся чистым (Ubuntu 24.04 или Debian 12), и Piper, Silero или XTTS вы ставите сами по шагам выше: на Piper уходит пять минут, на XTTS с загрузкой чекпоинта — около получаса. Зато то, что в каталоге есть и разворачивается автоматически при заказе, — whisper, распознавание речи: доступы к нему появляются в личном кабинете сразу, без единой команды в терминале. Если синтез — это половина голосового контура, где вторая половина слушает пользователя, разумно заказать сразу связку STT и TTS на одном сервере; подробно про сборку такого конвейера — в материале про голосового бота на своей модели.
Честный минимум: 2 vCPU, 4 ГБ RAM, 30 ГБ NVMe. Хватает на Piper или Silero с запасом под систему и несколько голосовых моделей — это чисто CPU-нагрузка, GPU не нужен вовсе. Ограничение прямое: параллельные запросы на двух ядрах встают в очередь — для потока уведомлений и озвучки статей этого достаточно, для колл-центра на сотни одновременных звонков нет.
Комфортный вариант: GPU-сервер, 4 vCPU, 16 ГБ RAM, 60 ГБ NVMe, видеокарта от 8 ГБ VRAM. Нужен под XTTS — чекпоинт, кэш моделей и очередь синтеза с клонированием голоса умещаются с запасом. Как подобрать конкретную карту под нагрузку — отдельный разбор в статье про выбор GPU-сервера.
Локация — Великобритания, Лондон. Прямой доступ к Hugging Face при скачивании моделей без прокси и низкий пинг до Европы. Если синтезированный контент с голосами реальных людей должен по 152-ФЗ храниться в России — берите RU-локацию: для офлайн-движка это не создаёт технических ограничений, разница только в маршруте до Hugging Face при установке.
Оплата — картой российского банка, по СБП, криптовалютой или токеном MAAT; иностранная карта для сервера в Лондоне не нужна. Полный список конфигураций — на странице аренды VPS.
Развернуть за пару минут
Готовый образ на VPS MAATRIX: NVMe, AMD EPYC, root-доступ. Локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.
Развернуть WhisperОбсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →Частые вопросы
Нужен ли GPU для синтеза речи на сервере?
Нет, если хватает Piper или Silero — оба рассчитаны на CPU и синтезируют быстрее реального времени на паре ядер. GPU нужен для XTTS: без него клонирование голоса и потоковый синтез становятся заметно медленнее.
Whisper — это же распознавание речи. Зачем он в статье про синтез?
Whisper решает обратную задачу — голос в текст, а не текст в голос. Он пригождается, если синтез стоит рядом с распознаванием в одном голосовом контуре — бот, который слушает и отвечает. В каталоге MAATRIX одной кнопкой поднимается именно Whisper, а движок синтеза вы разворачиваете сами по шагам этой статьи на тот же сервер.
Можно ли использовать XTTS в коммерческом продукте?
Код открыт, но сама модель распространяется под Coqui Public Model License — некоммерческой по умолчанию, а компания-правообладатель, у которой раньше покупали коммерческую лицензию, закрылась. Перед платным использованием стоит свериться с текстом лицензии и проконсультироваться с юристом. Piper под GPL-3.0 такого ограничения на использование готовых голосов не накладывает.
Нужны сами нейросети для контента?
Генерируйте изображения, видео и озвучку нейросетями на falapi.io — десятки моделей в одном окне. Оплата картой РФ и по СБП.