Conversation
|
Independent reproduction of the problem this PR fixes, and a test of the branch The reference for every comparison is NeMo's own output for the same model Builds: The failure on
|
main |
#112 | |
|---|---|---|
| mean WER vs NeMo | 0.055 | 0.022 |
| median WER | 0.013 | 0.000 |
| recordings with WER >= 0.15 | 2 / 22 | 0 / 22 |
| 73.2 s recording | 0.200 | 0.048 |
| 102.4 s recording | 0.473 | 0.012 |
| 300.0 s recording | 0.057 | 0.014 |
The two main outliers are exactly the silent interior omission described in
the PR body. A halving experiment isolates it to the single-window path rather
than the weights or the quantisation:
| recording | NeMo | main, whole file |
main, two halves |
|---|---|---|---|
| 102.4 s | 166 words | 87 | 81 + 85 = 166 |
| 73.2 s | 125 words | 103 | 77 + 46 = 123 |
F16 and Q8_0 produce the same word counts to the word, so quantisation is not
involved. Under 40 s the two paths agree exactly — as expected, since NeMo does
not chunk there either.
With this branch
Eleven of the 22 recordings now match NeMo word for word, and no recording is
worse in any way I can demonstrate.
One recording diverges (WER 0.079, 35.07 s, three differing words). It is the
worst audio in the set — a mobile call with severe dropouts. Two of the three
differences were checked by ear against the recording:
- one phrase: this branch is correct, the NeMo reference is wrong
- one short numeric ID: both are wrong, each one edit away from what is spoken
- one phrase in the badly corrupted opening seconds: unintelligible either way
So it is a divergence from an imperfect reference, not a regression. Note the
timestamps land at 5-7 s and ~22 s, i.e. nowhere near a 30-40 s window
boundary, so this is not a seam artefact.
max audio correctly reports unbounded (long audio chunked internally) on
the branch.
Two questions
- Anything blocking this leaving draft state besides canary: add v2 word timestamps #111? The branch is based
on b6a6aca, i.e. before 0.2.1, so anyone using it today gives up six weeks of
fixes. qwen3_asrshows the same single-pass loss — 143 words against NeMo's 168 on
the 102.4 s recording, while the two halves reconstruct it. It is in the same
"hard context cap" bucket. Is comparable long-form handling planned for it,
or should that be a separate issue?
The audio and the transcripts cannot be shared — they are real customer calls.
|
Follow-up: I rebased both commits onto
On the same 22 German voicemail recordings the rebased version is slightly |
Decoder n_ctx stays finite per window, so the CLI was hitting the "~0 s" branch instead of FEATURE_LONG_FORM after the rebase onto main. Co-authored-by: Cursor <cursoragent@cursor.com>
e9a7b1e to
5fb6a85
Compare
|
Thanks for the independent German voicemail check, and for writing down the rebase conflicts. Draft / rebaseStill stacked on #111 — that remains the thing blocking this leaving draft. Both commits are now rebased onto current Conflicts were the three you hit, keeping both sides:
Later
qwen3_asrSeparate issue. Same hard context-cap bucket, but a different decoder and no Canary-style window/overlap stitcher. I would not fold it into this PR. WER on the rebased branchQ8_0 timestamp GGUF, CUDA RTX 3090,
Continuous coverage (word timestamps, no FLEURS ref):
I do not have your 22 voicemails, so I cannot rerun that NeMo comparison here. The FLEURS-de concat is the closest public stand-in: German, >40 s, scored against ground truth rather than NeMo, and it does not drop interior words. |
Dependency
This is a stacked PR on top of #111 (
canary: add v2 word timestamps). The branch intentionally includes that commit; please review this PR after #111, then rebase it ontomainonce #111 lands.Summary
Motivation
Canary 1B v2 has a 40 second decoder window. Running longer audio as one window can silently omit substantial interior speech even when inference reaches the final phrase. On the 84.381 second
samples/whole-earth.wav, the pre-long-form path returned 141 normalized words with a 35.040 second internal transcript gap. The chunked path returned 217 normalized words with a maximum 1.840 second inter-word gap and continuous coverage through the final phrase.The first fixed-duration prototype also lost repeated words at chunk seams. Selecting low-energy boundaries and restricting text deduplication to a true suffix fixed that failure rather than masking it with a broader overlap heuristic.
Correctness
Adversarial repeated-speech tests passed without missing or duplicated repetitions:
The 39 s, 40 s, 40.001 s, and 41 s threshold cases also passed. Every benchmark returned monotonic positive word intervals within the audio duration, with normalized full text matching the word sequence.
Performance
Warm Q8_0 measurements on a shared RTX 4060 Ti:
F32 timestamp validation at 55 seconds passed on an RTX 3090 in 899.36 ms (61.2x realtime). The shared RTX 4060 Ti did not have enough free memory for the F32 model's 6.1 GiB CUDA allocation, so that cell was moved to the 3090 rather than changing running services.
Verification
git diff --checkpassed