~/satyajit

Projecting out Whisper's hallucinations: abliteration, in reverse

mdjsonmcp

2026-09-08 · 20 min · whisper · asr · speech · interpretability · activation-steering · inference-time · explainer

Point a microphone at a rooster and Whisper large-v3 transcribes "i'm the best." Point it at a car horn and it writes "the train is coming up." Feed it a jackhammer and it writes "thank you." None of these clips contain speech. Abbasihafshejani and Jadliwala's paper, "Reducing Hallucinated Transcripts in Whisper via Hallucination Space Projection," fixes this without touching a single weight: it estimates a low-rank direction in Whisper's decoder activations from non-speech calibration audio, and subtracts it out at inference. Averaged across three model scales and three non-speech benchmarks, hallucination rate falls from 31.31% to 2.44%.

That is the same move this site covered in an abliterated GLM-5.3-Flash release: find a contrastive direction in activation space, project it out. Arditi et al.'s result was that a single direction mediates refusal in chat models, and ablating it turns off a safeguard. This paper runs the identical technique — estimate a subspace from paired contrastive activations, subtract it at inference, no gradient step anywhere — to turn off a failure mode instead. Same math, opposite target, and the same question follows it into a new domain: what does the model give up when you edit it this way?

Why this happens

Whisper (Radford et al., 2022) is a single auto-regressive decoder doing two jobs at once: generating transcript tokens, and estimating a no_speech_prob — the probability mass Whisper's own decoder assigns to a special <|nospeech|> token. The official implementation's decision rule is simple: if no_speech_prob clears a threshold τ\tau (0.6 by default), discard whatever text got generated and return an empty transcript. The problem is that generation and rejection are two different computations sharing one decoder, and nothing forces them to agree. The decoder can assign high probability to a fluent token sequence — an acknowledgment, a subtitle-style sign-off, a repeated word — even when no_speech_prob never gets close to τ\tau.

Koenecke et al. (2024) found that roughly 1% of Whisper transcriptions overall contain unsupported content, over a third of it potentially harmful or misleading. Baranski et al. (2025) measured the non-speech case directly and found Whisper large-v3 emits non-empty text for 40.3% of pure non-speech inputs — acknowledgments, applause markers, animal-sound onomatopoeia, subtitle endings. A few of their examples, reproduced here exactly as Whisper transcribed them:

SourceAudio eventWhisper transcript
ESC-50rooster"i'm the best"
ESC-50car horn"the train is coming up"
UrbanSound8Kjackhammer"thank you"
UrbanSound8Kengine idling"so"
FSD50Kdog barking"dog, dog, dog, dog, dog"
FSD50Kfrying"you"

Table 4 from the paper — representative hallucinated transcripts on non-speech audio.

Existing fixes intervene somewhere else in the pipeline: an external voice-activity detector removes non-speech regions before Whisper ever sees them (WhisperX); a phrase-list filter removes known-bad strings after decoding (Bag of Hallucinations); a fine-tune recalibrates the decoder's "crazy heads" on non-speech examples with empty targets (Calm-Whisper). This paper's move is different in kind: reach directly into the decoder's own hidden states, mid-generation, and remove the direction that produces the hallucinated text — before a single token commits.

The method: find a subspace, subtract it

The estimation step (Section 3.1–3.2) needs paired contrastive data: non-speech clips where Whisper hallucinates, and non-speech clips where it correctly stays silent. Run unprojected Whisper over a calibration set, sort by whether it hallucinated, and collect decoder hidden states at a chosen layer \ell from both groups:

H={hi,hall}i=1Nh,F={hj,empty}j=1NfH_{\ell} = \{h^{\mathrm{hall}}_{i,\ell}\}_{i=1}^{N_h}, \qquad F_{\ell} = \{h^{\mathrm{empty}}_{j,\ell}\}_{j=1}^{N_f}

Both groups are non-speech audio, so subtracting them cancels out whatever "this is a non-speech clip" looks like in activation space and isolates what's left over: the direction specific to hallucinating on non-speech rather than correctly rejecting it. Pair them up (n=min(Nh,Nf)n = \min(N_h, N_f)) and stack the differences into a matrix:

Δ=[(h1,hallh1,empty)(hn,hallhn,empty)]Rn×d\Delta_{\ell} = \begin{bmatrix} (h^{\mathrm{hall}}_{1,\ell} - h^{\mathrm{empty}}_{1,\ell})^{\top} \\ \vdots \\ (h^{\mathrm{hall}}_{n,\ell} - h^{\mathrm{empty}}_{n,\ell})^{\top} \end{bmatrix} \in \mathbb{R}^{n \times d}

Take the SVD, Δ=UΣV\Delta_{\ell} = U_{\ell}\Sigma_{\ell}V_{\ell}^{\top}, and keep the top rr right singular vectors as a row-orthonormal basis B,r=V,1:rRr×dB_{\ell,r} = V_{\ell,1:r}^{\top} \in \mathbb{R}^{r \times d} — this is ordinary PCA on the difference vectors, the same construction Arditi et al. use for a rank-1 refusal direction, generalized to rank rr. At inference, every decoder hidden state at layer \ell gets the component along that basis removed:

h~=hα(hB,r)B,r\tilde{h}_{\ell} = h_{\ell} - \alpha \, (h_{\ell} B_{\ell,r}^{\top}) \, B_{\ell,r}

α\alpha scales how much of that component comes out; α=1\alpha=1 removes it completely, in the direction B,rB_{\ell,r} spans. Drag it below and watch what happens to a decoder state on either side of that subspace:

projecting a decoder state away from the hallucination subspace · Eq. 1, Algorithm 1illustrative geometry, real parameters
hallucination-subspace direction (r=4, one shown)everything elseremoved: α·(h·b) = 6.60h
model
example
mode
α = 1.00
config
ℓ=28, r=4, γ=0.05
p_ns_base (this example)
0.82
gate p_ns_base ≥ γ?
open (0.82 ≥ 0.05)
effective α · removed
1.00 · 6.60

Eq. 1 is exactly the arrow math above: h̃ = h − α(hB)B removes only the component of a decoder state that lies along the estimated hallucination basis B, leaving the rest untouched. In gated mode that subtraction only happens when Whisper’s own unprojected no-speech probability already clears the model’s threshold γ — switch the example to “genuine speech” and, for every model here, the gate stays closed and h̃ = h exactly, which is the entire reason gated projection costs so much less WER than always-on. Switch to “always” mode and the same speech example gets projected anyway, whether or not it needed it.

Applying this to every input is the always-on variant, and it works — but it also edits decoder states for genuine speech that never needed it. So the paper gates the intervention on Whisper's own judgment: run one pass unprojected, read off no_speech_prob, and only apply Eq. 1 if that probability already clears a (lower, separate) gate threshold γ\gamma. If the gate doesn't fire, decoding proceeds unmodified. If it does, Whisper decodes a second time with the projection active, and that run's no_speech_prob is what gets compared against τ\tau for the final accept/reject call:

Algorithm 1 — Gated Low-Rank Decoder Projection
Input: model M, audio x, layer ℓ, basis B, strength α, gate γ, threshold τ
 
1. y_base, p_base ← M(x)                     # one unprojected pass
2. if p_base ≥ γ:
3.     attach projection hook at layer ℓ
4.     y, p ← M(x) with h'_ℓ = h_ℓ − α(h_ℓ B^T)B during decoding
5. else:
6.     y, p ← y_base, p_base                 # unchanged
7. return "" if p > τ else y

Two thresholds, two jobs: γ\gamma decides whether the decoder gets edited at all; τ\tau — Whisper's own, unchanged, default 0.6 — decides whether the (possibly edited) result gets kept. This is worth sitting with, because it explains the gate's entire value proposition, which Figure 3 of the paper shows directly:

Two histograms comparing Whisper's no-speech probability before and after gated projection, on non-speech audio (ESC-50) and on real speech (LibriSpeech test-clean), with a dashed line marking the 0.6 rejection threshold. On non-speech audio, the fraction of examples above threshold jumps from 21.8% to 96.3%. On real speech, it moves only from 0.0% to 2.9%.
No-speech probability before and after gated projection, on non-speech audio (left) versus real speech (right); dashed line marks τ=0.6 (paper, Figure 3).

