Files
lang/doc/whisper-api.md

10 KiB
Raw Permalink Blame History

Whisper API — Распознавание речи (ProxyAPI.ru)

Источники:


1. Endpoint

POST https://api.proxyapi.ru/openai/v1/audio/transcriptions

Авторизация: Authorization: Bearer <API_KEY>

Второй endpoint — перевод в английский:

POST https://api.proxyapi.ru/openai/v1/audio/translations

2. Модели

Модель Форматы ответа Временные метки Поток
whisper-1 json, text, srt, verbose_json, vtt word + segment
gpt-4o-transcribe json, text
gpt-4o-mini-transcribe json, text

Вывод: для максимальной детализации (сегменты, слова,置信度) — только whisper-1.


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

Параметр Тип Обязательный Описание
file file Аудиофайл (mp3, mp4, mpeg, mpga, m4a, wav, webm). Макс 25 МБ
model string whisper-1, gpt-4o-transcribe, gpt-4o-mini-transcribe
language string ISO-639-1 код (it, en, ru, ...). Без него — автоопределение
prompt string Текст-подсказка: термины, имена, аббревиатуры для улучшения точности
temperature float 0–1. По умолчанию 0. Выше = разнообразнее, но больше ошибок
response_format string json (по умолч.), text, srt, verbose_json, vtt
timestamp_granularities string[] ["word"], ["segment"], ["word","segment"]. Только для whisper-1

⚠️ Важный нюанс (webm)

ProxyAPI.ru заявляет поддержку webm, но по факту ffmpeg на их стороне не может определить длительность webm/opus файлов из Chrome. Ошибка:

{"detail": "Cannot extract audio duration. Invalid file or format."}

Решение: конвертировать webm → WAV (16kHz, mono) в браузере через Web Audio API перед отправкой.


4. Форматы ответа

4.1 json (по умолчанию)

{
    "text": "распознанный текст"
}

С usage (зависит от модели):

{
    "text": "Sottotitoli e revisione a cura di QTSS",
    "usage": {
        "type": "duration",
        "seconds": 2
    }
}

4.2 text

Чистый текст, без JSON:

Sottotitoli e revisione a cura di QTSS

4.3 verbose_json

{
    "task": "transcribe",
    "language": "italian",
    "duration": 2.0,
    "text": "Sottotitoli e revisione a cura di QTSS",
    "segments": [
        {
            "id": 0,
            "seek": 0,
            "start": 0.0,
            "end": 2.0,
            "text": " Sottotitoli e revisione a cura di QTSS",
            "tokens": [50364, 318, 1521, 310, 270, 9384, 308, 34218, 68, 257, 1262, 64, 1026, 1249, 7327, 50, 50464],
            "temperature": 0.0,
            "avg_logprob": -0.2574056088924408,
            "compression_ratio": 0.8260869383811951,
            "no_speech_prob": 0.8321689367294312
        }
    ],
    "usage": {
        "type": "duration",
        "seconds": 2
    }
}

Поля сегмента:

Поле Описание
id Номер сегмента (с 0)
seek Смещение в секундах от начала файла
start Начало сегмента (сек)
end Конец сегмента (сек)
text Текст сегмента
tokens Идентификаторы токенов Whisper
temperature Использованная температура
avg_logprob Средняя лог-вероятность токенов (выше = увереннее). Можно использовать для оценки качества
compression_ratio Степень сжатия текста относительно аудио
no_speech_prob Вероятность отсутствия речи (01). Значения > 0.5 = вероятно тишина/шум

4.4 verbose_json + timestamp_granularities=["word"]

{
    "task": "transcribe",
    "language": "italian",
    "duration": 2.0,
    "text": "Sottotitoli e revisione a cura di QTSS",
    "words": [
        { "word": "Sottotitoli", "start": 0.0,  "end": 0.48 },
        { "word": "e",           "start": 0.48, "end": 0.56 },
        { "word": "revisione",   "start": 0.56, "end": 1.12 },
        { "word": "a",           "start": 1.12, "end": 1.20 },
        { "word": "cura",        "start": 1.20, "end": 1.44 },
        { "word": "di",          "start": 1.44, "end": 1.52 },
        { "word": "QTSS",        "start": 1.52, "end": 2.0  }
    ],
    "usage": { "type": "duration", "seconds": 2 }
}

