Contents
- What I found
- The question
- The setup
- How the scorers work
- Speech recognition: same accuracy, different terms
- The fine-tune that won every overlap metric
- An overnight search, and what the gate couldn’t see
- A verifier, tested on errors we planted
- From benchmark to a live visit copilot
- What the metric missed
- Limits
- What I’d do next
The question
Ambient scribes are judged on the finished note, but the note inherits every upstream error: a dropped medication name, a line credited to the wrong speaker, a follow-up instruction that never reached the summary. I wanted to know which stage of an open pipeline actually hurts the note, and whether the metrics teams usually report would notice.
scribe-bench is a non-commercial study built on public data to learn the domain. It isn’t a product, and nothing in it is clinical advice.
The setup
Transcription is scored on the 57 recorded mock primary-care consultations in PriMock57. Notes are scored on ACI-Bench encounters, with a 7,092-term primary-care lexicon for medical terms. The writer is Qwen3.8-27B; the fine-tune is one epoch of LoRA on 2,804 open transcript-and-note pairs. Each stage is scored on held-out data before the next stage uses its output.
- 01Transcribe and label speakers
- 02Score the transcript
- 03Write the note
- 04Verify each claim
- 05Keep only what holds on held-out
How the scorers work
Overlap metrics such as ROUGE-L compare a draft with a reference note. Beside them sit the dimensions clinicians care about: lexicon term recall and precision, plan-item recall, misattributions per note (a claim credited to the wrong speaker), follow-up recall, and grounding, meaning whether each sentence is supported by the transcript. The judged dimensions use LLM judges.
Every comparison is a paired bootstrap over encounters with a 95% interval, so a difference counts only when its interval excludes zero. The verifier is tested by injecting known errors into otherwise correct notes: negations, changed numbers, swapped drugs, fabricated findings and third-party leaks.
Speech recognition: same accuracy, different terms
Word error rate would rank the usable recognizers as nearly equal. Medical-term miss does not: the two language-model decoders lose far fewer terms than the transducer decoders, and the intervals do not overlap. Running the streaming model offline on the whole recording changes nothing, so this is the decoder, not latency.
| System | Decoder | WER % | Term miss % | DER % |
|---|---|---|---|---|
| MOSS-TD 0.9B | LLM | 10.3 | 8.4 [7.1, 9.7] | 11.4 |
| Canary-Qwen 2.5B | LLM | 11.6 | 9.4 [8.0, 10.8] | — |
| Nemotron-3.5 streaming 0.6B | Transducer | 11.8 | 12.5 [10.9, 14.0] | — |
| Parakeet-TDT 0.6B v3 | Transducer | 11.2 | 15.1 [13.4, 16.8] | — |
| Sortformer + Parakeet v3 | Transducer | 11.2 | 15.1 | 11.1 |
| Nano Omni 30B-A3B, as prompted | LLM | 27.2 | 15.7 | 88.3 |
Paired over recordings, MOSS-TD minus the streaming model is −3.9 points of term miss [−6.3, −1.7]; Canary-Qwen minus streaming is −2.6 [−4.8, −0.6] at unchanged word error rate. The last row measures one chat model as I prompted it, not the model’s best use. Complaint-tuned hotwords made word error rate slightly worse (+0.18 [+0.03, +0.33]).
The fine-tune that won every overlap metric
One epoch of LoRA lifted ROUGE-L by 8.6 points, the kind of result that gets announced. Judged on the clinician dimensions, the same notes got worse: more claims credited to the wrong speaker, and fewer follow-up instructions carried into the note. Every interval excludes zero.
LoRA minus base, 120 ACI-Bench encounters
looks betteris worse
- Term precision+10.2 points, 95% interval 7.9 to 12.6
- ROUGE-L+8.6 points, 95% interval 7.2 to 10
- Term recall+4.8 points, 95% interval 2.9 to 6.6
- Follow-up recall−4.5 points, 95% interval -7.3 to -2
- Misattributions per note
- +0.11 [0.04, 0.18]
- Follow-up recall
- 97.4% → 92.9%
- Sentences with citations
- 99.6% → 9–16%
The fine-tune also erased citations: the training targets carried none, so the tuned writer stopped citing the transcript at all.
An overnight search, and what the gate couldn’t see
An autoresearch loop tried 131 pipeline variants overnight: recognizer, speaker mapping, prompts, citations, a verifier gate and the writer model. A change had to hold on 20 development visits, then beat the best score on 37 held-out visits, then survive a second judge. Five changes were accepted, and ten development gains failed on held-out.
The loop reported +4.2 on held-out visits. Re-run with the writer’s official release weights instead of the community build the search had used, the gain shrank to +1.3 [−3.8, +6.2], and two losses became measurable. Roughly three of the four points belonged to the modified build, not the pipeline.
| Metric | Difference | Baseline → best |
|---|---|---|
| Term precision | +2.5 [0.5, 4.5] | — |
| ROUGE-L | +1.5 [0.3, 2.6] | 21.8 → 23.2 |
| Composite score | +1.3 [−3.8, 6.2] | 41.0 → 42.3 |
| Grounded sentences | −3.4 [−6.6, −0.2] | 88.6% → 85.2% |
| Plan recall | −8.1 [−13.8, −1.7] | 80.8% → 72.7% |
The search also rejected citations eight times, because its objective had no verifiability term and citations cost about a point of ROUGE-L. Re-scored with grounding, the cited configuration beats the uncited best by +6.1 grounded [+3.2, +8.9]. A score without the trust dimension removes the trust feature.
A verifier, tested on errors we planted
The claim verifier, Gemma 4 26B-A4B, checks each claim in a note against the transcript. It was measured by planting known errors in correct notes on three ACI-Bench test splits.
| Split | Claims | Injected | Recall | Clean flagged |
|---|---|---|---|---|
| ACI test 1 | 905 | 232 | 98.7% | 5.5% |
| ACI test 2 | 968 | 247 | 99.6% | 3.5% |
| ACI test 3 | 891 | 229 | 98.7% | 4.4% |
By type, negations were the hardest to catch (85–93%); fabricated findings and third-party leaks were caught 99–100% of the time. The catch is in the setup: these are synthetic corruptions. How many of a model’s own, natural errors the verifier catches is unmeasured.
From benchmark to a live visit copilot
The same pipeline runs live. The repo includes a copilot that streams the microphone to a self-hosted realtime recognizer and shows, as the visit unfolds, the next question to ask and questions drawn from guideline lookups.
I later built it out into a fuller private prototype that also drafts a cited note and EHR fields, and stops before anything is signed. It has been measured on synthetic visits only, with no real patients:
- 99.71%
- speaker labels correct
- 289 / 308
- note sentences supported by the transcript
- 14 / 15
- held-out “don’t miss” reminders raised
- 0 / 419
- wrong values in EHR draft fields
- ~$0.07
- model cost per visit
What the metric missed
ROUGE-L rewards notes that read like the reference. The fine-tune learned the reference style, so overlap rose while attribution and follow-ups slipped and citations vanished. A dashboard tracking overlap alone would have shipped it, and an optimizer scored on overlap removed a trust feature on its own.
The judges have limits too. Two judges rank notes alike (ρ = 0.80) but disagree on the sign of the official-weights difference, and four judges could not agree on who said what: pairwise κ from −0.02 to +0.29, with no note flagged by all four. These evaluations are good for ordering pipelines and catching objective failures, and unsafe as absolute quality claims without clinician calibration.
Limits
- Mock UK primary-care consultations: 57 recordings, cleaner than clinic audio, with terse reference notes and no chart context.
- No clinician has read any note, and the judges are not calibrated against clinicians.
- The search ran on a community-modified writer build; the official-weights re-run is the number to trust.
- Verifier recall is on injected errors only. The live view was evaluated as a replay.
- Fairness groups are small (3–26 encounters). A quarter of reference plan items were never spoken in the visit.
What I’d do next
- Calibrate the judges against clinician-labelled misattributions on a small set of real audio.
- Score completeness against what was actually said, and put a verifiability term in every objective.
- Train against attribution errors directly, then rerun the fine-tune.
- Measure the verifier on models’ own mistakes, not only on planted ones.
Sources
Questions about this work? Get in touch.
sipratt@gmail.comHow I write these: numbers link to their source files; drafting is AI-assisted and every result is checked by hand. More on method