franken_whisper v0.5.0 — a measured, quality-gated performance release for the x86-64 CPU native engine. Where v0.4.0 put the encoder on the GPU for Apple Silicon, v0.5.0 makes the CPU encoder substantially faster while holding output quality to a measured zero-WER-Δ budget.
Headline measured wins (large-v3-turbo)
- Quality-safe int8 encoder — 1.47× (→1.67× with SDPA-gather fusion) — calibrated per-model (WER-Δ budget 0.0), WER-neutral,
FW_ENC_ATTN_OUT_I8I32kill switch. - SDPA softmax poly-exp — 1.0722× e2e — default-on for turbo, transcript byte-identical, WER Δ 0.000 vs whisper.cpp.
- Byte-exact encoder fusions (mlp bias→GELU/residual, M2 f16 GEMV 1.26×) + register-blocked int8 microkernels.
Versus the reference implementations (greedy, quiet host, each engine at its best thread count): the native CPU engine runs ~2.3× faster than whisper.cpp on tiny.en and parity-to-faster on large-v3-turbo (~1.5× on a 32-core x86 box, and the lead grows with audio length as the encoder advantage compounds). OpenAI's Python Whisper is itself slower than whisper.cpp on CPU, so the margin versus the original implementation is at least as large.
Honesty methodology
Every lever was kept only on a measured win, gated conservatively:
- Median vs paired-null (A/A) control — ABBA-interleaved, so host contention and run-order bias cannot masquerade as a speedup.
- Byte/ULP-exact where claimed — byte-exact levers asserted bit-identical; the sole numerics-affecting default (poly-exp) held to WER-Δ 0.000 vs whisper.cpp.
- Negative-evidence ledger — rejected levers logged in
docs/NEGATIVE_EVIDENCE.mdwith a reject-id, the null-control, and a retry-condition.
Scope: greedy / temperature-0 comparisons (no beam search or temperature fallback yet), measured on a quiet host; the head-to-head ratio degrades under contention. Full record: docs/PERF_LEDGER.md, docs/NEGATIVE_EVIDENCE.md.
Full changelog: v0.4.0...v0.5.0