Independent ASR evaluation · Google FLEURS (public, CC-BY-4.0) · run on Cloudflare Workers AI
Loading the benchmark…
A finding worth flagging: no Nordic languages, today
While testing which languages to include, every request with language=sv (also da, no, fi, pl) against @cf/deepgram/nova-3 on Cloudflare Workers AI returned HTTP 400 — "No such model/language/tier combination found." Only en, es, fr, de, hi, ru, pt, ja, it, nl are accepted as standalone language codes on this platform — the same ten languages as Nova-3's own "multi" code-switching mode, plus English on its own.
That's why this benchmark covers English, German, French, Spanish, Dutch and Italian rather than Swedish, which was the original target language for this evaluation. For a Nordic-language customer PoC, this specific hosting path isn't usable yet — worth knowing before you promise a client a demo.
Speed, not just accuracy
Latency here is a single HTTP round-trip per clip against the Workers AI REST API — a rough proxy for batch throughput, not Deepgram's own streaming numbers. Useful for comparing the two models under identical conditions, not for citing as a production SLA.
Try it on your own voice
Record up to 10 seconds, or upload a short clip (up to ~30 s). Whisper large-v3-turbo transcribes it live, right here, through the same Workers AI account used for the benchmark above. Nova-3's live box is currently disabled — its Workers AI binding rejects binary audio input as of this writing, a real platform limitation, not a design choice; its numbers throughout the rest of this page come from the real, precomputed benchmark run. See Methodology for the detail.
Nothing recorded yet. Up to 10 requests/hour per visitor, capped globally per day to keep this demo's Workers AI bill trivial.
Every clip, word by word
Struck-through words are what the reference transcript says and the model missed; underlined words are what the model added or substituted instead. This is the raw material the leaderboard numbers above come from — nothing here is cherry-picked.
Methodology & limitations
- Dataset
- Google FLEURS test split, streamed via Hugging Face (not bulk-downloaded), CC-BY-4.0. 15 clips per language, kept in a 3–13s duration band, taken in stream order (not reshuffled) — so this is a convenience sample of the first matching clips, not a random draw from the full test set.
- Sample size
- 90 clips total, 15 per language. Small enough that per-language confidence intervals are wide — they're shown next to every number below rather than hidden. Treat single-percentage-point differences as noise; treat the Nordic-language gap as a hard fact (it's a capability check, not a sample statistic).
- Normalization
- Lowercased, punctuation stripped, whitespace collapsed, applied identically to reference and hypothesis before computing word error rate. Diacritics are kept (they're phonemically meaningful in these languages). Numbers are not normalised: "25" vs "twenty-five" or "23:35" vs "23 35" counts as an error, which inflates WER for whichever model formats differently from the reference on number-heavy clips (e.g. en_010, it_012). FLEURS is clean read speech and may overlap with either model's training data — treat it as a smoke test, not a ranking.
- WER
- Corpus-level: total (substitutions + deletions + insertions) ÷ total reference words, computed with a standard word-level edit-distance alignment.
- Confidence intervals
- 95% interval from 2,000 clip-level bootstrap resamples per language.
- Models
@cf/deepgram/nova-3and@cf/openai/whisper-large-v3-turbo, both via Cloudflare Workers AI — not Deepgram's or OpenAI's own hosted APIs directly. Numbers reflect this specific hosting path, not necessarily either vendor's best-available accuracy.- Not included
- Deepgram Flux — it's a turn-taking, WebSocket-only conversational model built for live voice agents, not a batch transcription endpoint, so it doesn't fit a WER comparison like this one. A voice-agent latency/turn-taking demo would be the right way to evaluate it, and is a natural next step.
- Live "try it" box
- Whisper large-v3-turbo is genuinely live. Nova-3's live entry is disabled: its Workers AI binding (used from inside the Function) rejects every binary audio shape tried (ArrayBuffer, Uint8Array, Blob, byte array) with the same schema error the raw REST API gives for a JSON body — while the identical audio sent as a raw HTTP POST with a
Content-Typeheader works fine, which is how the precomputed benchmark itself was run. Fixing the live box would mean calling that REST endpoint from the Function with a Cloudflare API token as a server-side secret, which isn't wired up in this deployment. Rate-limited (10/hour per visitor, ~300/day globally) via the Cache API — best-effort and per-datacenter, not a hard global guarantee. Audio duration isn't verified server-side; a 5 MB upload cap stands in for a duration check. Separately: Cloudflare's own free-tier Workers AI account has a 10,000-neuron/day cap, which this project's benchmark run alone came close to — a live demo running on a free account can hit Cloudflare's limit before it hits either of this app's own rate limits.
What I'd actually do with a customer's audio
This is the shape of a real proof-of-concept, just with public data standing in for a customer's recordings:
1. Get 30–60 minutes of the customer's own audio across the conditions that matter to them — accents, background noise, call quality, domain vocabulary — not a public benchmark. Public sets like FLEURS are clean read speech; real support calls, meetings or IVR audio behave differently.
2. Agree on ground truth before running anything: either the customer's existing transcripts, or a small hand-corrected reference set, with the normalization rules written down up front (case, punctuation, numbers, filler words) so nobody re-litigates the scoring after seeing the numbers.
3. Report WER per segment that matters to the business (per queue, per agent, per language) rather than one blended number, plus latency and cost at the volume they'll actually run — a model that wins on accuracy but not on their concurrency needs isn't a win.
4. Say what's uncertain. A 90-clip public benchmark like this one is a starting point for a conversation, not a procurement decision — and I'd rather tell a customer their sample is too small to be sure than round a confidence interval away.
About this project
Built by Ulf Faldt Reifenberg — an independent, reproducible ASR evaluation on European languages, run the way a solutions architect would run a customer proof-of-concept: public data, an honest sample size, real latency numbers, and a live comparison anyone can try.
Source, benchmark script and raw results: github.com/AlwaysBlind/euro-asr-bench (placeholder until published).
Unofficial — not affiliated with Deepgram, OpenAI, or Cloudflare. Model names are used only to identify which systems were tested.