Документация Распознавание речи (SST)

Распознавание речи (Speech-to-Text)

API распознавания речи преобразует аудиофайлы в текст с помощью AI-моделей. Интерфейс полностью совместим с OpenAI Audio Transcriptions API, что обеспечивает простую миграцию с OpenAI.

Базовый URL: https://api.ru-openrouter.ru/v1/

Эндпоинты

Эндпоинт Метод Описание
/v1/audio/transcriptions POST Распознавание речи в текст
/v1/audio/translations POST Перевод аудио в текст на английском
/v1/transcriptions/models GET Список моделей для распознавания речи
/v1/models?filter=transcribe GET Фильтр моделей транскрипции в общем списке

Model Discovery

Получить список доступных STT-моделей можно через эндпоинт /v1/transcriptions/models:

curl "https://api.ru-openrouter.ru/v1/transcriptions/models" \
  -H "Authorization: Bearer sk_ваш_api_ключ"

Ответ возвращает модели, классифицированные как transcription:

{
  "object": "list",
  "data": [
    {
      "id": "openai/whisper-1",
      "object": "model",
      "created": 1735689600,
      "owned_by": "openai",
      "capabilities": {
        "can_understand_audio": false,
        "input_modalities": ["text"],
        "output_modalities": ["transcription"]
      },
      "pricing": {
        "prompt": "1.6150",
        "completion": "1.6150",
        "pricing_type": "per_minute",
        "currency": "RUB"
      },
      "context_length": 250000,
      "description": "Модель распознавания речи OpenAI Whisper. Преобразует аудио в текст."
    }
  ]
}

Также можно отфильтровать модели по типу через общий список:

curl "https://api.ru-openrouter.ru/v1/models?filter=transcribe" \
  -H "Authorization: Bearer sk_ваш_api_ключ"

Использование API

Отправьте POST-запрос на /v1/audio/transcriptions с аудиоданными. API поддерживает два формата ввода: multipart/form-data (OpenAI-стиль) и application/json (OpenRouter-стиль).

Multipart/form-data (OpenAI-стиль)

Самый простой способ — передать аудиофайл напрямую:

curl -X POST https://api.ru-openrouter.ru/v1/audio/transcriptions \
  -H "Authorization: Bearer sk_ваш_api_ключ" \
  -F "file=@audio.mp3" \
  -F "model=openai/whisper-1"

JSON (OpenRouter-стиль)

Альтернативный способ — передать аудио в base64-кодировке в теле JSON:

# Base64-кодирование аудиофайла
AUDIO_BASE64=$(base64 < audio.mp3 | tr -d '\n')

curl -X POST https://api.ru-openrouter.ru/v1/audio/transcriptions \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer sk_ваш_api_ключ" \
  -d '{
    "model": "openai/whisper-1",
    "input_audio": {
      "data": "'"$AUDIO_BASE64"'",
      "format": "mp3"
    }
  }'

Примеры на языках программирования

Python (Requests):

import requests

response = requests.post(
    url="https://api.ru-openrouter.ru/v1/audio/transcriptions",
    headers={
        "Authorization": "Bearer sk_ваш_api_ключ",
    },
    files={
        "file": ("audio.mp3", open("audio.mp3", "rb")),
    },
    data={
        "model": "openai/whisper-1",
    }
)

result = response.json()
print(result["text"])
print(f"Generation ID: {result.get('generation_id')}")

Python (OpenAI SDK):

from openai import OpenAI

client = OpenAI(
    base_url="https://api.ru-openrouter.ru/v1",
    api_key="sk_ваш_api_ключ",
)

with open("audio.mp3", "rb") as f:
    result = client.audio.transcriptions.create(
        model="openai/whisper-1",
        file=f,
    )

print(result.text)

JavaScript (Fetch):

import fs from 'fs';

const formData = new FormData();
formData.append('model', 'openai/whisper-1');
formData.append('file', new Blob([fs.readFileSync('audio.mp3')]), 'audio.mp3');

const response = await fetch('https://api.ru-openrouter.ru/v1/audio/transcriptions', {
  method: 'POST',
  headers: {
    Authorization: 'Bearer sk_ваш_api_ключ',
  },
  body: formData,
});

const result = await response.json();
console.log(result.text);

PHP:

$ch = curl_init('https://api.ru-openrouter.ru/v1/audio/transcriptions');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => [
        'Authorization: Bearer sk_ваш_api_ключ',
    ],
    CURLOPT_POST => true,
    CURLOPT_POSTFIELDS => [
        'model' => 'openai/whisper-1',
        'file' => curl_file_create(__DIR__ . '/audio.mp3'),
    ],
]);
$result = json_decode(curl_exec($ch), true);
curl_close($ch);

echo $result['text'] . "\n";

Параметры запроса

Multipart/form-data

Параметр Тип Обязательный Описание
model string Да STT-модель (например, openai/whisper-1, openai/whisper-large-v3). Список: /v1/transcriptions/models
file file Да Аудиофайл (mp3, wav, ogg, flac, m4a, mp4, webm)
language string Нет ISO-639-1 код языка (например, "ru", "en"). Если не указан — определяется автоматически
response_format string Нет Формат ответа: json (по умолчанию), verbose_json
temperature number Нет Температура семплинга (0–1). Более низкие значения дают более детерминированный результат
prompt string Нет Подсказка для распознавания (помогает с нестандартной лексикой)
timestamp_granularities string Нет Детализация временных меток: word или segment (только для verbose_json)

JSON (OpenRouter-стиль)

Параметр Тип Обязательный Описание
model string Да STT-модель
input_audio.data string Да Аудиоданные в base64-кодировке (raw bytes, не data URI)
input_audio.format string Да Формат аудио (wav, mp3, flac, m4a, ogg, webm, aac)
language string Нет ISO-639-1 код языка
response_format string Нет json (по умолчанию) или verbose_json
temperature number Нет Температура семплинга (0–1)
prompt string Нет Подсказка для распознавания
timestamp_granularities string Нет word или segment

Provider-specific параметры

Параметры провайдера передаются через поле provider и пробрасываются upstream-провайдеру:

{
  "model": "openai/whisper-large-v3",
  "input_audio": {
    "data": "UklGRiQA...",
    "format": "wav"
  },
  "provider": {
    "options": {
      "groq": {
        "prompt": "Expected vocabulary: OpenRouter, API, transcription"
      }
    }
  }
}

Формат ответа

JSON (response_format=json)

{
  "text": "Привет, это тест распознавания речи.",
  "usage": {
    "seconds": 9.2,
    "total_tokens": 113,
    "input_tokens": 83,
    "output_tokens": 30,
    "cost_rub": 0.0508
  },
  "generation_id": "gen_abc123def"
}

Verbose JSON (response_format=verbose_json)

{
  "task": "transcribe",
  "language": "russian",
  "duration": 9.2,
  "text": "Привет, это тест распознавания речи.",
  "segments": [
    {
      "id": 0,
      "seek": 0,
      "start": 0.0,
      "end": 4.5,
      "text": "Привет, это тест",
      "tokens": [1, 2, 3, 4, 5],
      "temperature": 0.0,
      "avg_logprob": -0.4,
      "compression_ratio": 1.2,
      "no_speech_prob": 0.02
    },
    {
      "id": 1,
      "seek": 45,
      "start": 4.5,
      "end": 9.2,
      "text": " распознавания речи.",
      "tokens": [6, 7, 8, 9],
      "temperature": 0.0,
      "avg_logprob": -0.35,
      "compression_ratio": 1.1,
      "no_speech_prob": 0.01
    }
  ],
  "usage": {
    "seconds": 9.2,
    "total_tokens": 113,
    "input_tokens": 83,
    "output_tokens": 30,
    "cost_rub": 0.0508
  },
  "generation_id": "gen_abc123def"
}

При передаче timestamp_granularities[]=word в ответ добавляется массив words с пословными временными метками.

Поля ответа

Поле Тип Описание
text string Распознанный текст
usage.seconds number Длительность входного аудио в секундах
usage.total_tokens number Общее количество токенов (input + output)
usage.input_tokens number Количество входных токенов
usage.output_tokens number Количество выходных токенов
usage.cost_rub number Стоимость запроса в рублях
generation_id string Уникальный идентификатор генерации

Заголовки ответа

Заголовок Описание
X-Generation-Id Уникальный ID генерации для отслеживания и отладки

Перевод аудио (Translation)

Эндпоинт /v1/audio/translations полностью аналогичен /v1/audio/transcriptions по формату запроса, но возвращает перевод аудио на английский язык.

curl -X POST https://api.ru-openrouter.ru/v1/audio/translations \
  -H "Authorization: Bearer sk_ваш_api_ключ" \
  -F "file=@audio.mp3" \
  -F "model=openai/whisper-1"

Поддерживаемые аудиоформаты

Поддерживаемые форматы аудио зависят от провайдера. Наиболее распространённые:

Формат MIME-тип Описание
wav audio/wav Без сжатия, наилучшее качество
mp3 audio/mpeg Со сжатием, широко совместим
flac audio/flac Сжатие без потерь
m4a audio/mp4 MPEG-4 аудио
ogg audio/ogg Ogg Vorbis
webm audio/webm WebM аудио
aac audio/aac Advanced Audio Coding

Подсказки (Prompt)

Параметр prompt позволяет передать подсказку для улучшения распознавания — например, список ожидаемых терминов, имён или специфической лексики:

curl -X POST https://api.ru-openrouter.ru/v1/audio/transcriptions \
  -H "Authorization: Bearer sk_ваш_api_ключ" \
  -F "file=@audio.mp3" \
  -F "model=openai/whisper-1" \
  -F "prompt=OpenRouter, API, транскрипция, нейросеть"

Поддержка prompt зависит от провайдера — некоторые провайдеры игнорируют этот параметр.

Ограничения

  • Размер файла: для multipart-загрузки — до 25 MB. Для сжатых форматов (MP3, AAC) это соответствует примерно 26 минутам аудио при 128 kbps или более 2 часов при 24 kbps Opus. Для WAV этот лимит достигается быстрее (около 13 минут при 16 kHz моно).
  • Таймаут провайдера: до 60 секунд обработки. Для длинных аудиофайлов рекомендуется разделять их на сегменты.
  • response_format: text, srt и vtt не поддерживаются — передача этих значений вернёт ошибку 400.

Ошибки

Коды ошибок

HTTP-код code Описание
400 missing_model Не указан параметр model
400 invalid_json_body Некорректное JSON-тело (для JSON-формата)
400 invalid_base64 Некорректная base64-кодировка в input_audio.data
400 file_upload_error Ошибка загрузки файла
400 model_not_found Модель не найдена или неактивна
400 model_not_supported Модель не поддерживает транскрипцию аудио
402 insufficient_balance Недостаточно средств на балансе
429 limit_exceeded Превышен лимит API-ключа
503 audio_transcription_unavailable Сервис транскрипции временно недоступен