MAATRIX / Блог / Как поднять синтез речи на своём сервере

Как поднять синтез речи на своём сервере

Как поднять синтез речи на своём сервере

MAATRIX

Публичные TTS-сервисы берут плату за каждый символ и получают ваш текст на входе — для приватного контента, ботов и потоковой озвучки это неудобно вдвойне. Синтез речи на сервере снимает оба ограничения: движок работает на вашем железе, текст никуда не уходит, а озвучка не тарифицируется по объёму. Разберём три рабочих движка — Piper, Silero и XTTS, — установку каждого и то, как обернуть синтез в API, которым пользуются приложения.

Обсудить статью, задать вопрос или начать новую тему

Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество 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, некоммерческой по умолчанию.

ДвижокЖелезоКлонирование голосаЛицензия
PiperCPUнетGPL-3.0 (движок, форк piper1-gpl)
SileroCPUнетсм. репозиторий проекта
XTTS-v2GPU, от 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 — десятки моделей в одном окне. Оплата картой РФ и по СБП.