Skip to content
anecho.ai

How it was measured, and what that does not license you to say.

This page exists to be quoted. Every figure below is interpolated from the published results file, and every caveat is attached to the claim it limits rather than filed at the bottom where it can be left behind.

Run 2026-08-14T02:16:50Z · schema v1 · 13 backends × 18 conditions · faster-whisper:base.en

The result, in one paragraph

No engine beat the unprocessed control on pooled word error rate: raw scored 14.8% against 15.6% for the best enhancer (ai-coustics Quail L) and 20.3% for the best engine with a licence you can ship (GTCRN). That single pooled number is not the whole result, and quoting it alone is a misreading: at least one engine did beat raw in 11 of the 18 individual conditions, with the largest single-condition gain −5.79 points (ai-coustics Quail VF 2.2 L on Competing speaker 5 dB). The only conditions where nothing helped were Reverb and Reverb + noise 10 dB and telephony_alaw and telephony_g722 and telephony_opus12k and telephony_loss3 and telephony_loss10 — reverberation, which none of these models remove. The correct summary is therefore: enhancement pays where the audio is genuinely bad and costs you accuracy where it is not, and pooling across a condition mix that is mostly not-that-bad hides the trade. Insertions — words the recogniser invented that nobody said — went up rather than down, from 101 on raw audio to 410 on Clearline (8 kHz, resampled), which is the opposite of the usual vendor claim.

§ what-was-run

What was run

One harness, one recogniser, one machine, every engine treated identically.

13 audio backends — 11 enhancement engines plus an unprocessed control and a passthrough sanity row — were scored across 18 acoustic conditions on a test set of 180 clips (10 speakers, 1406 seconds of audio, seed 20260101).

Transcription is CTranslate2 int8 CPU, greedy, model=base.en. Voice activity is silero-vad at threshold 0.5 on 512-sample blocks. Cost is measured on Apple M1 Max (macOS-26.5.2-arm64-arm-64bit) with onnxruntime 1.28.0 pinned to 1 intra-op thread and sequential execution, so every real-time factor here is one stream on one core, not a fan-out across the machine.

The control is a row, not a footnote. Unprocessed audio appears in every table and every delta is measured against it in the same condition. A benchmark without a null hypothesis is a brochure.

  • Clean
  • Noise -5 dB
  • Noise 0 dB
  • Noise 5 dB
  • Noise 10 dB
  • Noise 20 dB
  • Babble 5 dB
  • Competing speaker 0 dB
  • Competing speaker 5 dB
  • Reverb
  • Reverb + noise 10 dB
  • Telephony 8 kHz
  • Telephony + noise 10 dB
  • telephony_alaw
  • telephony_g722
  • telephony_opus12k
  • telephony_loss3
  • telephony_loss10
§ headline

How to quote this without misquoting it

If you quote one number from this benchmark, quote it with the condition attached. Pooled WER across a fixed condition mix is a property of the mix as much as of the engine: weight the mix toward clean and lightly-noisy speech and enhancement looks like a tax; weight it toward competing speakers and low SNR and enhancement looks like a win. Both readings come from the same file.

The specific misreading we would like to head off is "enhancement never helps". That is not what 18 conditions showed. No engine beat raw on the pooled average; at least one engine beat raw in 11 of the 18 individual conditions. Both sentences are true, and the second one is the actionable half — it tells you the conditions in which turning enhancement on is a good trade.

The mirror-image misreading is also wrong. Enhancement is not a free win in the conditions where it helped: it moved word error rate by a few points on a test set whose resolution is about half a point per word, on one recogniser, and it raised insertions everywhere. Measure it on your own audio and your own recogniser before you commit — the SDK ships the same alignment code this harness uses, precisely so you can.

§ where-enhancement-pays

Where enhancement paid, condition by condition

At least one engine beat the unprocessed control in 11 of 18 conditions.

