LLM API и интеграция

Озвучка текста через API: Gemini 3.8 Flash TTS в рублях

Озвучка текста через API: Gemini 3.8 Flash TTS в рублях

Озвучить текст через API в рублях можно моделью Gemini 3.8 Flash TTS: POST /v1/audio/speech, тот же ключ и баланс, что у текстовых моделей KeyDealer. На 28 октября 2026 года оценка — около 1,25 ₽ за 1000 символов. За один запрос — до 2500 символов, на выходе WAV 24 кГц моно, на выбор 70 готовых голосов.

Разберём формат запроса, порядок «оценка — задача — статус — файл», нарезку длинного текста, склейку аудио и работу с интонацией.

Что умеет озвучка в KeyDealer

Позиция одна — gemini-3-8-flash-tts, она же google/gemini-3-8-flash-tts. Синтез проверен 14 октября 2026 года, модель доступна в живом каталоге.

ПараметрЗначение на 28.10.2026
ЭндпоинтPOST /v1/audio/speech, асинхронно
Обязательные поляmodel, input, voice
Необязательные поляinstructions (до 500 символов), response_format
Текст за запросдо 2500 символов
ВыходWAV, 24 кГц, моно, PCM 16 бит, до 300 секунд
Голоса70 готовых, список в GET /v1/audio/voices
Клонирование, несколько дикторов, MP3нет
Ценаоценка около 1,25 ₽ за 1000 символов

Сама модель — разработка Google. По документации Google, Gemini 3.8 Flash TTS понимает больше 130 языков, русский среди них. Язык модель определяет по тексту сама, отдельного параметра нет.

Если нужно превращать тексты в голос и платить российской картой, KeyDealer даёт Gemini 3.8 Flash TTS по тому же ключу, что и текстовые модели. Оценка на 28 октября 2026 года — около 1,25 ₽ за 1000 символов. Отдельный аккаунт у Google и валютная карта для этого не нужны.

Как устроен запрос на озвучку

Тело запроса одно и то же для оценки и для запуска. Удобно держать его в файле:

{
  "model": "gemini-3-8-flash-tts",
  "input": "Привет! Это озвучка через KeyDealer.",
  "voice": "Charon",
  "instructions": "Спокойно и доброжелательно.",
  "response_format": "wav"
}

Дальше четыре шага.

# 1. Бесплатная оценка: ничего не резервирует и не запускает
curl --fail-with-body https://api.keydealer.ru/v1/audio/speech/quote \
  -H "Authorization: Bearer $KEYDEALER_API_KEY" \
  -H "Content-Type: application/json" --data-binary @speech.json

# 2. Запуск с максимумом из оценки и уникальным ключом задачи
curl --fail-with-body https://api.keydealer.ru/v1/audio/speech \
  -H "Authorization: Bearer $KEYDEALER_API_KEY" \
  -H "Content-Type: application/json" \
  -H "X-KD-Idempotency-Key: $SPEECH_IDEMPOTENCY_KEY" \
  -H "X-KD-Max-Charge-Microrubles: $MAX_CHARGE_MICRORUBLES" \
  --data-binary @speech.json

# 3. Статус той же задачи до completed или failed
curl --fail-with-body "https://api.keydealer.ru/v1/audio/speech/operations/$OPERATION_ID" \
  -H "Authorization: Bearer $KEYDEALER_API_KEY"

# 4. Скачивание WAV после completed
curl --fail-with-body "https://api.keydealer.ru/v1/audio/speech/operations/$OPERATION_ID/content" \
  -H "Authorization: Bearer $KEYDEALER_API_KEY" -o voice.wav

Оба заголовка во втором шаге обязательны. X-KD-Max-Charge-Microrubles берётся из поля max_charge_microrubles ответа оценки, 1 ₽ = 1 000 000 микрорублей. X-KD-Idempotency-Key — строка от 16 до 128 латинских букв, цифр, дефисов и подчёркиваний, своя для каждой задачи.

Запуск возвращает 202 и JSON с полем id вида kd_tts_.... Статусы: queued, dispatching, waiting, unknown, completed, failed. Повторное скачивание готового файла бесплатно и новую озвучку не запускает.

Почему это не похоже на OpenAI audio.speech

Потому что ответ — задача, а не аудиофайл. Синхронный вызов audio.speech.create() из SDK OpenAI ждёт байты WAV или MP3 в ответе и с этим API без адаптации работать не будет. Нужна небольшая обёртка: оценка, запуск, опрос статуса раз в несколько секунд, скачивание.

