clarion.uz

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

OpenAI-совместимый REST и WebSocket. С OpenAI SDK меняется только base_url.

Базовый URLhttps://api.uzasr.uz/v1

Аутентификация

Ключ передаётся в заголовке каждого запроса.

Ключ вида uzasr_live_… показывается один раз. Храните его на сервере, не в браузере и не в приложении.

HTTP
Authorization: Bearer uzasr_live_…

Быстрый старт

Распознавание файла одним запросом.

import os from openai import OpenAI client = OpenAI(    base_url="https://api.uzasr.uz/v1",    api_key=os.environ["UZASR_API_KEY"],) result = client.audio.transcriptions.create(    model="uzasr-large",    file=open("call.mp3", "rb"),    response_format="verbose_json",    timestamp_granularities=["word"],)print(result.text)

Синхронное распознавание

Файлы до 10 минут. Ответ приходит в том же запросе.

POST/v1/audio/transcriptions

ПараметрТипОписание
filefileАудио или видео: wav, mp3, m4a, ogg, flac, mp4, webm.
modelstringuzasr-large или uzasr-base, либо точная версия.
response_formatstringjson, text или verbose_json. По умолчанию json.
timestamp_granularities[]stringword: таймкоды слов, только с verbose_json.
languagestringНеобязательный. Поддерживается только uz.

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

verbose_json с таймкодами слов и звуковыми событиями.

ПараметрТипОписание
textstringТекст с пунктуацией, латиница.
words[]objectword, start, end: слово и его границы в секундах.
segments[]objectФрагменты записи с границами и текстом.
events[]objectlabel, start, end, score. Метки: laughter, applause, music. Неизвестные метки игнорируйте.
verbose_json
{  "task": "transcribe",  "language": "uz",  "duration": 28.0,  "text": "Oyoqdagi yechish bilan shunaqa ovoz chiqaradiki, …",  "segments": [    { "id": 0, "start": 0.0, "end": 9.8, "text": "Oyoqdagi yechish bilan …" }  ],  "words": [    { "word": "Oyoqdagi", "start": 0.12, "end": 0.64 }  ],  "events": [    { "label": "laughter", "start": 2.28, "end": 2.52, "score": 0.557 },    { "label": "applause", "start": 19.28, "end": 21.04, "score": 0.659 }  ]}

Заголовок X-Uzasr-Processing-Seconds содержит чистое время обработки на GPU, без очереди и запуска.

Асинхронные задачи

Файлы до 3 часов. Создайте задачу и опрашивайте статус.

POST/v1/jobs

GET/v1/jobs/{id}

Повтор с тем же Idempotency-Key вернёт исходную задачу. Статусы: queued, succeeded, failed.

import osimport time import requests API = "https://api.uzasr.uz/v1"headers = {"Authorization": f"Bearer {os.environ['UZASR_API_KEY']}"} job = requests.post(    f"{API}/jobs",    headers={**headers, "Idempotency-Key": "call-2026-10-21-0042"},    files={"file": open("meeting.mp3", "rb")},    data={"model": "uzasr-large"},).json() while job["status"] == "queued":    time.sleep(5)    job = requests.get(f"{API}/jobs/{job['id']}", headers=headers).json() print(job["result"]["text"])

Онлайн-режим

WebSocket: PCM-поток на вход, события текста на выход.

WS/v1/realtime?model=uzasr-large

СобытиеНаправлениеОписание
ready← серверСессия открыта, указана точная версия модели.
partial← серверТекущая фраза. Поле stable не изменится, остальное может уточниться.
final← серверФраза зафиксирована после паузы 0,8 с, с пунктуацией.
event← серверЗвуковое событие, через 1–1,5 с после его окончания.
done← серверСессия закрыта, audio_seconds для учёта.
binary→ клиентPCM s16le, 16 кГц, моно. Рекомендуемый размер кадра 100 мс.
stop→ клиент{"type":"stop"}: зафиксировать последнюю фразу и закрыть сессию.
WebSocket
← от сервера→ от клиента
wss://api.uzasr.uz/v1/realtime?model=uzasr-large ← { "type": "ready" }→ <binary PCM s16le 16 kHz, 100 мс>← { "type": "partial", "utterance": 0, "start": 0.0,    "text": "Assalomu alaykum qanday", "stable": "Assalomu alaykum" }← { "type": "final", "utterance": 0, "start": 0.0, "end": 2.4,    "text": "Assalomu alaykum, qanday yordam bera olaman?" }→ { "type": "stop" }← { "type": "done", "audio_seconds": 2.9 }

Браузер не передаёт заголовки в WebSocket: подключайтесь со своего сервера и проксируйте поток.

Модели

Псевдоним всегда указывает на актуальную версию.

GET/v1/models

МодельПараметрыWERКогда выбирать
uzasr-large600M11,5%По умолчанию, максимальная точность
uzasr-base220M12,2%Большие объёмы, ниже стоимость

Ошибки

Единый формат, совместимый с OpenAI.

HTTPcodeЧто произошло
400unsupported_parameterНеизвестный параметр формы.
400unsupported_languageПараметр language отличается от uz.
400audio_unreadableНе удалось декодировать аудио.
400audio_too_longЗапись длиннее лимита эндпоинта. Используйте /v1/jobs.
401invalid_api_keyКлюч не передан, неверен или отозван.
404model_not_foundТакой модели нет. Список: GET /v1/models.
413file_too_largeФайл больше лимита.
429concurrency_limit_exceededПревышено число параллельных запросов. Смотрите Retry-After.
503model_unavailableМодель запускается или на обслуживании. Повторите через минуту.
504timeoutРаспознавание не уложилось в срок. Для длинных файлов используйте /v1/jobs.
JSON
{  "error": {    "type": "invalid_request_error",    "code": "unsupported_language",    "message": "Only 'uz' is supported"  }}

Лимиты

Значения по умолчанию. Для корпоративных клиентов настраиваются.

ОграничениеЗначение
Синхронный запросдо 10 минут аудио
Асинхронная задачадо 3 часов аудио
Параллельные запросы на ключ8
Онлайн-сессиядо 5 минут
Хранение результата задачи7 дней