kosareva.cloud
← Документация API

Распознавание речи по API

Аудиофайл на вход — текст или субтитры на выход. Работает по тому же протоколу, что Whisper у OpenAI: адрес /v1/audio/transcriptions, файл в multipart/form-data, ответ в привычных форматах. Ключ и базовый адрес те же, что у текстовых моделей: https://api.kosareva.cloud/v1.

Модель — gemini-3-5-transcribe, это Gemini 3.5 Transcribe от Google: больше 85 языков, язык определяется сам, есть таймкоды по словам. Минута записи в среднем обходится около 0,55 ₽ — подробнее о цене ниже и на странице модели.

Первый запрос

Отправьте файл и имя модели. Без других параметров придёт JSON с полем text.

curl https://api.kosareva.cloud/v1/audio/transcriptions \
  -H "Authorization: Bearer ВАШ_API_КЛЮЧ" \
  -F model="gemini-3-5-transcribe" \
  -F file="@meeting.mp3" \
  -F language="ru"

language необязателен: без него модель определит язык сама, в том числе если собеседники переходят с одного языка на другой. Если язык известен заранее, укажите его кодом из двух букв — ru, en, kk.

Python, OpenAI SDK

from openai import OpenAI

client = OpenAI(
    api_key="ВАШ_API_КЛЮЧ",
    base_url="https://api.kosareva.cloud/v1",
)

with open("meeting.mp3", "rb") as audio:
    result = client.audio.transcriptions.create(
        model="gemini-3-5-transcribe",
        file=audio,
        language="ru",
        prompt="Kosareva Cloud, Kubernetes, PostgreSQL",  # термины и имена — списком
    )

print(result.text)
print(result.usage)  # сколько токенов звука и текста ушло на запрос

Если у вас уже есть код под Whisper, менять нужно три строки: ключ, base_url и model. Модели whisper-1 у нас нет — инструменту, который подставляет её по умолчанию, укажите gemini-3-5-transcribe.

Субтитры: srt и vtt

Попросите response_format srt или vtt — придёт готовый файл субтитров, фразы разбиты по паузам и концам предложений.

with open("lecture.mp3", "rb") as audio:
    subtitles = client.audio.transcriptions.create(
        model="gemini-3-5-transcribe",
        file=audio,
        response_format="srt",  # или "vtt"
    )

with open("lecture.srt", "w", encoding="utf-8") as file:
    file.write(subtitles)
curl https://api.kosareva.cloud/v1/audio/transcriptions \
  -H "Authorization: Bearer ВАШ_API_КЛЮЧ" \
  -F model="gemini-3-5-transcribe" \
  -F file="@lecture.mp3" \
  -F response_format="srt" \
  -o lecture.srt

Таймкоды фраз и слов: verbose_json

В verbose_json кроме текста есть длительность записи, фразы с началом и концом в секундах и каждое слово отдельно.

with open("call.wav", "rb") as audio:
    result = client.audio.transcriptions.create(
        model="gemini-3-5-transcribe",
        file=audio,
        response_format="verbose_json",
        timestamp_granularities=["word"],
    )

print(result.duration)  # длительность записи, секунды
for segment in result.segments:
    print(f"{segment.start:7.2f}–{segment.end:7.2f}  {segment.text}")
for word in result.words[:5]:
    print(word.word, word.start, word.end)

Фразы и слова приходят в verbose_json всегда, параметр timestamp_granularities можно не передавать.

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

ПолеЧто задаёт
fileЗапись: mp3, mp4, m4a, wav, ogg и opus, webm, flac, aac, aiff. Весь запрос вместе с файлом — до 25 МБ. Обязательно
modelgemini-3-5-transcribe. Обязательно
languageКод языка из двух букв, например ru. Без него язык определяется сам
promptТермины, имена и названия через запятую — модель возьмёт их как словарь. Связный текст здесь не учитывается, а в форматах с таймкодами словарь не работает
response_formatjson (по умолчанию), text, srt, vtt, verbose_json
timestamp_granularitiesПринимается для совместимости: в verbose_json и так есть фразы и слова
temperatureПринимается, но на расшифровку не влияет

Сколько стоит

Цена считается по токенам, как у самой модели: звук — 216 ₽ за миллион токенов, это 25 токенов на секунду записи, то есть около 0,32 ₽ за минуту; текст расшифровки — 1 296 ₽ за миллион токенов. Минута обычной речи в среднем выходит около 0,55 ₽: плотная речь чуть дороже, запись с паузами — дешевле. Сколько ушло на конкретный запрос, видно в расходах кабинета, а в форматах json и verbose_json — ещё и в поле usage ответа. В text, srt и vtt ответ — голый текст, поля usage там нет.

Голосовое сообщение на 30 секунд≈ 0,28 ₽
Звонок на 5 минут≈ 2,8 ₽
Совещание на час≈ 33 ₽

Запрос, который закончился ошибкой, не списывается.

Чего здесь нет

Ошибки

Ошибка приходит в формате OpenAI с объяснением по-русски, деньги за неё не списываются. Исключение — 413: слишком большой запрос отклоняется ещё на входе, и тело такого ответа не JSON, поэтому смотрите на код ответа.

400Нет файла, файл пустой, формат не звуковой, модель не для распознавания (например, whisper-1), неизвестный response_format, запись длиннее допустимого
413Запрос вместе с файлом больше 25 МБ
429Модель перегружена — повторите через минуту
502, 504Сбой или долгий ответ на стороне модели — повторите запрос

Коротко

Распознавание речи подключается тем же ключом и тем же SDK, что и чат, — отдельный договор или сервис не нужен. Для протоколов совещаний берите json или text, для видео — srt, для разметки звонков по времени — verbose_json.