TTS API — синтез речи через REST и WebSocket
Как подключить TTS API за 15 минут — REST и Realtime WebSocket, примеры на Python и curl, цены в рублях. Сравнение GenVoice, SpeechKit и ElevenLabs.
TTS API: синтез речи через REST и WebSocket
Если коротко: чтобы подключить синтез речи через API, зарегистрируйтесь в GenVoice, создайте API-ключ в личном кабинете и отправьте POST-запрос на https://api.genvoice.ru/v1/api/tts с текстом и voice_id — в ответ придёт готовый аудиофайл. Для голосовых ботов и телефонии есть Realtime API через WebSocket: текст передаётся по частям, как от LLM, а аудио возвращается короткими чанками по мере генерации, с низкой задержкой до первого звука. Старт бесплатный — 2 000 символов на балансе при регистрации, баланс не сгорает. Дальше — 5 ₽ за 1 000 символов (эффективно от 3,50 ₽ на пакете Продвинутый).
Я подключал десятки TTS-сервисов в боты и бэкенды, и в этой статье собрал то, что реально нужно разработчику: рабочие примеры на curl и Python, описание Realtime-протокола, честное сравнение с SpeechKit и ElevenLabs и расчёты стоимости в рублях. Все примеры сверены с актуальным API GenVoice.
Хотите подключить прямо сейчас? Создайте API-ключ в GenVoice — 2 000 символов на балансе при регистрации, без привязки карты. Первый запрос к API — за пару минут.
Что такое TTS API и зачем он нужен
TTS API (Text-to-Speech API) — это программный интерфейс синтеза речи: вы передаёте текст, а сервис возвращает озвучку голосом нейросети. В отличие от веб-редактора, API позволяет встроить синтез прямо в код — без ручных действий в браузере.
Типичные задачи, которые решает TTS API:
- Голосовые боты и ассистенты — озвучка ответов в Telegram-ботах, на сайтах, в приложениях.
- IVR и телефония — голосовые меню и автоответчики, которые читают динамический текст (баланс, статус заказа).
- Массовая озвучка контента — генерация аудио для статей, уроков, карточек товаров, рассылок.
- Озвучка интерфейса — доступность (accessibility), проговаривание уведомлений.
- Конвейеры с LLM — текст от языковой модели сразу превращается в речь в реальном времени.
GenVoice даёт два способа интеграции: REST API (запрос → готовый файл) для офлайн-озвучки и Realtime WebSocket API (стриминг текста → стриминг аудио) для интерактивных сценариев с низкой задержкой. Дальше разберём оба.
Как подключить TTS API за 15 минут (REST)
REST-подход — самый простой: один HTTP-запрос отдаёт готовый аудиофайл. Подходит для озвучки статей, рассылок, карточек, любых задач, где не нужна реакция в реальном времени.
Шаг 1. Получите API-ключ
Зарегистрируйтесь в личном кабинете, откройте раздел API и создайте ключ. Он начинается с sk_live_ — используйте его в заголовке Authorization: Bearer <ключ>. Ключ создаётся бесплатно, на балансе уже есть 2 000 символов для тестов.
Шаг 2. Выберите голос
Получите список публичных голосов и возьмите id понравившегося:
curl -s https://api.genvoice.ru/v1/api/voices/public \
-H "Authorization: Bearer sk_live_YOUR_API_KEY"
В ответе придёт массив голосов с полями id, name, gender. Поле id (UUID) — это и есть voice_id для синтеза.
Шаг 3. Синтезируйте речь
Отправьте текст на эндпоинт POST /api/tts. В ответ придёт бинарный аудиофайл:
curl -s https://api.genvoice.ru/v1/api/tts \
-H "Authorization: Bearer sk_live_YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"text": "Привет! Это синтез речи через TTS API GenVoice.",
"voice_id": "9efc2a63-911e-4e19-9d5e-01b0640fc4e6",
"output_format": "mp3_24000_48",
"speed": 1.0
}' \
--output speech.mp3
То же самое на Python:
import requests
resp = requests.post(
"https://api.genvoice.ru/v1/api/tts",
headers={"Authorization": "Bearer sk_live_YOUR_API_KEY"},
json={
"text": "Привет! Это синтез речи через TTS API GenVoice.",
"voice_id": "9efc2a63-911e-4e19-9d5e-01b0640fc4e6",
"output_format": "mp3_24000_48",
"speed": 1.0,
},
timeout=60,
)
resp.raise_for_status()
with open("speech.mp3", "wb") as f:
f.write(resp.content)
Параметры запроса:
| Параметр | Тип | По умолчанию | Описание |
|---|---|---|---|
text |
string | — | Текст для озвучки (лимит символов зависит от тарифа) |
voice_id |
UUID | — | Идентификатор голоса из /api/voices/public или вашего клона |
output_format |
string | mp3_24000_48 |
Пресет формата {кодек}_{частота}_{битрейт}, см. таблицу ниже |
speed |
float | 1.0 |
Скорость речи, 0.5–1.5 |
Формат задаётся пресетом {кодек}_{частота}_{битрейт}. Доступные значения:
| Пресет | Кодек | Когда использовать |
|---|---|---|
mp3_24000_48 |
MP3 24 кГц 48 kbps | По умолчанию, баланс качества и веса |
mp3_44100_64 |
MP3 44.1 кГц 64 kbps | Лучшее качество MP3 |
wav_24000 |
WAV 24 кГц | Без сжатия, для монтажа |
opus_24000_32 |
Opus 24 кГц | Лёгкий вес для веба и мессенджеров |
pcm_24000 / pcm_8000 |
raw PCM | Стриминг, обработка на лету |
ulaw_8000 / alaw_8000 |
µ-law / A-law | Телефония и VoIP |
Проверить остаток баланса можно отдельным запросом:
curl -s https://api.genvoice.ru/v1/api/balance \
-H "Authorization: Bearer sk_live_YOUR_API_KEY"
Это всё, что нужно для базовой интеграции. Списание идёт по факту синтеза — 5 ₽ за 1 000 символов.
Нужен ли вам Realtime TTS API через WebSocket
REST отлично подходит, когда текст известен заранее и можно подождать готовый файл. Но для голосовых ботов, ассистентов и телефонии важна низкая задержка до первого звука и возможность прервать речь, когда заговорил пользователь. Для этого у GenVoice есть Realtime API через WebSocket.
| Критерий | REST API | Realtime API (WebSocket) |
|---|---|---|
| Протокол | HTTP | WebSocket |
| Отправка текста | Весь текст целиком | По частям, потоково |
| Получение аудио | Файл целиком после синтеза | Чанками по мере готовности |
| Задержка до первого аудио | Высокая (весь текст → весь файл) | Низкая (первые слова → первый чанк) |
| Прерывание | Невозможно | Мгновенное через interrupt |
| Несколько фраз | Отдельный запрос на каждую | В одной сессии без переподключения |
| Когда выбрать | Озвучка контента, рассылки, файлы | Голосовые боты, IVR, стриминг от LLM |
Эндпоинт: wss://api.genvoice.ru/v1/api/tts/stream. Логика общения событийная: вы открываете сессию, потоково шлёте текст, сервер потоково отдаёт аудио.
Как устроен протокол
Обмен идёт JSON-сообщениями с полем event:
session.begin— клиент открывает сессию: передаётapi_key,voice_id,output_format.session.ready— сервер подтвердил, можно слать текст.text.chunk— клиент шлёт кусок текста (сflush: true, чтобы форсировать синтез).audio.chunk— сервер отдаёт фрагмент аудио в base64 с полемsequence(порядковый номер). Каждый чанк содержит примерно 200 мс звука — это размер фрагмента стриминга, а не задержка.text.end→generation.complete— текст закончился, синтез завершён, сессия снова в READY.interrupt— в любой момент прервать текущую генерацию (для голосовых ботов).
Низкую задержку до первого аудио обеспечивает буфер сервера: как только накопилось около 120 символов или встретилась граница предложения, сервер начинает синтез, не дожидаясь конца текста.
Минимальный клиент на Python
Пример отправляет текст и собирает аудио из чанков (полный клиент с обработкой interrupt и keepalive — в документации Realtime API):
import asyncio, base64, json, wave
import aiohttp
WS_URL = "wss://api.genvoice.ru/v1/api/tts/stream"
async def synthesize(text: str, out: str = "stream.wav") -> None:
async with aiohttp.ClientSession() as session:
async with session.ws_connect(WS_URL) as ws:
await ws.send_json({
"event": "session.begin",
"api_key": "sk_live_YOUR_API_KEY",
"voice_id": "9efc2a63-911e-4e19-9d5e-01b0640fc4e6",
"output_format": "pcm_24000",
})
ready = json.loads((await ws.receive()).data)
if ready.get("event") != "session.ready":
raise RuntimeError(ready)
await ws.send_json({"event": "text.chunk", "text": text, "flush": True})
await ws.send_json({"event": "text.end"})
parts: list[bytes] = []
while True:
data = json.loads((await ws.receive()).data)
if data["event"] == "audio.chunk":
parts.append(base64.b64decode(data["audio"])) # воспроизводите по мере прихода
elif data["event"] == "generation.complete":
break
elif data["event"] == "error":
raise RuntimeError(data)
with wave.open(out, "wb") as wf:
wf.setnchannels(1); wf.setsampwidth(2); wf.setframerate(24000)
wf.writeframes(b"".join(parts))
asyncio.run(synthesize("Привет! Это потоковый синтез речи."))
В боевом сценарии вы не накапливаете аудио в файл, а сразу отдаёте декодированные байты в плеер или в телефонию — за счёт этого пользователь слышит ответ почти сразу после первых слов.
Форматы для телефонии
Realtime отдаёт raw-аудио без заголовков, в том числе форматы для VoIP:
| Формат | Частота | Применение |
|---|---|---|
pcm_24000 |
24 кГц | Высокое качество, веб и приложения |
pcm_16000 / pcm_8000 |
16 / 8 кГц | Лёгкий стриминг |
ulaw_8000 |
8 кГц | µ-law для телефонии (Asterisk, FreeSWITCH) |
alaw_8000 |
8 кГц | A-law для VoIP-систем |
Поддержка µ-law/A-law означает, что GenVoice подключается к телефонии напрямую, без перекодирования.
Какой TTS API выбрать: GenVoice, SpeechKit или ElevenLabs
Три популярных варианта для русскоязычных проектов. Главные отличия — качество русского, наличие Realtime/streaming и цена в рублях.
| Критерий | GenVoice | Яндекс SpeechKit | ElevenLabs |
|---|---|---|---|
| Русские голоса | 70+ нейроголосов | ~10 голосов | мало, русский неродной |
| Клонирование голоса | Да, от 3 сек | Нет (в публичном API) | Да |
| Realtime / streaming | Да, WebSocket + interrupt |
Да (gRPC streaming) | Да |
| Форматы телефонии | µ-law / A-law 8 кГц | Да | Ограниченно |
| Цена за 1 000 символов | 5 ₽ (эфф. от 3,50 ₽) | ~1,3–4 ₽ по объёму | ~16–19 ₽ с курсом и комиссией |
| Оплата из РФ | Картой РФ | Yandex Cloud | Только в валюте, посредник |
| Бесплатный старт | 2 000 символов | требует платёжный аккаунт | 10 000 символов |
Коротко: SpeechKit дёшев на больших объёмах, но привязан к экосистеме Yandex Cloud и сложнее в подключении. ElevenLabs силён в английском, но дорог и неудобен в оплате из России. GenVoice — баланс между ценой, качеством русского, простой оплатой и наличием Realtime с клонированием.
Сколько стоит TTS API: расчёты в рублях
Синтез в GenVoice стоит 5 ₽ за 1 000 символов на всех тарифах. На пакетах действует бонус к балансу, который снижает эффективную цену:
| Тариф | Цена пакета | Зачисляется на баланс | Лимит символов/запрос | Эфф. цена за 1 000 |
|---|---|---|---|---|
| Бесплатный | 0 ₽ | 2 000 символов при регистрации | 500 | 5 ₽ |
| Старт | 199 ₽ | 210 ₽ (~42 000 символов) | 1 000 | ~4,71 ₽ |
| Базовый | 499 ₽ | 600 ₽ (~120 000 символов) | 2 000 | ~4,16 ₽ |
| Продвинутый | 1 499 ₽ | 2 140 ₽ (~428 000 символов) | 5 000 | ~3,50 ₽ |
Баланс не сгорает — платите только за фактически синтезированные символы. Прикинем на типовых сценариях:
- Telegram-бот, 500 ответов по 200 символов в день — 100 000 символов/мес ≈ 350–500 ₽/мес.
- IVR / автоответчик, 30 фраз по 120 символов, 2 000 звонков/мес — ~7,2 млн символов — это уже B2B-объём; для таких нагрузок есть постоплата от 3 ₽ за 1 000 символов со скидкой за коммит объёма.
- Озвучка курса, 50 уроков по 4 000 символов — 200 000 символов ≈ 700–1 000 ₽ разово на пакете Продвинутый.
Для больших и предсказуемых объёмов есть постоплатный тариф для бизнеса — от 3 ₽ за 1 000 символов с дополнительной скидкой за коммит объёма (фиксируете планируемый месячный объём — получаете цену ниже) и повышенными лимитами (до 120 запросов в минуту). Его подключают индивидуально под нагрузку.
Можно ли клонировать голос и использовать его через API
Да. Вы загружаете образец голоса от 3 секунд в веб-интерфейсе, GenVoice создаёт клон и выдаёт его voice_id. Дальше клон используется в API точно так же, как публичный голос — и в REST (POST /api/tts), и в Realtime (session.begin). Один клон доступен даже на бесплатном тарифе для теста; на Старте — 3, на Базовом — 10, на Продвинутом — 25 клонов. Коммерческое использование клона — с тарифа Старт.
Подробно процесс разобран в статье клонирование голоса нейросетью.
Как обрабатывать ошибки и лимиты TTS API
Боевая интеграция должна корректно реагировать на ответы сервера. GenVoice возвращает стандартные HTTP-коды с JSON-телом {"detail": "..."}:
| Код | Что значит | Что делать |
|---|---|---|
401 |
Недействительный или отсутствующий API-ключ | Проверьте заголовок Authorization: Bearer sk_live_... |
400 |
Некорректный запрос: неверный voice_id или текст длиннее лимита тарифа |
Проверьте параметры, разбейте длинный текст |
402 |
Недостаточно средств на балансе | Пополните баланс, заранее проверяйте /api/balance |
403 |
Модель недоступна для вашего тарифа | Смените модель или повысьте тариф |
408 |
Превышено время ожидания синтеза | Повторите запрос (короткий текст синтезируется быстрее) |
429 |
Превышен лимит запросов (RPM или одновременные) | Сделайте паузу и повторите с экспоненциальной задержкой |
502 |
Ошибка воркера синтеза | Повторите запрос; при повторении — напишите в поддержку |
Лимит запросов зависит от тарифа: на Бесплатном — 5 запросов/мин и 1 одновременный, на Старте — 8, на Базовом — 10, на Продвинутом — 30 запросов/мин. Для WebSocket действует лимит одновременных сессий: 1 / 2 / 3 / 5 соответственно.
Простой ретрай на 429 и 502 с экспоненциальной паузой:
import time
import requests
def synthesize_with_retry(payload: dict, api_key: str, attempts: int = 4) -> bytes:
for i in range(attempts):
resp = requests.post(
"https://api.genvoice.ru/v1/api/tts",
headers={"Authorization": f"Bearer {api_key}"},
json=payload,
timeout=60,
)
if resp.status_code in (429, 502) and i < attempts - 1:
time.sleep(2 ** i) # 1, 2, 4 секунды
continue
resp.raise_for_status()
return resp.content
raise RuntimeError("TTS API не ответил после нескольких попыток")
Частые ошибки при интеграции TTS API
На что обычно тратят время при подключении — и как этого избежать:
- Превышение лимита символов на запрос. Лимит зависит от тарифа: 500 (Бесплатный), 1 000 (Старт), 2 000 (Базовый), 5 000 (Продвинутый). Длинный текст разбивайте на части на стороне клиента и склеивайте аудио.
- Забыли
flushв Realtime. Безflush: trueсервер ждёт, пока накопится буфер или граница предложения. Если шлёте короткую финальную фразу — ставьтеflush, иначе аудио задержится доtext.end. - Не дочитали канал после
interrupt. После отправкиinterruptнужно продолжать читать сообщения доgeneration.interrupted: в канале могут быть уже отправленныеaudio.chunk— их вычитывают, но не воспроизводят. Иначе протокол рассинхронизируется. - Таймауты на длинных сессиях. Для долгих WebSocket-соединений (бот ждёт ввода) шлите
pingкаждые 15 секунд, иначе сессия закроется по неактивности. - Неверные параметры WAV. Realtime отдаёт raw-аудио без заголовков. При сохранении в WAV ставьте параметры под формат: для
pcm_24000— 1 канал, 2 байта, 24 000 Гц. - Хранение ключа в коде фронтенда.
sk_live_-ключ — секрет. Держите его на бэкенде, не в браузерном JS.
Частые вопросы
Что такое TTS API простыми словами? TTS API (Text-to-Speech API) — это программный интерфейс, который превращает текст в речь по HTTP- или WebSocket-запросу. Вы отправляете текст и идентификатор голоса, а в ответ получаете аудиофайл или поток аудио. Это позволяет встроить синтез речи в чат-бота, IVR, приложение или сайт без ручной записи диктора.
Есть ли у GenVoice realtime / streaming TTS API?
Да. Кроме обычного REST-эндпоинта POST /api/tts, есть Realtime API через WebSocket (wss://api.genvoice.ru/v1/api/tts/stream). Текст передаётся по частям, как от LLM, а аудио возвращается чанками по мере генерации — с низкой задержкой до первого звука и возможностью мгновенно прервать речь. Это нужно для голосовых ботов, ассистентов и телефонии.
Сколько стоит TTS API в России? В GenVoice синтез стоит 5 ₽ за 1 000 символов, а на пакете Продвинутый эффективная цена снижается примерно до 3,50 ₽ за счёт бонуса к балансу. При регистрации на баланс начисляется 2 000 символов бесплатно, баланс не сгорает. Для сравнения, ElevenLabs обходится примерно в 16–19 ₽ за 1 000 символов с учётом курса и комиссии посредника.
Какой TTS API лучше для русского языка? Для русского языка лучше всего работают GenVoice и Яндекс SpeechKit — их модели обучены на русскоязычных данных. ElevenLabs оптимизирован под английский, русский звучит менее естественно. GenVoice предлагает 70+ русских нейроголосов и клонирование, SpeechKit — около 10 голосов.
Можно ли клонировать голос и использовать его через API?
Да. В GenVoice вы загружаете образец голоса от 3 секунд в веб-интерфейсе, получаете voice_id клона и используете его в API так же, как публичный голос — и в REST, и в Realtime. Клонирование одного голоса доступно даже на бесплатном тарифе для теста.
Готовы интегрировать TTS API? Зарегистрируйтесь в GenVoice — REST для озвучки контента, WebSocket для голосовых ботов, 2 000 символов бесплатно при регистрации.
Озвучьте свой текст прямо сейчас
Первые ~2 000 символов бесплатно. Выберите голос, вставьте текст — и получите готовую дорожку за минуту.
Перейти в редактор синтеза