Add Groq Whisper API integration (200x faster than local CPU)

Pipeline:
- New transcribe_with_groq() function uses Groq's whisper-large-v3-turbo
- 30s audio transcribed in ~0.5s (vs 30s+ on CPU)
- Same quality as local Whisper (it's the same OpenAI model)
- Cloudflare bypass via custom User-Agent header
- 24MB upload limit guard with auto-fallback to local
- Language auto-detect works (Groq returns full lang name, mapped to ISO codes)

Default whisper_provider='auto':
- If GROQ_API_KEY is set → use Groq (200x faster)
- Otherwise → fallback to local faster-whisper
- Strict 'groq' mode: no fallback (returns empty if Groq fails)
- Strict 'local' mode: skip Groq entirely

CLI: --whisper-provider {auto,groq,local}
API: whisper_provider field in StartJobIn

Cost: $0.04/h with whisper-large-v3-turbo ($0.002 per 200s song)
This commit is contained in:
2026-04-29 11:08:15 +00:00
parent 60765ad84c
commit 5c53a27d33
2 changed files with 156 additions and 5 deletions
+6
View File
@@ -247,6 +247,9 @@ def process_job(job_id):
# Brez extension
fn_hint = Path(job["filename"]).stem
cmd += ["--filename-hint", fn_hint]
# Whisper provider (groq = 200x hitreje od lokalnega)
if job.get("whisper_provider"):
cmd += ["--whisper-provider", job["whisper_provider"]]
# lang: če None ali 'auto', pusti analyze.py auto-detect
if job.get("lang") and job["lang"] not in ("auto", ""):
cmd += ["--lang", job["lang"]]
@@ -500,6 +503,8 @@ class StartJobIn(BaseModel):
# LLM za semantično analizo + popravke
llm_provider: str = "claude" # claude / gemini / auto
llm_model: Optional[str] = None # specifičen model (privzeto najboljši za provider)
# Whisper provider (Groq je 200x hitrejši od lokalnega CPU faster-whisper)
whisper_provider: str = "auto" # auto / groq / local
# ────────────────────────────────────────────────────────────────
@@ -605,6 +610,7 @@ async def start_processing(
quality=payload.quality,
llm_provider=payload.llm_provider,
llm_model=payload.llm_model,
whisper_provider=payload.whisper_provider,
current_step="V vrsti za obdelavo",
# Počisti pretekle napake (retry-friendly)
chorus_error=None,