# 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ěď ```json { "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) ```bash curl -X POST https://services.csbot.cz/apps/audio-transcription/dual-with-merge \ -H "X-Deepgram-Api-Key: " \ -H "X-OpenAI-Api-Key: " \ -F "file=@nahravka.mp3" \ -F "language=cs" ``` ## Chybové stavy Chybové odpovědi jsou JSON: `{"error": "", "message": "...", "detail": ""}`. | 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í.