diff --git a/docs/Architecture.md b/docs/Architecture.md index b74a2d4..517f157 100644 --- a/docs/Architecture.md +++ b/docs/Architecture.md @@ -168,7 +168,7 @@ environment). See `WorkBreakdown.md` for the itemized checklist.) to the decoder input of every 30 s window by a wrapper around the model's `generate()`, which also strips it from the output again (D-048). Live passes (4.1b) carry the same `prompt`. -6. **Long-form branch (D-049/D-050, "Advanced → Skip silence", off by default).** +6. **Long-form branch (D-049/D-050, "Advanced → Skip silence", on by default since D-052).** With the option on, every load posted for a file run or the Download button carries `vad: true`; once the Whisper pipeline is ready the worker loads Silero VAD (`onnx-community/silero-vad`, 2.2 MB, Cache API like the weights; offline it is diff --git a/docs/Decisions.md b/docs/Decisions.md index 2098ac9..ea6c02b 100644 --- a/docs/Decisions.md +++ b/docs/Decisions.md @@ -1629,7 +1629,7 @@ tokenizer incl. "Århus, Ærø"); server-live passes keep the ids. Pinned by the stubbed-sidecar test "the vocabulary hint reaches the batched pipeline as text". ## D-049 — Long-form file pipeline (Silero VAD chunks, language pinned once) ships as an Advanced option, off by default -**Status:** Accepted (2026-10-30) — spec 001 Goal 3 +**Status:** Accepted (2026-10-30) — spec 001 Goal 3; **the "off by default" part is superseded by D-052** Browser file transcription cuts audio into fixed 30 s windows with 5 s overlap (Transformers.js's chunked pipeline), decoding silence and overlaps, and with "Auto-detect" Transformers.js 4.2 silently decodes as @@ -1801,3 +1801,23 @@ fallback restart behaves; Firefox/Safari WASM. **Revisit:** if Transformers.js gains a TDT decoder, move to it and drop parakeet.js + the alias plugin; if WebGPU measures well on real hardware, consider letting "auto" pick it. + +## D-052 — "Skip silence" (long-form pipeline) is on by default (opt-out) +**Status:** Accepted (2026-10-30) — owner's decision; supersedes D-049's default +D-049 shipped the long-form pipeline off by default because the spec's +rollout rule required it to be faster *and* no worse on WER on every +measurement clip, and two clips missed: the synthetic meeting (+0.0106 WER, +mostly casual spellings like "gonna") and da_festuge with `da` (a speed tie). +On the one long real recording it was ~2× faster with about half the WER +(en_alien, Large v3 Turbo on CPU: 210 s → 115 s, 0.255 → 0.140), and it +fixes "auto" decoding Danish as English. The owner weighed that above the +strict rule and made it opt-out. +**Change:** `LONG_FORM_DEFAULT = true` in `src/lib/longForm.ts`. A stored +choice still wins, so anyone who turned it off keeps it off. Nothing else +changes: the VAD model (2.2 MB, D-050) is still fetched only as part of a +user-started transcription or the Download button, and when it isn't +available (offline, never downloaded) the file still goes through the +chunked path. Live mode is unaffected. +**Caveat:** the WER numbers behind this use reference transcripts generated +with Whisper (owner, 2026-10-30), so they favour Whisper-like output; re-check +once correct transcripts are available. diff --git a/src/lib/longForm.ts b/src/lib/longForm.ts index 6de0c5e..7ac7a6f 100644 --- a/src/lib/longForm.ts +++ b/src/lib/longForm.ts @@ -8,11 +8,12 @@ import type { StorageLike } from "./engine"; export const LONG_FORM_KEY = "whisper-long-form"; /** - * Off by default: the spec's rollout rule makes the long-form pipeline the - * default only if it is faster and not less accurate on every measurement - * clip — see D-049 for the numbers that decided this. + * On by default (opt-out, D-052): the owner chose it after D-049's + * measurements — ~2× faster and about half the WER on the 15-min clip — + * outweighed the spec's strict every-clip rule, which kept it opt-in on a + * +0.0106 WER result on the synthetic meeting. A stored "off" still wins. */ -export const LONG_FORM_DEFAULT = false; +export const LONG_FORM_DEFAULT = true; function defaultStorage(): StorageLike | null { try { diff --git a/tests/longform-setting.test.ts b/tests/longform-setting.test.ts index 53aee14..ca0f4b0 100644 --- a/tests/longform-setting.test.ts +++ b/tests/longform-setting.test.ts @@ -34,6 +34,12 @@ describe("long-form setting persistence (D-049)", () => { expect(() => saveLongFormChoice(true, throwing)).not.toThrow(); }); + test("is on unless the user turned it off (opt-out, D-052)", () => { + expect(LONG_FORM_DEFAULT).toBe(true); + expect(loadLongFormChoice(memoryStorage())).toBe(true); + expect(loadLongFormChoice(memoryStorage({ [LONG_FORM_KEY]: "off" }))).toBe(false); + }); + test("round-trips an explicit choice", () => { const storage = memoryStorage(); saveLongFormChoice(!LONG_FORM_DEFAULT, storage);