Аудио: распознавание и синтез речи

Speech to text (STT), text to speech (TTS), MP3 и PCM

Используйте API-ключ с областью gateway:write, разрешённой моделью и положительным балансом организации.

bash
export BASE_URL="http://localhost:8012"
export KODIK_API_KEY="YOUR_API_KEY"
export STT_MODEL="openai/whisper-1"

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; большие записи разбивайте на части.

bash
curl --fail-with-body "$BASE_URL/v1/audio/transcriptions" \
  -H "Authorization: Bearer $KODIK_API_KEY" \
  -F "model=$STT_MODEL" \
  -F "file=@sample.wav"

Text to speech — синтез речи

POST /v1/audio/speech принимает model, input (до 4096 символов), voice, response_format (mp3 или pcm, по умолчанию mp3) и необязательный speed (0.25–4). Голос и формат должны поддерживаться моделью. Ответ — аудиобайты, а не JSON. Шлюз буферизует до 32 МиБ перед выдачей и проверяет стоимость; потоковая выдача во время генерации и SSE пока не поддерживаются.

bash
curl --fail-with-body "$BASE_URL/v1/audio/speech" \
  -H "Authorization: Bearer $KODIK_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model":"microsoft/mai-voice-2","input":"Hello world","voice":"en-US-Harper:MAI-Voice-2","response_format":"mp3"}' \
  -D speech.headers --output speech.mp3
Модели, стоимость и конфиденциальность
Используйте каталог /v1/catalog/models?api_surfaces=transcriptions или api_surfaces=speech. Для загрузки моделей выполните синхронизацию каталога в админке. Поддержаны подключения OpenRouter/KodikRouter; chat-модель с audio не обязательно поддерживает отдельный аудио-API. Стоимость берётся из usage.cost для транскрипции и данных генерации провайдера для речи, затем конвертируется в рубли с наценкой шлюза. Метаданные стоимости могут появиться с задержкой: шлюз ожидает их до 60 секунд. Если стоимость так и не получена, возвращается ошибка 502. Исходное аудио отправляется провайдеру без удаления PII. При включённом маскировании обнаруженные PII в тексте синтеза или подсказке транскрипции отклоняются до отправки: восстановить плейсхолдеры внутри звука нельзя. Provider options в этом режиме недоступны.

Для безопасного повтора передавайте Idempotency-Key: завершённый ответ хранится 24 часа, повтор с другим телом или одновременно выполняющийся запрос возвращает 409. Ошибка не сохраняется как успешный ответ: повтор после 502 может вызвать новую платную генерацию. Для аудио-чата по-прежнему используйте /v1/chat/completions.

Транскрипция через JSON

json
{
  "model": "openai/whisper-1",
  "input_audio": {"data": "BASE64_AUDIO", "format": "mp3"},
  "response_format": "json"
}

В поле data передайте base64-содержимое записи. Пример структуры успешного ответа; значения зависят от записи и модели:

json
{"text":"Hello world.","usage":{"cost":0.001,"input_tokens":10,"output_tokens":3}}

Проверка результата и ошибки

Для speech ожидайте HTTP 200, Content-Type: audio/mpeg для MP3 или audio/pcm для PCM и X-Generation-Id. Сохраните ответ в файл; MP3 можно открыть аудиоплеером. PCM — необработанные аудиоданные.

При ошибке возвращается JSON, а не аудиофайл. speech_generation означает ошибку получения звука; speech_billing — ошибку получения стоимости. Сохраните X-KodikRouter-Request-Id и X-Generation-Id для диагностики.

bash
cat speech.headers
file speech.mp3