Сервис работает в тестовом режиме — идёт бета-тестирование. Возможны ошибки.
Главная/Документация API

API-документация для интеграций

REST API для озвучки, потоковой генерации, каталога голосов, создания своего голоса и расшифровки.

# Синтез речи (voice — id из GET /api/v1/voices) curl https://golosar.tech/api/v1/tts \ -H "X-API-Key: $GOLOSAR_KEY" \ -H "Content-Type: application/json" \ -d '{ "voice": "ru_n16", "text": "Привет! Это Голосарь.", "language": "ru" }' --output out.wav
import fs from "fs"; const response = await fetch("https://golosar.tech/api/v1/tts", { method: "POST", headers: { "X-API-Key": process.env.GOLOSAR_KEY, "Content-Type": "application/json" }, body: JSON.stringify({ voice: "ru_n16", text: "Привет! Это Голосарь.", language: "ru" }) }); const audio = Buffer.from(await response.arrayBuffer()); await fs.promises.writeFile("out.wav", audio);
import os, requests response = requests.post( "https://golosar.tech/api/v1/tts", headers={ "X-API-Key": os.environ["GOLOSAR_KEY"], "Content-Type": "application/json", }, json={ "voice": "ru_n16", "text": "Привет! Это Голосарь.", "language": "ru", }, ) open("out.wav", "wb").write(response.content)
REST
интерфейс интеграции
Движок
генерация озвучки
257
голосов в каталоге
WAV
формат API-ответа
Возможности

Создано для интеграции

Синхронная генерация

POST-запрос возвращает готовый WAV-файл.

REST без SDK

Примеры для cURL, Node.js и Python через обычный HTTP.

Потоковый режим

Отдельный endpoint для streaming-сценариев.

10 языков + Auto

Один эндпоинт, параметр language: русский, английский, немецкий, французский, испанский, итальянский, португальский, китайский, японский и корейский.

Системные, свои и из маркетплейса

Используйте библиотеку, свои голоса (клоны) и голоса, купленные в маркетплейсе (GET /voices/mine).

РФ-хостинг

Серверы в России, 152-ФЗ.

Справочник

API v1 — эндпоинты

GET/api/v1/voicesКаталог голосов: id, имя, язык, пол, стиль, лицензия, метка, ссылка на пример звука (sample_url) и портрет голоса (avatar_url). Обе ссылки абсолютные. Для голосовых агентов есть измеренные показатели: timbre_spread — насколько уезжает САМ ТЕМБР между репликами (ниже 0,44 — обычный разброс одного голоса; 0,44 и выше — расстояние, сопоставимое с расстоянием до другого человека), timbre_spread_worst — худший случай из замеров (порог 0,55), stability (stable · ok · drifting) и pitch_hz — средняя высота. Готовый вердикт — в поле recommended_for_agents: true у голосов, пригодных для живого разговора; ровно по нему работает фильтр ?use=agent, а на витрине стоит метка «Для агентов». Есть и фильтр ?stability=stable, но он судит по высоте и для диалога менее показателен. Движок синтезирует каждую фразу заново, и у части голосов звучание гуляет так, что собеседник слышит «разных людей». ⚠️Мы промерили весь каталог, но из общей выдачи голоса с уехавшим тембром не вырезаются (с 11.10.2026): для живого разговора берите фильтр ?use=agent — он отдаёт только проверенные. Ориентируйтесь на timbre_spread: он важнее герц, потому что голос с образцовой высотой может уплывать тембром. По умолчанию отдаётся 200 голосов — за остальными приходите с ?limit=500 или листайте через offset; общее число в поле total. Поле sample_rate — частота ФАЙЛА для линии этого голоса, полученная ЗАМЕРОМ; null означает «у линии замер не делали», а не «наверное, 24 000». ⚠️Точное значение каждого ответа всегда приходит в заголовке X-Sample-Rate — он читается из самого файла и главнее каталога, а поток может отличаться от файла. library — код линии, на которой работает голос. Значения не зашивайте: состав линий меняется, а какая обслуживает голос сейчас — видно в этом же поле ответа
GET/api/v1/voices/mineВаши голоса: приватные клоны (созданные вами) + купленные на маркетплейсе. Требует ключ. Приватные голоса других аккаунтов сюда НЕ попадают и в общий каталог не светятся
POST/api/v1/ttsСинтез речи → WAV или MP3 (параметр format)
POST/api/v1/tts_streamПотоковый синтез (chunked PCM) — чистый поток без пост-эффектов и без mp3. Для короткой реплики (до ~60 знаков) первый звук приходит примерно через 0,8 секунды; текст длиннее идёт кусками по ~90 знаков, и первый кусок приходит позже (около 1,3 с на 128 знаках). Быстрая подача включена по умолчанию (с 27.08.2026). Живая интонация — "mode": "expressive", свой instruct или emotion (с 18.10.2026 поле читается и в потоке), но тогда звук придёт только в конце генерации. Символы в потоке списываются по длине присланного текста целиком, включая маркеры пауз
POST/api/v1/voices/createСоздать голос: name (≤80), audio_b64 (до 10 МБ САМОГО файла), ref_text (=аудио слово-в-слово, ≤2000), consent="voice-data-consent,privacy", language? → voice id. Прежний путь /api/v1/voices/clone продолжает работать как алиас
POST/api/v1/transcribeРасшифровка короткого фрагмента: audio_b64, language? (полное имя) → текст. Длительность учитывается в месячном лимите минут расшифровки тарифа
POST/api/v1/voice-designГолос по описанию: description (по-русски, до 600 знаков), chips? → попытка в очереди (202). 1 500 знаков, 3 варианта за ~3–4 мин
GET/api/v1/voice-design?id=…Состояние попытки: status, progress, variants[].audio_url, sample_text; без id — последние попытки и список chips
GET/api/v1/statusГотовность движка (real-time агенты): ready, model_ready, latency_ms, status (ok · degraded · maintenance · engine_down), maintenance, retry_after_seconds; при неполадках добавляются note и eta
POST/api/v1/warmupПрогрев движка перед сессией звонков (без списания символов)
POST/api/v1/audio/speechOpenAI-совместимый синтез: {input, voice, response_format?, speed?, seed?} — тот же синтез, оплата и проверки, что у /api/v1/tts (см. Совместимость с OpenAI)
GET/api/v1/audio/voicesКаталог голосов в формате интеграторов: {"voices":[{"name","gender":"f|m","description","language"}]}; только опубликованные голоса витрины. Требует ключ
POST/api/v1/singСнят: песни — отдельный сервис «Споём». Ответ 410 moved_to_service, адрес сервиса — в поле service_url и заголовке Location

GET /api/v1/voices — фильтры: q (поиск по названию, стилю, описанию И по идентификатору голоса), language (ru, en, de…), gender (male/female), stability, use=agent, library (код линии; значения приходят в поле library у голосов — не зашивайте список, линии включают и выключают), limit (по умолч. 200, макс. 500), offset ИЛИ page (1-я страница = 1; при обоих главенствует offset). Ответ сам называет свою пагинацию: limit, offset, page (фактическая), has_more, total. Поле voice из ответа передавайте в POST /tts.

⚠️Линия голоса. Сейчас у всех голосов одна линия — поле library в ответе каталога равно "universal". Не зашивайте код линии в интеграцию: если в каталоге появится вторая линия, голоса неактивной русской линии из выдачи не отдаются, их число придёт в поле ru_old_line_hidden, а запрос голоса по идентификатору (?q=…) вернёт блок unavailable с reason — тем кодом, которым ответит синтез. Пока линия одна, этих полей в ответе нет.

Свои голоса (приватные). Клон, который вы создали (в кабинете или через POST /voices/create), привязан к вашему аккаунту и в общий каталог GET /voices НЕ попадает — другие клиенты его не видят. Чтобы получить список своих голосов программно (и их voice-id для синтеза), вызывайте GET /api/v1/voices/mine со своим ключом — он вернёт только ВАШИ клоны и купленные голоса. Синтез своим голосом: передайте его voice в POST /tts с тем же ключом — озвучить его сможет только ваш аккаунт (чужой ключ получит 403). Публичный GET /voices при этом остаётся строго каталогом.

# GET /api/v1/voices?language=ru&gender=male&limit=200 { "object": "list", "total": 152, "count": 152, "voices": [ { "voice": "ru_n16", "name": "Александр", "language": "ru", "gender": "male", "style": "глубокий", "license": "commercial", "badge": null, "sample_url": "https://golosar.tech/voice-previews/lib/ru_n16.wav" } ] }

