Skip to content

source of truth catalog file - #160

Merged
cjpais merged 26 commits into
mainfrom
fluers-wer-testing
Sep 15, 2026
Merged

cjpais merged 26 commits into
mainfrom
fluers-wer-testing

Conversation

@cjpais

@cjpais cjpais commented Sep 12, 2026

Copy link
Copy Markdown
Contributor

Basically, a lot of this work was done as a result of building giant sets of word error rate testing across multiple languages for all of the models to get an idea of how well they perform, at least on some set of data, so people can offer better onboarding experiences for local models. Especially since the number of local models is incredibly overwhelming.

This also lays the foundation so that every new model that comes in (officially on the handy-computer hf org) does have more things that need to be tested that we have word error rate data for every language they support, and performance data as well.

Fold the 4750U publication sweep into the catalog: 245 profile-stamped
cells, 137 of them replacing legacy rows that carried a rounded xRT and no
stage timings. Ryzen legacy rows drop from 176 to 39. Rows last measured in
April and May move 50-90% faster, which is the optimization work since
landing rather than a measurement change, so they go in with --force.

The moonshine language fine-tunes waive their dots cell. Fed 35 s of
out-of-language audio they degenerate into a repetition loop, never emit
end-of-stream, and decode hits the 194-token position cap, so the cell
times a loop and the bench binary exits non-zero. Their published dots rows
were hand-written round numbers; drop them with the requirement, since a
waived cell with a row present is an extra.

scripts/bench/run.py built its candidate matrix from the profile's
top-level samples only, so a family that overrides them (gigaam benches a
Russian clip) matched nothing and every variant was silently skipped with
exit 0. Union the override samples in before the per-variant filter.

Document scripts/catalog/new_record.py as Step 0 of porting-6, the first
stage that writes to the catalog, and correct the stale instruction there
to transcribe bench numbers into the doc and the card by hand.
All 16 cells, replacing round hand-written placeholders with measured
figures. Q8_0 on CPU read 9.00 for all four variants and now reads 12.77 to
14.38; e2e-rnnt on Vulkan read 22.00 and now reads 15.7. Ryzen legacy rows
drop from 39 to 2.
English jfk and dots decode out of distribution on a single-language
fine-tune: the next-token distribution is nearly flat, so an argmax flip
starts a repetition loop that never emits end-of-stream and runs to the
194-token position cap. Whether that happens depends on the backend, since
GPU logits are not bit-identical to CPU. moonshine-tiny-ja terminates on
CPU and loops on Metal from the same file; moonshine-base-ar did the
reverse on Vulkan. A cell whose success is decided by whether nonsense
happens to stop is not measuring anything.

Point those six variants at their own language clip, the way gigaam
already points at a Russian one. Output is then a real transcript and
identical across backends. The dots waiver goes with them, and the English
rows they held are dropped, so 24 cells read as missing until both rigs
bench them. ar, uk and vi keep the waiver; no fixture exists in those
languages yet.

Underneath the profile, check.py's integrity pass now refuses a record with
no speed rows at all. The profile decides which cells are required; this is
the floor that stops a model shipping a page and a card with no performance
on them. It fires on those six and nothing else.
Both sides fixed the same bug: a bench report names its variant by the
models/ directory, which mirrors the upstream repo casing while the record
is kebab-case. Keep the resolver that also falls back to the upstream repo
slug when exactly one record claims it, so models/SenseVoiceSmall resolves
to sensevoice-small, and the uniqueness guard keeps models/GigaAM-v3 from
resolving to an arbitrary one of the four gigaam records.

scripts/bench/run.py takes both changes: catalog_key for the profile
lookup, and the candidate matrix unioning in samples named only by a
family or model override.
The twelve moonshine language fine-tunes and the four gigaam variants now
bench on a pair of in-language FLEURS clips at the same two lengths as
jfk/dots, instead of English audio they decode out of distribution or a
2.2 s clip whose figure was load and encode dominated.

vi-long started at the longest Vietnamese utterance, 38.1 s, which exceeds
moonshine's 194-token decode cap: the transcript tracked the reference word
for word and then stopped mid-word about 95% through. Replaced with a
25.1 s clip, verified to transcribe to completion on both sizes and both
backends.

Every speed row in the catalog now names the build that measured it, 996 of
996, against 506 of 964 before this sweep. Both rigs are fully profile
measured; the only rows outside a profile are the sortformer diarizer's,
which no ASR profile claims.
@cjpais cjpais changed the title add FLEURS WER analysis experiments source of truth catalog file Sep 15, 2026
@cjpais
cjpais merged commit 83a75c1 into main Sep 15, 2026
5 checks passed
NairoDorian added a commit to NairoDorian/transcribe.cpp that referenced this pull request Sep 18, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant