Does adding the agent's own audio
as context really help?
A short study on acoustic fusion for Hindi/English ASR — what works, what collapses.
"Understanding the question is half the answer."
— Socrates
The Problem
Accurate speech recognition is the foundation every real-time conversation system rests on. In voice-driven customer support — where millions of calls are handled daily — the entire downstream pipeline depends on one thing: getting the user's words right. A wrong transcript misdirects the bot. An empty one stops it entirely.
The hardest segment to get right is also the most common one. In conversational settings, the majority of user turns are short — a confirmation, a number, a name, a one-word answer. These utterances are rarely clean. They arrive over compressed phone channels, against background chatter, at varying distances from the microphone, and often mid-breath. The acoustic signal carries very little redundancy. A fraction of a second of noise can overwhelm the entire phonemic content of the response.
The ASR has to decide, frame by frame, which vocabulary to emit from — and with a short, noisy signal, there is often not enough evidence to make that decision confidently. Acoustic fusion proposes a direct fix: prepend the agent's audio to the user's audio. Let the model hear the question before it decodes the answer. The intuition is sound. The implementation is where it gets interesting.
How Acoustic Fusion Works
The base model is a standard encoder–decoder ASR system. In standard inference, only the user's audio enters the encoder. In fusion mode, we concatenate the agent's audio with the user's audio before encoding:
The fusion pipeline — four steps, top to bottom
Build the fused input
Concatenate in this exact order. The user segment always sits at the end.
Encode the full sequence in one pass
The encoder processes agent and user frames together — it has no idea where one ends and the other begins.
Mark the boundary — locate where user audio begins
The boundary frame is computed from agent duration — it marks the point in H where the user's speech begins. The full H is kept intact.
Decode the entire sequence — agent and user together
The decoder sees the full sequence. The agent's portion is transcribed first; the user's words follow. The decoder's hidden state, shaped by the agent's audio, provides the contextual prior when it reaches the user's frames.
The encoder processes the full [agent + silence + user] sequence in one
pass, and the decoder then runs over the full hidden state. The boundary frame is used
to locate where the user's speech begins in the output — not to truncate the input.
The model itself is frozen; no fine-tuning occurs.
The hypothesis is intuitive: the encoder's hidden state, having just processed the question, carries a distributional prior toward response-domain tokens — time expressions, confirmations, locations, numbers. This prior should shift emission probability toward contextually appropriate output.
The hypothesis is partially correct. But the approach runs into a specific failure — one that must be understood and corrected before any gain is realized.
Does It Actually Help?
The mechanism is clear and the intuition is sound. But does it hold on real data? To find out, acoustic fusion was evaluated on 282 call-centre conversation pairs — each pair consisting of an agent utterance followed by a user response. The agent audio was prepended with a fixed 1000 ms silence gap and zero blank penalty, the simplest possible configuration, to see what raw context injection does before any parameter tuning.
Every sample was decoded twice — user audio alone, then fused — and the combined CER + WER delta determined which of three outcomes occurred.
Fusion improved transcription. The model's error rate dropped — adding the agent's voice as context genuinely helped the decoder produce a more accurate transcript.
Fusion made things worse. The model's error rate increased — the agent's context actively disrupted what was already a good user-only transcript.
No change. Fusion and no-fusion produced identical transcripts — the context neither helped nor hurt, typically on samples the model handled confidently alone.
Error rates by outcome class
| Outcome | Samples | User-only CER | Fusion CER | User-only WER | Fusion WER |
|---|---|---|---|---|---|
| fusion_won | 53 | 0.326 | 0.192 | 0.509 | 0.270 |
| degraded | 101 | 0.157 | 0.343 | 0.259 | 0.436 |
| tied | 128 | 0.104 | 0.104 | 0.183 | 0.183 |
Not what we expected
Only 1 in 5 samples actually benefits from fusion. The degraded class — samples the model was already handling well — outnumbers fusion_won almost 2-to-1. Adding context, with no other tuning, hurts more often than it helps. The question is no longer whether fusion works — it clearly does for some samples. The question is: what exactly is happening inside the decoder on the cases where it fails?
A Frame-Level Autopsy
Aggregate CER numbers tell you fusion failed — they don't tell you how. To find out, every decode pass was instrumented at the joint-network level: logits captured at each emitting step, encoder hidden states recorded at every token-emitting encoder frame, and emitting frames matched across the user-only and fusion decodes. Three sample classes emerged across 282 samples.
The finding is precise: fusion does not fail by hallucinating wrong tokens. It fails by silencing correct ones — the decoder's hidden state, primed by the assistant audio, raises blank preference at the exact positions that were already emitting correctly. The token identity is clear; the decoder just chooses not to say it.
Frame survival
For each sample, encoder frames that produced a non-blank token in the user-only decode were matched against the fusion decode (±2 frame tolerance). The gross new rate — fusion emissions with no user counterpart — is nearly identical across all three classes (~10%). Degradation is explained entirely by suppression, not hallucination.
| Label | Survival rate | Suppression rate | New frame rate | net n_emit change |
|---|---|---|---|---|
| fusion_won | 0.843 | 0.157 | 0.107 | −0.87 |
| degraded | 0.793 | 0.207 | 0.112 | −0.98 |
| tied | 0.970 | 0.030 | 0.100 | −0.09 |
Blank competition at emitting positions
All features below are measured only at joint-network steps where the model chose
to emit a non-blank token. Δ = fusion − user. Note that
entropy_top20 barely changes for degraded (−0.051): the model
already knew which token to emit — blank is overriding a confident, correct decision.
dur_entropy is identical across classes, confirming the contamination
targets blank preference exclusively, not generalised decoder confusion.
| Feature | fusion_won Δ | degraded Δ | What it shows |
|---|---|---|---|
| blank_to_top_gap | +0.048 | −1.104 | Gap between winning token and blank widens for fusion_won; narrows sharply for degraded |
| blank_rank | −1.09 | −1.27 | Blank climbs the logit leaderboard more for degraded (rank 5.0 → 3.6) |
| blank_prob | +0.004 | +0.021 | P(blank) at emitting steps rises 5× more for degraded |
| entropy_top20 | −0.265 | −0.051 | Context resolves token uncertainty for fusion_won; degraded was already certain |
| dur_entropy | +0.008 | +0.007 | Identical — suppression is blank-specific, not generalised confusion |
| frames_skipped_emit | +0.137 | +0.051 | fusion_won gains stride confidence at emission points; degraded barely benefits |
Encoder shift — why the decoder is responsible
If the encoder were causing blank suppression, degraded samples would show the largest shift at selected frames. They show the smallest. The suppression comes from the prediction network's recurrent hidden state — accumulated during assistant audio processing — not from the per-frame encoder representation. Encoder shift magnitude is inversely correlated with suppression rate.
| Feature | fusion_won | degraded | tied | What it shows |
|---|---|---|---|---|
| enc_l2_user_f | 4.761 | 4.511 | 3.899 | Larger shift = more acoustically relevant context = less suppression |
| enc_norm_delta | +0.717 | +0.530 | +0.375 | Fusion boosts encoder energy most for the samples it helps |
| enc_cos_user_f | 0.849 | 0.859 | 0.886 | Higher similarity for degraded — encoder barely moved, yet decoder misfired |
| gross_suppression_rate | 0.157 | 0.207 | 0.030 | Suppression tracks inversely with encoder shift — decoder state is the cause |
The Two Knobs
The decoder's blank token
The decoder visits every encoder frame and must decide: emit a vocabulary token, or
output a blank — a signal meaning "nothing new here, keep
moving." Most frames are blank. Real tokens emerge sparsely, at the peaks of acoustic
confidence, when blank_p drops below 0.5 and a vocabulary token wins the
softmax. On user-only audio this pattern is healthy and produces an accurate transcript.
Same utterance · GT: नहीं दस बजे दस बजे · three decoding conditions
Left panel — user only. blank_p drops confidently below
0.5 at five frames and the tokens fire cleanly, except for one phonetic slip: the second
दस is heard as दो (highlighted in amber). This is the baseline — a
good-but-not-perfect decode with no context.
Centre panel — fusion, λ = 0. The agent's audio is prepended but no
penalty is applied. The decoder correctly emits the first occurrence of
नहीं दस बजे — blank_p still falls below 0.5 at those frames,
correcting the phonetic error in the process. But the second दस बजे never
fires: the decoder's hidden state, having already transcribed a complete thought, treats
the repetition as audio that does not require a new output.
blank_p stays at 0.72–0.75 — above the decision boundary — and both
tokens are silenced.
Right panel — fusion, λ = 3. Subtracting 3 from the blank logit before
softmax — logit[blank] ← logit[blank] − λ — tilts the decision boundary.
The suppressed frames drop from 0.72–0.75 to 0.11–0.13, well below 0.5. Both repetition
tokens fire. The full correct transcript is recovered, in blue, without retraining
a single weight.
The catch
λ = 3 works here. But the right value is different for every sample — too low and the suppressed tokens stay silent; too high and the decoder forces tokens on frames that should remain blank, flooding the transcript with noise. Finding the correct λ per sample, without decoding it twice, is the unsolved problem.
The silence gap — a second lever
The blank penalty acts on the logit. But there is a completely independent knob that acts on the decoder's state: the silence gap inserted between agent and user audio. The decoder is a recurrent system — it carries memory of every frame it has processed. When agent audio ends and user audio immediately begins, that memory is still active. The decoder is not ready to hear a new speaker.
Silence changes this. A sufficiently long gap looks acoustically like the natural pause
between two utterances. The decoder's hidden state drains, its agent-mode prior fades,
and blank_p returns to a level where user-speech tokens can compete.
With the right silence duration and zero blank penalty, suppression decreases
on its own — no logit manipulation required.
Same utterance · same agent prepend · λ = 0 · only silence gap changes
At 1 s the decoder partially resets — आप and आएंगे
fire cleanly, but the middle tokens तो and बात are
suppressed (blank_p climbs to 0.63–0.67 as the agent-state
reasserts itself), while करेंगे recovers at the end.
At 1.3 s the minimum viable silence is reached — all five tokens emit,
though तो and बात do so narrowly
(blank_p = 0.45–0.46, just below 0.5).
At 2.5 s the decoder fully resets and every token fires with
blank_p between 0.02 and 0.12.
Tuning both knobs together
The silence gap controls how much the decoder resets before hearing the user. The blank penalty controls how aggressively it is pushed to emit even when reset is incomplete. Tuned together — the right silence for the decoder's state, the right penalty for the remaining suppression — acoustic fusion produces a clean, complete transcript. The agent's question genuinely improves the model's understanding of the user's answer.
What the runs showed
Six configurations were evaluated across 293 samples. Each run fixes or varies a different
combination of the two knobs — blank penalty and silence gap — plus auxiliary controls like
max_dur and dynamic parameter generation. Results are reported as Character Error
Rate (CER), Word Error Rate (WER), and a Combined score (average of the two). The Δ Combined
column shows the improvement or regression against the no-fusion baseline.
Run configurations
No fusion, no penalty. Straight ASR on user audio only. The reference line everything else is measured against.
Grid search — mild blank penalty, short silence window. Blank penalty swept 0–1.5; silence gap swept 0–1500 ms. No duration cap. Establishes whether any fusion configuration beats baseline.
Grid search — stronger blank penalty, duration cap added. Blank penalty swept 1–7; silence gap swept 0–1500 ms; max_dur = 15s guard added to prevent catastrophic looping on numerics.
Fixed params — zero penalty, 1 s silence. Both knobs fixed at a single value with no grid search. Tests whether a reasonable-sounding but untuned configuration degrades rather than helps.
Dynamic parameter generation. Parameters generated per-sample via heuristics based on agent audio and user audio durations. Tests whether adaptive per-sample selection if patterns works.
No fusion — blank penalty only. Blank penalty applied (1–7 grid) to user-only audio with no agent prepend and no silence gap. Isolates the penalty's effect independently of any fusion context.
Tail blank penalty with monkey-patched decoding. A fixed blank penalty of 4.5 applied only to tail frames via a monkey-patched decoder loop. Brings agent context directly into user decoding state.
Results across 293 samples
| Run | Strategy | CER | WER | Combined | Δ Combined | Helped | Neutral | Degraded |
|---|---|---|---|---|---|---|---|---|
| Base | No fusion, no penalty | 16.60% | 27.23% | 21.91% | — | — | — | — |
| 1 | Grid: blank=[0–1.5], silence=[0–1500ms] | 13.26% | 22.51% | 17.88% | +4.03 pts | 100 | 149 | 44 |
| 2 | Grid: blank=[1–7], silence=[0–1500ms], max_dur=15s | 11.72% | 21.50% | 16.61% | +5.30 pts | 113 | 139 | 41 |
| 3 | Fixed: blank=0, silence=1000ms | 23.33% | 31.30% | 27.32% | −5.40 pts | 55 | 126 | 112 |
| 4 | Dynamic: generate_params() | 23.82% | 36.45% | 30.14% | −8.22 pts | 57 | 110 | 126 |
| 5 | No fusion: blank=[1–7], silence=0ms | 14.44% | 24.90% | 19.67% | +2.24 pts | 56 | 237 | 0 |
| 6 | Tail blank penalty (4.5) with monkey-patch decoding | 26.65% | 40.65% | 33.52% | −12.84 pts | 56 | 92 | 145 |
Every run that beats the baseline does so by searching the blank penalty and silence duration jointly. The two parameters are not independently tunable — fixing one while ignoring the other, or generating them per-sample without coordinating both, consistently degrades performance. The gains only materialise when both knobs are swept together across their interaction space.
Teaching the oracle
Grid search finds the best parameters for a given sample — but it cannot generalise. A more useful capability would be to predict the right blank penalty and silence duration directly from features of the input: the audio's acoustic properties, the agent's duration, the encoder's hidden-state statistics. The idea is to treat the fusion system as a learnable function — extract features from what we can observe before decoding, and train a lightweight model that maps those features to the parameter pair that maximises transcription quality. If the feature set is sufficiently discriminative, the model could replace the grid search entirely, selecting parameters per-sample at inference time with no additional decoding passes.
Feature discriminative power
Seven candidate features were engineered from the audio and encoder state. Each was evaluated for its ability to separate strong positive samples from hard negatives — measured as the mean difference between the two tiers (Diff: strong positive vs. hard negative). Features with a near-zero difference carry no signal for the predictor.
| Feature | Diff | Discriminative power |
|---|---|---|
| agent_user_audio_ratio | +0.339 | Weak |
| speaking_rate | −0.229 | Weak |
| h_max | +0.505 | Very weak |
| entropy_mean | +0.016 | Near zero |
| blank_prob_mean | −0.003 | Near zero |
| entropy_delta | −0.035 | Near zero |
| cos_sim_mean | −0.001 | Near zero |
Sample tier categorisation
Sample combinations were categorised into tiers based on win_rate —
the fraction of 293 parameter combos that beat no-fusion — and
best_combined_delta, the maximum improvement achieved by any combo.
The tiers define how learnable each sample's optimal parameters are:
| Tier | Criteria |
|---|---|
| strong_positive | win_rate ≥ 0.5 AND delta ≥ 0.05 — fusion reliably outperforms no-fusion across most of the parameter space |
| hard_negative | win_rate ≤ 0.15 OR delta < 0.02 — fusion rarely or never helps; even the best combo produces negligible gain |
What We Learned
Acoustic fusion carries a genuine signal. The agent's prior question, encoded alongside the user's response, does shift the decoder's output toward contextually appropriate tokens. But the mechanism is fragile — blank suppression means the decoder cannot hear the user at all unless two knobs are tuned in tandem. When both are tuned jointly via grid search, the approach delivers up to +5.30 points on the combined CER+WER metric; when either knob is fixed unilaterally, performance collapses by as much as −12.84 points.
The run analysis also tells a more nuanced story. Fusion is not failing uniformly — in the best runs, over 100 samples improved while fewer than 45 degraded. The aggregate metric suffers because degradation on a subset drowns out the gains. The signal is real; the problem is the bleed.
The harder open question is whether the right parameters can be predicted without a grid search. Seven candidate features — spanning audio duration ratios, speaking rate, encoder hidden-state statistics, entropy, and cosine similarity — were evaluated for discriminative power. None showed more than a weak signal; five of the seven sat near zero. The implication is direct: no lightweight model trained on these features can reliably replace the grid search at this stage. Per-sample parameter selection at inference time is not yet tractable from observable inputs alone.
Gate on audio ratio
Blank suppression scales with agent duration — a 13.6 s prepend suppresses even the opening user frames that would otherwise already be ramping toward emission. The agent-to-user audio ratio is the most direct proxy for how hard the decoder will resist emitting; bypass fusion when the ratio is high.
Test on fusion-native utterances
This experiment measures the generic performance of context addition across all utterance types — it is not designed to isolate fusion-native cases. Acoustic fusion is built for utterances where the agent's question directly constrains the response: confirmations, repetitions, yes/no answers, echoed time expressions. The current dataset does not focus on this subset, so the aggregate numbers understate what the approach could deliver on the right data.
Speech distribution analysis
Agent and user audio have fundamentally different speech distributions — pace, vocabulary, turn length, noise floor. Understanding where these distributions diverge most would identify the segments where the agent prior is genuinely informative versus where it pulls the decoder in the wrong direction.
The question is half the answer — but only if the decoder is still listening when it arrives.