The non-speech distribution shifts hard to the right of τ\tau — projection is doing exactly what it's supposed to. The speech distribution barely moves, because for real speech the gate mostly never fires in the first place: no_speech_prob starts near zero, stays under γ\gamma, and the projection hook never attaches. That's the mechanism behind gated projection's WER advantage over always-on, made concrete in a histogram rather than asserted.

Calibration: what it costs to build the subspace

The entire subspace comes from ESC-50 folds 1–3 — 1,200 environmental audio clips, a small, standard, freely downloadable benchmark. No paired human transcription is needed beyond what Whisper itself produces: run unprojected inference, split by hallucinated-vs-empty, take the SVD. No gradient computation anywhere in the pipeline. LibriSpeech validation-clean (2,703 clips) is used alongside it, but only to select (,r,α,γ)(\ell, r, \alpha, \gamma) by checking that a candidate setting doesn't wreck WER on real speech — it plays no role in defining the subspace itself.

The generalization result is the part worth taking seriously: a subspace built entirely from ESC-50 folds 1–3 is then evaluated, unchanged, on held-out ESC-50 folds 4–5, on UrbanSound8K (8,732 clips the subspace never saw), and on a filtered non-speech subset of FSD50K (8,621 clips). It transfers. That's evidence the projection is picking up a reusable decoder-level signature of "about to hallucinate" rather than overfitting to ESC-50's specific acoustic palette — though the paper is careful to flag, in its own limitations section, that broader calibration-to-deployment shifts (different domains entirely) remain untested.

The headline number, unpacked

Table 1 reports hallucination rate on the three non-speech test sets, at Whisper's default τ=0.6\tau=0.6, across all three model scales:

ModelMethodESC-50UrbanSound8KFSD50K
SmallOriginal23.5012.3321.35
SmallAlways-on1.500.816.68
SmallGated1.530.846.84
MediumOriginal26.5014.5241.95
MediumAlways-on1.820.628.02
MediumGated2.750.668.78
Large-v3Original44.2576.0821.35
Large-v3Always-on1.500.870.18
Large-v3Gated8.382.741.15

Table 1 — non-speech hallucination rate (%), τ=0.6.

The abstract's 31.31% and 2.44% are the mean of all nine Original cells and all nine Always-on cells in this table — not one dataset, not one model, the full 3×3 grid. It's a reasonable way to headline the result, but it also means the number papers over real spread: original hallucination rate on UrbanSound8K alone runs as high as 76.08% for large-v3, while FSD50K sits at 21.35%, a 3.5x gap in how bad the underlying problem is before any intervention runs. The gated column has its own oddity worth flagging directly — large-v3's gated hallucination rate (8.38% on ESC-50) is worse than both small's (1.53%) and medium's (2.75%), even though large-v3 uses the lowest gate threshold (γ=0.05\gamma=0.05, meaning it should fire the most often of the three). The paper doesn't explain this reversal, and neither can this article from the outside — it's a real data point that "bigger model, lower threshold" doesn't straightforwardly mean "more suppression," sitting right there in the paper's own table.

The honest core: what gated projection costs

Non-speech hallucination rate is the number that gets headlined. LibriSpeech word error rate is where the bill comes due — this is the paper's own honesty test, run on real speech with real reference transcripts, and it's the number to hold onto:

ModelMethodtest-clean WERtest-other WER
SmallOriginal4.048.38
SmallAlways-on4.5111.48
SmallGated4.379.13
MediumOriginal3.667.29
MediumAlways-on6.4015.06
MediumGated5.4711.68
Large-v3Original4.065.87
Large-v3Always-on12.9513.13
Large-v3Gated6.176.57

Table 2 — LibriSpeech WER (%).

ModelMethodtest-clean FRRtest-other FRR
SmallOriginal0.000.00
SmallAlways-on0.644.86
SmallGated0.412.58
MediumOriginal0.030.27
MediumAlways-on5.6816.87
MediumGated4.079.97
Large-v3Original0.040.00
Large-v3Always-on10.5011.47
Large-v3Gated2.861.40

Table 3 — LibriSpeech speech false-rejection rate (%): genuine speech incorrectly filtered as non-speech.