Два поля, которые стоит проверять перед синтезом. license: commercial — голос можно использовать в проектах; noncommercial — демонстрационный (исследовательский) голос: в редакторе его можно слушать, но нельзя выгрузить; по API ограничение пока не применяется — используйте такие голоса только для проб, не для публикации. badge: null — обычный голос; beta — работает, качество языка дорабатывается; soon — синтез этим голосом временно отключён, запрос вернёт ошибку voice_not_available_yet. Отфильтруйте такие голоса на своей стороне, если строите список выбора для пользователя.

Свои голоса

Доступ к своим (созданным) голосам

Голос, который вы создали (клон), приватный: он привязан к вашему аккаунту, в общий каталог GET /voices не попадает, и озвучить им может только ваш аккаунт по вашему ключу (чужой ключ → 403). Доступ к своим голосам — по ключу, в три шага:

Шаг 1Создайте API-ключ в кабинете → раздел «API» (нужен тариф Про и выше). Это тот же ключ, что и для синтеза.
Шаг 2GET /api/v1/voices/mine со своим ключом → список только ваших голосов (созданные вами клоны + купленные на маркетплейсе). Поле voice — это id для синтеза.
Шаг 3POST /api/v1/tts с тем же ключом и voice = id вашего голоса → аудио вашим голосом. Язык берётся из самого голоса (запись клона), параметр language для своего голоса игнорируется.

Новый голос, созданный позже, появляется в /voices/mine автоматически — переподключать ключ не нужно. Публичный GET /voices при этом остаётся строго каталогом (приватные голоса в него не подмешиваются).

# Шаг 2 — список своих голосов curl -H "X-API-Key: <ваш ключ>" https://golosar.tech/api/v1/voices/mine # Ответ { "object": "list", "count": 2, "voices": [ { "voice": "voice-7a6b08", "name": "Мой голос", "language": "Russian", "gender": "male", "kind": "own", "sample_url": "https://golosar.tech/voice-previews/voice-7a6b08.wav", "avatar_url": "https://golosar.tech/voice-avatars/voice-7a6b08.webp" } ] } # Шаг 3 — синтез своим голосом (voice = поле из ответа выше) curl -X POST https://golosar.tech/api/v1/tts -H "X-API-Key: <ваш ключ>" -H "Content-Type: application/json" -d '{"voice":"voice-7a6b08","text":"Привет из моей программы"}' --output out.wav
Доступ

Аутентификация

Все эндпоинты требуют API-ключ: заголовок X-API-Key: <ключ> или Authorization: Bearer <ключ> (кроме GET /api/v1/voices и GET /api/v1/status — открыты). Ключ создаётся в кабинете → раздел «API»; API доступен с тарифа Про и выше (иначе 403). Синтез списывает символы с тарифа ключа — при нулевом балансе возвращается 402. Лимит частоты — по тарифу: Про — 120 запросов/мин, Бизнес — 300, Студия — 600 (фолбэк 60); превышение → 429, заголовок Retry-After.

POST /api/v1/tts

Параметры

voiceid голоса из GET /api/v1/voices — обязателен. Без него или при неизвестном/недоступном id → 403: выберите и проверьте id заранее по /api/v1/voices
textтекст для озвучки (обязательно; синоним поля — speaker для голоса, см. ниже). Тарифный лимит — на запрос в целом. Длинный плоский текст сервис сам режет по предложениям на части (одна генерация движка — до [object Promise] символов) и склеивает в один файл; синхронно уходит до 5 частей, сверх этого запрос вернёт 400 text_too_long_for_sync без списания — тогда передавайте текст массивом segments или несколькими запросами. Если движок всё же отверг слишком длинную часть — text_too_long_for_line. Поддерживает маркер паузы: ‖N‖ — пауза N секунд (от 0,05 до 5, например ‖1.5‖; не больше 150 пауз на запрос), голый ‖ — 0,4 с. Метка звука или музыки ♪Скрип двери♪ — на этом месте прозвучит звук из каталога (/zvuki/katalog.json, поле imya; музыка — несколько секунд с затуханием); метка не читается вслух и не оплачивается, неизвестное имя убирается и даёт X-Effects-Failed: zvuk. В массиве segments звук — отдельный элемент {"zvuk": "Скрип двери"}. В одном запросе — не больше 20 звуков, иначе 400 too_many_sounds (символы не спишутся). Сколько символов списано за ответ — в заголовке X-Chars-Charged (метки, паузы и знаки ударения в счёт не входят). Поток /api/v1/tts_stream звуки не вставляет — метки в нём просто вырезаются
languageязык: ru, en, de, fr, es, it, pt, zh, ja, ko (или ru-RU, en-US), либо auto — автоопределение языка по тексту. Для голоса из каталога язык берётся из самого голоса. По умолч. ru
instructэмоция/стиль по-английски, напр. "calm, friendly" (опц.; до 500 символов, дальше обрезается)
emotionэмоция: joyful, excited, tender, calm, sad, serious, tense, angry, afraid, surprised. Работает на любом голосе каталога — эмоцию играет модель; сила подачи преднастроена для каждого голоса. Тембр в целом сохраняется, при яркой эмоции возможен лёгкий сдвиг звучания (размен движка: точность тембра ↔ управляемость интонации). Явный instruct имеет приоритет над emotion (опц.; без параметра — базовая эмоция голоса или нейтрально). Действует одинаково в /tts и /tts_stream (в потоке — с 18.10.2026). Эмоция включает живую подачу: синтез идёт целой фразой, и в потоке звук приходит в конце генерации (см. mode) — для живого разговора шлите реплику без эмоции. Незнакомое значение — 400 unsupported_emotion со списком допустимых, символы не списываются. Явный быстрый режим сильнее эмоции: при "mode": "fast" (или "instruct": "") подача остаётся быстрой, эмоция не применяется, и ответ несёт X-Effects-Failed: emotion. При segments эмоция достаётся сегментам без своего instruct; сегмент со своим instruct остаётся при нём.
saturationнасыщение/гармоническая «подцветка» тембра (пост-обработка): {"preset":"tube"|"tape"|"air","intensity":0–1} (опц.)
speedтемп речи 0.5–2.0 (опц.). Значение вне диапазона не отбрасывается, а приводится к ближайшей границе, и в ответе появляется X-Effects-Failed: speed — запрос не падает, но результат будет не тем, что вы просили
modeрежим подачи (опц.): "fast" — первый звук приходит сразу (~0,8 с для короткой реплики; замер 13.09.2026 снаружи через сайт, две пробы — 0,79 и 0,81 с), подача ровная; на тексте длиннее ~60 знаков поток идёт кусками, и первый кусок приходит позже; "expressive" — живая интонация, но звук отдаётся только в КОНЦЕ генерации, поэтому реплика в 480 знаков даёт около 10 секунд тишины. По умолчанию fast (с 27.08.2026; раньше умолчанием был expressive, и это ломало голосовых агентов: платформа не дожидалась ответа и рвала связь). Для живых разговоров и телефонии ничего указывать не нужно. Выразительность включается явно: "mode": "expressive", свой instruct или emotion — любое из трёх переключает подачу в живую (ответ несёт X-Voice-Mode: expressive); исключение — явный "mode": "fast" или "instruct": "", они сильнее эмоции (см. emotion). До 18.10.2026 emotion в потоке не читался, а в /tts без mode гасился быстрым режимом — исправлено, пути ведут себя одинаково. Принимаются также синонимы: "slow" = expressive, "realtime" = fast
gain_dbгромкость −24…+24 дБ (опц.). В синхронном /tts аудио приводится к ровному уровню (≈ −16 дБ), а gain_db сдвигает его. В потоковом /tts_stream звук идёт как синтезирован (он ровный сам по себе, разброс между репликами ~3 дБ), gain_db просто усиливает. ⚠️Замер 24.08: до +6 дБ чисто, при +12 дБ появляются искажения на пиках (0,2% сэмплов упираются в потолок) — для телефонии держите 0, при необходимости не выше +6
eqэквалайзер тембра: {"bands":[{"hz":80,"db":4}, …]} (опц.); также принимается сокращённая форма { low, mid, high } (дБ) и произвольные полосы hz строго 0 < hz < 12000 (границы 0 и 12000 исключены — такая полоса молча отбрасывается); db −12…+12
effectпресет звучания: clean (шумоочистка — то же, что отдельный параметр clean:true; указывать что-то одно), radio, audiobook, podcast, phone, cinematic, megaphone, vintage, deep, bright, warm, narrator_warm, intimate, spacious, whisper, concert; характеры: robot, cartoon, chipmunk, monster, villain, echo_hall; студийные: studio_announcer, studio_natural, studio_rich; куда публикуете (громкость в норму площадки): pub_shorts, pub_youtube, pub_audiobook, pub_news, pub_documentary, pub_asmr, pub_deesser; книги по жанру (−20 LUFS, пик ≤ −3): book_skazka, book_detektiv, book_uzhasy, book_fentezi, book_klassika, book_lekciya. Премиум-эффекты (характеры, студийные, cinematic, concert, megaphone, vintage) — только на платных тарифах, иначе игнорируются (опц.)
seedцелое 0…2147483647 для детерминированного повтора одной и той же озвучки; вне диапазона — игнорируется (опц.). Важно для интеграций: если seed не передан, по API подставляется фиксированное значение — одинаковый запрос даёт одинаковый звук по умолчанию. Нужна вариативность между репликами — передавайте разные seed явно
cleantrue — нейро-шумоподавление (отдельный параметр; не путать с effect:"clean", опц.)
backgroundфон/атмосфера: rain, thunder, sea, forest, wind, stream, night, street, cafe, crowd, fire; добавлены 13.10: swamp_night, meadow, field_birds, surf, downpour, rain_thunder, rain_tent, rain_drain, blizzard, park, market, fair, station, subway, airport_hall, airport_announce, clock_room, rain_window, storm_house, kitchen_diner, library, old_wood, manor_night, train_car, metro_car (опц.)
bg_levelгромкость фона 0.05–0.8 (опц., по умолч. 0.25)
lead_silence_msтишина в начале аудио, мс (опц., для агентов; по умолч. 0, макс. 5000)
format"wav" (по умолч.) или "mp3" (опц.)
response_formatтелефонные кодеки: g711_alaw_8k, g711_ulaw_8k, g722_16k, opus, pcm_s16le_24k — конвертация поверх синтеза для телефонии/SIP; имеет приоритет над format=mp3; фактический формат приходит в заголовке ответа X-Audio-Format (опц.)
container"wav" (по умолч.) или "raw" — обёртка для телефонного response_format: wav-контейнер (удобно плеерам) или сырые кадры кодека под SIP/RTP. Действует на g711_alaw_8k, g711_ulaw_8k и pcm_s16le_24k. На g722_16k и opus не влияет: G.722 в wav-обёртке не играется, поэтому всегда отдаётся сырым (audio/G722), а opus всегда приходит в ogg-контейнере (audio/ogg, при raw — audio/opus)
segmentsальтернатива text — массив [{ text, instruct?, silence? }] (до 301 элементов — 150 пауз; тот же формат, что в /tts_stream) для пофразовой интонации; куски синтезируются и склеиваются в один файл, эффекты/фон/mp3 накладываются на целое. Интонация фрагмента задаётся через instruct (эмоция per-сегмент как отдельное поле не применяется). Пауза: пауза-сегмент { silence: N } даёт точную тишину N мс (0–5000) в обоих эндпоинтах; сегмент с обоими полями text и silence тоже работает — текст озвучивается, пауза ставится после него. Символы списываются по сумме длин text сегментов (опц.)