Read these against the resolution limit below before treating any of them as a result: several are inside one or two reference words.

  • Clean: raw 4.7% → 4.2% (−0.53 points, FastEnhancer-M); 1 of 11 engines beat raw here.
  • Noise -5 dB: raw 18.4% → 13.7% (−4.74 points, FastEnhancer-L); 3 of 11 engines beat raw here.
  • Noise 0 dB: raw 11.1% → 6.3% (−4.74 points, ai-coustics Quail L); 8 of 11 engines beat raw here.
  • Noise 5 dB: raw 8.9% → 6.8% (−2.11 points, FastEnhancer-L); 4 of 11 engines beat raw here.
  • Noise 10 dB: raw 6.3% → 5.3% (−1.05 points, FastEnhancer-L); 5 of 11 engines beat raw here.
  • Noise 20 dB: raw 4.2% → 3.2% (−1.05 points, FastEnhancer-M); 2 of 11 engines beat raw here.
  • Babble 5 dB: raw 24.7% → 20.5% (−4.21 points, ai-coustics Quail VF 2.2 L); 1 of 11 engines beat raw here.
  • Competing speaker 0 dB: raw 84.7% → 79.5% (−5.26 points, ai-coustics Quail L); 2 of 11 engines beat raw here.
  • Competing speaker 5 dB: raw 26.3% → 20.5% (−5.79 points, ai-coustics Quail VF 2.2 L); 1 of 11 engines beat raw here.
  • Telephony 8 kHz: raw 5.8% → 5.3% (−0.53 points, FastEnhancer-S); 1 of 11 engines beat raw here.
  • Telephony + noise 10 dB: raw 10.5% → 9.5% (−1.05 points, ai-coustics Quail VF 2.2 L); 1 of 11 engines beat raw here.
§ where-it-did-not

Where nothing helped

Reverberation is the clean failure case. None of these models are dereverberation models, and on the two reverberant conditions the best engine still lost to doing nothing. SI-SDR goes sharply negative there — down to around −17 dB — which is the metric telling you the processed signal has been moved a long way from the reference, not merely denoised.

  • Reverb: raw 5.8%, best engine 6.8% (+1.05 points, ai-coustics Quail L). Nothing beat doing nothing.
  • Reverb + noise 10 dB: raw 13.7%, best engine 14.7% (+1.05 points, GTCRN). Nothing beat doing nothing.
  • telephony_alaw: raw 7.4%, best engine 7.4% (±0.00 points, ai-coustics Quail L). Nothing beat doing nothing.
  • telephony_g722: raw 5.3%, best engine 5.3% (±0.00 points, FastEnhancer-L). Nothing beat doing nothing.
  • telephony_opus12k: raw 6.8%, best engine 6.8% (±0.00 points, FastEnhancer-S). Nothing beat doing nothing.
  • telephony_loss3: raw 11.1%, best engine 11.1% (±0.00 points, ai-coustics Quail VF 2.2 L). Nothing beat doing nothing.
  • telephony_loss10: raw 10.0%, best engine 10.5% (+0.53 points, ai-coustics Quail L). Nothing beat doing nothing.
§ resolution

The resolution limit — what counts as a result

Each condition carries roughly 190 reference words (3,420 across all 18 conditions), so one word is about 0.53 points of word error rate. Any per-condition delta smaller than that is a single word and is not a finding — including when it flatters us.

This is why the telephony column is reported as "no meaningful improvement" rather than as a win: the best engine there lands −0.53 points from the control, which is inside one reference word, while the worst costs +10.00 points, which is not.

The test set is deliberately small enough to say so plainly: 10 speakers is enough to separate large effects and not enough to resolve a point or two of WER. Treat rank orderings between adjacent engines as unresolved.

§ caveats

The caveats that must travel with these numbers

If you cite a figure from this benchmark, cite these with it. They are the harness's own statement of what it does not prove, published in the results file itself and reproduced here unedited.

Every backend is scored at its own native rate, so a narrowband engine is resampled 16→8→16 to meet this matrix. To keep that handicap accountable rather than rhetorical, the table carries a resample-only control — the same round trip with no model in it. On the Telephony 8 kHz rows the control scores 5.8%, which makes it an easy condition, and easy conditions are exactly where enhancement has the least to win and the most to lose.

