Null TestEleven enhancers. One control. Nothing won on average.
One corpus, 19 conditions, one harness, every engine scored the same way. On pooled word error rate, no enhancer beat the unprocessed control. The null hypothesis won.
The vendor numbers cannot all be true.
Four public answers to the same question. No shared corpus among them.
| Source | Claim | What shipped as evidence |
|---|---|---|
| Krisp | ~46% WER reduction | Marketing figure. Corpus, conditions and transcriber unstated. |
| ai-coustics | ~43% WER reduction | Marketing figure. Same shape, different model family. |
| Deepgram | Enhancement hurts STT accuracy | Published position. No dataset we can find. |
| arXiv:2512.17562 | Raw beat enhanced in all 40 configurations | Independent — but one research model, medical speech, semantic WER. |
Here is a shared corpus. None of the four survives it. The reduction claims: the best engine on this bench moved pooled WER +0.9 points — a rise, not the advertised fall. The never-helps claims: at least one engine beat raw in 11 of 19 conditions. A number without a corpus is not evidence. This one you can download.
The best enhancer, ai-coustics Quail L: 15.2% pooled against the control’s 14.3%. The best you can legally ship, anecho.ai_focus_model_16khz_v8_2: 16.6%. Insertions — invented words — rose from 103 raw to 381 on DeepFilterNet3.
Pooled is not the whole result: at least one engine beat raw in 11 of 19 conditions, by up to −10.5 points on Competing speaker 0 dB. Enhancement pays where the audio is genuinely bad, costs accuracy where it is not; pooling hides the trade.
| Licence | Better than raw | |||||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Raw (no processing) | — | 14.32 | ref | 103 | 60 | — | 0.948 | 19.3 | — | 0 ms |
| Passthrough (control) | — | 14.32 | ±0.00 | 103 | 60 | 0/19 | 0.948 | 19.3 | 0.000 | 0 ms |
| ai-coustics Quail L | proprietary | 15.18 | +0.86 | 128 | 59 | 3/19 | 0.943 | 20.6 | 0.123 | 30 ms |
| anecho.ai_focus_model_16khz_v8_2 | proprietary — ours | 16.59 | +2.27 | 119 | 73 | 4/19 | 0.941 | 18.5 | 0.067 | 15 ms |
| ai-coustics Quail VF 2.2 L | proprietary | 17.59 | +3.27 | 163 | 76 | 5/19 | 0.945 | 16.1 | 0.075 | 30 ms |
| GTCRN | MIT | 20.14 | +5.82 | 223 | 41 | 1/19 | 0.945 | 17.9 | 0.050 | 16 ms |
| FastEnhancer-S | MIT | 20.33 | +6.01 | 173 | 72 | 3/19 | 0.943 | 17.8 | 0.034 | 16 ms |
| FastEnhancer-L | MIT | 20.36 | +6.04 | 171 | 112 | 6/19 | 0.941 | 15.6 | 0.377 | 26 ms |
| FastEnhancer-B | MIT | 20.64 | +6.32 | 163 | 80 | 3/19 | 0.943 | 17.7 | 0.021 | 16 ms |
| FastEnhancer-T | MIT | 21.66 | +7.34 | 146 | 110 | 3/19 | 0.940 | 17.5 | 0.013 | 16 ms |
| FastEnhancer-M | MIT | 22.13 | +7.81 | 234 | 84 | 5/19 | 0.940 | 16.1 | 0.110 | 22 ms |
| DeepFilterNet3 (96-frame warm-up) | MIT OR Apache-2.0 | 30.69 | +16.37 | 375 | 130 | 0/19 | 0.914 | 24.3 | 0.226 | 100 ms |
| DeepFilterNet3 | MIT OR Apache-2.0 | 34.04 | +19.72 | 381 | 200 | 0/19 | 0.901 | 23.9 | 0.133 | 100 ms |
Blue row is the unprocessed reference · red ΔWER means the engine made transcription worse · green VAD FA means it cut false triggers
Generated 2026-08-14T02:16:50Z · faster-whisper:base.en · silero-vad · Apple M1 Max · onnxruntime 1.28.0 · 1 thread
Enhancement is not useless. It is pointed at the wrong consumer.
Wire it upVoice activity F1 barely moves — but in the conditions that break barge-in, the false-alarm rate collapses.
| Engine | Transcription | Turn-taking (Onset) | ||||
|---|---|---|---|---|---|---|
| WER raw → enh | ΔWER | Ins raw → enh | F1 raw → enh | FA Babble 5 dB | FA Competing 5 dB | |
| ai-coustics Quail L | 14.3→15.2 | +0.86 | 103→128 | 0.948→0.943 | 98→96 | 58→58 |
| anecho.ai_focus_model_16khz_v8_2 | 14.3→16.6 | +2.27 | 103→119 | 0.948→0.941 | 98→92 | 58→53 |
| ai-coustics Quail VF 2.2 L | 14.3→17.6 | +3.27 | 103→163 | 0.948→0.945 | 98→75 | 58→37 |
| Resample-only 16→8→16 (control) | 14.8→18.6 | +3.86 | 101→173 | 0.950→0.948 | 98→97 | 58→55 |
| GTCRN | 14.3→20.1 | +5.82 | 103→223 | 0.948→0.945 | 98→92 | 58→57 |
| FastEnhancer-S | 14.3→20.3 | +6.01 | 103→173 | 0.948→0.943 | 98→85 | 58→56 |
| FastEnhancer-L | 14.3→20.4 | +6.04 | 103→171 | 0.948→0.941 | 98→68 | 58→39 |
| FastEnhancer-B | 14.3→20.6 | +6.32 | 103→163 | 0.948→0.943 | 98→87 | 58→56 |
| FastEnhancer-T | 14.3→21.7 | +7.34 | 103→146 | 0.948→0.940 | 98→89 | 58→57 |
| FastEnhancer-M | 14.3→22.1 | +7.81 | 103→234 | 0.948→0.940 | 98→75 | 58→48 |
| DeepFilterNet3 (96-frame warm-up) | 14.3→30.7 | +16.37 | 103→375 | 0.948→0.914 | 98→93 | 58→57 |
| DeepFilterNet3 | 14.3→34.0 | +19.72 | 103→381 | 0.948→0.901 | 98→92 | 58→57 |
Every engine we tested raised word error rate. Several of them cut the VAD false-alarm rate by twenty to thirty points in the conditions that actually break turn-taking. That is not a contradiction — it is two different consumers with two different requirements, and it is why the SDK emits two channels instead of picking a winner on your behalf.
Raw → your transcriberEnhanced → Onset
One machine, one recogniser, one test set.
Exactly which, and where that limits the conclusion.
| Recogniser | CTranslate2 int8 CPU, greedy, model=base.en |
|---|---|
| Voice activity | silero-vad · threshold 0.5 · 512-sample blocks |
| Test set | v1 · 10 speakers · 190 clips · 1485 s |
| Conditions | 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, Competing speaker 10 dB |
| Seed | 20260101 |
| Host | Apple M1 Max · macOS-26.5.2-arm64-arm-64bit |
| Runtime | onnxruntime 1.28.0 · 1 intra-op thread |
- 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.
- 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.
What is on the bench, and what you are allowed to ship.
Licence is a first-class column: the engine that comes closest cannot legally go into your product — the closest one you can ship is ours.
| Engine | Licence | Shippable | RTF | Latency | Pooled WER |
|---|---|---|---|---|---|
| Raw (no processing) | — | permitted | — | 0 ms | 14.32% |
| Passthrough (control) | — | permitted | 0.000 | 0 ms | 14.32% |
| ai-coustics Quail L | proprietary | benchmark only | 0.123 | 30 ms | 15.18% |
| anecho.ai_focus_model_16khz_v8_2 | proprietary — ours | permitted | 0.067 | 15 ms | 16.59% |
| ai-coustics Quail VF 2.2 L | proprietary | benchmark only | 0.075 | 30 ms | 17.59% |
| GTCRN | MIT | permitted | 0.050 | 16 ms | 20.14% |
| FastEnhancer-S | MIT | permitted | 0.034 | 16 ms | 20.33% |
| FastEnhancer-L | MIT | permitted | 0.377 | 26 ms | 20.36% |
| FastEnhancer-B | MIT | permitted | 0.021 | 16 ms | 20.64% |
| FastEnhancer-T | MIT | permitted | 0.013 | 16 ms | 21.66% |
| FastEnhancer-M | MIT | permitted | 0.110 | 22 ms | 22.13% |
| DeepFilterNet3 (96-frame warm-up) | MIT OR Apache-2.0 | permitted | 0.226 | 100 ms | 30.69% |
| DeepFilterNet3 | MIT OR Apache-2.0 | permitted | 0.133 | 100 ms | 34.04% |
What happens when the audio never leaves the phone line.
Wideband engines are measured here on narrowband input, which is what running one on a call actually requires.
Retracted · we used to say something else
We used to lead with a community report attributing a large fixed loss of every caller's audio to the default frame-processor resample pattern. Then we built the control, and our own measurement does not support it: 8→16→8 kHz with a deliberately broken sample-repeat resampler scores 150 dB SI-SDR against its input — at an exact 2:1 ratio it is algebraically the identity — while a correct polyphase resampler scores 38 dB, lower, because it actually filters. We are not making that claim any more.
If being the referee means anything, it means publishing the call that goes against you.
Live conversations: two recognisers, and the condition decides who leads.
200 constructed 30–60 s conversations — real voices and real rooms, mixed by us — each streamed whole through the engine with no reset inside it, then scored twice: by faster-whisper base.en, and by Gemini Live input transcription, the transcript a live Gemini voice agent produces of the caller.
With faster-whisper base.en: raw 37.82 %, v8_2 38.46 %, VF S 38.59 % WER pooled; v8_2 − VF S = −0.13 [−4.56, +4.47] pp (parity, CI spans 0); no engine beats raw on the pooled set.
With Gemini Live input transcription: raw 40.50 %, v8_2 36.40 %, VF S 42.87 % WER pooled; v8_2 − VF S = −6.47 [−9.89, −3.26] pp (v8_2 ahead); v8_2 beats raw on the pooled set. VF S still leads with a distant talker at −10 dB (+7.74 [+2.48, +12.77] pp).
On turn-taking the result goes against us: under Gemini Live input transcription, VF S triggers fewer false barge-ins — 52 against 125 for v8_2 and 97 for raw — and fewer false responses (37 / 56 / 49; v8_2 − VF S = +0.10 [+0.01, +0.18] per conversation). v8_2 triggers more false barge-ins than the unprocessed audio. VF S also holds the pauses quieter (17.4 dB of background suppression against 8.5 dB).
faster-whisper base.en
Offline, open-weights, the recogniser of the main matrix.
Near · background −10 dB
40 conv · 3,654 words · 1 word = 0.027 pp
| Engine | WER % | Ins % | Del % | Leak /100 |
|---|---|---|---|---|
| raw | 14.70 | 8.21 | 1.75 | 2.33 |
| v8_2 | 10.86 | 3.42 | 2.16 | 0.71 |
| ai-coustics Quail VF 2.2 S | 8.89 | 1.70 | 1.92 | 0.25 |
Near · background −5 dB
40 conv · 3,654 words · 1 word = 0.027 pp
| Engine | WER % | Ins % | Del % | Leak /100 |
|---|---|---|---|---|
| raw | 21.65 | 10.73 | 3.56 | 2.85 |
| v8_2 | 24.00 | 12.10 | 3.07 | 1.01 |
| ai-coustics Quail VF 2.2 S | 27.04 | 8.26 | 9.25 | 0.49 |
Near · background 0 dB
40 conv · 3,654 words · 1 word = 0.027 pp
| Engine | WER % | Ins % | Del % | Leak /100 |
|---|---|---|---|---|
| raw | 38.70 | 20.42 | 2.57 | 4.16 |
| v8_2 | 37.19 | 16.61 | 4.57 | 2.63 |
| ai-coustics Quail VF 2.2 S | 55.94 | 4.84 | 28.41 | 1.01 |
Near, pooled (3 conditions)
120 conv · 10,962 words · 1 word = 0.009 pp
| Engine | WER % | Ins % | Del % | Leak /100 |
|---|---|---|---|---|
| raw | 25.01 | 13.12 | 2.63 | 3.11 |
| v8_2 | 24.02 | 10.71 | 3.27 | 1.45 |
| ai-coustics Quail VF 2.2 S | 30.62 | 4.94 | 13.19 | 0.58 |
Room · background −10 dB
40 conv · 3,654 words · 1 word = 0.027 pp
| Engine | WER % | Ins % | Del % | Leak /100 |
|---|---|---|---|---|
| raw | 53.17 | 29.64 | 2.19 | 5.01 |
| v8_2 | 49.56 | 14.70 | 5.75 | 1.51 |
| ai-coustics Quail VF 2.2 S | 40.07 | 10.10 | 7.01 | 1.01 |
Room · background −5 dB
40 conv · 3,654 words · 1 word = 0.027 pp
| Engine | WER % | Ins % | Del % | Leak /100 |
|---|---|---|---|---|
| raw | 60.86 | 27.91 | 5.91 | 5.94 |
| v8_2 | 70.69 | 21.73 | 12.15 | 2.82 |
| ai-coustics Quail VF 2.2 S | 61.03 | 12.97 | 15.96 | 1.94 |
Room, pooled (2 conditions)
80 conv · 7,308 words · 1 word = 0.014 pp
| Engine | WER % | Ins % | Del % | Leak /100 |
|---|---|---|---|---|
| raw | 57.02 | 28.78 | 4.05 | 5.47 |
| v8_2 | 60.13 | 18.21 | 8.95 | 2.16 |
| ai-coustics Quail VF 2.2 S | 50.55 | 11.54 | 11.48 | 1.48 |
All, pooled (5 conditions)
200 conv · 18,270 words · 1 word = 0.005 pp
| Engine | WER % | Ins % | Del % | Leak /100 |
|---|---|---|---|---|
| raw | 37.82 | 19.38 | 3.20 | 4.06 |
| v8_2 | 38.46 | 13.71 | 5.54 | 1.74 |
| ai-coustics Quail VF 2.2 S | 38.59 | 7.58 | 12.51 | 0.94 |
| Condition | v8_2 − VF S | Reading | v8_2 − raw | VF S − raw |
|---|---|---|---|---|
| Near · background −10 dB | +1.97 [−0.54, +4.63] | parity (CI spans 0) | −3.83 [−7.47, −0.83] | −5.80 [−10.22, −2.01] |
| Near · background −5 dB | −3.04 [−19.48, +14.99] | parity (CI spans 0) | +2.35 [−5.92, +16.16] | +5.39 [−4.56, +19.71] |
| Near · background 0 dB | −18.75 [−27.75, −9.90] | v8_2 ahead | −1.51 [−9.31, +4.89] | +17.24 [+6.01, +27.97] |
| Near, pooled (3 conditions) | −6.60 [−13.36, −0.06] | v8_2 ahead | −0.99 [−5.24, +4.14] | +5.61 [±0.00, +11.76] |
| Room · background −10 dB | +9.50 [+4.31, +14.84] | VF S ahead | −3.61 [−17.42, +6.45] | −13.11 [−26.20, −4.22] |
| Room · background −5 dB | +9.66 [+3.07, +16.81] | VF S ahead | +9.82 [+3.09, +17.40] | +0.16 [−5.86, +6.02] |
| Room, pooled (2 conditions) | +9.58 [+5.52, +13.90] | VF S ahead | +3.11 [−4.55, +9.66] | −6.47 [−13.60, −0.71] |
| All, pooled (5 conditions) | −0.13 [−4.56, +4.47] | parity (CI spans 0) | +0.65 [−3.38, +4.73] | +0.78 [−3.60, +5.13] |
Gemini Live input transcription
The input transcription of a live voice agent: each output streamed (real time, 100 ms PCM16 frames) into a Gemini Live session, model gemini-live-2.5-flash-native-audio.
Near · background −10 dB
40 conv · 3,654 words · 1 word = 0.027 pp
| Engine | WER % | Ins % | Del % | Leak /100 |
|---|---|---|---|---|
| raw | 21.76 | 2.85 | 13.36 | 0.82 |
| v8_2 | 14.40 | 1.23 | 8.10 | 0.16 |
| ai-coustics Quail VF 2.2 S | 17.43 | 0.77 | 11.71 | 0.05 |
Near · background −5 dB
40 conv · 3,654 words · 1 word = 0.027 pp
| Engine | WER % | Ins % | Del % | Leak /100 |
|---|---|---|---|---|
| raw | 23.97 | 4.19 | 13.27 | 1.23 |
| v8_2 | 18.94 | 3.86 | 7.53 | 0.74 |
| ai-coustics Quail VF 2.2 S | 24.82 | 0.88 | 17.10 | 0.05 |
Near · background 0 dB
40 conv · 3,654 words · 1 word = 0.027 pp
| Engine | WER % | Ins % | Del % | Leak /100 |
|---|---|---|---|---|
| raw | 39.71 | 4.84 | 23.04 | 1.07 |
| v8_2 | 33.06 | 5.34 | 16.53 | 1.34 |
| ai-coustics Quail VF 2.2 S | 60.95 | 0.93 | 48.71 | 0.08 |
Near, pooled (3 conditions)
120 conv · 10,962 words · 1 word = 0.009 pp
| Engine | WER % | Ins % | Del % | Leak /100 |
|---|---|---|---|---|
| raw | 28.48 | 3.96 | 16.56 | 1.04 |
| v8_2 | 22.13 | 3.48 | 10.72 | 0.75 |
| ai-coustics Quail VF 2.2 S | 34.40 | 0.86 | 25.84 | 0.06 |
Room · background −10 dB
40 conv · 3,654 words · 1 word = 0.027 pp
| Engine | WER % | Ins % | Del % | Leak /100 |
|---|---|---|---|---|
| raw | 49.67 | 1.89 | 35.96 | 0.41 |
| v8_2 | 51.89 | 3.09 | 28.46 | 0.33 |
| ai-coustics Quail VF 2.2 S | 44.14 | 2.63 | 25.04 | 0.33 |
Room · background −5 dB
40 conv · 3,654 words · 1 word = 0.027 pp
| Engine | WER % | Ins % | Del % | Leak /100 |
|---|---|---|---|---|
| raw | 67.38 | 2.11 | 52.52 | 0.47 |
| v8_2 | 63.71 | 4.76 | 38.15 | 0.57 |
| ai-coustics Quail VF 2.2 S | 67.00 | 2.52 | 44.25 | 0.30 |
Room, pooled (2 conditions)
80 conv · 7,308 words · 1 word = 0.014 pp
| Engine | WER % | Ins % | Del % | Leak /100 |
|---|---|---|---|---|
| raw | 58.52 | 2.00 | 44.24 | 0.44 |
| v8_2 | 57.80 | 3.93 | 33.31 | 0.45 |
| ai-coustics Quail VF 2.2 S | 55.57 | 2.57 | 34.65 | 0.31 |
All, pooled (5 conditions)
200 conv · 18,270 words · 1 word = 0.005 pp
| Engine | WER % | Ins % | Del % | Leak /100 |
|---|---|---|---|---|
| raw | 40.50 | 3.17 | 27.63 | 0.80 |
| v8_2 | 36.40 | 3.66 | 19.75 | 0.63 |
| ai-coustics Quail VF 2.2 S | 42.87 | 1.54 | 29.37 | 0.16 |
| Condition | v8_2 − VF S | Reading | v8_2 − raw | VF S − raw |
|---|---|---|---|---|
| Near · background −10 dB | −3.04 [−10.83, +5.06] | parity (CI spans 0) | −7.36 [−11.99, −3.02] | −4.32 [−12.81, +3.82] |
| Near · background −5 dB | −5.88 [−11.15, −1.18] | v8_2 ahead | −5.04 [−9.82, −0.61] | +0.85 [−5.37, +7.43] |
| Near · background 0 dB | −27.89 [−35.80, −19.85] | v8_2 ahead | −6.65 [−11.20, −2.00] | +21.24 [+14.22, +28.70] |
| Near, pooled (3 conditions) | −12.27 [−16.84, −7.91] | v8_2 ahead | −6.35 [−9.11, −3.74] | +5.92 [+1.47, +10.57] |
| Room · background −10 dB | +7.74 [+2.48, +12.77] | VF S ahead | +2.22 [−2.62, +7.30] | −5.53 [−11.51, +0.06] |
| Room · background −5 dB | −3.28 [−8.07, +1.40] | parity (CI spans 0) | −3.67 [−8.01, +0.83] | −0.38 [−4.72, +3.89] |
| Room, pooled (2 conditions) | +2.23 [−1.64, +6.08] | parity (CI spans 0) | −0.73 [−4.04, +2.72] | −2.96 [−6.62, +0.63] |
| All, pooled (5 conditions) | −6.47 [−9.89, −3.26] | v8_2 ahead | −4.10 [−6.28, −1.98] | +2.37 [−0.92, +5.54] |
WER, insertions and deletions as % of reference words. Leak: inserted words that also occur in the transcribed background talker's text (stop-words excluded, count-capped), per 100 reference words; untranscribed MUSAN talkers cannot be attributed, so this is a lower bound. CIs: paired bootstrap over conversations, 95 %. Negative means fewer errors for the first engine named; a difference whose interval spans zero is read as parity, never as a win.
| Condition | raw: responses / false · barge-ins / false | v8_2: responses / false · barge-ins / false | VF S: responses / false · barge-ins / false |
|---|---|---|---|
| Near · background −10 dB | 197 / 8 · 215 / 19 | 210 / 8 · 214 / 24 | 202 / 7 · 198 / 1 |
| Near · background −5 dB | 208 / 12 · 228 / 23 | 191 / 11 · 229 / 29 | 204 / 4 · 204 / 7 |
| Near · background 0 dB | 207 / 14 · 218 / 19 | 185 / 10 · 218 / 22 | 171 / 11 · 156 / 11 |
| Near, pooled (3 conditions) | 612 / 34 · 661 / 61 | 586 / 29 · 661 / 75 | 577 / 22 · 558 / 19 |
| Room · background −10 dB | 206 / 8 · 161 / 21 | 217 / 13 · 203 / 28 | 212 / 5 · 198 / 12 |
| Room · background −5 dB | 158 / 7 · 117 / 15 | 198 / 14 · 174 / 22 | 181 / 10 · 167 / 21 |
| Room, pooled (2 conditions) | 364 / 15 · 278 / 36 | 415 / 27 · 377 / 50 | 393 / 15 · 365 / 33 |
| All, pooled (5 conditions) | 976 / 49 · 939 / 97 | 1001 / 56 · 1038 / 125 | 970 / 37 · 923 / 52 |
| False responses / conversation | v8_2 − VF S | v8_2 − raw | VF S − raw |
|---|---|---|---|
| Near · background −10 dB | +0.03 [−0.12, +0.17] | ±0.00 [−0.15, +0.12] | −0.03 [−0.17, +0.15] |
| Near · background −5 dB | +0.17 [−0.03, +0.38] | −0.03 [−0.17, +0.15] | −0.20 [−0.40, ±0.00] |
| Near · background 0 dB | −0.03 [−0.17, +0.12] | −0.10 [−0.30, +0.07] | −0.07 [−0.25, +0.10] |
| Near, pooled (3 conditions) | +0.06 [−0.05, +0.16] | −0.04 [−0.13, +0.05] | −0.10 [−0.21, +0.01] |
| Room · background −10 dB | +0.20 [±0.00, +0.40] | +0.12 [−0.07, +0.33] | −0.07 [−0.23, +0.07] |
| Room · background −5 dB | +0.10 [−0.12, +0.30] | +0.17 [±0.00, +0.35] | +0.07 [−0.12, +0.28] |
| Room, pooled (2 conditions) | +0.15 [±0.00, +0.30] | +0.15 [+0.01, +0.29] | ±0.00 [−0.12, +0.12] |
| All, pooled (5 conditions) | +0.10 [+0.01, +0.18] | +0.04 [−0.04, +0.12] | −0.06 [−0.14, +0.02] |
- False response: the agent started a reply with no target speech in the previous 3 s.
- False barge-in: Gemini Live reported `interrupted` with no target speech in the previous 1.5 s.
- Counts are totals over the conversations in each row. Only false responses carry a paired CI in the report; the barge-in counts are reported as counts.
| Condition | Supp. v8_2 | Supp. VF S | SI-SDR raw | SI-SDR v8_2 | SI-SDR VF S | Onset v8_2 | Onset VF S |
|---|---|---|---|---|---|---|---|
| Near · background −10 dB | 10.6 dB | 30.1 dB | 12.06 | 14.50 | 8.87 | −11.36 dB | −22.82 dB |
| Near · background −5 dB | 7.7 dB | 23.7 dB | 7.18 | 10.84 | 6.38 | −13.14 dB | −24.84 dB |
| Near · background 0 dB | 6.9 dB | 11.6 dB | 2.22 | 6.74 | -0.24 | −13.60 dB | −21.09 dB |
| Near, pooled (3 conditions) | 8.4 dB | 21.8 dB | 7.15 | 10.69 | 5.00 | −12.70 dB | −22.92 dB |
| Room · background −10 dB | 9.7 dB | 14.1 dB | 3.37 | 3.38 | 3.21 | −16.04 dB | −23.17 dB |
| Room · background −5 dB | 7.6 dB | 7.5 dB | 1.60 | 1.99 | 1.35 | −16.26 dB | −23.23 dB |
| Room, pooled (2 conditions) | 8.7 dB | 10.8 dB | 2.48 | 2.69 | 2.28 | −16.15 dB | −23.20 dB |
| All, pooled (5 conditions) | 8.5 dB | 17.4 dB | 5.29 | 7.49 | 3.91 | −14.08 dB | −23.03 dB |
- Supp.: raw minus output level on background-voice-alone segments inside the target's pauses (dB, mean over conversations).
- SI-SDR: SI-SDR on target-active frames (mean dB); higher means less damage to the target.
- Onset: energy change in the first 200 ms of the target's speech after a pause, relative to the rest of that run (dB; negative = onset attenuated).
The trade in one line: VF S silences more — 17.4 dB against 8.5 dB in the pauses — and pays for it at the target’s first syllable after a pause (−23.03 dB against −14.08 dB) and in target fidelity (SI-SDR 3.91 against 7.49; raw 5.29). Both engines attenuate onsets; neither is free.
- Constructed, not recorded end to end. Digitally constructed from real recordings: real voices and real measured rooms, mixed by us. Not recorded end to end. 40 conversation scripts, each mixed under 5 conditions = 200 conversations, 30.4–59.8 s each, seed 20261021.
- Target: one LibriSpeech test-clean speaker per script, 4–8 consecutive utterances of one chapter with natural pauses (0.3–2.5 s) and at least one 3–6 s listening gap.
- Background: 1–3 other real talkers (LibriSpeech dev-clean, MUSAN speech) who come and go with their own pauses, placed through measured BUT ReverbDB room responses at 1–4 m; in half of the scripts, intermittent real ambience (DEMAND, MUSAN noise) at -20 dB re the target.
- Conditions: near — close-mic target (headset / phone), background talkers at −10, −5, 0 dB; room — target through a measured response at 0.5–1.5 m, background at −10, −5 dB.
- Streaming: each conversation runs whole through the engine with no reset inside it; engines reset between conversations; output is delay-compensated by each engine’s declared latency (v8_2 15 ms, VF S 30 ms).
- ai-coustics Quail VF 2.2 S: licensed SDK at its native 16 kHz, SDK default enhancement level (0.8). Benchmark only, never a code path.
- Scoring: faster-whisper base.en on the whole conversation, and Gemini Live input transcription with each output streamed in real time into a live session; both against the target’s transcript; paired bootstrap over conversations, 95 %.
- The mixes are digitally constructed from real recordings. They are not recorded end to end, and a real call adds things a mix does not: codecs, AGC, the talker reacting to the room.
- Two recognisers, two answers: faster-whisper base.en reads the pooled set as parity, Gemini Live input transcription as a v8_2 lead. Neither is the truth for your stack; your own recogniser decides.
- 40 target speakers, one script each; the five conditions re-mix the same scripts, so they are not independent samples.
- Raw WER is high by design (overlapping talkers). Insertions dominate raw; the engines trade insertions for deletions, and the pooled totals hide which error you get.
- Leak counts only words attributable to the transcribed background talker — a lower bound.
- ai-coustics Quail VF 2.2 S ran at one setting, the SDK default; another enhancement level would move its trade between suppression and deletions.
Ignore pooled claims. Including any we might publish.
A pooled number is a property of the condition mix as much as of the engine, and no vendor shares a mix. Judge on your own voice.
The complete results: one JSON document at a stable, versioned URL, CC-BY-4.0./data/nulltest/v1/results.json
The harness is private because it embeds a licensed competitor SDK. Think a row is wrong, or your engine belongs on the bench? Write to [email protected] — we run it and publish the row, whichever way it lands.
- The control is a row
- Unprocessed audio is the first row of every table and every ΔWER is measured against it — here the null hypothesis won.
- The same code scores everyone
- One scoring path, nothing special-cased, and the result is published even when it reads “nothing won”.
- Pooled and per-condition are reported separately
- Both are published and neither may stand in for the other, whichever makes the better headline.
- Error decomposition, not just a total
- Substitutions, insertions and deletions are reported separately — inserted chatter and a dropped “not” are different failures.
- A one-word difference is not a result
- Any delta inside a single reference word is reported as a number and described as noise, never as a win.
- Cost is reported next to accuracy
- Real-time factor and latency sit in the same table as WER; an engine that misses the frame deadline has not won.
- The proprietary baseline never ships
- ai-coustics rows are a licensed measuring stick, never a code path in anything we sell.