⚠️ При запросе words, поле segments не возвращается (взаимоисключающие).

4.5 srt / vtt

Форматы субтитров с таймкодами. Пример SRT:

1
00:00:00,000 --> 00:00:02,000
 Sottotitoli e revisione a cura di QTSS

5. Поддерживаемые языки

Полный список (из официальных доков):

Африкаанс, арабский, армянский, азербайджанский, белорусский, боснийский, болгарский, каталанский, китайский, хорватский, чешский, датский, голландский, английский, эстонский, финский, французский, галисийский, немецкий, греческий, иврит, хинди, венгерский, исландский, индонезийский, итальянский, японский, каннада, казахский, корейский, латышский, литовский, македонский, малайский, маратхи, маори, непальский, норвежский, персидский, польский, португальский, румынский, русский, сербский, словацкий, словенский, испанский, суахили, шведский, тагальский, тамильский, тайский, турецкий, украинский, урду, вьетнамский, валлийский.

Коды ISO-639-1: it (итальянский), en (английский), ru (русский), fr (французский), etc.


6. Prompt — улучшение распознавания

Параметр prompt помогает Whisper правильно распознать специфические термины, имена, аббревиатуры. Работает как контекстная подсказка.

{
  "model": "whisper-1",
  "file": "@audio.wav",
  "language": "it",
  "prompt": "amore, cuore, spaghetti, Ferrari, Lamborghini, ciao, buongiorno"
}

Рекомендация: передавать ожидаемое слово/фразу как prompt для повышения точности.


7. Полезные поля для оценки качества

avg_logprob (средняя лог-вероятность)

  • Диапазон: примерно от -2.0 (плохо) до 0 (идеально)
  • Можно использовать как confidence score
  • Порог ~ -0.5 для приемлемого качества

no_speech_prob (вероятность тишины)

  • 0 = точно речь
  • 1 = точно тишина/шум
  • Порог > 0.5 = вероятно, сказать нечего

compression_ratio

  • Отношение длины текста к длине аудио
  • Аномальные значения могут указывать на галлюцинации

8. Ограничения

  • Макс. размер файла: 25 МБ
  • Перевод (/translations) — только на английский
  • Временные метки — только whisper-1
  • Поток (stream=true) — недоступен для whisper-1
  • webm заявлен но не работает с ProxyAPI.ru (нужна конвертация в WAV/MP3)

9. Цены (ProxyAPI.ru, май 2026)

Модель Цена за минуту
whisper-1 ~0.006 $
gpt-4o-transcribe ~0.006 $
gpt-4o-mini-transcribe ~0.003 $

10. Пример использования в Lyngvo

// transcribe.js — актуальная версия (v103)
async function blobToWav(blob) {
  const ab = await blob.arrayBuffer();
  const ctx = new AudioContext({ sampleRate: 16000 });
  const buf = await ctx.decodeAudioData(ab);
  await ctx.close();
  // ... конвертация в WAV 16kHz mono ...
  return new Blob([wavBuf], { type: 'audio/wav' });
}

async function transcribe(blob) {
  const wavBlob = await blobToWav(blob);
  const fd = new FormData();
  fd.append('file', wavBlob, 'audio.wav');
  fd.append('model', 'whisper-1');
  fd.append('language', 'it');
  // По желанию — prompt для улучшения точности
  // fd.append('prompt', 'amore, ciao, buongiorno');

  const r = await fetch(
    'https://api.proxyapi.ru/openai/v1/audio/transcriptions',
    {
      method: 'POST',
      headers: { 'Authorization': `Bearer ${API_KEY}` },
      body: fd
    }
  );
  return await r.json();
  // → { text: "...", usage: { type: "duration", seconds: N } }
}