Озвучка текста
Текст в речь через POST /audio/speech. Совместимо с OpenAI SDK — подмените base_url. Ответ — сырой аудиопоток, не JSON.
POST https://api.aitunnel.ru/v1/audio/speech принимает JSON. В OpenAI SDK укажите base_url https://api.aitunnel.ru/v1/.
Поддерживаемые модели
Актуальный список, голоса, форматы и цены — публичный каталог:
curl https://api.aitunnel.ru/public/aitunnel/models/speechНа сайте: страница моделей.
| Поле | Описание |
|---|---|
voices | Идентификаторы голосов для поля voice |
supported_formats | Значения response_format. Первый — если параметр не указать |
symbols_cost | Цена за 1 млн символов в рублях — или за 1 млн байт UTF-8, если billing_unit: "utf8_bytes" |
billing_unit | characters или utf8_bytes. У drama-3 — байты: кириллица 2 байта на букву, латиница 1 |
voices: [] | Пустой список = фиксированных голосов нет, опишите голос текстом |
prompt_cost / completion_cost | Цена за 1 млн токенов, если модель тарифицируется по токенам |
russian_supported | Надёжно ли озвучивает русский |
supports_voice_cloning | Принимает ли сэмпл голоса в input_references |
voice_sample_max_bytes | Самый большой сэмпл голоса в base64, в байтах; null без клонирования. Больше — 400 |
Имя в запросе — без префикса провайдера: gpt-4o-mini-tts, не openai/gpt-4o-mini-tts. Префикс provider/model обходит каталог — см. OpenRouter.
Базовое использование
curl https://api.aitunnel.ru/v1/audio/speech \
-H "Authorization: Bearer sk-aitunnel-xxx" \
-H "Content-Type: application/json" \
-d '{
"model": "gpt-4o-mini-tts",
"voice": "alloy",
"input": "Привет! Это пример озвучки текста через AITUNNEL.",
"response_format": "mp3"
}' \
--output output.mp3Параметры запроса
| Параметр | Тип | Обязательный | Описание |
|---|---|---|---|
model | string | да | Имя из каталога или provider/model |
input | string | да | Текст для озвучки |
voice | string | обычно | Голос из voices модели. Если voices пустой — не передавайте |
response_format | string | нет | Формат аудио. Если не указать — первый из supported_formats (обычно mp3) |
speed | number | нет | Скорость речи, 0.25–4.0. Есть у моделей OpenAI и eleven-multilingual-v2, у остальных может игнорироваться |
instructions | string | нет | Стиль речи. Есть у gpt-4o-mini-tts |
input_references | array | нет | Сэмпл голоса для клонирования — ниже |
Формат ответа
Тело — бинарное аудио. Стоимость и баланс — в заголовках:
| Заголовок | Описание |
|---|---|
Content-Type | audio/mpeg для mp3, audio/pcm для pcm |
cost-rub | Стоимость запроса в рублях |
balance | Остаток баланса после списания |
X-AITunnel-Cost-Pending | true, если провайдер ещё не сообщил стоимость. Тогда cost-rub и balance не приходят, а списание появится позже — подробнее |
X-Request-Id | ID запроса (tts-…), как в истории расходов |
Ошибка приходит JSON-ом, не аудио: сначала проверьте статус ответа. Форма ошибки — ошибки и отладка.
Перед запросом на балансе откладывается цена текста по каталогу; не хватает баланса или бюджета ключа — 402. У части моделей с ценой за символ действует нижняя граница: за запрос списывается не меньше каталожной цены символов input, даже если провайдер посчитал дешевле.
Клонирование голоса
У части моделей можно передать короткий сэмпл в input_references — отдельный «загрузить голос» шаг не нужен. Нужен один input_audio (base64 или data-URI) и по желанию text с расшифровкой сэмпла:
{
"model": "voxtral-mini-tts-2603",
"input": "Hello from my cloned voice!",
"response_format": "mp3",
"input_references": [
{
"type": "input_audio",
"input_audio": { "data": "data:audio/wav;base64,UklGRuQXDAB..." }
},
{ "type": "text", "text": "This is the transcript of the reference audio." }
]
}Не все модели это умеют: смотрите supports_voice_cloning в каталоге. Сейчас это seed-audio-1-0. Если поле false, input_references вернёт 400. Слишком большой сэмпл провайдер отклонит.
Оплата за секунду аудио
seed-audio-1-0 тарифицируется не по символам, а по длительности готовой озвучки: 0,5 ₽ за секунду, 30 ₽ за минуту. Поле symbols_cost у неё — пересчёт этой цены в символы по средней скорости чтения, а не тариф. Практические следствия: короткий запрос всё равно стоит несколько секунд аудио, так что цена за символ на коротких строках выше; за один вызов нельзя получить больше 120 секунд, то есть дороже 60 ₽ запрос не выйдет. Точная сумма — в заголовке cost-rub.
Примеры
gpt-4o-mini-tts с инструкциями по стилю
response = client.audio.speech.create(
model="gpt-4o-mini-tts",
voice="nova",
input="Добро пожаловать! Сегодня у нас отличные скидки.",
instructions="Говори с энтузиазмом, как диктор рекламы.",
)
response.stream_to_file("promo.mp3")Grok Voice TTS 1.0
response = client.audio.speech.create(
model="grok-voice-tts-1.0",
voice="eve",
input="Hello! This is a test of Grok Voice TTS.",
response_format="mp3",
)
response.stream_to_file("grok.mp3")Gemini 3.1 Flash TTS с эмоциональными тегами
Только pcm:
response = client.audio.speech.create(
model="gemini-3.1-flash-tts-preview",
voice="Kore",
input="[excited] Невероятно! [whispers] Это работает.",
response_format="pcm",
)
response.stream_to_file("gemini.pcm")ElevenLabs Eleven v4 с аудиотегами
Теги в квадратных скобках ([whispers], [laughs], [sighs]) модель исполняет, а не читает вслух. Работают в eleven-v4 и eleven-v3. Теги входят в оплачиваемые символы и в лимит запроса: 10 000 символов у eleven-v4, eleven-v4-turbo и eleven-multilingual-v2, 5 000 у eleven-v3, 40 000 у eleven-flash-v2.5. Кроме 21 голоса из voices (george, sarah, …) в voice можно передать ID голоса из библиотеки ElevenLabs, например JBFqnCBsd6RMkjVDRZzb.
response = client.audio.speech.create(
model="eleven-v4",
voice="george",
input="[whispers] Это большой секрет. [laughs] Ну ладно, расскажу!",
response_format="mp3",
)
response.stream_to_file("eleven.mp3")Voxtral Mini TTS
response = client.audio.speech.create(
model="voxtral-mini-tts-2603",
voice="en_paul_neutral",
input="Welcome to our service. How can I help you today?",
response_format="mp3",
)
response.stream_to_file("voxtral.mp3")Несколько голосов в подкасте
segments = [
("nova", "Добрый день! Вы слушаете еженедельный подкаст о технологиях."),
("onyx", "Сегодня мы обсудим последние новости в мире ИИ."),
("nova", "Начнём с обзора новых моделей этой недели."),
]
for i, (voice, text) in enumerate(segments):
response = client.audio.speech.create(
model="tts-1-hd",
voice=voice,
input=text,
response_format="mp3",
)
response.stream_to_file(f"segment_{i}.mp3")Лучшие практики
- Модель:
gpt-4o-mini-tts— стиль черезinstructions;tts-1— быстрее;grok-voice-tts-1.0— много языков;gemini-3.8-flash-tts— наррация и диалог;gemini-3.8-flash-lite-tts— массовое чтение вслух;gemini-3.1-flash-tts-preview— теги эмоций. У всех трёх Gemini толькоpcm. ElevenLabs:eleven-v4— максимум выразительности;eleven-v4-turbo,eleven-v3-conversationalиeleven-flash-v2.5— голосовые агенты с низкой задержкой;eleven-multilingual-v2— аудиокниги и ролики.drama-3— режиссируемая озвучка: эмоция в квадратных скобках перед репликой, теги вроде<whisper>внутри строки.heygen-voice-1иheygen-voice-1-turbo— 39 языков и 10 голосов, толькоpcm.assemblyai-tts-1— тысячи голосов (slug видаaai-janeвvoice), шесть языков: английский, испанский, французский, немецкий, итальянский и португальский; русского нет, до 5 000 символов за запрос.simba-3.5от Speechify — 48 языков в одной модели (язык определяется по тексту, русский не заявлен и звучит с акцентом), голоса видаgeffen_32иalec, теги[whispering]и(sighs)в тексте, 3 000 ₽ за 1M символов. - Формат:
mp3для хранения и плеера;pcmдля пайплайнов с низкой задержкой. Не сохраняйтеpcmкак.mp3. - Длинный текст режьте на фрагменты и склеивайте аудио.
- Кэшируйте готовые файлы — повтор того же текста оплачивается снова.
Устранение неполадок
Пустой или битый файл?
response_formatдолжен совпадать с расширением. У Gemini — толькоpcm.- Не-200 ответ — JSON с ошибкой, не аудио.
400 на формат?
- Смотрите
supported_formatsмодели.
Модель не найдена?
- Имя без префикса провайдера (
gpt-4o-mini-tts, неopenai/gpt-4o-mini-tts). - Список:
GET https://api.aitunnel.ru/public/aitunnel/models/speech.
Голос не принят?
- Берите идентификатор из
voicesэтой модели в каталоге. Наборы у моделей разные. - Если
voicesпустой (seed-audio-1-0), полеvoiceне передавайте вообще: чужое имя вродеalloyпровайдер отклонит с 400. Нужный тембр опишите вinputилиinstructions, либо передайте образец вinput_references.
400 на input_references?
- Клонирование есть только у моделей с
supports_voice_cloning: true.
Смотрите также
- Аудио — аудио в чате
- Распознавание речи — аудио в текст
- Список моделей
- Ошибки и отладка