Skip to content

SlidingWindow streaming: default rescue floors replace an unrelated opening word with a vocabulary term ("Hey" → "Codex") #899

Description

@Alex-Wengg

Surfaced while verifying #898 on the public #855 clip 01-validation-request-21.4s.wav (Tests/FluidAudioTests/ASR/Parakeet/SlidingWindow/Fixtures) with the vocabulary terms Codex, follow-up. Pre-existing: reproduces on main before #898.

The sliding-window streaming rescorer replaces an unrelated short word with the term through the spotter-rescue path at near-zero string similarity. Which word depends on the machine's decode, so this is not tied to "Hey":

In every case the real "codex" later in the sentence is left unchanged and batch decode keeps the original words. The streaming path uses VocabularyRescorer.Config.default; the unified path uses VocabularyBoostingSession.itnDefaultConfig (#702 floors 0.30 / 0.50) precisely to stop short-word rescue over-fire, and #862 recorded the same "rescue-floor WER tax" on the TDT path (recall up, WER 15.70 → 22.25 on .default).

Candidates:

  • (a) Apply the CTC custom-vocabulary rescorer over-fires on short keyword terms since 0.14.8 (PR #634) #702 floors on the sliding-window streaming path by default. Directly rejects a 0.12 candidate and aligns the two streaming engines. Needs a recall/WER re-run on earnings22-kws before merging, since .default was kept on this path for brand-name recall.
  • (b) Gate the rescue on the spotter detection's time range. Detections already map to overlapping word timestamps, but VocabularyRescorer+TokenRescoring falls back to the nearest word to the detection centre when no word overlaps, unconditionally — that is how a detection at ~9 s can land on Hey at 0.2 s or validate. Bound the fallback (e.g. within one word / marginSeconds) and log the detection interval so the trace shows which path fired.
  • Also: the CLI's streaming path drops the rescue-floor flags (--vocab-spotter-min-sim, --vocab-spotter-min-sim-multi, --vocab-disable-spotter-rescue); only batch builds a VocabularyRescorer.Config from them. Pass them through runStreaming so the floors can be A/B'd from the CLI.

Regression guard once fixed: extend SlidingWindowVocabularyBoostingStreamingTests to assert the transcript still starts with "hey" and keeps "validate your findings with codex". Note that test currently cannot prove the rescorer acted (CI's decode already produced "follow-up" with zero replacements), so exposing spotter detections in ctcDetectedTerms even when no replacement is applied would give it something machine-independent to assert.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions