Speech-to-speech modelling
Speech understanding
Speech input for LLMs
Three ways to feed speech to an LLM: continuous encoder embeddings, discrete semantic tokens, or codec tokens. Most models use the first.
| Option | What it is | Used by |
|---|---|---|
| Continuous embeddings | ASR-pretrained encoder, then a small projector into LLM space | Voxtral (arXiv 2507.13264), Qwen3-Omni (arXiv 2509.17765), Granite-speech (arXiv 2505.08699), Phi-4-multimodal (arXiv 2503.01743), Step-Audio 2 (arXiv 2507.16632), Canary-Qwen |
| Discrete semantic tokens | Single-codebook VQ on an ASR encoder, built for AR generation | GLM-4-Voice (12.5 Hz, 175 bps; arXiv 2412.02612) |
| Codec tokens | Multi-codebook RVQ, first layer distilled toward a semantic teacher | Moshi's Mimi (12.5 Hz, 8 codebooks, WavLM-distilled first layer; arXiv 2410.00037) |
| Hybrid | Discrete and continuous summed | Kimi-Audio (12.5 Hz semantic tokens from a VQ layer in the Whisper encoder, plus continuous Whisper features downsampled to 12.5 Hz; arXiv 2504.18425) |
Per-model paths
| Model | Encoder and adapter | Rate to LLM |
|---|---|---|
| Voxtral (arXiv 2507.13264) | Whisper large-v3 encoder, 30 s chunks, MLP adapter with 4x downsample | 12.5 Hz |
| Qwen3-ASR (arXiv 2601.21337) / Qwen3-Omni (arXiv 2509.17765) | AuT encoder, 8x conv downsample, 1-8 s dynamic attention window | 12.5 Hz |
| Granite-speech (arXiv 2505.08699) | CTC-trained Conformer plus windowed Q-Former; 100 Hz log-mel reduced 2x at the encoder input, then 5x in the Q-Former | 10 Hz |
| Step-Audio 2 (arXiv 2507.16632) | Frozen encoder at 25 Hz, adaptor with 2x downsampling | 12.5 Hz |
| Qwen2-Audio (arXiv 2407.10759) | Encoder initialised from Whisper-large-v3, plus a stride-2 pooling layer | 25 Hz (40 ms per frame) |
Why 12.5 Hz converges
Whisper emits 50 Hz frames. Voxtral notes that 30 minutes of audio at 50 Hz is a sequence of 90k tokens, which is why it adds a 4x downsampling adapter (arXiv 2507.13264). Moshi's Mimi codec also runs at 12.5 Hz (arXiv 2410.00037).
Trade-offs
- Continuous: richest acoustic and paralinguistic signal, easy to train as ASR, but the output side needs a separate path.
- Discrete: one vocabulary for input and output, enables self-supervised next-token training, loses detail.
- Codec: the model hears and speaks the same tokens, but multi-codebook streams cost more per frame. Inference This suits duplex.
- Inference Downsampling to 10-12.5 Hz is the main sequence-length lever. It costs fine acoustic detail, which motivates hybrids like Kimi-Audio.
"Input is converging on an ASR-pretrained encoder, a small projector and about 12.5 Hz. Discrete tokens appear when the same vocabulary must also be generated."
ASR with speech LLMs: offline and streaming
ASR is one more speech-to-text task on the encoder, projector and LLM stack. The design questions are how much to train, and how to stream.
Training recipes
| Model | Recipe |
|---|---|
| Canary-Qwen (NVIDIA) | LLM frozen; train encoder, projection and LoRA. Trained on about 234K h of public speech; the card reports 5.63 mean WER and RTFx 418 on the Open ASR Leaderboard (NVIDIA model card) |
| Granite-speech (arXiv 2505.08699) | Encoder, projector and LoRA (rank 64 on q, v) trained jointly |
| Phi-4-multimodal (arXiv 2503.01743) | Two stages: ASR pre-training updates encoder and projector with the language decoder frozen; post-training freezes the encoder and updates projector and speech LoRA |
| Voxtral (arXiv 2507.13264) | Pretraining, then SFT, then DPO and online DPO |
- Freezing the LLM is the direct guard against forgetting. Granite-speech states that in text mode it calls the underlying LLM without LoRA, which preserves its text capabilities.
- Canary-Qwen's LLM mode takes a text transcript only, not raw audio (NVIDIA model card).
Streaming approaches
| Approach | Mechanism |
|---|---|
| Chunked or causal encoder | Qwen3-ASR's AuT encoder uses a 1-8 s dynamic attention window, so one model serves streaming (short chunks) and offline inference; the authors report an average TTFT as low as 92 ms for the 0.6B model (arXiv 2601.21337) |
| Delayed streams | Kyutai DSM: a decoder-only LM over time-aligned streams. ASR corresponds to delaying the text stream relative to the audio, and the reverse gives TTS (arXiv 2509.08753) |
| Chunked decoder | SpeechLLM-XL: decoder-only model over configurable audio chunks; the authors report 2.7 / 6.7 WER on LibriSpeech test clean / other with 1.28 s chunks. CTC forced alignment segments the training transcripts (arXiv 2410.03752) |
Inference Chunk size and lookahead trade latency against WER.
Multilingual scale
Omnilingual ASR (Meta) covers over 1,600 languages, in models from 300M to 7B parameters (arXiv 2511.09690). Qwen3-ASR covers 52 languages and dialects (arXiv 2601.21337).
Leaderboard state
The Open ASR Leaderboard compares 86 systems on 12 datasets, with English short- and long-form and multilingual tracks (arXiv 2510.06961). Its authors observe that Conformer encoders paired with Transformer decoders reach the best average WER, while CTC and TDT decoders give the best RTFx.
Open question and scope
- Not covered here: transducer plus LLM hybrids and CTC-prefix joint decoding.
"From my streaming ASR work: chunk size and lookahead set the latency/WER trade-off. The new twist is delayed text streams, so ASR becomes a special case of a multistream LM."
How encoder audio and ASR text meet inside the LLM
A speech LLM must decide where audio positions and text positions sit in one sequence. That choice sets when text can be emitted, whether the model streams, and what alignment the training data needs. This section lays out six layouts from the papers; encoder rates are in Speech input, the Whisper front end is in Whisper, and the full streaming-ASR taxonomy is in Streaming ASR families.
Six layouts
1. Prefix (soft prompt).
[audio e1 … eT] <asr prompt> → text tokens
Qwen2-Audio models each text token given the previous text and the encoded audio, , with the objective stated over the next text token (Section 2; arXiv 2407.10759).
Its encoder is initialised from Whisper-large-v3, and a stride-2 pooling makes each frame about 40 ms (arXiv 2407.10759).
The official repo prompt for the pretrained model is <|audio_bos|><|AUDIO|><|audio_eos|>Generate the caption in English:, and its chat example puts the audio item before the text item (QwenLM/Qwen2-Audio).
Voxtral passes encoder output through an MLP adapter that downsamples 4x (50 to 12.5 Hz), and its decoder predicts text conditioned on the audio and text inputs (arXiv 2507.13264).
Its pretraining uses an audio segment followed by its transcript (<repeat>), or alternating audio and text segments (<next>), and a special token selects transcribe mode with no text prompt (arXiv 2507.13264).
Neither paper states whether the loss is masked to text positions, and neither describes the audio positions beyond conditioning.
Inference
The <|AUDIO|> placeholder suggests encoder frames replace those positions in the input embeddings.
2. Chunk-interleaved streaming.
[audio chunk 1] [text 1] $ [audio chunk 2] [text 2] $ …
SpeechLLM-XL splits the audio into 1.28 s chunks and trains the LLM to emit each chunk's text plus an end-of-chunk token $ (Sections III and IV-A; arXiv 2410.03752).
The target transcript is segmented per chunk, with a $ after each chunk's tokens, and the audio encodings are interleaved with text embeddings by audio-text alignment (Section III, Fig. 1; arXiv 2410.03752).
When reference alignments are missing, CTC forced alignment between audio encodings and text tokens gives each token's end time (Section III; arXiv 2410.03752).
Self-attention caches the previous chunks, and at inference each chunk's text is generated until $ is predicted, then $ is dropped from the transcript (arXiv 2410.03752).
3. Per-frame wait or blank.
e1 BLANK e2 w w BLANK e3 BLANK …
In Speech ReaLLM an input embedding arrives every 240 ms, the model appends it and keeps predicting tokens until it predicts BLANK (Section 2, Algorithm 1; arXiv 2406.09569).
A frame can therefore yield zero, one or several words.
Training targets come from fixed alignments produced by an external CTC "alignment-teacher", with cross-entropy loss; the paper found it better to give the encoder 960 ms of right context than to delay the labels (Sections 3 and 4.2; arXiv 2406.09569).
4. Transducer with an LLM predictor.
LLM(text history) + encoder frame → joint network → token or blank
Transducer-Llama uses the LLM as the non-blank predictor at decoding; encoder output enters through the joint network, not the LLM input (Sections II and III; arXiv 2412.16464).
The non-blank distribution combines both scores:
Here is the blank probability, comes from the acoustic encoder and from the internal LM, which the LLM replaces after RNN-T training (Sections II and III-C; arXiv 2412.16464). The LLM is frozen apart from new embedding and output layers for the ASR vocabulary (Section III-A; arXiv 2412.16464). The paper does not state the predictor's input. Inference As in any transducer predictor, it sees the previous non-blank labels, not audio.
5. Time-aligned parallel streams.
step t: emb(text token) + emb(audio tokens) → one vector → text out
Moshi gives each stream its own embedding table and sums them: the Temporal Transformer takes "the sum of K learnt embedding tables" for the previous step, with streams for (Section 3.4; arXiv 2410.00037).
One stream holds the aligned text, with PAD between words and EPAD before each word, and PAD is about 65% of tokens in English conversation (Section 3.4.4; arXiv 2410.00037).
Steps are 80 ms (12.5 Hz).
DSM does the same, "the embeddings are summed before going into the backbone" (Section 3; arXiv 2509.08753).
For ASR it teacher-forces the audio tokens, computes loss on the text stream including PAD and WORD, and delays the text by a default 2.5 s (Sections 3.2 and 4; arXiv 2509.08753).
More in Inner Monologue and
who emits what per frame.
6. Hybrid continuous plus discrete input.
per 12.5 Hz step: whisper_feature(t) + emb(semantic_token(t))
Kimi-Audio downsamples Whisper features from 50 to 12.5 Hz with an adaptor, then adds them to the semantic-token embeddings as the audio LLM input (Sections 2.2 and 4.1; arXiv 2504.18425).
Confirmed
The paper is inconsistent: its Introduction says it concatenates the two (arXiv 2504.18425).
Inference
The method sections are more specific, so treat it as addition.
Comparison
| Layout | When text is emitted | Streaming? | Alignment needed | Example |
|---|---|---|---|---|
| 1. Prefix | After the audio and a task prompt | No, audio is complete first | None | Qwen2-Audio (arXiv 2407.10759), Voxtral (arXiv 2507.13264) |
| 2. Chunk-interleaved | After each 1.28 s chunk, closed by $ |
Yes | Token end times, from references or CTC forced alignment | SpeechLLM-XL (arXiv 2410.03752) |
| 3. Per-frame blank | After each 240 ms embedding: zero or more words, then BLANK |
Yes | Fixed alignments from an external CTC teacher | Speech ReaLLM (arXiv 2406.09569) |
| 4. Transducer, LLM predictor | When the joint network picks a non-blank token | Yes (160 ms segments) | RNN-T loss; no external aligner stated | Transducer-Llama (arXiv 2412.16464) |
| 5. Time-aligned streams | One text slot per 80 ms step, mostly PAD; ASR text lags by a delay |
Yes | Word timestamps place words on the grid | DSM (arXiv 2509.08753), Moshi (arXiv 2410.00037) |
| 6. Hybrid input | Not a text layout; changes the audio input only | Set by the host model | None | Kimi-Audio (arXiv 2504.18425) |
Position encoding for audio
Qwen3-Omni uses TM-RoPE, which splits the rotary embedding into temporal, height and width components (24, 20 and 20 rotary angles) (Section 2.3; arXiv 2509.17765). For text, all three components share one position ID, which makes it equal to 1D RoPE. For audio, each temporal ID spans 80 ms, and the AuT encoder emits 12.5 Hz tokens (Sections 2.2 and 2.3; arXiv 2509.17765). Each modality starts at one plus the largest position ID of the previous one, and audio and video align through absolute-time IDs (arXiv 2509.17765).
Inference The Qwen2-Audio and Voxtral papers state no separate audio position scheme, so I assume ordinary sequential positions there. In layout 5 a position is a time step by construction, since all streams sum into one backbone input per step (arXiv 2509.08753).
Where ASR text leaves the speech model
Inference In the unified speech LLM design and in the cascade, the speech model's streaming transcript goes to the downstream reasoning LLM as plain text. The text would carry tags such as partial or final, and the reasoning LLM would start only on a stable transcript, as in partials, finals and when to start the LLM. Layouts 2 and 3 give that stream natively; a prefix model gives it only after the utterance ends; layout 5 gives it with a fixed lag.
Supporting facts: SpeechLLM-XL drops $ from the final transcript (arXiv 2410.03752), and Speech ReaLLM's response after each embedding is often empty (arXiv 2406.09569).
Streaming ASR trade-offs are in
Streaming approaches
and Look-ahead.
"Audio and text meet in the LLM in a few ways: offline models put projected audio frames first and decode text after, while streaming models interleave chunks with an end-of-chunk token, emit a blank after each frame, run a transducer, or sum time-aligned streams per 80 ms step. The trade-off is alignment: chunk and frame layouts need CTC alignments for training targets, time-aligned streams need word timestamps, and a prefix needs neither but waits for the whole utterance. For a voice agent I want text while the user is still speaking, so I would pick chunk interleaving or time-aligned streams."
Whisper and the Whisper encoder
Whisper is an encoder-decoder Transformer trained on 680,000 hours of weakly supervised audio. Its encoder became the default front end for speech LLMs. Source: arXiv 2212.04356 unless stated.
Architecture
- Confirmed Input is 16 kHz audio turned into an 80-channel log-magnitude mel spectrogram (25 ms window, 10 ms stride), in 30 s segments.
- Confirmed The stem is two conv layers (width 3, GELU); the second has stride 2, so one encoder frame covers 20 ms.
- Derived: the 10 ms hop gives 100 mel frames per second (100 Hz). The stride-2 conv halves that to one frame per 20 ms (50 Hz). A 30 s window is therefore 30 s / 10 ms = 3,000 mel frames and 3,000 / 2 = 1,500 encoder frames. Short audio is padded to 30 s, so compute is paid for the full window.
Rule (derived arithmetic):
| Rate | ms per frame | Where it comes from |
|---|---|---|
| 100 Hz | 10 | Log-mel hop (arXiv 2212.04356) |
| 50 Hz | 20 | Whisper encoder after the stride-2 conv (arXiv 2212.04356) |
| 25 Hz | 40 | Qwen2-Audio: stride-2 pooling on the encoder output, each frame about 40 ms (arXiv 2407.10759) |
| 12.5 Hz | 80 | Voxtral: 4x downsampling adapter on 50 Hz embeddings (arXiv 2507.13264) |
| Model | Layers | Width | Heads | Params |
|---|---|---|---|---|
| Tiny | 4 | 384 | 6 | 39M |
| Base | 6 | 512 | 8 | 74M |
| Small | 12 | 768 | 12 | 244M |
| Medium | 24 | 1024 | 16 | 769M |
| Large | 32 | 1280 | 20 | 1550M |
- large-v3: same architecture, 128 mel bins instead of 80, and a Cantonese token. Reported OpenAI reports a 10% to 20% error reduction over large-v2 (OpenAI model card).
- large-v3-turbo: a fine-tuned, pruned large-v3 with the decoder cut from 32 to 4 layers (OpenAI model card). The card lists it at 809M parameters.
Multitask token format
The decoder prompt carries the task as tokens: start-of-transcript, language, task (transcribe or translate), then timestamps or no-timestamps. One model therefore does ASR, X-to-English translation and language ID. Timestamps are quantised to 20 ms.
Training data and recipe
| Model | Data |
|---|---|
| v1 / v2 | 680,000 h weakly supervised: 117,000 h of non-English transcription across 96 other languages, 125,000 h of X-to-English translation, the rest English (paper). |
| large-v3 | 1 million hours of weakly labelled audio and 4 million hours of audio pseudo-labelled with large-v2 (OpenAI model card). |
- Filtering: drop machine-generated transcripts (all caps or all lower, no punctuation). Compare audio language ID (VoxLingua107-trained) with CLD2 on the transcript and drop mismatches; English transcripts of other-language audio are kept as translation data.
- Optimiser: AdamW, gradient-norm clipping, linear decay after 2,048 warmup steps, batch 256, FP16 with activation checkpointing, 2 to 3 passes over the data.
- Augmentation: none for the first models. Large-v2 trained 2.5x more epochs with SpecAugment, stochastic depth and BPE dropout.
Long-form decoding
Whisper slides a 30 s window over long audio and decodes with heuristics (paper section 4.5).
- Beam search with beam 5.
- Temperature fallback from 0, in steps of 0.2 up to 1.0, when average log-probability is below -1 or the gzip compression ratio exceeds 2.4.
- Condition on the previous window's text only when temperature is below 0.5.
- No-speech threshold 0.6 to skip silent windows.
Limitations
- The model card warns that predictions may include text that was not spoken (hallucination) and that the sequence-to-sequence architecture is prone to repetitive text. It also states that the models cannot be used for real-time transcription out of the box.
- The fixed 30 s window, non-causal encoder and autoregressive beam decoder make streaming hard.
Hallucination and repetition are documented limitations on the model card. Do not rank checkpoints on hallucination without your own measurement.
The encoder as a speech-LLM front end
| System | How it uses Whisper |
|---|---|
| Qwen2-Audio (arXiv 2407.10759) | Encoder initialised from Whisper-large-v3 |
| Voxtral (arXiv 2507.13264) | Whisper large-v3-based encoder, 128 mels, each 30 s chunk independent, 4x downsampling adapter |
| GLM-4-Voice (arXiv 2412.02612) | Fine-tuned whisper-large-v3 ASR model with a VQ bottleneck gives a 12.5 Hz, 175 bps single-codebook tokenizer; made causal (see below) |
| LLaMA-Omni 2 (arXiv 2505.02625), Kimi-Audio (arXiv 2504.18425) | LLaMA-Omni 2 uses the Whisper-large-v3 encoder; Kimi-Audio takes continuous Whisper features at 50 Hz and downsamples them to 12.5 Hz with an adaptor |
| Moshi (arXiv 2410.00037) | Whisper large-v3 transcribes the training audio to produce the time-aligned text for the inner monologue; it is not the encoder |
| Qwen3-Omni (arXiv 2509.17765) | Replaced it with AuT (see below) |
Inference Three issues recur. Padding to 30 s wastes compute on short turns. 50 Hz is too long a sequence for an LLM, so every system adds an adapter (50 Hz / 4 = 12.5 Hz). Bidirectional attention blocks streaming, so teams either make the encoder causal (GLM-4-Voice) or replace it (AuT).
Making the Whisper encoder stream
Whisper does not stream for three reasons.
- The encoder takes a fixed 30 s window (arXiv 2212.04356), and Voxtral describes it as a fixed receptive field of 30 s (arXiv 2507.13264).
- Streaming wrappers pad every buffer to the full context length, so each partial result pays for 30 s (arXiv 2506.12154).
- Encoder attention is bidirectional, so every frame sees later audio (GLM-4-Voice replaces it with block-causal attention, arXiv 2412.02612). The model card states the models cannot do real-time transcription out of the box.
Four families fix this, with different cost.
- Causal fine-tuning. CarelessWhisper fine-tunes Whisper with LoRA so each encoder frame attends only to its own chunk and earlier chunks, and it caches encoder keys and values instead of re-encoding padded buffers (arXiv 2508.12301). It trains on 960 h of LibriSpeech with chunk sizes of 40 to 300 ms. The U2-style variant puts a CTC head on the Whisper encoder, trains with dynamic chunk masks (0.1 to 1.0 s) on inputs shorter than 30 s, and rescores with the original decoder (arXiv 2506.12154). GLM-4-Voice makes the encoder causal inside its tokenizer: causal convolution before the Transformer and block-causal attention, then pooling and vector quantisation give 12.5 Hz tokens (arXiv 2412.02612).
- Replace the encoder. Qwen3-Omni trains AuT (Audio Transformer) from scratch on 20 million hours of supervised audio, with 8x Conv2D downsampling to 12.5 Hz and block-wise window attention for real-time prefill caching (arXiv 2509.17765). Qwen3-ASR reuses AuT with a dynamic flash-attention window of 1 s to 8 s, so one model serves streaming (short chunks) and offline (long queries) (arXiv 2601.21337).
- Wrap the offline model. whisper_streaming re-runs Whisper on a growing buffer and commits words once consecutive runs agree (LocalAgreement), at 3.3 s latency (arXiv 2307.14743). Simul-Whisper uses the cross-attention alignment to guide decoding on chunks, with a truncation detector for cut words (arXiv 2406.10052). The U2 authors note that wrappers reprocess the same audio and leave a training-inference mismatch (arXiv 2506.12154).
| Approach | Change to Whisper | Retraining? | Latency and compute | Example |
|---|---|---|---|---|
| Buffer wrapper | None; re-decode a growing buffer, commit on agreement | No | 3.3 s latency; re-encodes padded buffers (arXiv 2307.14743, 2506.12154) | whisper_streaming |
| Alignment-guided wrapper | Cross-attention alignment steers decoding; truncation detector | No Whisper fine-tuning | 1.46% average absolute WER degradation at 1 s chunks (arXiv 2406.10052) | Simul-Whisper |
| Causal LoRA fine-tune | Chunked causal mask in the encoder; encoder KV cache | LoRA, 960 h | Large-v2, 300 ms chunks: 0.081 s average latency (greedy) vs 0.426 s for Ufal-Whisper (beam 5); test-clean WER 4.98% vs 7.50% (arXiv 2508.12301) | CarelessWhisper |
| Causal fine-tune with CTC | Dynamic chunk masks, CTC head, decoder rescoring, KV cache | Full fine-tune, about 5,800 h of earnings calls | 17.30% WER at 1 s chunks; about 267 ms per partial transcript on four CPU cores (arXiv 2506.12154) | U2-style Whisper |
| Causal tokenizer | Causal conv, block-causal attention, pooling, VQ | Fine-tune the ASR model | 12.5 Hz, 175 bps (arXiv 2412.02612) | GLM-4-Voice |
| New windowed encoder | Replace the encoder entirely | From scratch, 20M h | 12.5 Hz; window 1 to 8 s (arXiv 2509.17765, 2601.21337) | AuT in Qwen3-Omni, Qwen3-ASR |
"Whisper streams in three ways: wrap it and pay for re-encoding, fine-tune it causal with a chunked mask and an encoder cache, or replace the encoder. Wrappers need no training but cost latency; causal fine-tuning gets sub-second latency; a new windowed encoder like AuT costs a from-scratch run but serves streaming and offline from one model."
Streaming audio encoders beyond Whisper
Most streaming encoders do one of two things: restrict attention to a causal or windowed context, or cache past activations.
| Encoder | Causal or windowed | Frame rate | Streaming mechanism | Used in |
|---|---|---|---|---|
| AuT | Windowed | 12.5 Hz (about 80 ms per frame) | Dynamic flash-attention window of 1 to 8 s; 8x downsampling (arXiv 2509.17765, 2601.21337) | Qwen3-Omni, Qwen3-ASR |
| Qwen2.5-Omni audio encoder | Windowed (2 s blocks) | About 40 ms per frame (25 Hz, derived) | Initialised from Whisper-large-v3; full attention changed to attention in blocks of 2 s to support prefilling (arXiv 2503.20215) | Qwen2.5-Omni |
| Mimi | Causal | 12.5 Hz (80 ms) | All convolutions causal; theoretical latency 160 ms, 200 ms in practice (arXiv 2410.00037) | Moshi; DSM-ASR (arXiv 2509.08753) |
| GLM-4-Voice tokenizer | Causal conv plus block-causal attention | 12.5 Hz | Whisper-based encoder made causal, then pooled and quantised (arXiv 2412.02612) | GLM-4-Voice |
| Cache-aware FastConformer | Limited look-ahead | 80 ms (8x downsampling of a 10 ms hop, derived) | Caches past activations and trains with limited context, so no overlapping recomputation (arXiv 2312.17279) | NVIDIA NeMo; parakeet_realtime_eou_120m-v1 |
- Qwen3-ASR numbers: the paper reports 2.69 average WER offline vs 3.33 streaming for the 1.7B model, and 3.48 vs 4.40 for 0.6B, with streaming run at a 2 s chunk size (arXiv 2601.21337). It also reports an average time to first token as low as 92 ms for the 0.6B model.
- DSM-ASR: feeds Mimi tokens (12.5 Hz) and delays the text stream by a default 2.5 s, with timestamp precision of 80 ms (arXiv 2509.08753).
- Cache-aware Conformer: with a regular look-ahead, latency compounds with depth (1,360 ms for 17 layers and one token of look-ahead); chunk-aware look-ahead does not. On LibriSpeech test-other with an RNNT decoder, the cache-aware model reaches 6.3% WER at 1,360 ms, against 11.3% for buffered inference at 2,000 ms (arXiv 2312.17279).
- The model card lists a 120M-parameter cache-aware FastConformer-RNNT with 17 layers and latency of 80 to 160 ms.
Ecosystem
| Tool | What it adds |
|---|---|
| faster-whisper | CTranslate2 reimplementation; its README claims up to 4 times faster than openai/whisper at the same accuracy with less memory (README benchmark: 1m03s vs 2m23s, fp16, beam 5); batched inference; Silero VAD filter |
| whisper.cpp | C/C++ port for CPU and edge |
| WhisperX (arXiv 2303.00747) | VAD-based pre-segmentation ("VAD Cut & Merge") with batched inference for a twelve-fold speedup reported in the paper, and forced phoneme alignment for word-level timestamps; the repo notes that the alignment model is language-specific and overlapping speech is not handled well |
| distil-whisper (arXiv 2311.00430) | distil-large-v2: 2 decoder layers, 756M params, 5.8x faster, 51% fewer parameters; pseudo-labels filtered with a 10% WER threshold (45.4% dropped); less prone to long-form hallucination; works as a speculative-decoding assistant with identical outputs |
Interview insights
- Whisper got the recipe right: scale plus weak supervision gives robustness, and multitask tokens put ASR, translation and language ID in one model.
- It is wrong for voice products as shipped: fixed window, non-causal encoder and beam decoding hurt latency, and silence hallucination matters for agents.
- Newer encoders address this: the Open ASR Leaderboard authors find Conformer encoders with Transformer decoders give the best average WER (arXiv 2510.06961), and Qwen3-ASR uses a dynamic 1 to 8 s attention window to cover both streaming and offline (arXiv 2601.21337).
- AuT is the synthesis: Whisper-scale data with a streaming-friendly encoder.
"Whisper's recipe is right, but the architecture is wrong for voice agents: a fixed 30 s window and a bidirectional encoder. That is why GLM-4-Voice makes it causal and Qwen3-Omni replaces it with AuT, and why I would start from a streaming encoder."
Look-ahead (right context) in streaming encoders
Look-ahead, also called right context, is how much future audio an encoder may see before it commits to an output for the current frame. Zero look-ahead means each output depends only on the past, so it can be emitted as soon as its frame arrives. N frames of look-ahead means each output waits for N more frames, which helps resolve ambiguous sounds and word boundaries but adds latency.
Reading "0LA" and "12LA"
Inference Shorthand such as 0LA and 12LA names a streaming configuration by its look-ahead in encoder frames: 0 frames or 12 frames. What 12 frames costs depends on the frame duration after subsampling, and on whether the look-ahead is applied per layer or per chunk (below).
| Frame duration after subsampling | 12 frames of look-ahead (derived) |
|---|---|
| 40 ms (4× subsampling of a 10 ms hop) | 480 ms |
| 80 ms (8× subsampling of a 10 ms hop) | 960 ms |
For comparison, Speech ReaLLM uses 240 ms input frames with 960 ms of encoder right context (arXiv 2406.09569).
The latency and accuracy trade-off
NVIDIA's cache-aware streaming FastConformer paper measures the trade-off directly (arXiv 2312.17279). On LibriSpeech test-other with a hybrid model and chunk-aware look-ahead, the authors report:
| Look-ahead latency | RNNT WER (%) | CTC WER (%) |
|---|---|---|
| 0 ms | 9.5 | 10.6 |
| 40 ms | 9.0 | 10.1 |
| 240 ms | 7.8 | 8.8 |
| 520 ms | 7.5 | 8.4 |
| 680 ms | 7.3 | 8.0 |
| 1,360 ms | 6.3 | 7.1 |
| Offline (full context) | 5.0 | 5.7 |
Zero look-ahead costs about 50% relative WER against the 1,360 ms setting (derived, RNNT), and most of the gain arrives within a few hundred milliseconds. In the same paper, buffered (non-cache-aware) streaming reaches only 11.3% WER at 2,000 ms with RNNT, worse than cache-aware streaming with zero look-ahead.
Regular against chunk-aware look-ahead
How look-ahead is implemented matters as much as how much is allowed (arXiv 2312.17279).
| Regular look-ahead | Chunk-aware look-ahead | |
|---|---|---|
| Mechanism | Each self-attention layer sees M future steps | Input split into chunks of size C; every frame sees its whole chunk, plus earlier chunks as cached left context, but never the next chunk |
| Effective look-ahead | M × number of layers | From C−1 frames (first frame in a chunk) to 0 (last frame) |
| Paper's example | 17 layers, one frame each: 1,360 ms | Average latency is half the look-ahead size |
| RNNT WER at 1,360 ms | 7.1% | 6.3% |
So "12LA" is cheap or expensive depending on whether it means 12 frames once at the chunk level, or 12 frames per layer that compound through the stack. Inference
One model, several look-aheads
The same paper trains a single model with multiple look-ahead settings and compares it to separate single-setting models on LibriSpeech test-other (arXiv 2312.17279). With RNNT, the multi-look-ahead model reports 6.2%, 5.5% and 5.2% WER at 40, 240 and 520 ms, against 6.4%, 5.9% and 5.4% for single-look-ahead models. That lets a product pick the latency at inference time.
NVIDIA's Parakeet realtime end-of-utterance model card lists a cache-aware streaming FastConformer-RNNT with 80 to 160 ms latency.
Zero look-ahead suits barge-in detection, end-of-turn signals and the fastest partials, where reacting early matters more than a perfect word. Larger look-ahead suits final transcripts handed to the reasoning LLM. A multi-look-ahead encoder can serve both from one model.
Look-ahead is the future audio the encoder waits for before committing a frame, so it trades latency for accuracy. NVIDIA's cache-aware FastConformer shows RNNT WER going from 9.5% at zero look-ahead to 6.3% at 1,360 ms, and chunk-aware look-ahead beats per-layer look-ahead at the same latency because it does not compound with depth. I would train one encoder with several look-aheads and use zero for turn-taking and a larger one for final transcripts.