Subtract original from gated on each row and you get exactly the abstract's range: +0.33 points for small on test-clean, up to +4.39 points for medium on test-other. Nothing about rank, layer, or gate threshold changes within that range — it's produced entirely by which model scale and which split you happen to evaluate on, which is the kind of thing a single headline number cannot show and a table has to. Play with both axes below:

hallucination reduction vs. WER cost · Tables 1-3
0123450246810LibriSpeech WER cost vs. original Whisper (percentage points)avg. non-speech hallucination rate (%)Δ 0.334.39 ptssmallcleanothermediumlarge-v3
model
config
ℓ=24, r=2, α=0.75, γ=0.1
HR: original → gated
27.7% → 4.06%
WER cost (clean / other)
+1.81 / +4.39 pts
speech FRR (clean / other)
4.07% / 9.97%

This is the paper’s recommended deployment setting — each scale at its own tuned (ℓ, r, α, γ) from Section 5.1. Every point sits under 5% average hallucination rate, down from originals between 19% and 47% (off this chart’s scale). Now look at the horizontal spread of each row: for one fixed operating point, the WER cost still swings just from choosing test-clean over test-other — and across scales the two ends of that swing are +0.33 pts (small, test-clean) and +4.39 pts (medium, test-other), the paper’s own abstract range of “0.33–4.39 percentage points.” No single rank, layer, or threshold explains that 13x span — model scale and test split do.

Rank and layer: why bigger models needed a wider subspace

The paper doesn't fix rank in advance — Figure 1 sweeps decoder layer \ell against rank rr on the development split, holding α=1\alpha=1 and no gating, before any gate parameters get chosen at all:

Two heatmaps for Whisper large-v3: hallucination rate and LibriSpeech WER across a grid of decoder layer (rows, 4 through 31) by projection rank (columns, 1, 2, 4, 8). The selected setting, layer 28 and rank 4, achieves 1.1% hallucination rate and 3.94% WER, highlighted; several deeper, higher-rank cells are flagged for WER exceeding baseline by more than half a point.
Offline selection of decoder layer ℓ and projection rank r for Whisper large-v3 — hallucination rate (left) and LibriSpeech validation WER (right); the selected setting (ℓ=28, r=4) is boxed (paper, Figure 1).

Two things fall out of this grid. First, depth matters far more than width: early layers (4, 8, 12) barely move hallucination rate no matter the rank, while the effective range sits in the middle-to-late layers — a pattern echoed in Whisper small and medium's own sweeps (Appendix C). Second, rank saturates instead of scaling smoothly — going from r=1r=1 to r=8r=8 doesn't monotonically improve hallucination rate, and past a point it actively hurts WER, which is exactly what "unnecessary removal of speech-relevant information" looks like in a heatmap. The three final selected configurations end up small and different across scales:

ModelLayer \ellRank rrα\alphaGate γ\gamma
Small1011.000.15
Medium2420.750.10
Large-v32841.000.05

Rank climbs from 1 to 4 as the model gets bigger — the same open question this site raised about GLM-5.3-Flash-Uncensored's residual refusal, inverted. There, an 11–18% residual refusal rate after single-direction ablation raised the question of whether refusal is really mediated by one direction in every architecture, or whether some models need more. Here the paper answers that question empirically, for hallucination rather than refusal: Whisper-small's failure mode collapses onto a single dominant direction (r=1r=1 is already enough), but large-v3 needed four — a genuinely low-rank subspace either way, nothing close to a general-purpose edit, but not a single line either.

Two more ablations worth the honest read

