Аудио: распознавание и синтез речи
Speech to text (STT), text to speech (TTS), MP3 и PCM
Используйте API-ключ с областью gateway:write, разрешённой моделью и положительным балансом организации.
Speech to text — распознавание речи
POST /v1/audio/transcriptions распознаёт аудио и возвращает JSON с text и usage. Принимается JSON с input_audio.data (base64) и input_audio.format либо multipart/form-data с file и model. Поддерживаются response_format: json и verbose_json; язык, температура и временные метки зависят от модели. Лимит всего тела запроса по умолчанию — 2 000 000 байт, включая base64 или multipart; большие записи разбивайте на части.
Text to speech — синтез речи
POST /v1/audio/speech принимает model, input (до 4096 символов), voice, response_format (mp3 или pcm, по умолчанию mp3) и необязательный speed (0.25–4). Голос и формат должны поддерживаться моделью. По умолчанию ответ синхронный — аудиобайты, а не JSON. Шлюз буферизует до 32 МиБ перед выдачей и проверяет стоимость; потоковая выдача во время генерации и SSE пока не поддерживаются.
Для долгого синтеза используйте Prefer: respond-async: сервер вернёт JSON задания с HTTP 202. Пример ниже сохраняет прежний синхронный режим.
В синхронном режиме передавайте Idempotency-Key: завершённый ответ хранится 24 часа, повтор с другим телом или одновременно выполняющийся запрос возвращает 409. Ошибка не сохраняется как успешный ответ: повтор после 502 может вызвать новую платную генерацию. Для аудио-чата по-прежнему используйте /v1/chat/completions.
Голоса для выбранной модели
/v1/audio/voices?model={model}Голоса из каталога; без model возвращаются доступные ключу speech-модели
Пример сокращён: фактический список зависит от синхронизированного каталога. Выберите ID из supported_voices и передайте его в voice. supported_voices: null и source: unavailable означают, что каталог не содержит списка, а не отсутствие поддержки голосов. API-ключу нужен scope gateway:read или gateway:write; применяется allowlist моделей. Также доступен /audio/voices. Пользовательские ID передаются провайдеру без изменения; доступ к приватным голосам ElevenLabs не гарантирован. Создание и клонирование голосов этим endpoint не поддерживаются.
Асинхронная генерация: 202 → polling → результат
Для долгих запросов добавьте Prefer: respond-async. Сервер сохранит задание и вернёт 202 Accepted с JSON, а не готовый результат. Клиент должен опрашивать статус и скачивать результат после завершения. Закрытие соединения не отменяет сохранённое задание.
Пример использует Bash, curl и jq. Выберите доступную вашему ключу модель; для речи также проверьте голос через /v1/audio/voices. Сохраните Idempotency-Key и тело запроса до отправки. Для нового намеренного задания задайте новый ключ; для повтора того же запроса оставьте прежний.
Ответ содержит id, status, polling_url, expires_at и request_id; content_url появляется при completed. Заголовки ответа: Location, Retry-After, Preference-Applied: respond-async и X-KodikRouter-Request-Id.
/v1/media/jobs/{id}Статус задания; используйте тот же API-ключ, что и при отправке
/v1/media/jobs/{id}/contentГотовый результат: JSON изображения или аудиобайты речи
Выполните следующий блок после получения job-id.txt. При временном сбое повторяйте этот блок с сохранённым ID, а не создавайте новое задание. При 429 соблюдайте Retry-After.
queued — в очереди; running — генерация; billing_pending / billing — ожидание или обработка стоимости; completed — результат доступен. В billing_pending звук уже может быть сохранён: сервер повторяет получение стоимости, не синтез. failed означает отказ, а needs_reconciliation — неизвестный исход платного запроса: обратитесь в поддержку с ID задания и request_id, не запускайте генерацию автоматически повторно.
Дневной или месячный лимит расходов блокирует новые генерации (402), но не polling и скачивание уже оплаченного результата. Ключ должен оставаться активным и неистёкшим; scope gateway:write, доступ к модели и rate limit продолжают действовать. Другой ключ не получает доступ к заданию. Повторные GET не запускают генерацию и не списывают стоимость задания снова. Async не отменяет сетевые таймауты скачивания больших файлов.
Транскрипция через JSON
В поле data передайте base64-содержимое записи. Пример структуры успешного ответа; значения зависят от записи и модели:
Проверка результата и ошибки
Для синхронного speech или скачивания завершённого async-задания ожидайте HTTP 200, Content-Type: audio/mpeg для MP3 или audio/pcm для PCM и X-Generation-Id. При async-отправке ожидайте 202 с JSON задания, не сохраняйте его как MP3. MP3 можно открыть аудиоплеером; PCM — необработанные аудиоданные.
При ошибке возвращается JSON, а не аудиофайл. speech_generation означает ошибку получения звука; speech_billing — ошибку получения стоимости. Сохраните X-KodikRouter-Request-Id и X-Generation-Id для диагностики.
