Fixes the three bugs that made 1.0's transcripts fiction.
What was wrong. 3h12m of capture produced 22,218 words, almost none of them spoken: "the security is over" seven times in a row, and one line reading मार žе дусов लाहथ प buffalovia hurry up — Devanagari and Cyrillic in the same sentence.
Three causes, all fixed:
- Whisper was fed the silence. A chunk that was 3% speech went in whole, and the model invents fluent text over room tone. Only voiced regions are now sent, with timestamps mapped back to real clock time.
- Language auto-detection reads only the first 30 seconds and applies the result to the whole call — across 99 languages. A chunk opening with silence had its language chosen from noise. Detection is now restricted to en/hi/mr.
- The JNI never enabled whisper's own defences:
suppress_nstdefaults to false upstream, and per-segment no-speech probability was never read.
Plus a per-language initial prompt (without it, Marathi came back romanised), level normalisation, and repetition collapse at both transcription and summary time.
Throughput. Base measured 714 s to transcribe a 256 s chunk — 0.4x realtime, a queue that never drains. The cause was the temperature-fallback ladder retrying every degenerate window up to six times; it is now capped at three.
Model guidance, measured rather than asserted:
| model | Hindi | Marathi | code-switched | English |
|---|---|---|---|---|
| Base | 0.23 | 0.00 | 0.08 | 1.00 |
| Small | 0.54 | 0.13 | 0.38 | 1.00 |
Small is the right choice for Devanagari, at roughly 2.5x the compute.
63 unit tests pass. See docs/VERIFICATION.md for what remains unverified.