Ответ — бинарный аудиофайл: audio/wav или audio/mpeg (если format=mp3). Передавайте либо text, либо segments.

Рецепт

Голосовой агент (real-time)

Озвучка реплик бота с минимальной задержкой. Шаги: (1) один раз подобрать стабильный голос, (2) на каждую реплику — потоковый синтез.

1. ГолосGET /api/v1/voices?use=agent — вернёт голоса, проверенные для живого разговора (по ним ровный тембр между репликами). Возьмите voice первого подходящего пола и запомните.
2. ПроверкаGET /api/v1/status перед стартом сессии: ready:true — можно синтезировать.
# на каждую реплику бота — потоковый синтез (первый звук ~0,8 с) curl -N -X POST https://golosar.tech/api/v1/tts_stream -H "X-API-Key: <ключ>" -H "Content-Type: application/json" -d '{ "voice": "ru_n16", "text": "Здравствуйте! Чем помочь?", "mode": "fast" }' # ответ — сырой PCM 24 кГц, играйте по мере прихода. Заголовок X-Voice-Warning = смените голос.
Рецепт

Длинный текст по частям

Длинный текст можно отправить целиком — сервис сам режет его по предложениям (одна генерация движка ≤[object Promise] знаков, синхронно до 5 частей). Делите на главы сами, когда нужен контроль пауз и отдельные файлы; паузы между абзацами — маркером ‖ или сегментами с silence.

# кусок главы + пауза 500 мс между абзацами через segments curl -X POST https://golosar.tech/api/v1/tts -H "X-API-Key: <ключ>" -H "Content-Type: application/json" -d '{ "voice": "ru_f7", "format": "mp3", "segments": [ { "text": "Глава первая." }, { "silence": 500 }, { "text": "Было раннее утро…" } ] }' --output chapter1.mp3 # каждый кусок ≤[object Promise] знаков; счёт символов идёт по сумме сегментов.
Рецепт

Клон своего голоса

Загрузите 15–30 секунд чистой речи (короче 15 с — отказ sample_too_short) с точной расшифровкой — получите voice-id, которым дальше синтезируете как обычным голосом. Согласие обязательно.

# 1) создать клон → вернётся voice id curl -X POST https://golosar.tech/api/v1/voices/create -H "X-API-Key: <ключ>" -H "Content-Type: application/json" -d '{ "name": "Мой голос", "audio_b64": "<wav в base64; сам файл до 10 МБ>", "ref_text": "текст записи слово в слово", "consent": "voice-data-consent,privacy", "language": "Russian" }' # 2) синтез своим голосом — тот же POST /tts, voice = полученный id. Приватный клон виден только по вашему ключу (GET /voices/mine).
Рецепт

Расшифровка аудио → текст

Аудио в base64 → текст с определением языка. За каждую минуту аудио с баланса списывается 1000 символов; месячный лимит расшифровки считается в минутах по тарифу.

# распознать речь (язык — полным именем или auto) curl -X POST https://golosar.tech/api/v1/transcribe -H "X-API-Key: <ключ>" -H "Content-Type: application/json" -d '{ "audio_b64": "<аудио в base64, ≤30 МБ>", "language": "Russian" }' # → { "text": "...", "language": "Russian" }
POST /api/v1/tts_stream

Потоковый синтез

Принимает voice, text, language, instruct, speed, gain_db, eq, effect, seed ИЛИ массив segments (поэлементная интонация). Отдаёт чистый поток PCM (application/octet-stream, chunked; формат: 24 000 Гц, 16 бит, моно, little-endian) для немедленного воспроизведения. Пост-эффекты, применяемые к целому файлу (clean, background/bg_level, lead_silence_ms), и формат mp3 в стриме НЕ поддерживаются — для них используйте POST /api/v1/tts.

Формат segments — массив объектов [{ text, instruct?, silence? }], до 301 элементов (150 пауз): text — фрагмент текста; instruct — интонация фрагмента по-английски (до 500 символов, как и у общего instruct); silence — пауза после фрагмента в мс (0–5000; сегмент можно прислать и без текста — только пауза). Символы списываются по сумме длин text всех сегментов.

# POST /api/v1/tts_stream → поток PCM (application/octet-stream, chunked) { "voice": "ru_n16", "text": "Привет! Это потоковый синтез.", "language": "ru" }
POST /api/v1/voices/create · алиас /api/v1/voices/clone

Создание голоса

nameназвание голоса (обязательно; ≤80 символов — длиннее молча обрезается)
audio_b64запись-образец WAV в base64; предел — 10 МБ САМОГО файла, не строки; минимальная длительность проверяется по заголовку WAV, короче — 400 sample_too_short (обязательно)
ref_textтекст образца — должен совпадать с записью слово-в-слово (обязательно); если текст в разы не сходится с длиной речи в записи (например, фраза в записи повторяется, а в тексте — один раз) — 400 sample_text_mismatch с полями speech_seconds и ref_text_chars, голос не создаётся (≤2000 символов — длиннее молча обрезается, поэтому для длинного образца укладывайтесь в лимит, иначе транскрипт перестанет совпадать с аудио и качество клона упадёт)
consentстрока согласия — передавайте ровно "voice-data-consent,privacy" (данные голоса, 152-ФЗ); без неё — 400 (обязательно)
languageязык образца, полное имя (Russian, English…) или ISO-код; по умолч. Russian (опц.)

Поле voice из ответа передавайте в POST /tts. Значение voice ниже — иллюстративный пример; реальный идентификатор приходит в ответе. Создание своего голоса ПО API требует доступа к API (тариф Про и выше) и учитывает лимит голосов тарифа.

# Ответ — 200 OK (значение voice — пример) { "ok": true, "voice": "usr_a1b2c3", "name": "Мой голос", "language": "Russian" }
POST /api/v1/transcribe

Расшифровка

audio_b64аудио в base64; рассчитано на короткий фрагмент (обязательно)
languageтолько ПОЛНОЕ имя языка: Russian, English, German, French, Italian, Spanish, Portuguese, Chinese, Japanese, Korean; бета (без гарантии): Ukrainian, Polish, Dutch, Greek, Bulgarian, Czech, Romanian, Slovak, Slovenian, Serbian, Swahili (ISO-код или auto молча включают автоопределение; без параметра — автоопределение) (опц.)
размераудио ≤ ~30 МБ в base64 (иначе 413, code=audio_too_large); пустое/слишком короткое — 400 (code=no_audio)

Списываются символы по тарифу (≈1 мин аудио = 1000 символов, минимальная тарификация — 3 секунды), учитывается месячный лимит минут расшифровки тарифа.

# Ответ { "text": "Расшифрованный текст фрагмента.", "language": "Russian" }
POST /api/v1/voice-design

Голос по описанию

Новый голос без записи: опишите его — модель создаст 3 варианта на одной фразе, около 3–4 минут. Попытка — 1 500 знаков с баланса; не получилось — знаки возвращаются. Одна попытка за раз, варианты хранятся 14 дней.

descriptionописание по-русски: пол (обязательно), возраст, высота, тембр, темп, манера, настроение; до 600 знаков. Голоса реальных людей не повторяем — «как у …» даёт 400 (code=imya)
chipsнеобязательно: id терминов из GET /api/v1/voice-design → chips[] (до 20) — то же, что плашки на сайте
ответы202 — попытка создана; 400 pol — не указан пол; 402 no_credits; 429 zanyato — предыдущая ещё идёт; 404 not_available — раздел ещё не открыт

Опрашивайте GET /api/v1/voice-design?id=… раз в 10–20 секунд. Когда status=done, скачайте варианты по audio_url (с тем же ключом) и сохраните понравившийся обычным созданием голоса: POST /api/v1/voices/create с файлом варианта в audio_b64 и sample_text в ref_text, согласие — в consent, как описано в создании голоса; правила тарифа для своих голосов действуют как всегда.

# POST /api/v1/voice-design { "description": "Мужской голос средних лет, низкий, диктор новостей" } # GET /api/v1/voice-design?id=… — когда готово { "id": "7b05c64a-…", "status": "done", "progress": { "done": 3, "total": 3 }, "variants": [ { "index": 0, "seconds": 9.3, "audio_url": "/api/v1/voice-design/audio?id=…&i=0" } ], "sample_text": "Здравствуйте! Я ваш новый голос…" }
POST /api/v1/audio/speech · GET /api/v1/audio/voices

Совместимость с OpenAI

Если ваш код уже говорит с OpenAI-подобным API синтеза, поменяйте адрес и ключ. Ключ — тот же (X-API-Key или Authorization: Bearer). Поля переводятся в /api/v1/tts один в один, поэтому синтез, оплата, лимиты и ошибки — те же, что описаны выше.

inputтекст для озвучки (обязательно) — как text в /tts
voiceid голоса: поле voice в GET /api/v1/voices или поле name в GET /api/v1/audio/voices
response_formatmp3 → MP3; без поля или wav → WAV; телефонные форматы — как в /tts
speed, seedкак в /tts; поле model игнорируется
GET /api/v1/status · POST /api/v1/warmup

Статус и прогрев

GET /api/v1/status (без ключа) — готовность движка для real-time. POST /api/v1/warmup (с ключом; символы НЕ списывает) прогревает движок перед серией звонков.

# GET /api/v1/status { "ready": true, "model_ready": true, "engine_up": true, "latency_ms": 42, "status": "ok", "maintenance": false, "retry_after_seconds": 0 } # при неполадках добавляются "note" (причина) и "eta"
# POST /api/v1/warmup { "ok": true, "warmed": true, "warm_ms": 318 }
Рекомендации

Голос для агента

Через API по умолчанию действует быстрая ровная подача (fast), живая разговорная включается "mode": "expressive"; тембр стабилен между репликами. Громкость в потоке отдаётся как её синтезировал движок — она ровная сама по себе; регулировать её можно полем gain_db. Ваши явные emotion/instruct/seed в запросе всегда в приоритете.

Произношение: как поправить слово

Текст диктору можно подсказывать прямо в строке — отдельных параметров для этого не нужно. Это особенно важно, когда реплики пишет языковая модель: букву ё она ставит непредсказуемо.

Плюс перед гласной = подсказка. Поставьте плюс перед ударной гласной, и диктор прочитает по ней: жалюз+и, диспанс+ер. Букву Ё пишите буквой Ё: всё звучит как «всё», все — как «все». Так чинится большинство ошибок ударения и произношения.

⚠️Редкие слова не поддаются даже так: у нас записан случай «обработала» — одиннадцать способов записи, ни один не сработал. Если попалось такое слово, перефразируйте его или напишите нам: мы разберём случай и добавим слово в общий словарь исправлений, после чего оно зазвучит верно у всех без правок с вашей стороны. Так, например, было исправлено «все» — теперь оно читается правильно само.

Профиль голоса — источник значений по умолчанию. Настройки, сохранённые у голоса в кабинете («Звучание голоса»: эквалайзер тембра, «Сделать чище», «Студийная полировка», манера чтения), применяются и к API-запросам — агент получает тот же звук, что вы слышите в студии, ничего дублировать в теле запроса не нужно. Параметр, переданный явно, перекрывает сохранённый. Если звук в интеграции отличается от ожидаемого, проверьте профиль голоса, а не только запрос.

Простая речь — в промт агента, не в TTS. Синтез читает текст как есть и слова не подменяет (юридические формулировки, названия и бренды не пострадают). Чтобы агент звучал по-человечески, добавьте в его системный промт правило вида:

# в системный промт агента (LLM), генерирующего реплики Говори просто и по-человечески: короткие фразы, без канцелярита и сложных терминов («делается», а не «осуществляется»). Числа и даты — словами, аббревиатуры раскрывай. Одна мысль — одно предложение.

Слова, которые движок читает неточно, лечит произносительная база — она общая для сайта и API и самообучается; отдельная просьба — в поддержку.

Для телефонии и агентов

Ёмкость, задержки и повторы

Параллельные запросысинтез идёт через общую очередь: ограниченное число одновременных генераций на весь сервис, остальные ждут в очереди (время ожидания зависит от её длины). Если очередь уже полна, 503 engine_busy с заголовком Retry-After: 5 приходит сразу; не дождались — тот же ответ. Для агента это значит: не запускайте десятки параллельных синтезов на один ключ, ставьте свою очередь и уважайте Retry-After
Задержкаизмерено на боевом стенде. /tts отдаёт готовый файл целиком: короткая реплика (~50 знаков) — около 2 секунд, 480 знаков — около 12 секунд. /tts_stream с умолчанием (быстрый режим) начинает отдавать звук примерно через 0,8 секунды независимо от длины текста — подробности в следующем пункте. Если запросили "mode": "expressive", движок синтезирует фразу целиком и первый звук придёт только в конце: на 480 знаках это около 10 секунд молчания. Планируйте таймауты по режиму, который используете.
Быстрый режим (умолчание)первый звук приходит примерно через 0,8 секунды независимо от длины текста — движок отдаёт речь по мере синтеза. Ничего передавать не нужно, это подача по умолчанию с 27.08.2026. Плата — речь ровнее и менее «живая»: разговорный дефолт и эмоц-паспорт голоса не применяются. Нужна живая интонация — "mode": "expressive", но тогда звук придёт только в конце генерации: на 92 знаках первый звук через 2,6 секунды вместо 0,8, на 480 знаках — около 10 секунд. Умолчание одинаково в /tts_stream и /tts, поэтому характер речи совпадает, если часть реплик вы синтезируете файлом, а часть потоком
Таймаутына нашей стороне: /tts — 60 секунд на каждую часть длинного текста (частей до 5, то есть до 5 минут на весь ответ); /tts_stream — 30 секунд на первый кадр и 120 секунд без данных подряд. Свой клиентский таймаут ставьте не меньше этих значений, иначе будете рвать живые генерации
Обрыв потокапосле отдачи заголовков ошибка приходит как обрыв соединения — отдельного кода уже не будет. Считайте поток успешным только если получили ожидаемую длительность аудио; при обрыве спишутся символы лишь за фактически доставленный звук
Сколько занято прямо сейчасответ синтеза несёт заголовки: X-Concurrency-Used — сколько ВАШИХ генераций идёт прямо сейчас (счётчик аккаунта; в /tts считается после завершения текущего запроса, в потоке — вместе с ним), X-Concurrency-Limit — сколько параллельных генераций разрешает ваш тариф, X-Concurrency-Queued — сколько запросов ждут общей очереди сервиса, X-Engine-Busy — занят ли сам движок, X-Voice-Mode — какой режим подачи применён. Стройте свою очередь по этим числам, а не по догадкам. ⚠️Исключение — ответ из кэша: повторный запрос с тем же текстом, голосом и настройками отдаётся мгновенно с заголовком X-Cache: HIT, и заголовков занятости в нём нет (генерации не было). Считайте их отсутствие признаком кэша, а не сбоя
Проверка перед звонкомGET /api/v1/status отдаёт ready, status (ok · degraded · maintenance · engine_down), причину в note и retry_after_seconds. Опрашивайте его перед стартом кампании и при первом 503 — так вы отличите техработы от разовой перегрузки
Повторыидемпотентных ключей нет: повторный запрос — это новая генерация и новое списание. Чтобы повтор дал тот же звук, передавайте одинаковый seed. Память озвучки (повтор без изменений и правка только изменённых кусков без доплаты) работает в редакторе сайта; через API каждый синтез оплачивается. Безопасно повторять после 429/503; после 4xx (кроме 429) повтор бессмыслен — исправьте запрос
Ответ

Заголовки и поле code

Content-Typeпо параметру format/response_format: audio/wav, audio/mpeg; телефонные форматы при container=raw — audio/PCMA;rate=8000 (alaw), audio/PCMU;rate=8000 (mulaw), audio/G722, audio/opus (в контейнере ogg), audio/L16;rate=24000 (сырой PCM 16 бит); по умолчанию контейнер wav, и тогда приходит audio/wav. Для /tts_stream — application/octet-stream. Без параметра формата приходит WAV 16 бит, моно; частота сейчас 24 000 Гц у всех голосов. Точное значение для ответа /tts приходит в заголовке X-Sample-Rate (у потока /tts_stream этого заголовка нет — частота потока 24 000 Гц): берите его, а не зашитое число, иначе звук проиграется не на своей скорости. Нужна гарантированная частота — просите response_format=pcm_s16le_24k или телефонный профиль
X-Sample-Rateчастота того звука, который пришёл этим ответом (сейчас у всех голосов 24000). Читается из заголовка самого файла, поэтому не расходится с содержимым, и приходит одинаково на свежей генерации и на повторе из кэша. Заголовок есть только у /tts; поток /tts_stream идёт на 24 000 Гц. ⚠️Не зашивайте частоту в проигрыватель по документации — читайте заголовок: у другой линии голосов она может быть иной, и ошибка слышна как ускоренная или замедленная речь. Нужна одна и та же всегда — просите response_format=pcm_s16le_24k
X-Tts-Timingтолько в /tts_stream — секундомер по этапам: prep=174ms; engine=74ms; total=248ms. prep — наша подготовка (разбор текста, проверка доступа, биллинг), engine — время движка до первых данных, total — вместе. Помогает понять, где расходуется время, не гадая. В ответе /tts этого заголовка нет: там отдаётся готовый файл, и разбивать нечего. ⚠️Это НЕ время до речи: первые байты потока могут быть тишиной
X-Voice-Warningприходит, если выбранный голос заметно меняет звучание от реплики к реплике — для живого разговора это слышно как «говорит другой человек». Формат машиночитаемый: unstable_for_agents; pitch_spread_hz=54; timbre_spread=0.45; better=ru_n26,ru_f7,ru_n39. В better — замены того же пола с измеренными показателями. Синтез при этом выполняется штатно, заголовок ничего не блокирует
X-Audio-Formatкакой телефонный профиль применён (g711_alaw_8k и т.д.). Приходит только при явном response_format. ⚠️Если формат указан неверно, ответ будет 400 unsupported_format со списком допустимых значений в поле supported — раньше неизвестное значение молча игнорировалось, и приходил звук в другом формате
X-Effects-Failedчто мы применили не так, как вы просили, через запятую. Кроме собственно эффектов сюда попадают: speed (вышел за 0,5–2,0 и приведён к границе), loudness (нормализация громкости пропущена), instruct (инструкция длиннее 500 знаков — взята не целиком), seed (значение негодное, поэтому повтор не будет тем же), bg_level (громкость фона вне 0.05–0.8 либо прислана без годного background — фона не будет вовсе). Заголовок есть только при расхождении; запрос при этом не падает и символы списываются полностью, поэтому проверяйте его, если результат отличается от ожидаемого. Работает одинаково на /api/v1/tts и /api/v1/tts_stream
X-CacheHIT / MISS — был ли ответ отдан из кэша (ускорение). На биллинг НЕ влияет: по API-ключу каждый успешный синтез тарифицируется одинаково, и на HIT, и на MISS (деньги за результат)
Retry-Afterчерез сколько секунд повторить: при 429 — до сброса счётчика частоты; при 503 — 5 с, если сервис перегружен (engine_busy, temporary_unavailable), 30 с, если движок недоступен (engine_unavailable) или не собрался MP3 (mp3_unavailable); при 429 concurrency_limit — 2 с. Ориентируйтесь на заголовок, а не на фиксированную паузу
X-Engine-Busyтекущая загрузка очереди движка в формате активно/всего (например 3/4) — приходит на каждом ответе со свежей генерацией (в ответе из кэша, X-Cache: HIT, его нет). Если первая цифра стабильно у потолка, вы упираетесь в ёмкость
X-Tts-Hintтолько в /tts_stream — машиночитаемая подсказка по ускорению (например, что явный instruct отключил быстрый путь)

Поле code в теле ошибки — машиночитаемая ПРИЧИНА. Ориентируйтесь на него, а не на HTTP-код: один и тот же 403 возвращается в нескольких разных случаях. Полный перечень — в таблице ниже, она собирается из того же справочника, по которому сервис отвечает, поэтому не может отстать от кода.

codeHTTPЧто значитЧто делать
acute400Ударение знаком акута не годится
В пометке стоит знак акута над буквой (за́мок). Такую пометку служба чтения не понимает.
Отметьте ударную гласную знаком плюс перед ней (з+амок).
audio_required400Нет образца голоса
В запросе нет аудио-образца (audio_b64).
Приложите образец записи в base64: чистая речь, без музыки и шума.
bad_audio400Запись не распознана
Присланная запись не читается как аудио.
Повторите синтез и сохранение — файл, судя по всему, повреждён.
bad_json400Битый запрос
Тело запроса не разобралось как JSON.
Проверьте синтаксис и заголовок Content-Type: application/json.
bad_request400Неверный запрос
В запросе не хватает обязательного поля или значение недопустимо.
Сверьтесь с описанием метода в документации API.
consent_required400Нужно согласие на голос
Создание голоса требует подтверждения, что вы вправе использовать эту запись.
Поставьте отметку о согласии в мастере создания голоса.
email_typo400Опечатка в адресе почты
Домен почты похож на известный с одной ошибкой — например «gmail.cim» вместо «gmail.com». На такой адрес письмо с кодом не придёт.
Проверьте адрес и повторите регистрацию. Подсказка с правильным написанием — в тексте ошибки.
empty_text400Пустой текст
В запросе нет текста для озвучки.
Введите текст и повторите.
engine_rejected400Движок отклонил запрос
Синтезатор не принял параметры: чаще всего не тот язык для выбранного голоса.
Проверьте язык и настройки голоса. Библиотечный голос читает на своём родном языке.
library_capability400Возможность не поддерживается этой группой голосов
У линии, на которой работает этот голос, нет запрошенной возможности — например эмоций, эффектов, фонов или потоковой отдачи.
Уберите неподдерживаемые параметры или выберите голос из универсального каталога.
name_required400Не указано имя голоса
В запросе на создание голоса нет поля name.
Передайте name — под этим именем голос появится в вашей библиотеке.
no_audio400Нет аудио
В запросе на расшифровку не пришёл звук.
Приложите файл или base64-строку с записью.
ref_text_required400Нет расшифровки образца
Не передан ref_text — текст, который звучит в образце.
Передайте ref_text ДОСЛОВНО так, как произнесено в записи: расхождение портит клон.
ru_dictor_line_off400Линия голоса не исполняет русский
Русский текст озвучивает основная линия, а выбранный каталожный голос принадлежит другой русской линии, которая сейчас не исполняет русский.
Выберите русский голос из каталога (поле library у голосов показывает активную линию). Если у голоса есть двойник на активной линии, отказ называет его по имени. Свой собственный голос работает по-прежнему.
ru_dictor_only400Русский исполняет другая линия
Русский текст сейчас озвучивает не основная линия, и выбранный голос основной линии на ней не воспроизводится.
Выберите русский голос активной линии из каталога. На других языках выбранный голос доступен; свой собственный голос работает по-прежнему.
sample_text_mismatch400Текст не совпадает с записью
Текст образца в разы не сходится с длиной речи в записи — голос из такой пары говорит неразборчиво, поэтому он не создан.
Загрузите запись обычной речи без повторов, музыки и чужих голосов или впишите в текст всё, что сказано в записи, слово в слово. Замер — в полях speech_seconds и ref_text_chars ответа.
sample_too_short400Образец слишком короткий
Запись образца короче минимума — из такой похожий голос не получится.
Перезапишите образец длиннее: измеренная длительность — в поле sample_seconds ответа, нужный минимум — в min_seconds. Спокойная речь с паузами между фразами.
text_too_long400Текст длиннее предела
Текст превышает максимальную длину одного запроса.
Разделите текст на части. На платных тарифах длинный текст в редакторе экспортируется в фоне частями; целую книгу удобнее озвучивать в отдельном сервисе «Книги» (golosar-kniga.tech). Больший объём за один раз открывает тариф выше.
text_too_long_for_line400Слишком длинная часть для движка
Движок отверг одну из частей текста как слишком длинную для одной генерации.
Разбейте текст на сегменты покороче (массив segments) или добавьте точки, по которым сервис режет текст.
text_too_long_for_sync400Объём только фоном
Текст слишком велик для синхронного ответа: частей больше, чем держится соединение (поля parts, max_parts, got).
В кабинете — озвучьте фоном через «Скачать»; в API — разбейте текст на части (асинхронных задач в API нет).
too_many_segments400Слишком много кусков
Текст разбит на большее число фрагментов, чем допускает один запрос.
Уберите лишние паузы в разметке: каждая пауза начинает новый кусок, а их число ограничено.
too_many_sounds400Слишком много звуков
В тексте больше меток звуков (♪), чем допускает один запрос.
Уберите часть меток звуков или разбейте текст на несколько запросов.
trial_same_text400Текст пробы совпадает с образцом
Пробный голос нельзя слушать тем же текстом, что читали при записи: так не слышно, похож ли голос.
Напишите другой текст.
unsupported_effect400Неизвестный эффект
Запрошенный звуковой эффект (effect) не поддерживается.
Возьмите значение из поля allowed в ответе или уберите effect.
unsupported_emotion400Эмоция не распознана
Значение emotion не из списка поддерживаемых.
Пришлите одно из перечисленных в ответе значений или уберите параметр — тогда голос звучит нейтрально. Символы не списаны.
unsupported_eq400Эквалайзер не распознан
Поле eq прислано, но его форма не подходит.
Ожидается {bands:[{hz,db},…]} либо {low,mid,high} в децибелах. Символы не списаны.
unsupported_format400Неизвестный формат
Запрошенный формат аудио не поддерживается.
Допустимые значения перечислены в поле supported ответа и в документации API.
voice_not_in_demo400Голоса нет в демо
В демо-озвучке на витрине доступен только короткий список голосов, этот в него не входит.
Выберите голос из списка демо или войдите в кабинет — там доступны все голоса.
api_key_invalid401Ключ API недействителен
Ключ не существует или был отозван.
Проверьте, что копировали ключ целиком, или выпустите новый в разделе «API».
api_key_required401Не передан ключ API
Запрос пришёл без ключа доступа.
Передайте ключ заголовком X-API-Key или Authorization: Bearer. Ключ — в разделе «API» кабинета.
auth_invalid401Неверный ключ API
Ключ не найден или отозван.
Проверьте заголовок X-API-Key. Ключ можно перевыпустить в разделе «API».
auth_required401Нужен вход
Сессия истекла или вы не вошли в аккаунт.
Войдите заново — черновик в редакторе сохраняется.
insufficient_balance402Кончились символы
На балансе не хватило символов, чтобы озвучить этот текст целиком.
Пополните баланс в разделе «Тариф и лимиты».
insufficient_balance_kuski402Не хватило символов
На балансе не хватило символов на новые части озвучки (уже озвученные берутся из памяти и не оплачиваются). Символы не списаны.
Пополните баланс в разделе «Тариф и лимиты».
no_credits402Нулевой баланс
Символы на счету закончились.
Пополните баланс в разделе «Тариф и лимиты».
demo_voice403Демонстрационный голос
Этот голос можно слушать, но нельзя сохранить: у него нет прав на коммерческое использование.
Для скачивания выберите голос без метки «Демо».
email_unverified403Почта не подтверждена
Озвучка доступна после подтверждения почты.
Откройте раздел «Аккаунт» и введите код из письма.
plan_quota403Исчерпан лимит тарифа
Достигнут месячный лимит вашего плана.
Лимит обновится в начале следующего периода, либо перейдите на тариф выше.
plan_required403Нужен другой тариф
Эта возможность доступна на более высоком тарифе.
Посмотрите тарифы в кабинете — там указано, что входит в каждый.
project_limit403Лимит проектов тарифа
Достигнут предел числа проектов на вашем тарифе.
Удалите ненужные проекты или перейдите на старший тариф.
trial_exists403Пробный голос уже есть
На бесплатном тарифе пробный голос может быть только один, и он у вас уже создан.
Послушайте его или удалите, затем создавайте новый. На платном тарифе ограничения нет.
trial_spent403Пробные прослушки закончились
У пробного голоса ограниченное число прослушек, они израсходованы.
Оформите платный тариф — голос станет рабочим сам, без пересоздания.
voice_access403Голос не на вашем тарифе
Голос существует, но на текущем плане недоступен.
Выберите другой голос или перейдите на тариф, где он открыт.
voice_deleted403Голос удалён
Этот голос удалён, синтезировать им больше нельзя (в проекте он мог остаться выбранным).
Выберите другой голос в списке. Если удалили случайно — создайте голос заново по тому же образцу.
voice_denied403Голос без права выгрузки
Выбран демонстрационный (исследовательский) голос — выгружать файлы им нельзя.
Выберите коммерческий голос из каталога.
voice_failed403Голос не создался
Обучение голоса завершилось ошибкой, поэтому синтез им недоступен.
повторить позже
voice_limit403Лимит своих голосов
На вашем тарифе закончились места под собственные голоса.
Удалите ненужный голос или перейдите на тариф с большим числом мест.
voice_not_available403Голос недоступен
Этот голос вам сейчас недоступен: он удалён, не ваш или закрыт тарифом.
Выберите другой голос в списке.
voice_not_available_yet403Язык голоса ещё не открыт
Голос из языка с меткой «Скоро»: синтез для этого языка пока не включён.
Выберите голос другого языка; языки с меткой «Скоро» откроются позже.
voice_not_found403Голос не найден
Такого голоса нет ни в каталоге, ни среди ваших и купленных.
Проверьте идентификатор голоса; полный список — /api/voices/library.
voice_not_ready403Голос ещё готовится
Ваш голос создан, но обучение ещё идёт — синтезировать им пока нельзя.
Подождите несколько минут. Удалять и создавать голос заново НЕ нужно.
voice_trial403Пробный голос
Этот голос создан на бесплатном плане как проба: его можно послушать, но нельзя озвучивать им тексты.
Перейдите на тариф «Старт» или выше — пробный голос станет рабочим.
not_found404Объект не найден
Запрошенной записи нет: удалена или адрес неверный.
Обновите страницу и проверьте, что объект существует.
export_in_progress409Сохранение уже идёт
Предыдущее сохранение или экспорт ещё не закончились.
Дождитесь окончания — повторный запуск не нужен.
length_mismatch409Запись не совпала с текстом
Сохраняемая озвучка не соответствует текущему тексту проекта.
Ничего делать не нужно: озвучим заново под изменённый текст.
voice_conflict409Такое имя голоса занято
Голос с таким именем у вас уже есть.
Выберите другое имя.
tracks_gone410Дорожек проекта больше нет
Отдельные дорожки голоса и фона этого перевоплощения больше не хранятся; готовый файл цел, но пересвести баланс нечем.
Перевоплотите запись заново.
voice_line_retired410Линия этого голоса снята
Голос принадлежит линии, которой больше нет: озвучить им или перезаписать его образец нельзя.
Создайте голос заново на действующей линии — запись займёт пару минут.
length_required411Нет длины запроса
Не передан или испорчен заголовок Content-Length.
Проверьте HTTP-клиент: длина тела обязательна.
audio_too_large413Аудио слишком большое
Размер записи больше допустимого для одного запроса.
Разрежьте запись на части или сожмите её (моно, меньший битрейт).
body_too_large413Слишком большой запрос
Тело запроса превышает допустимый размер.
Уменьшите объём: короче текст или меньше файл.
too_big413Файл слишком большой
Загружаемый файл больше допустимого размера.
Разбейте книгу на части или уберите тяжёлые вложения.
too_large413Запись собираем на сервере
Готовая озвучка слишком велика, чтобы собрать её в браузере.
Ничего делать не нужно: файл соберётся на сервере.
unsupported415Формат файла не поддержан
Такой формат книги или документа мы не читаем.
Сохраните файл в поддерживаемом формате (список — в документации) и загрузите снова.
no_text422В файле нет текста
Файл прочитан, но текста в нём не нашлось — например, это скан-картинки.
Загрузите текстовую версию: скан сначала нужно распознать.
concurrency_limit429Слишком много запросов сразу
Одновременных озвучек больше, чем позволяет тариф.
Дождитесь окончания текущих или повторите через время из заголовка Retry-After.
rate_limited429Слишком часто
Превышена частота запросов в минуту. Счёт ведётся НА АККАУНТ, а не на ключ: второй ключ частоту не удваивает.
Дождитесь секунд из заголовка Retry-After и повторите. Нужен запас — напишите нам.
too_many_requeues429Слишком много повторов задачи
Задачу расшифровки перезапускали слишком много раз подряд.
Загрузите файл заново.
client_aborted499Клиент прервал сам
Соединение закрыто со стороны клиента: закрыта вкладка, нажат стоп или пропала связь.
—
internal_error500Внутренняя ошибка
Что-то пошло не так на нашей стороне.
повторить позже
save_failed500Голос не сохранён
Голос синтезирован, но не записался в библиотеку.
повторить позже
clone_failed502Не удалось создать голос
Движок не смог построить голос по образцу.
повторить позже
engine_empty502Пустой ответ движка
Синтез завершился, но звук не пришёл.
повторить позже
engine_error502Ошибка движка
Движок вернул ошибку при обработке текста.
повторить позже
factory_bad_answer502Фабрика голосов ответила непонятно
Ответ службы не разобрался: либо версии разошлись, либо ответ пришёл не в том виде.
повторить позже
mp3_failed502Конвертация в MP3 не удалась
Озвучка синтезирована, но перекодировать её в MP3 не получилось. Списанные символы возвращены.
повторить позже
scan_failed502Разбор главы не удался
Служба разбора текста не ответила или ответила непонятно, поэтому список спорных слов не собран.
повторить позже
synth_failed502Озвучка отрывка не удалась
Служба синтеза не смогла озвучить этот отрывок.
повторить позже
telephony_failed502Не собрался телефонный формат
Звук синтезирован, но преобразование в телефонный формат не удалось.
повторить позже
transcribe_error502Ошибка распознавания
Расшифровка не удалась на нашей стороне.
повторить позже
asr_vram_low503Не хватило памяти на карте
Распознаванию не хватило видеопамяти — её заняли озвучка и перевоплощение.
повторить позже
billing_unavailable503Биллинг недоступен
Не удалось проверить баланс.
повторить позже
catalog_unavailable503Каталог голосов недоступен
Список голосов временно не читается — сбой на нашей стороне.
повторить позже
demo_unavailable503Демо недоступно
Демонстрационная озвучка на главной временно не работает.
повторить позже
engine_busy503Движок перегружен
Сейчас слишком много одновременных озвучек.
повторить позже
engine_off503Служба озвучки недоступна
Служба синтеза сейчас не отвечает, поэтому разобрать главу и озвучить её не получилось.
повторить позже
engine_unavailable503Движок недоступен
Сервис синтеза временно не отвечает.
повторить позже
factory_down503Фабрика голосов недоступна
Адрес службы известен, но она не отвечает: скорее всего не запущена на машине движка.
повторить позже
factory_off503Фабрика голосов не подключена
В реестре серверов не указан порт службы «Фабрика голосов», поэтому обращаться некуда.
повторить позже
factory_timeout503Фабрика голосов не ответила вовремя
Служба не ответила за отведённое время. Начатая задача могла остаться выполняться.
повторить позже
mp3_unavailable503MP3 временно недоступен
Кодировщик MP3 на сервере сейчас недоступен; символы не списаны.
повторить позже
orig_pin_failed503Исходник не зафиксирован
Не удалось закрепить исходную запись перед обработкой.
повторить позже
temporary_unavailable503Временно недоступно
Сервис на короткое время недоступен.
повторить позже
Коды ответов

Ошибки

200Успех — тело ответа содержит аудиофайл
400Битый JSON (bad_json), пустой текст (empty_text), текст длиннее лимита тарифа (text_too_long), больше 301 сегментов (too_many_segments), больше 5 частей для синхронного ответа (text_too_long_for_sync), движок отверг слишком длинную часть (text_too_long_for_line) или неизвестный движку язык (engine_rejected). При создании голоса — не переданы обязательные поля: name_required, ref_text_required, audio_required, consent_required; образец короче минимума — sample_too_short (в ответе sample_seconds и min_seconds)
401Нет или неверный API-ключ (заголовок X-API-Key / Authorization)
402Недостаточно символов на балансе ключа — пополните тариф
403Функция недоступна на текущем тарифе (доступ к API, включая создание голоса, — с Pro и выше; code=plan_required) или нет доступа к голосу: voice_not_found — голос неизвестен или чужой приватный; voice_not_available — не передано поле voice, голос скрыт или не опубликован; voice_trial — пробный клон бесплатного плана, озвучивать им нельзя до тарифа; voice_not_ready, voice_failed, voice_deleted — свой голос ещё готовится, не собрался или удалён; voice_not_available_yet — голос помечен «Скоро», синтез им пока отключён (см. поле badge в каталоге). Также: email_unverified — платные вызовы по ключу требуют подтверждённой почты аккаунта; voice_limit — достигнут лимит клонов тарифа; plan_quota — исчерпана квота расшифровки
409Конфликт (voice_conflict): такое имя занято голосом другого аккаунта — укажите другое имя. Свой голос с тем же именем конфликта не даёт: он перезаписывается новым образцом
413Слишком большой файл: создание голоса — образец больше 10 МБ (размер самого файла, не base64; тело запроса больше 14 МБ — body_too_large); расшифровка — аудио > ~30 МБ (base64, code=audio_too_large)
429Превышен лимит частоты. Синтез И расшифровка (POST /transcribe) — по тарифу ключа, каждый эндпоинт своим счётчиком (Про 120, Бизнес 300, Студия 600). Отдельные лимиты: создание голоса (clone) — 5/мин на аккаунт, GET /voices — 120/мин на IP, GET /status — 60/мин на IP, warmup — 20/мин на аккаунт (несколько ключей одного аккаунта делят лимит). Смотрите заголовок Retry-After
500Внутренняя ошибка сервиса (internal_error) — например при чтении каталога голосов. Повторите запрос; если повторяется — напишите в поддержку
502Сбой обработки на стороне сервиса (конвертация в MP3 или ответ движка расшифровки/клонирования) — повторите запрос. Коды: engine_error, engine_empty, telephony_failed, mp3_failed (символы за неотданный MP3 возвращаются). transcribe_error и clone_failed приходят с тем статусом, который вернул движок (например 503) — смотрите на код, а не на число
503Движок спит/недоступен или сервис перегружен — повторите через несколько секунд. Отдельный случай: при format=mp3 — «MP3-кодировщик недоступен на сервере» (проверяется до синтеза, символы не списываются); повтор не поможет — используйте format=wav или напишите в поддержку

