Распознавание речи (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 |
Сервис транскрипции временно недоступен |