Files
JiriUhlir d55089b1c8 fix
2026-07-10 10:08:51 +02:00

3.2 KiB

Endpoint přepisu

Jediná metoda, která udělá vše najednou: přepis Deepgramem + OpenAI (whisper-1) a jejich AI sloučení. Audio se posílá jako proměnná file (multipart/form-data), ostatní parametry jsou form fields v POST. API klíče jsou v X- hlavičkách. Výstup je vždy JSON.

Hlavičky (secrets)

Hlavička Nutná Popis
X-Deepgram-Api-Key ano Deepgram API klíč
X-OpenAI-Api-Key ano OpenAI API klíč (whisper-1 přepis + slučovací chat)

POST /dual-with-merge

Form parametry

Pole Typ Default Popis
file soubor Audio k přepisu (povinné)
combine_prompt text výchozí „Czech Transcript Merger“ System prompt pro sloučení
deepgram_model text nova-2 Deepgram model
whisper_model text whisper-1 OpenAI přepisový model
chat_model text gpt-4o OpenAI chat model pro sloučení
language text cs Jazyk (ISO kód)
diarize bool true Deepgram diarizace (rozlišení mluvčích)
smart_format bool true Deepgram smart formatting

Nezadá-li se combine_prompt, použije se výchozí prompt z app/prompts.py.

Rozlišení mluvčích a kvalita

  • Při diarize=true (výchozí) Deepgram interně zapne i utterances a přepis deepgram se vrací se štítky mluvčích, např. Mluvčí 0: ... / Mluvčí 1: .... Plochý přepis bez mluvčích (samotné alternatives[0].transcript) se použije jen jako fallback.
  • gpt (Whisper) je plynulý, ale bez mluvčích a občas halucinuje na tichu/šumu — proto se volá s temperature=0.
  • merge sjednotí oba zdroje: použije strukturu mluvčích z Deepgramu, doplní chybějící repliky z Whisperu a ignoruje zjevné halucinace (řídí výchozí combine_prompt).

Odpověď

{
  "gpt": "Dobrý den, tady je asistentka ...",
  "deepgram": "Mluvčí 0: Dobrý den, tady je asistentka ...\nMluvčí 1: Ne, teď to nejde.",
  "merge": "Asistent: Dobrý den, tady je asistentka ...\nVolající: Ne, teď to nejde."
}

Příklad (curl)

curl -X POST https://services.csbot.cz/apps/audio-transcription/dual-with-merge \
  -H "X-Deepgram-Api-Key: <DEEPGRAM_KEY>" \
  -H "X-OpenAI-Api-Key: <OPENAI_KEY>" \
  -F "file=@nahravka.mp3" \
  -F "language=cs"

Chybové stavy

Chybové odpovědi jsou JSON: {"error": "<TypChyby>", "message": "...", "detail": "<text z upstreamu>"}.

HTTP Kdy
400 Chybí / prázdný audio soubor; nepodporovaný nebo poškozený audio formát (Deepgram/OpenAI vrátí 400/415/422)
401 Chybí X-Deepgram-Api-Key / X-OpenAI-Api-Key, nebo upstream odmítl API klíč (Deepgram/OpenAI 401/403)
429 Rate limit na Deepgram nebo OpenAI
502 Výpadek / neočekávaná chyba upstreamu (5xx, síťová chyba, timeout, neočekávaná struktura odpovědi)
500 Neočekávaná chyba serveru

Mapování dělá raise_for_upstream v app/errors.py. Špatný typ souboru se pozná až z odpovědi Deepgramu/OpenAI (bytes validují oni) a mapuje se na 400, ne na 502. Všechny chyby se logují (bez secrets), žádné tiché selhání.