Anecho's own engine is now in this table, and it loses. Pooled it scores well behind doing nothing, and the control is what makes that readable: on the wideband half the band limit costs about six points of word error rate and our model adds roughly thirty more, while on the narrowband half the band limit costs under a point and our model still adds six. It loses at its own operating point, to raw audio and to a piece of wire — the one exception being plain Telephony 8 kHz, where it lands on the control and ties doing nothing. We publish it because a benchmark that exempts its author measures nothing.

  • DeepFilterNet3 is measured through a block-online adapter: every public ONNX export of it lacks recurrent state tensors, so per-frame streaming is impossible with the published weights. Its RTF here is an upper bound and its latency (100 ms) is far above the ~40 ms a native (Rust/tract) runtime achieves. Read the DFN3 rows as a lower bound on quality and an upper bound on cost.
  • ai-coustics rows are a proprietary baseline run through the licensed aic-sdk. They are a reference point, never a shipping code path.
  • WER is measured with faster-whisper:base.en (CTranslate2 int8 CPU, greedy, model=base.en). A different recogniser will give different absolute numbers; the harness supports Deepgram and AssemblyAI so the *ordering* can be checked on another engine.
  • Clearline is an 8 kHz model and these conditions are stored at 16 kHz, so its row is measured through the harness's resample path — 16 k -> 8 k -> model -> 8 k -> 16 k (soxr), the same path the native-8 kHz ai-coustics baselines take. On `clean`, `noise_*`, `babble_snr5`, `competing_*` and `reverb*` that is not its operating point: the 4-8 kHz band is discarded before the model ever sees it. The `resample8k` control row is that round trip with no model in it, so the band limit and the model can be told apart; and the telephony sub-aggregate below reports the regime the model was actually built for.
  • The Clearline checkpoint benchmarked here is not shippable, and this row is not a claim that it is. Two gates it does not pass, both measured on its own eval (`runs/t4_300h_200ep_solo`, 1,800-clip test_v2) and neither of them visible in this table: (1) a solo regression — on clips with no competing speaker the model makes the audio worse, -0.874 dB SI-SDR with 37.1% of solo clips degraded (-0.595 dB / 33.0% on val_v2); (2) speaker conditioning contributes approximately nothing — the matched ablation scores FiLM +2.815 dB against no-conditioning +2.690 dB, a 0.125 dB difference against a 0.3 dB noise floor, so what is being measured here is a plain denoiser and not the speaker isolation the architecture is for. The row exists so Clearline can be *placed* next to the competition on identical audio, not to argue that it is ready.
  • Clearline's own eval (`clearline/evaluate.py`, 1,800 clips, difficulty buckets) and this leaderboard are not comparable and were never meant to be: different clips, different conditions, different pooling. Only the recogniser is shared. This row exists precisely so that a comparable number exists.
  • DeepFilterNet3 runs at 48 kHz on 16 kHz source material upsampled to 48 kHz — there is no real content above 8 kHz for it to work with. That is the honest telephony/VoIP situation, but it is not the condition DFN3 was designed for.
  • The test set is 10 speakers / ~190 reference words per condition. That is enough to separate large effects and not enough to resolve differences of a point or two of WER.
  • Run-to-run repeatability of the recogniser was measured, not assumed — and the standing warning did not reproduce here. Elsewhere in this project faster-whisper on CPU has been seen to return different transcripts for byte-identical input (three runs of one aggregate gave 121.65 / 122.15 / 121.40%), and the standing guidance from that is to treat differences below roughly 6 pp on a small aggregate as decoder noise. On this host and this harness it did not happen: 25/25 scopes were bit-identical across repeated decodes (raw on 18 condition(s), 180 clips x 3 decodes; clearline on 5 condition(s), 50 clips x 3 decodes), including the arms where the recogniser is already hallucinating past 100% WER. Independently, re-measuring `raw` and `gtcrn` in a fresh process two days after the published run reproduced all 54 rows exactly (max ΔWER 0.0000 pp). Three repeats cannot prove determinism and a different host, venv or thread count may well behave differently, so the conservative 6 pp guidance still governs anything quoted from another machine — but on this table the resolution limit is set by the size of the test set, not by the decoder: one reference word is 0.53 pp in a single condition (190 words), and about 0.03 pp pooled across all 18. Differences of a point or two between adjacent rows are still not results; differences of tens of points are.
  • onnxruntime is pinned to 1 intra-op thread with sequential execution: the measured cost is one stream on one core, not a fan-out across the whole machine.
  • The `telephony*` conditions in this table are stored at 16 kHz after a full 8 kHz carrier leg (band-limit, codec, packet loss), so every backend sees them at its own native rate. The genuinely narrowband experiment — where nothing is resampled — is a separate artefact (`bench/out/telephony.json`).
  • Packet loss is modelled as bursty (2-state Gilbert-Elliott) erasure of 20 ms frames with attenuated-repeat concealment, not i.i.d. loss with silence fill. i.i.d. loss flatters every decoder and silence fill overstates the damage.
