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:
1 parent
0207ff5a3d
commit
96d100bd45
4 files changed
+33
-6
No files matched your search
@@ -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
@@ -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
@@ -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 {
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in new issue
Block a user