Тело ошибки — JSON { "error": "описание", "code": "машинный_код" }. Разбирайте code, а не текст: тексты мы переписываем, коды не меняем. Символы при неуспехе не списываются. Исключение — обрыв потока /tts_stream на середине: списываются только символы за фактически доставленное аудио, остаток возвращается.

Каталог

Эффекты и фоны

Параметр effect — один пресет на запрос. Бесплатные доступны всем; премиум — на платных тарифах.

Подача (free)radio — сухой эфир · audiobook — аудиокнига · narrator_warm — тёплый рассказчик · podcast — подкаст · phone — телефон · intimate — близко · spacious — простор · whisper — шёпот · deep — ниже · bright — ярче · warm — теплее
Студийные (премиум)studio_announcer — дикторский эфир · studio_natural — естественный студийный · studio_rich — насыщенный «дорогой» · cinematic — кино · concert — зал · megaphone — рупор · vintage — винтаж
Характеры (премиум)robot — робот · cartoon — мультяшный · chipmunk — бурундук · monster — монстр · villain — злодей · echo_hall — эхо-зал
Фоны (background)Природа: rain (дождь) · thunder (гроза) · sea (море) · forest (лес) · wind (ветер) · stream (ручей) · night (ночь). Город: street (улица) · cafe (кафе) · crowd (толпа). Погода: downpour (ливень) · rain_thunder (ливень с громом) · rain_tent (дождь по шатру) · rain_drain (дождь и водосток) · blizzard (метель). Город, ещё: park (парк) · market (рынок) · fair (ярмарка) · station (вокзал) · subway (метро, поезд) · airport_hall · airport_announce (аэропорт). Природа, ещё: swamp_night (болото, лягушки) · meadow (луг) · field_birds (поле, птицы) · surf (прибой). Дом: fire (камин) · clock_room (часы) · rain_window (дождь за окном) · storm_house (гроза над домом) · kitchen_diner (кухня закусочной). Для книг: library (библиотека) · old_wood (скрип дерева) · manor_night (ночь у поместья) · train_car (вагон поезда) · metro_car (вагон метро). Громкость — bg_level 0.05–0.8
eq (тембр)8 полос: 80, 160, 300, 600, 1500, 3500, 6500, 10500 Гц, каждая −12…+12 дБ. Пример: {"bands":[{"hz":80,"db":-4},{"hz":3500,"db":3}]} — убрать гул, добавить чёткости
Квоты

Лимиты

Одновременные генерациисколько синтезов можно вести параллельно — отдельный лимит тарифа, не путать с частотой запросов. Превышение → 429 concurrency_limit с Retry-After: дождитесь завершения текущей генерации, а не шлите повтор сразу. Текущее состояние видно в заголовках любого успешного ответа (X-Concurrency-Used и X-Concurrency-Limit). Для голосовых агентов это главное ограничение: именно оно определяет, сколько разговоров вы ведёте одновременно
Частота запросовсинтез и расшифровка (POST /transcribe) — по тарифу, у каждого эндпоинта свой счётчик. ⚠️Счётчик — на аккаунт, а не на ключ: несколько ключей (или несколько агентов на одном ключе) делят общий лимит, завести второй ключ ради удвоения частоты не получится. Про — 120/мин, Бизнес — 300/мин, Студия — 600/мин (фолбэк 60). Отдельно: создание голоса (POST /voices/clone) — 5/мин на аккаунт; GET /voices — 120/мин на IP; GET /status — 60/мин на IP; warmup — 20/мин на аккаунт. Превышение → 429 + Retry-After
Длина текстамакс. символов на один POST /api/v1/tts — по тарифу ключа; плоский текст сервис режет на части сам (одна генерация движка ≤[object Promise] символов, синхронно до 5 частей — дальше text_too_long_for_sync). В /tts_stream суммарная длина сегментов — тоже по тарифу ключа, жёсткого числа нет
Баланс символовсинтез списывает символы с тарифа ключа; при нулевом балансе — 402
Расшифровка≈1 мин аудио = 1000 символов; учитывается месячный лимит минут расшифровки тарифа
Размер файласоздание голоса: образец ≤10 МБ самого файла (не base64), иначе 413. Расшифровка: аудио ≤ ~30 МБ (base64), иначе 413
Пример

Полный запрос

POST /api/v1/tts { "voice": "ru_n16", "text": "Сегодня отличная погода.", "language": "ru", "instruct": "calm, friendly", "speed": 1.0, "effect": "podcast", "eq": { "bands": [ { "hz": 3500, "db": 3 } ] }, "background": "rain", "bg_level": 0.2, "format": "mp3" } → 200 OK, Content-Type: audio/mpeg (бинарный файл)
FAQ

Частые вопросы разработчиков

Как получить API-ключ и с какого тарифа он доступен?

В кабинете → раздел «API» создайте ключ (формат sk-live-…) — он показывается один раз, сохраните сразу. Публичный API доступен с тарифа Про и выше; на младших вернётся 403 plan_required.

Как передавать ключ в запросе?

Заголовком — принимаются оба варианта: X-API-Key: sk-live-… или Authorization: Bearer sk-live-…. Тело запроса — JSON.

Чем POST /api/v1/tts отличается от /api/v1/tts_stream?

/tts — синхронный, отдаёт готовый файл (WAV/MP3 или телефонный формат). /tts_stream — низколатентный поток сырого PCM по мере синтеза, для голосовых ассистентов; без mp3, телефонии и пост-обработки целого файла (чистка/фон). Пресет-эффект, громкость и эквалайзер в потоке работают.

В каком формате приходит поток и как его проиграть?

Сырой PCM: 16 бит, 24000 Гц, моно, без WAV-заголовка (Content-Type: application/octet-stream). Проиграть: ffplay -f s16le -ar 24000 -ac 1 -i - или aplay -f S16_LE -r 24000 -c 1; либо дописать WAV-заголовок и сохранить как .wav.

Какие форматы у обычного /api/v1/tts?

По умолчанию WAV; format:"mp3" → MP3. Для телефонии — response_format: g711_alaw_8k, g711_ulaw_8k, g722_16k, opus, pcm_s16le_24k (фактический формат приходит в заголовке X-Audio-Format).

Что значат коды ошибок?

401 — проблема с ключом; 402 insufficient_balance — не хватает символов; 403 — нет прав (тариф/email/голос); 429 rate_limited — превышен лимит (см. заголовок Retry-After); 400 — ошибка в запросе; 503 — движок занят/недоступен; 502 — сбой синтеза (символы возвращаются). Причина — в поле code ответа.

Какие ошибки стоит ретраить?

Только временные: 429 — по Retry-After; 503/502 — с экспоненциальной паузой, 2–4 попытки. Не ретраить 400/401/402/403/413/409 — это про сам запрос, доступ или баланс.

Как создать свой голос через API?

POST /api/v1/voices/create (алиас /api/v1/voices/clone): поля name, audio_b64 (образец, до 10 МБ самого файла), ref_text (расшифровка образца слово-в-слово), consent (строка с токенами voice-data-consent и privacy). Голос приватный, привязан к вашему аккаунту.

Как расшифровать аудио?

POST /api/v1/transcribe: audio_b64 и опционально language (только полное имя языка — например «Russian», не «ru»). Вернёт {text, language}. Стоимость — по длительности аудио.

Как получить одинаковый результат при повторных запросах?

Передавайте фиксированный seed (целое) вместе с теми же текстом/голосом/параметрами — озвучка воспроизводится идентично.

Есть ли вебхуки или колбэки?

Нет. Синтез и расшифровка синхронные — результат приходит в том же запросе. Асинхронной постановки задач с колбэком нет.

Как снизить задержку для голосового бота?

Используйте /api/v1/tts_stream (звук по мере синтеза), заранее прогрейте движок POST /api/v1/warmup (без списания) и проверяйте готовность GET /api/v1/status.

В аудио щелчок/шум/треск — что делать?

Обновите и повторите запрос. Если повторяется — это дефект на нашей стороне (не ваша настройка и не паузы): напишите в поддержку с примером и параметрами запроса, починим.

Получите ключ за минуту

Получить API-ключ →
POST /api/v1/ttsGET /api/v1/voicesSEO-страница API