Неизвестные поля в теле отклоняются ещё до отправки модели. Параметр speed и формат mp3 из спецификации OpenAI вернут ошибку 400, денег за неё не возьмут.

Сколько стоит озвучка и как работает резерв

Ответ: около 1,25 ₽ за 1000 символов по оценке каталога на 28 октября 2026 года. Статья в 10 000 символов — это четыре-пять запросов и около 12,5 ₽. Текст в 500 000 символов, то есть небольшая книга, — около 200 запросов и 627 ₽.

Оценка не равна счёту. Итог считается по фактическому использованию, которое подтверждает модель, поэтому он может немного отличаться от оценки в обе стороны.

Перед отправкой KeyDealer резервирует на балансе максимум из оценки. Он заметно выше ожидаемой суммы, в разы, — это страховка на случай, если подтверждённое использование окажется больше расчётного. Списание происходит только после того, как аудио проверено, и никогда не превышает принятый максимум. Лишний резерв возвращается, когда задача завершается. Отсюда практический вывод: на балансе должно хватать денег на резерв, а не только на ожидаемую сумму, иначе придёт 402.

Если статус unknown, исход ещё не подтверждён. В этом случае не создавайте новую задачу и не считайте, что озвучка бесплатна: продолжайте спрашивать статус той же задачи.

Как разрезать длинный текст на куски по 2500 символов

Резать по границам предложений, а не ровно по 2500 знаков. Обрыв на середине фразы модель прочитает с неестественной интонацией, и шов будет слышен.

Скрипт ниже собирает предложения в куски не длиннее лимита. Если одно предложение само длиннее 2500 символов, он режет его по последнему пробелу. Python считает длину строки в кодовых точках Unicode — так же, как лимит в API.

import re, sys

LIMIT = 2500

def chunks(text, limit=LIMIT):
    sentences = re.split(r'(?<=[.!?…])\s+', text.strip())
    out, cur = [], ''
    for s in sentences:
        while len(s) > limit:              # очень длинное предложение
            cut = s.rfind(' ', 0, limit)   # режем по последнему пробелу
            cut = cut if cut > 0 else limit
            if cur:
                out.append(cur); cur = ''
            out.append(s[:cut].strip()); s = s[cut:].strip()
        if cur and len(cur) + len(s) + 1 > limit:
            out.append(cur); cur = s
        else:
            cur = f'{cur} {s}'.strip()
    if cur:
        out.append(cur)
    return out

text = open(sys.argv[1], encoding='utf-8').read()
for i, c in enumerate(chunks(text)):
    open(f'chunk_{i:02d}.txt', 'w', encoding='utf-8').write(c)
    print(i, len(c))

Мы проверили скрипт на тексте из 400 предложений и одного искусственного предложения примерно в 4000 символов. Все куски вышли не длиннее 2500 символов, и при склейке текст совпал с исходным.

Учтите второй лимит: одна озвучка — не больше 300 секунд. В обычном темпе 2500 символов русского текста, по нашей грубой прикидке, звучат около трёх минут. Если в instructions вы просите говорить медленно, уменьшите куски, например до 1500 символов. Общие принципы нарезки длинных текстов — в статье как разбить документ на части.

Как склеить WAV-файлы в один

Все куски приходят в одном формате, 24 кГц моно PCM 16 бит, поэтому их можно склеить без перекодирования. Для ffmpeg это список файлов и демультиплексор concat:

# пауза 0,4 секунды между кусками, в том же формате
ffmpeg -f lavfi -i anullsrc=r=24000:cl=mono -t 0.4 -c:a pcm_s16le pause.wav

# список: кусок, пауза, кусок...
for f in voice_*.wav; do printf "file '%s'\nfile 'pause.wav'\n" "$f"; done > list.txt

ffmpeg -f concat -safe 0 -i list.txt -c copy book.wav

Короткая пауза между кусками нужна, чтобы стыки звучали как конец абзаца, а не как запнувшийся диктор. Если нужен MP3, конвертируйте уже склеенный файл одной командой ffmpeg.

Как задавать интонацию через instructions

Ответ: короткой фразой о манере чтения, одинаковой для всех кусков. Например: «спокойно и доброжелательно», «бодро, как ведущий подкаста», «медленно и чётко, как на уроке».

В документации Google есть важная деталь о моделях 3.8. Текст они читают как дословную расшифровку, поэтому ремарки вроде «(с улыбкой)» внутри input прозвучат вслух. Манеру нужно описывать отдельно — у нас для этого поле instructions.