Section 5.1's development-set search picked τ=0.6\tau=0.6 (Whisper's own unmodified default) without re-tuning it for the projected model. Appendix D.1 checks whether that default is still right once projection changes the underlying probability distribution, sweeping τ\tau against gated projection on Whisper-medium (fixed at =24,r=2,γ=0.10\ell=24, r=2, \gamma=0.10, but with α=1.0\alpha=1.0 here rather than medium's main-text setting of 0.75 — the paper's own ablation, not this article's substitution):

τ\tauMethodAvg. HRAvg. WERAvg. FRR
0.4Original13.085.770.80
0.4+Projection2.8911.4910.91
0.5Original20.425.540.35
0.5+Projection3.789.909.01
0.6Original29.495.480.14
0.6+Projection5.098.587.03
0.7Original42.755.460.09
0.7+Projection7.857.284.76

Table 5 — no-speech threshold ablation, Whisper-medium.

The default holds up as the best balance point — pushing τ\tau down to 0.4 buys hallucination rate down to 2.89% but pushes WER past 11% and FRR past 10%; pushing it up to 0.7 recovers WER and FRR but lets hallucination rate climb back to 7.85%. Worth reading the Original rows on their own, too: raising τ\tau from 0.4 to 0.7 with no projection at all barely moves WER (5.77% → 5.46%) while hallucination rate nearly quadruples (13.08% → 42.75%) — threshold tuning by itself is a blunt, mostly-useless instrument here, which is the paper's own justification for doing something at the activation level instead.

Appendix D.2 asks whether stacking two projected layers helps, applying (=20,r=4,α=0.5)(\ell=20, r=4, \alpha=0.5) and (=24,r=2,α=1.0)(\ell=24, r=2, \alpha=1.0) together, gated at γ=0.10\gamma=0.10:

MethodESC-50 HRUS8K HRFSD50K HRclean WERother WERclean FRRother FRR
Original26.5014.5241.953.677.300.030.27
Single-layer2.750.668.785.4811.684.079.97
Multi-layer0.130.074.8710.6215.7111.0713.75

Table 6 — multi-layer projection ablation, Whisper-medium.

Stacking layers pushes hallucination rate down further on every non-speech set (ESC-50 goes from 2.75% to 0.13%), and roughly doubles WER and FRR on both LibriSpeech splits at the same time. This is the same trade-off surface the whole method lives on, at a different operating point — more suppression is available, it just keeps costing the same currency. The paper keeps single-layer gated projection as its recommendation for exactly this reason.

What a stock external VAD already buys

Section 5.4 compares against training-free baselines that don't touch the decoder at all: WhisperX's external voice-activity detector filtering audio before it reaches Whisper, and a reimplementation of Barański et al.'s Bag-of-Hallucinations phrase filter (no public BoH implementation exists, so the paper built one from ESC-50's own frequent hallucinated phrases — "thank you," "the end," "meow meow," eleven phrases in Appendix E). All numbers below are Whisper large-v3, averaged over the same three non-speech sets as Table 1:

Grouped bar chart comparing hallucination rate across five methods (Original Whisper, Bag-of-Hallucinations phrase filter, WhisperX external VAD, gated projection, always-on projection) on ESC-50, UrbanSound8K, FSD50K, and their average. Original and BoH sit far above the other three methods on every dataset; WhisperX, gated, and always-on all cluster under 9%, with always-on lowest throughout.
Baseline comparison on non-speech datasets — hallucination rate by method, Whisper large-v3 (paper, Figure 4).
MethodESC-50UrbanSound8KFSD50KAverage HR
Original Whisper44.2576.0821.3547.23
BoH phrase filter38.7575.4118.1144.09
WhisperX (external VAD)4.133.058.555.24
Gated projection8.382.741.154.09
Always-on projection1.500.870.180.85

Phrase filtering barely dents the problem — it can only remove hallucinations that match a phrase already seen in its calibration list, and most of Whisper's non-speech vocabulary isn't that repetitive. The real tension is between the other two: gated projection's average hallucination rate (4.09%) actually beats WhisperX's (5.24%) — a stronger result than a purely training-free VAD pipeline, and one that needs no external model. But turn to speech quality and the ranking flips hard. At τ=0.5\tau=0.5, WhisperX reaches 2.67% / 4.74% WER on LibriSpeech test-clean/test-other with 0% FRR on both — genuinely better than Whisper's own unprojected baseline (4.15% / 5.87%), because removing non-speech regions before decoding gives the model cleaner context to work with. Gated projection's cost at that same operating region is 6.17% / 6.57% WER with real false rejection (2.86% / 1.40%). An external VAD is a dependency the projection method avoids; it also, on this paper's own numbers, costs almost nothing where projection costs several points of WER.