§ licensing

Licensing, reuse and citation

The measured results — everything in the results JSON — are published under CC-BY-4.0. Quote them, republish them, argue with them; attribution to Null Test by Anecho Audio, Inc. is requested, and a link to the methodology is appreciated because it carries the caveats.

The harness is Apache-2.0. The *derived audio* is a separate question and a stricter one: LibriSpeech is CC-BY-4.0. ESC-50 is CC-BY-NC-3.0 — the noise conditions are research/evaluation only. The competing-speaker and babble conditions are built from LibriSpeech alone and carry no NC restriction.

The ai-coustics rows are produced through their licensed SDK as a proprietary reference point. They are a measuring stick and never a shipping code path in anything we sell.

If you think we have measured your engine unfairly, the harness takes a new backend in one file — implement the four-method Enhancer protocol and it is picked up. Send a pull request and we will publish the corrected row.

Q · what people actually ask

Questions this benchmark answers.

Short answers, each one carrying the condition it was measured under.

Does noise suppression hurt speech-to-text accuracy?
In our measurement it depends entirely on the condition, and the honest answer is not a yes or a no. Pooled across 18 conditions, no engine beat unprocessed audio: raw scored 14.8% word error rate against 15.6% for the best enhancer. But per condition, at least one engine beat raw in 11 of 18 cases — the exceptions were both reverberant. Enhancement pays where the audio is genuinely bad (low SNR, competing speakers) and costs you accuracy where it is not. Measured with faster-whisper:base.en; a different recogniser will give different absolute numbers.
Which speech enhancement engine had the lowest word error rate?
ai-coustics Quail L at 15.6% pooled, but it is a proprietary baseline we do not ship. The best engine under a licence you can actually use in a product was GTCRN at 20.3%. Both are above the unprocessed control's 14.8%. Ranking between adjacent engines is inside the resolution of a 10-speaker test set and should not be treated as settled.
Does enhancement reduce hallucinated words in transcription?
No — it increased them here. Insertions rose from 101 on raw audio to 410 on Clearline (8 kHz, resampled). That is the direct opposite of the common vendor claim, and it is why this benchmark reports insertions, substitutions and deletions separately rather than only a WER total.
Should I run enhanced audio into my speech-to-text?
Not by default, and not with the same stream you feed your turn detector. Our data says the two consumers want different audio: enhancement cost word error rate on pooled average while cutting the voice-activity false-alarm rate by up to 29 points in the conditions that actually break barge-in (babble and competing speakers). The split pipeline — enhanced audio to VAD and turn-taking, original audio to the transcriber — is the routing that follows from the measurement.
Is DeepFilterNet3 really that bad?
No, and the rows should be read as a lower bound on its quality and an upper bound on its cost. Every public ONNX export of DeepFilterNet3 lacks recurrent state tensors, so per-frame streaming is impossible with the published weights and it has to run through a block-online adapter at 100 ms latency. Its native Rust runtime would be roughly 40 ms. It is also a 48 kHz model being handed 16 kHz source material upsampled to 48 kHz, which is the honest VoIP situation but not what it was designed for.
Can I reuse these results?
Yes. The results file is CC-BY-4.0 and the harness is Apache-2.0. Attribution to Null Test by Anecho Audio, Inc. is requested. Please carry the caveats with the numbers — particularly the single-recogniser caveat and the ~190-reference-word resolution limit, because most of the per-condition deltas that look interesting are one or two words wide.
Cite · the raw data

A stable URL, a stable schema, and a licence.

Everything on this page is derived from one file. Fetch it rather than scraping the tables.

bash
# stable, versioned — the schema version, not the run date
curl -s https://anecho.ai/data/nulltest/v1/results.json | jq '.backends[] | {id, wer, rtf}'

# the same document, unversioned
curl -s https://anecho.ai/benchmark.json | jq '.caveats'

The path carries the schema version, so a citation keeps resolving to a document your parser understands after a re-run replaces the numbers. Which run you are looking at is generatedAt, currently 2026-08-14T02:16:50Z.

Back

The leaderboard

Every cell, filterable by condition, with cost reported next to accuracy.

Open it
Write-up

What the run found

The launch post, with the argument and the parts we could not settle.

Read it
Consequence

The split pipeline

The routing this measurement implies: clean audio to turn-taking, original audio to the transcriber.

Wire it up