Распознавание речи по 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 МБ. Обязательно |
model | gemini-3-5-transcribe. Обязательно |
language | Код языка из двух букв, например ru. Без него язык определяется сам |
prompt | Термины, имена и названия через запятую — модель возьмёт их как словарь. Связный текст здесь не учитывается, а в форматах с таймкодами словарь не работает |
response_format | json (по умолчанию), 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 ₽ |
Запрос, который закончился ошибкой, не списывается.
Чего здесь нет
- Живой расшифровки по ходу разговора. Файл отправляется целиком, ответ приходит, когда распознана вся запись;
streamне поддерживается. - Записей длиннее часа и тяжелее 25 МБ. С таймкодами (
srt,vtt,verbose_json) — до 30 минут. Длинное режьте на части по паузам, а большие файлы сжимайте: час речи в mp3 на 48 кбит/с занимает около 21 МБ. - Перевода речи (
/v1/audio/translations) — только распознавание на языке записи. - Разделения говорящих. Модель это умеет, но через наш API пока не отдаёт.
- Распознавания в кабинете без кода — только по API.
Ошибки
Ошибка приходит в формате OpenAI с объяснением по-русски, деньги за неё не списываются. Исключение — 413: слишком большой запрос отклоняется ещё на входе, и тело такого ответа не JSON, поэтому смотрите на код ответа.
| 400 | Нет файла, файл пустой, формат не звуковой, модель не для распознавания (например, whisper-1), неизвестный response_format, запись длиннее допустимого |
| 413 | Запрос вместе с файлом больше 25 МБ |
| 429 | Модель перегружена — повторите через минуту |
| 502, 504 | Сбой или долгий ответ на стороне модели — повторите запрос |
Коротко
Распознавание речи подключается тем же ключом и тем же SDK, что и чат, — отдельный договор или сервис не нужен. Для протоколов совещаний берите json или text, для видео — srt, для разметки звонков по времени — verbose_json.