Ещё три совета Google, которые стоит перенести на свой поток:

  • Сначала озвучьте текст вовсе без инструкций — по словам Google, большинству запросов стиль не нужен.
  • Держите инструкцию короткой. Длинные описания персонажа на несколько абзацев, по наблюдению Google, — частая причина того, что голос «плывёт».
  • Не пытайтесь менять в инструкции пол, возраст или акцент. Для этого выбирают другой голос.

Google описывает и встроенные теги пауз и звуков в самом тексте, например <short pause> или <sigh>. Через API KeyDealer мы их не проверяли, поэтому на них не рассчитывайте, пока не убедитесь на своём тексте.

Как выбрать голос

Список из 70 имён отдаёт GET /v1/audio/voices. Имя передаётся в поле voice точно как в списке, например Charon или Kore. Описаний тембров в нашем каталоге нет, поэтому выбирать придётся на слух.

Практичный способ — озвучить одну и ту же фразу на русском пятью-десятью голосами. Фраза в 200 символов по оценке стоит около 0,25 ₽, так что выбор голоса обходится в 2–3 рубля. Один раз выбранный голос держите неизменным для всего проекта — иначе куски будут звучать разными людьми.

Где озвучка полезна

Типичные задачи — аудиоверсии статей, озвучка уроков и инструкций, голос для роликов. Для онлайн-курсов это разобрано в статье нейросеть для онлайн-школы, для видео — в материале о сценариях для видео.

Живой голосовой разговор с агентом — другая задача и другая модель. Чем отличается озвучка готового текста от диалога в реальном времени, разобрано в статье про Gemini 3.8 Live. Ограничить расход на пакетную озвучку можно отдельным ключом с потолком, это описано в статье про лимит расхода на ключ.

Что происходит с текстом и аудио

Текст и инструкции передаются модели для озвучки. До отправки мы храним их в зашифрованном виде; неотправленная задача истекает через 24 часа. Готовое аудио хранится зашифрованным и доступно только с ключом вашего аккаунта тоже 24 часа. После этого остаётся финансовая запись, но файл заново не генерируется — скачайте его вовремя.

Чего мы не утверждаем

Мы не утверждаем, что оценка равна счёту. 1,25 ₽ за 1000 символов — ориентир каталога на 28 октября 2026 года, итог считается по подтверждённому использованию.

Мы не обещаем возможностей модели, которых нет в нашем API. У Google есть диалог двух дикторов, дизайн и копирование голоса — через KeyDealer этого нет.

Мы не оцениваем качество голосов. Звучание на вашем тексте проверяется только прослушиванием.

Что держать в голове

Первое. Это асинхронный API: оценка, задача, статус, файл. Код под синхронный вызов OpenAI придётся обернуть.

Второе. Лимиты — 2500 символов текста и 300 секунд звука на запрос. Длинный текст режьте по предложениям, куски склеивайте с короткой паузой.

Третье. Интонацию задаёт короткая инструкция, одинаковая на всех кусках, а текст модель читает дословно. Что мы за проект — на странице о проекте, ключ заводится на keydealer.ru/login.

Частые вопросы

Сколько стоит озвучка текста через KeyDealer?

На 28 октября 2026 года оценка в каталоге — около 1,25 ₽ за 1000 символов. Это не фиксированный тариф: итог считается по подтверждённому использованию. Точную оценку и максимум для своего текста даёт бесплатный POST /v1/audio/speech/quote.

Сколько текста можно озвучить за один запрос?

До 2500 символов в поле input и до 500 символов в instructions. Длинный текст режут на куски по границам предложений и склеивают готовые WAV. Одна озвучка длится не больше 300 секунд.

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

WAV, 24 кГц, моно, PCM 16 бит. MP3 сервис не отдаёт, поэтому при необходимости конвертируйте файл сами, например через ffmpeg. Готовое аудио доступно для скачивания 24 часа.

Можно ли клонировать свой голос или озвучить диалог двумя голосами?

Нет. В KeyDealer доступен один диктор из готовых голосов, клонирования и нескольких дикторов в запросе нет. Диалог можно собрать из отдельных озвучек разными голосами и склеить.

Почему ответ приходит не сразу?

API асинхронный. Запрос создаёт задачу и возвращает её номер в JSON, а не аудиофайл. Статус проверяют по номеру, а WAV скачивают после статуса completed. Синхронный вызов в стиле OpenAI audio.speech.create() без адаптации не подойдёт.

Как задать интонацию?

Через поле instructions — коротким описанием манеры, например «спокойно и доброжелательно». Сам текст в input модель читает дословно, поэтому ремарки туда не пишут. Одинаковая короткая инструкция на всех кусках держит тон ровным.

Источники