38

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

Speech-to-Text API для распознавания русской речи. Формат как у Deepgram и OpenAI Audio API: в рабочей интеграции меняются адрес и ключ.

Deepgram

Отправка записи

Для проектов с обработкой данных в России это альтернатива Deepgram. Аудио передаётся телом запроса. Авторизация: заголовок Authorization со схемой Token.

from deepgram import DeepgramClient, DeepgramClientOptions

client = DeepgramClient(
    "ВАШ_КЛЮЧ",
    DeepgramClientOptions(url="https://vtext38.ru/api"),
)

with open("recording.mp3", "rb") as audio:
    response = client.listen.rest.v("1").transcribe_file(
        {"buffer": audio},
        {"smart_format": True, "diarize": True, "utterances": True},
    )

print(response.results.channels[0].alternatives[0].transcript)

Справочник

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

ПараметрНазначение
punctuateЗнаки препинания и заглавные. Синоним smart_format; вместе допустимы.
smart_formatФорматирование текста для чтения. То же, что punctuate; числа остаются словами.
diarizeРазделение по говорящим для записи в моно.
diarize_modelЛюбое значение включает диаризацию (как у Deepgram). Версия модели игнорируется.
multichannelРазделение по каналам стереозаписи. Для телефонии точнее, чем диаризация.
utterancesРазбивка на реплики по паузам и смене говорящего.
paragraphsДополнительная разбивка реплик на предложения.

Имя модели принимается любое и на результат не влияет. Язык один: русский.

Расхождения

Чем мы отличаемся от Deepgram

То, что стоит учесть при переносе кода.

Поля speaker_confidence нет
В ответе этого поля нет. Код, который его читает, нужно поправить.
Числа остаются прописью
Даже при smart_format числа пишутся словами, не цифрами.
Синхронный запрос до двадцати минут
Соединение держится во время обработки, максимум двадцать минут. Таймаут в SDK или HTTP-клиенте поставьте не меньше двадцати минут, иначе клиент оборвёт запрос сам. Для более длинных записей пока используйте загрузку в кабинете: callback ещё не реализован.
Язык один
Русский. Другой язык в запросе даёт понятную ошибку.
Файл сохраняется до распознавания
Если хранилище недоступно, API отвечает 500 с обычным телом внутренней ошибки. Распознавание не начинается, минуты не списываются. Это не отказ движка (502).
Слишком большой файл — 413, не 502
Если движок отклонил тело как слишком большое, API отвечает 413, а не «движок недоступен». Это ограничение размера, не простой сервиса.
Ошибка обработки аудио
Если файл прочитан, но распознавание внутри движка завершилось ошибкой, API отвечает 502: «Не удалось обработать аудио. Проверьте файл и повторите запрос».

OpenAI

Переход с OpenAI Audio API

Меняются ключ и base_url / baseURL (с суффиксом /v1). Адрес: https://vtext38.ru/api/v1/audio/transcriptions. Авторизация Bearer.

from openai import OpenAI

client = OpenAI(
    api_key="ВАШ_КЛЮЧ",
    base_url="https://vtext38.ru/api/v1",
)

with open("recording.mp3", "rb") as audio:
    result = client.audio.transcriptions.create(
        model="whisper-1",
        file=audio,
        language="ru",
        response_format="verbose_json",
    )

print(result.text)

Справочник

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

ПолеНазначение
fileАудиофайл. Формат определяется по содержимому, не по имени.
modelЛюбое значение принимается. На результат не влияет, whisper-1 можно оставить.
languageТолько русский (ru). Другой язык даёт ошибку 400.
response_formatjson, verbose_json или text. Неизвестное значение считается json.
diarizetrue включает разделение по говорящим. Поле наше; если его не передать, спикеров в ответе не будет.

Поля prompt, temperature и timestamp_granularities можно передавать: они игнорируются и вызов из‑за них не падает.

Расхождения

Чем мы отличаемся от OpenAI

То, что стоит учесть при переносе кода.

В base_url нужен суффикс /v1
В base_url или baseURL передайте адрес сервиса с /v1 на конце. SDK сам допишет /audio/transcriptions.
Синхронный запрос до двадцати минут
Соединение держится во время обработки, максимум двадцать минут. Таймаут в SDK или HTTP-клиенте поставьте не меньше двадцати минут, иначе клиент оборвёт запрос сам. Для более длинных записей пока используйте загрузку в кабинете: callback ещё не реализован.
Язык один
Русский. Другой язык в запросе даёт понятную ошибку.
Файл сохраняется до распознавания
Если хранилище недоступно, API отвечает 500 с обычным телом внутренней ошибки. Распознавание не начинается, минуты не списываются. Это не отказ движка (502).
Слишком большой файл — 413, не 502
Если движок отклонил тело как слишком большое, API отвечает 413, а не «движок недоступен». Это ограничение размера, не простой сервиса.
Ошибка обработки аудио
Если файл прочитан, но распознавание внутри движка завершилось ошибкой, API отвечает 502: «Не удалось обработать аудио. Проверьте файл и повторите запрос».

Ограничения

Время обработки

Синхронный запрос работает до десяти минут обработки. Базовый адрес: https://vtext38.ru/api. Для SDK OpenAI в клиент передайте https://vtext38.ru/api/v1.

Агенты

Документы для LLM и MCP

Те же факты, что на этой странице, в форматах, которые читают coding-агенты. Ключ для просмотра не нужен.

  • /llms.txtкраткий индекс для агентов и AI-поиска
  • /openapi.jsonмашинный контракт обоих диалектов
  • /mcpdocs-only MCP (ресурсы и промпты, без вызова распознавания)

Ключ выдаётся сразу после регистрации

15 минут распознавания начислим сразу. Отдельного тарифа для API нет: минуты те же, что в кабинете. Один ключ подходит и для Deepgram SDK, и для OpenAI SDK.