Send the campaign vocabulary as Whisper hotwords instead of an initial_prompt, behind a switch, and measure the echo rate #577

Closed
opened 2026-09-09 08:25:02 +00:00 by claude-bot · 1 comment
Contributor

Why. The bundled WhisperX server (v2 API, #352) advertises both initial_prompt and hotwords, but providers/asr.py only knows how to send initial_prompt: resolve_capabilities maps a declared initial_prompt to VocabularyStyle.INITIAL_PROMPT and there is no HOTWORDS style at all. On the 2026-09-09 session the 36-term prompt biased the names only weakly (the transcript still has Adani, Bidani, Parahark, Nick) while Whisper echoed fragments of the prompt on silent stretches (#569, #576). faster-whisper's hotwords parameter is the mechanism designed for term biasing; whether it echoes less and biases more is an empirical question this issue exists to answer on the dev replay.

Change.

  1. VocabularyStyle.HOTWORDS; the local adapter sends the terms as the hotwords form field when that style is selected and the server declares hotwords: true; the server wrapper in iac-repo already accepts it.
  2. A per-instance switch, default unchanged (initial_prompt): an environment variable on the worker is enough for the experiment (QB_ASR_VOCABULARY_STYLE=hotwords|initial_prompt|none), with the Admin → Bot Settings field to follow only if hotwords wins.
  3. The ASR vocabulary: log line already prints the style; the run's usage/summarisation record should carry it too so a comparison can be read back later.

Measure on dev, same audio as the baseline (session 5b0d6ac1…): name spellings for the five characters in the transcript (count of correct vs variant spellings per name), the hallucination_drops split, and the fragment-echo count from #576's query. Baseline numbers are on #569.

Out of scope: changing the vocabulary content (#574 covers the parenthesis).

**Why.** The bundled WhisperX server (v2 API, #352) advertises both `initial_prompt` and `hotwords`, but `providers/asr.py` only knows how to send `initial_prompt`: `resolve_capabilities` maps a declared `initial_prompt` to `VocabularyStyle.INITIAL_PROMPT` and there is no `HOTWORDS` style at all. On the 2026-09-09 session the 36-term prompt biased the names only weakly (the transcript still has Adani, Bidani, Parahark, Nick) while Whisper echoed fragments of the prompt on silent stretches (#569, #576). faster-whisper's `hotwords` parameter is the mechanism designed for term biasing; whether it echoes less and biases more is an empirical question this issue exists to answer on the dev replay. **Change.** 1. `VocabularyStyle.HOTWORDS`; the local adapter sends the terms as the `hotwords` form field when that style is selected and the server declares `hotwords: true`; the server wrapper in iac-repo already accepts it. 2. A per-instance switch, default unchanged (`initial_prompt`): an environment variable on the worker is enough for the experiment (`QB_ASR_VOCABULARY_STYLE=hotwords|initial_prompt|none`), with the Admin → Bot Settings field to follow only if hotwords wins. 3. The `ASR vocabulary:` log line already prints the style; the run's usage/summarisation record should carry it too so a comparison can be read back later. **Measure on dev**, same audio as the baseline (session `5b0d6ac1…`): name spellings for the five characters in the transcript (count of correct vs variant spellings per name), the `hallucination_drops` split, and the fragment-echo count from #576's query. Baseline numbers are on #569. Out of scope: changing the vocabulary content (#574 covers the parenthesis).
Author
Contributor

Measured on the dev replay (same audio, VAD defaults, filter on), initial_prompt vs hotwords. The worker logged style=hotwords on every track and the run record stamps vocabulary_style = hotwords, so the arm ran as intended.

initial_prompt hotwords
raw lines from Whisper 1,778 1,778
filter drops (artefact / repetition / echo) 154 / 5 / 1 154 / 5 / 1
lines kept, words kept 1,618, 11,269 1,618, 11,269
vocabulary fragment echoes left 10 10
Idani right / mangled 25 / 6 26 / 5
Harrowhark 10 / 2 12 / 2
Clio 27 / 2 27 / 4
Wyatt 21 / 1 20 / 1
Theo 22 / 2 20 / 2
Viquilonto / Viq 0 / 23 0 / 22

Verdict: no measurable difference. The outputs are near-identical, which is consistent with faster-whisper implementing hotwords by feeding the terms through the same previous-text slot the prompt uses; the echo rate is the same because the same words reach the decoder the same way. The switch stays (it is documented, default unchanged, and the stamp on the run makes future comparisons free), but it is not a lever for this problem.

What the numbers say the real problem is. "Viq" is heard as "Vic" every single time, with or without bias. No prompt will overturn a common English word the acoustics already match. The fix is deterministic and GM-controlled: let a character carry "heard as" aliases (Vic, Vick) and snap whole-word matches to the character's name after transcription, the way the lore-entry aliases already exist for wiki linking. Filed as #579.

Dev is left on hotwords for now (harmless, equivalent); prod is unchanged.

**Measured on the dev replay (same audio, VAD defaults, filter on), `initial_prompt` vs `hotwords`.** The worker logged `style=hotwords` on every track and the run record stamps `vocabulary_style = hotwords`, so the arm ran as intended. | | initial_prompt | hotwords | |---|---|---| | raw lines from Whisper | 1,778 | 1,778 | | filter drops (artefact / repetition / echo) | 154 / 5 / 1 | 154 / 5 / 1 | | lines kept, words kept | 1,618, 11,269 | 1,618, 11,269 | | vocabulary fragment echoes left | 10 | 10 | | Idani right / mangled | 25 / 6 | 26 / 5 | | Harrowhark | 10 / 2 | 12 / 2 | | Clio | 27 / 2 | 27 / 4 | | Wyatt | 21 / 1 | 20 / 1 | | Theo | 22 / 2 | 20 / 2 | | Viquilonto / Viq | 0 / 23 | 0 / 22 | **Verdict: no measurable difference.** The outputs are near-identical, which is consistent with faster-whisper implementing `hotwords` by feeding the terms through the same previous-text slot the prompt uses; the echo rate is the same because the same words reach the decoder the same way. The switch stays (it is documented, default unchanged, and the stamp on the run makes future comparisons free), but it is not a lever for this problem. **What the numbers say the real problem is.** "Viq" is heard as "Vic" every single time, with or without bias. No prompt will overturn a common English word the acoustics already match. The fix is deterministic and GM-controlled: let a character carry "heard as" aliases (Vic, Vick) and snap whole-word matches to the character's name after transcription, the way the lore-entry aliases already exist for wiki linking. Filed as #579. Dev is left on `hotwords` for now (harmless, equivalent); prod is unchanged.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
rbrooks/Quest-Board#577
No description provided.