Turn "Skip silence" on by default (opt-out, D-052)

Owner's decision: the long-form pipeline's gain on the long real recording
outweighs the spec's strict every-clip rollout rule. A stored "off" still wins.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Lucas WintherandClaude Opus 5.5 committed 2026-10-30 01:56:57 +01:00
1 parent 0207ff5a3d
commit 96d100bd45
4 files changed
+33 -6

No files matched your search

+1 -1
View File
@@ -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
+21 -1
View File
@@ -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.
+5 -4
View File
@@ -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 {
+6
View File
@@ -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);