From fa585c4316dd90426fcaa89edd8c95b64d6eac3c Mon Sep 17 00:00:00 2001 From: Brummel Date: Tue, 28 Apr 2026 00:56:05 +0200 Subject: [PATCH] Add section on suppressed tokens for digits --- whisper/README.md | 44 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/whisper/README.md b/whisper/README.md index 869fa8d..b1c22ef 100644 --- a/whisper/README.md +++ b/whisper/README.md @@ -88,6 +88,50 @@ WHISPER_URL=http://minerva.lan:9001 No other change. The Axum server speaks ahmetoner's interface; we mirror it. +## Investigated and rejected + +### `suppress_tokens` for digit-sequence preservation (2026-04-28) + +Goal: when a dictator says individual digits ("eins null null"), have Whisper +emit them as words instead of collapsing them to a number ("100"). The +collapse is irreversible downstream — there is no way for the LLM to +distinguish "hunderteins" (101 as a number) from "eins null eins" (a 1-0-1 +sequence) once both have become `101` in the transcript. + +The standard advice +([openai/whisper Discussion #1041](https://github.com/openai/whisper/discussions/1041)) +is to set `suppress_tokens` to every numeric token in the vocabulary so the +decoder is forced onto word tokens. We added a `suppress_numerics` form +field, threaded it through the Axum server and the experiments sandbox, +and tested it against a real cardiology dictation. + +**Two filter widths, both pathological:** + +1. **Jongwook's exact recipe** (`\d+` filter, ~426 tokens, faithful 1:1 + reproduction with `eot` bound and `removeprefix(" ")` filter): + - Massive end-of-audio repetition loop ("Enoxaparin, das heißt + Enoxaparin, das heißt Enoxaparin, …" 20+ times). The fixed + `compression_ratio_threshold=2.4` did not catch it. + - Numbers also disappear: `40 mg Thorazemit` → `Milligramm Thorazemit` + (the `40` is dropped, not converted to a word). +2. **Single-digit only** (`\d` filter, 20 tokens — `0`-`9` with and without + leading space): + - Repetition loop is gone (small enough list to keep beam search stable). + - But dictated sequences disappear entirely: `5mg 100` and `5mg 101` + become just `Visoprolol` and `Ramipriel` (no dosing schema in any form). + - Collateral damage on natural numbers: `12,5 mg` → `12,25 mg` (the ` 5` + token was suppressed; the decoder built the value from multi-digit + tokens and duplicated a digit). + +There is no usable middle ground between the two widths for our setup +(`large-v3` + faster-whisper 1.2.1 + medical German dictation). The status +quo (`100`/`101` in the transcript, doctor corrects manually) stays. + +Don't reattempt without changing the underlying ASR (different model, +different backend, or model-internal training to preserve digit-form +acoustic information). Memory entry: +`project_whisper_suppress_tokens_dead_end.md`. + ## Offline mode ```bash