One more comparison point, transcribed rather than re-run: Calm-Whisper (Wang et al., 2025), a fine-tuning-based mitigation, reports 15.51% hallucination rate on UrbanSound8K — worse than either projection variant here (2.74% gated, 0.87% always-on) — but LibriSpeech WER of just 2.19% / 4.13%, well under gated projection's 6.17% / 6.57%. No public Calm-Whisper checkpoint exists, so the paper doesn't re-run it in its own pipeline, and this article can't either — but the shape of the comparison is legible from the paper's own reported numbers alone: a method willing to update weights buys a cheaper WER trade than one that only edits activations, at the price of weaker suppression and an actual training run.

Same math, opposite target

Return to where this piece started. Arditi et al. found that refusal in open chat models concentrates along a direction identifiable from a small contrastive prompt set, and that ablating it turns off the safeguard almost entirely. This paper's related-work section names its own closest precedent directly: Nullu (Yang et al., 2025), which projects vision-language activations out of a "HalluSpace" to suppress object hallucination — this paper's title borrows the construction and moves it to speech. All three do the identical thing mathematically: collect paired contrastive activations, take an SVD (or, in Arditi's case, the rank-1 special case of the same idea), and subtract the resulting subspace from live activations at inference. No weights change. No gradient step runs.

What differs is only what gets removed and what breaks when you remove it. Arditi's ablation is applied to a safety behavior — the cost, when the ablation is too aggressive or too narrow, is measured in how much harmful content gets through, or in this site's own read on a specific release, in an 11–18% residual refusal rate that a single direction didn't fully explain. This paper's projection is applied to a reliability behavior — the cost is measured in WER and FRR on the model's actual job. Both papers describe their method as offering a "controllable trade-off," and both are right to. But they're not the same trade: a hallucination-suppression method that costs WER is failing at the thing Whisper is for, in a way that's directly measurable on every speech benchmark that exists. A refusal-suppression method that fails is failing at something layered on top of the model's core competence — harder to measure, easier to hand-wave. Reading these two papers side by side is a reminder that "we found a subspace and projected it out" is a description of a mechanism, not a verdict on whether doing so was a good idea. That verdict depends entirely on what sat in the subspace.

What isn't shown

The paper's own limitations section is unusually direct, and worth repeating rather than softening. The method is scoped to one specific failure mode — a non-speech input producing a non-empty transcript — and explicitly does not address hallucination in long-form transcription, multilingual audio, or acoustically ambiguous speech-adjacent inputs, where hallucination looks different and this subspace was never estimated to catch it. The gated variant still increases WER and FRR at every tested operating point; it reduces always-on's damage, it doesn't eliminate the trade-off. The subspace transfers from ESC-50 to two other benchmarks, but broader calibration-to-deployment domain shifts (a call-center corpus, a different language, a different microphone chain) remain untested. And the gate itself leans on Whisper's own no_speech_prob being a trustworthy signal in the first place — for the identical reason Whisper hallucinates in the first place, that estimate is not independent of the same decoder doing the generating.

None of that erases the headline result. A rank-1-to-4 subspace, estimated once from 1,200 clips of a public dataset with no gradient step, cuts non-speech hallucination by a factor of roughly ten to fifty depending on model scale and dataset — that holds up. It just isn't free, the paper says so in its own tables, and a method's honesty about its own cost is worth exactly as much attention as its headline.


Related on this site: GLM-5.3-Flash-Uncensored for the abliteration side of this exact technique, including the residual-refusal question this piece answers from the other direction; speech-to-speech for a voice pipeline built around the external-VAD approach this paper benchmarks against; and Audex for a different bet on ASR reliability — bolting speech onto a strong text decoder rather than editing an existing one's activations.

Cite this article

For attribution, please use the following reference or BibTeX:

Satyajit Ghana, "Projecting out Whisper's hallucinations: abliteration, in reverse", ai.thesatyajit.com, September 2026.

bibtex
@misc{ghana2026whisperhallucinationprojection,
  author = {Satyajit Ghana},
  title  = {Projecting out Whisper's hallucinations: abliteration, in reverse},
  url    = {https://ai.thesatyajit.com/articles/whisper-hallucination-projection},
  year   = {2026}
}
share