Speech-to-speech: literature review
Streaming conversational modelling
Rates, frames and clocks
A speech system runs several clocks at once, and "the frame rate" can mean any of them. Keep the clocks apart and every number in this chapter becomes easy to check. The anchor to remember is 12.5 Hz, which is one frame every 80 ms.
Every number carries its source. Arithmetic done for this chapter is marked derived. The 16 kHz input, 25 ms window, 10 ms hop and Whisper's stride-2 convolution come from the Whisper paper (arXiv 2212.04356); see Whisper and the Whisper encoder.
The ladder from waveform to LLM
| Stage | Rate | Period | Worked arithmetic |
|---|---|---|---|
| Waveform | 16 kHz (typical ASR input); 24 kHz (Mimi, WavTokenizer); 44.1 kHz (DAC) | at 16 kHz | Fisher telephone audio is 8 kHz and was upsampled to 24 kHz for Moshi (arXiv 2410.00037) |
| STFT / mel frames | 100 Hz | 10 ms hop | 25 ms window and 10 ms hop at 16 kHz are 400 and 160 samples (derived) |
| Encoder output (Whisper) | 50 Hz | 20 ms | Conv stride 2: . A 30 s chunk is 1,500 frames (derived) |
| Adaptor output | 12.5 Hz | 80 ms | Voxtral 4x adapter (arXiv 2507.13264): . A 30 s chunk is 375 frames (derived) |
| Codec frame (Mimi) | 12.5 Hz | 80 ms | samples per frame (derived) |
The whole chain for one Whisper-style input path:
Other encoders reach 12.5 Hz by other routes. Step-Audio 2 runs a frozen audio encoder at 25 Hz and a 2x adaptor, giving 12.5 Hz (arXiv 2507.16632).
The reason to stop at 12.5 Hz is sequence length. Thirty minutes is 1,800 s, so 50 Hz gives positions (derived). At 12.5 Hz the same audio is positions (derived).
Codec frame rates, tokens per second, bitrate
A codec frame is a vector in time. A token is one integer id. A residual quantiser (RVQ) turns each frame into one id per codebook, so token rate and frame rate differ.
Mimi has Hz, and , so tokens/s and bps. That matches the 1.1 kbps in the Mimi paper (arXiv 2410.00037). Confirmed
| Codec or tokenizer | Frame rate | Codebooks | Tokens/s | Bitrate |
|---|---|---|---|---|
| Mimi (arXiv 2410.00037) | 12.5 Hz | 8 × 2048 | 1.1 kbps (authors report; re-derived here) | |
| X-Codec2 (arXiv 2502.04128) | 50 Hz | 1 × 65,536 (16 kHz input, downsampling ratio 320) | (derived) | bps (derived) |
| WavTokenizer (arXiv 2408.16532) | 40 or 75 tokens/s | 1 (single quantiser) | 40 or 75 | not stated here |
| CosyVoice 2 tokenizer (arXiv 2412.10117) | 25 Hz | 1 (FSQ, 6,561 codes) | 25 | not stated here |
| GLM-4-Voice tokenizer (arXiv 2412.02612) | 12.5 Hz | 1 (VQ on Whisper) | 12.5 | 175 bps, so bits per token (derived) |
| VibeVoice tokenizer (arXiv 2508.19205) | 7.5 Hz | continuous latents | none | 3200x downsampling of 24 kHz audio |
| DAC (arXiv 2306.06546) | about 86 Hz at 44.1 kHz | 9 × 1024 | (derived) | about 8 kbps; kbps (derived) |
| Freeze-Omni decoder (arXiv 2411.00774) | 40 Hz | 1 × 1024 | 40 | not stated here |
"Mimi runs at 12.5 Hz" is the frame rate. The LM sees 100 tokens per second on the audio side alone, 200 for a user stream plus an agent stream (derived), and that is why the depth transformer exists (next section). Single-codebook codecs avoid this: their frame rate is their token rate.
"Mimi runs at 12.5 Hz, so one frame is 80 ms. With eight codebooks that is 100 tokens a second, and 1.1 kbps at eleven bits per token. Text and both audio streams share that one clock, which is why Moshi has no explicit turn state."
Text rate, audio rate and duplex clocks
Text is slow and audio is fast, so a model that emits both must choose how to align them. This section shows the two alignments and the clock a duplex model adds on top.
Text tokens against audio frames
Text is slow. Moshi puts text on the same 12.5 Hz grid as audio and fills the empty frames with a PAD token. In English conversational speech padding is about 65% of text-stream tokens (arXiv 2410.00037), so about 35% of frames carry a real token, roughly text tokens/s (derived).
Interleaving models drop the shared grid and fix an order instead. GLM-4-Voice (arXiv 2412.02612) alternates 13 text tokens with 26 speech tokens (1:2). At 12.5 Hz, 26 speech tokens last s, so the text runs at tokens/s (derived).
| System | Ratio or chunk | Clock | Duration of one unit |
|---|---|---|---|
| Moshi (arXiv 2410.00037) | 1 text slot per frame, ~65% PAD | 12.5 Hz | 80 ms per frame |
| GLM-4-Voice (arXiv 2412.02612) | 13 text : 26 speech (1:2) | 12.5 Hz speech | 26 tokens = 2.08 s (derived); decoder block of 10 tokens = 0.8 s |
| MinMo (arXiv 2501.06282) | 5 semantic vectors : 15 speech tokens | not stated | not computable |
| OmniFlatten (arXiv 2410.17799) | text chunk 2, speech chunk 10 | not stated | not computable |
| LLaMA-Omni 2 (arXiv 2505.02625) | read R = 3, write W = 10 | 25 Hz | ms per token; 10 tokens = 400 ms |
| SyncLLM (arXiv 2409.15594) | time-synchronous chunks | 25 Hz HuBERT | 160 to 240 ms chunk = 4 to 6 tokens (derived) |
| DuplexSLA (arXiv 2605.20755) | TA4 = 1 text + 4 audio per assistant step | 160 ms chunk clock, 80 ms user stride | 2 user strides per chunk (derived) |
Duplex clocks
A duplex model needs one clock that both directions share. In Moshi, every 80 ms step reads the user's 8 audio codes and emits the agent's text token and 8 audio codes. There is no turn state; silence is just tokens. One temporal-transformer pass plus up to 17 depth sub-steps must finish before the next frame is due. Inference If the temporal pass were free, the budget is ms per sub-step (derived).
Other systems decide less often than they run:
| System | Decision granularity |
|---|---|
| Moshi (arXiv 2410.00037) | Every frame, 80 ms |
| DuplexSLA (arXiv 2605.20755) | 160 ms chunk clock; user stream advances in 80 ms strides |
| SyncLLM | 160 to 240 ms chunks (arXiv 2409.15594) |
| LLaMA-Omni 2 (arXiv 2505.02625) | 400 ms speech chunks (10 tokens at 25 Hz, derived) |
| MiniCPM-o 4.5 (arXiv 2604.27393) | Ablation compares 1.0, 0.2 and 0.1 s chunks, and the 0.2 and 0.1 s rows score lower (Table 1); the LLM backbone needs 3-4 decoding steps per second |
| DiffuPlex (arXiv 2610.12214) | 12.5 Hz frames; one backbone wake predicts several future frames |
Latency in frames, video alignment and vocabulary
Latency is easiest to reason about in frames. The same clock arithmetic also aligns audio with video, and fixes the vocabulary for the interview.
Seconds to frames, and Moshi's latency
Divide any delay by 0.08 s to count frames.
| Delay | Seconds | Frames at 12.5 Hz (derived) |
|---|---|---|
| Moshi acoustic delay 1 (arXiv 2410.00037) | 0.08 | 1 |
| Moshi theoretical latency (acoustic delay 1) | 0.16 | 2 |
| Moshi theoretical latency (acoustic delay 2) | 0.64 | 8 |
| Moshi pretraining text-audio delay, randomised | -0.6 to +0.6 | -7.5 to +7.5 |
| GLM-4-Voice streaming decoder block (arXiv 2412.02612) | 0.8 | 10 |
| DSM TTS audio delay (arXiv 2509.08753) | 1.28 | 16 |
| DSM ASR text delay, default (arXiv 2509.08753) | 2.5 | 31.25 (source: about 31) |
| Hibiki minimum target lag (arXiv 2502.03382) | at least 2 | at least 25 |
Moshi's 160 ms is one 80 ms frame plus one 80 ms acoustic-delay step: ms (derived decomposition). The paper reports about 200 ms in practice. With acoustic delay 2 the paper states a theoretical latency of 8 timesteps, 640 ms (arXiv 2410.00037). Confirmed
Do not generalise the 160 ms into a formula such as "(1 + delay) frames". Delay 2 would give 240 ms, not the 640 ms the paper quotes, and this chapter does not derive how the 8 timesteps decompose. Quote the two numbers as stated and say which acoustic delay each belongs to.
Video alignment
Video frames run at 25 or 30 fps, against 12.5 Hz for audio tokens. At 25 fps there are exactly 2 video frames per audio frame. At 30 fps there are , which is not an integer, so the two streams cannot share a frame grid (derived).
Video latents are coarser than pixel frames. Wan 2.1's causal VAE has a latent length of about for frames (arXiv 2503.20314), so 25 fps becomes 6.25 latent frames per second and 30 fps becomes 7.5 (derived).
Ovi aligns the two token rates without resampling. It runs RoPE on both streams and scales the audio RoPE frequencies by , so 31 video latent frames line up with 157 audio tokens (arXiv 2510.01284). That is about audio tokens per video latent frame (derived).
Say it right in the interview
| Term | What it counts | Example | Common slip |
|---|---|---|---|
| Sample rate | Waveform samples per second (Hz, kHz) | 24 kHz audio into Mimi | Calling it the frame rate |
| Hop | Spacing between STFT windows (ms) | 10 ms hop gives 100 Hz mel frames | Confusing it with the LLM's step |
| Frame rate | Latent vectors per second after an encoder or codec | Mimi 12.5 Hz, 80 ms per frame | Treating a frame as one token |
| Token rate | Discrete ids per second, summed over codebooks | Mimi 100 tokens/s | Saying "12.5 Hz" for it |
| Bitrate | Bits per second of the code | Mimi 1.1 kbps | Quoting it without codebook size |
| Chunk size | Audio processed or emitted per step; a multiple of frames | LLaMA-Omni 2: 400 ms; DuplexSLA: 160 ms | Using "chunk" and "frame" interchangeably |
| Stride | How far the input advances per step | DuplexSLA user stream: 80 ms | Equating it with the chunk |
| Delay (lookahead) | Offset between streams, or future context a model waits for | Moshi acoustic delay 1; DSM ASR text delay 2.5 s | Equating it with end-to-end latency |
| Latency | Time from an event to the response | Moshi 160 ms theory, about 200 ms practice | Comparing theory with measured numbers |
"I keep four numbers apart: sample rate, frame rate, token rate and chunk size. Mimi is 24 kHz in, 12.5 Hz frames, 100 tokens a second, and chunks are whatever the system batches on top."
Timing logic: choosing input and output rates
Two rates matter when you design a speech model: how fast audio enters the LLM, and how fast the LLM must emit audio frames. They are set by different forces, and the output rate is the one that fixes your latency floor. The clocks themselves are defined in Rates, frames and clocks; this section covers how to choose them. Numbers are cited to the paper; arithmetic is marked derived, reasoning is marked Inference.
The input path, step by step
- 16 kHz waveform, cut into 25 ms windows with a 10 ms hop: 100 Hz mel frames (arXiv 2212.04356).
- A Whisper-style encoder has a stride-2 convolution: 50 Hz, 20 ms per frame (arXiv 2212.04356; 50 Hz is derived).
- A pooling or adapter stage cuts the rate again, to 10 to 25 Hz before the LLM.
| System | Encoder rate | Rate into the LLM | How |
|---|---|---|---|
| Whisper (arXiv 2212.04356) | 50 Hz (derived) | not applicable (ASR model) | Conv stride 2 on 100 Hz mel |
| Qwen2-Audio (arXiv 2407.10759) | Whisper-large-v3 init, 25 ms window, 10 ms hop | 25 Hz (derived from 40 ms) | Pooling stride 2; the paper says each output frame is about 40 ms |
| Voxtral (arXiv 2507.13264) | 50 Hz | 12.5 Hz | 4x adapter |
| Granite-speech (arXiv 2505.08699) | 100 Hz log-mel, then 50 Hz | 10 Hz | 2x stacking, then Q-Former (K = 15, N = 3) |
| Qwen3-Omni AuT (arXiv 2509.17765) | 8x Conv2D downsample | 12.5 Hz; each temporal ID is 80 ms | Conv downsample inside the encoder |
| Kimi-Audio (arXiv 2504.18425) | 50 Hz Whisper features | 12.5 Hz | Adaptor "from 50Hz to 12.5Hz"; discrete semantic tokens also at 12.5 Hz |
| GLM-4-Voice tokenizer (arXiv 2412.02612) | 25 Hz encoder output | 12.5 Hz | 2x downsample, then VQ (single codebook) |
| Step-Audio 2 (arXiv 2507.16632) | 25 Hz tokenizer | 12.5 Hz | 2x adaptor on the LLM side |
Inference Input can be fast and continuous because the audio already exists. The encoder reads it in parallel with no sampling loop, so a high rate only costs encoder compute. Output must be generated one step at a time, each step conditioned on the last, so every extra frame per second is an extra serial LLM step. The pooling stage exists to move that cost out of the LLM, where each position is expensive.
The output path: what fixes the rate
The output rate is the frame rate of the audio codec (or tokenizer) the LLM predicts. Each frame becomes one id per codebook, so , and the bitrate adds the bits per id:
Mimi: bps (derived), matching the 1.1 kbps in the paper (arXiv 2410.00037). The paper states frame and stride correspond to 80 ms, and that 8 codebooks at 12.5 Hz give "a sequence length of 100 steps per second", against around 3 to 4 text tokens per second for English.
| Codec | Frame rate | Codebooks | Bitrate | Stated rationale |
|---|---|---|---|---|
| Mimi (arXiv 2410.00037) | 12.5 Hz | 8 | 1.1 kbps | 100 steps per second at Q = 8, against 3 to 4 text tokens per second |
| DAC (arXiv 2306.06546) | 44.1 kHz / 512, about 86 Hz (derived) | 9 (10 bits each) | not stated here | "A lower frame rate is desirable when training a language model", shorter sequences |
| SNAC speech (arXiv 2410.14411) | 12 / 23 / 47 Hz | 3 scales | 984 bps | Multi-scale, coarse to fine |
| WavTokenizer (arXiv 2408.16532) | 40 or 75 tokens/s | 1 | 0.5 / 0.9 kbps | Single quantizer, 24 kHz |
| X-Codec 2 (arXiv 2502.04128) | 50 Hz | 1 (65,536 codes) | 800 bps (derived) | none given |
| CosyVoice 2 (arXiv 2412.10117) | 25 Hz | 1 (FSQ, 6,561 codes) | not stated here | none given here |
| GLM-4-Voice (arXiv 2412.02612) | 12.5 Hz | 1 | 175 bps | "Ultra-low bitrate" |
| VibeVoice (arXiv 2508.19205) | 7.5 Hz | continuous VAE, no codebooks | not applicable | Lower rate "substantially reduces the number of decoding steps" |
| TaDiCodec (arXiv 2508.16790) | 6.25 Hz | 1 | 87.5 bps | Needs the text at decode time |
| SiTok (arXiv 2602.06602) | 12.5 Hz default | not covered here | not covered here | Default "to balance efficiency and performance" |
The deeper table of codec bitrates is in Codec frame rates, tokens per second, bitrate.
How to choose the output rate
- Sequence length and compute. Mimi's 100 steps per second is the figure the paper weighs against 3 to 4 text tokens per second (arXiv 2410.00037). VibeVoice's 7.5 Hz is chosen to cut decoding steps (arXiv 2508.19205).
- Reconstruction quality. WavTokenizer scores PESQ 1.70 and UTMOS 3.60 at 40 tokens/s against 2.37 and 4.05 at 75 (arXiv 2408.16532, Table 1). Pooling X-Codec 2 to a 25 Hz variant raises UTMOSv2 on seven languages, for example Dutch 2.168 to 2.457 (arXiv 2601.20185).
- Intelligibility and LM difficulty. SiTok WER is 23.0 at 6.25 Hz, 4.06 at 12.5 Hz and 3.05 at 25 Hz (arXiv 2602.06602). TaDiCodec reaches 6.25 Hz with WER 3.02, but removing the text input at decode causes "significant performance degradation under extremely low token rate" (arXiv 2508.16790). A probing study measures WavTokenizer WER at 11.37% (75 tokens/s) against 24.36% (40 tokens/s) (arXiv 2606.16969, Table 1); it says models below 50 Hz without architectural accommodations degrade, and it attributes its own DAC cliff to a training misconfiguration, so it is not evidence of an intrinsic floor.
- Text-rate matching. GLM-4-Voice alternates 13 text tokens and 26 speech tokens, a 1:2 ratio chosen so text generation is "consistently faster than speech" (arXiv 2412.02612). Details: text and audio clocks.
- Reaction granularity. Inference One frame is the smallest unit the model can emit or react to: 80 ms at 12.5 Hz, 40 ms at 25 Hz.
Why 12.5 Hz
Three pressures meet at 12.5 Hz, and a fourth sets the cost.
- Sequence length and compute. Voxtral cuts its 50 Hz encoder output with a 4x adapter to 12.5 Hz (arXiv 2507.13264). Thirty minutes (1,800 s) at 50 Hz is positions; at 12.5 Hz it is 22,500 (derived).
- Text-rate matching. Moshi puts English at around 3 to 4 text tokens per second against 100 audio steps per second at 8 codebooks (arXiv 2410.00037). At 12.5 Hz that is about frames per text token (derived).
- The quality knee. SiTok WER is 23.0, 4.06 and 3.05 at 6.25, 12.5 and 25 Hz (arXiv 2602.06602). Going from 12.5 to 25 Hz buys little; going to 6.25 Hz costs a lot.
- Reaction quantum. An 80 ms frame is shorter than the median 151 ms by which human listeners start speaking before the other turn ends in smooth floor transfers (arXiv 2608.25218). Inference So the frame is not the binding constraint on human-like timing.
- The cost. Pooling discards fine acoustic detail. Kimi-Audio keeps continuous 50 Hz Whisper features alongside its 12.5 Hz discrete semantic tokens (arXiv 2504.18425).
Who emits what, per frame
The LLM does not predict one text token per input speech frame. How text lines up with frames depends on the design:
| Design | What happens per frame or chunk | Source |
|---|---|---|
| Encoder + adapter (understanding, ASR) | Frames are context only. No per-frame prediction; text is generated afterwards, with no 1:1 alignment | Qwen2-Audio (arXiv 2407.10759), Voxtral (arXiv 2507.13264) |
| Chunked streaming ASR | Text tokens are generated per chunk until an end-of-chunk token; 1.28 s chunks | SpeechLLM-XL (arXiv 2410.03752) |
| Time-aligned delayed streams | One text-stream token per 80 ms frame, mostly PAD (about 65% in Moshi); DSM's ASR text lags audio by a default 2.5 s | Moshi (arXiv 2410.00037), DSM (arXiv 2509.08753) |
| Interleaved output | User speech is context; output alternates 13 text : 26 speech tokens, text leading | GLM-4-Voice (arXiv 2412.02612) |
| Full-duplex dual stream | Each frame: read user audio tokens, emit own text token and own audio tokens (K = 17 sub-steps) | Moshi (arXiv 2410.00037) |
So text and speech are 1:1 per frame only in time-aligned designs, and that is why those designs pad the text stream.
Decoupling the backbone rate from the output rate
If every codebook needed its own backbone step, Q codebooks at 12.5 Hz would force a Hz backbone. Designs avoid this by letting one backbone step cover many tokens:
- Moshi: a depth transformer fills K = 2Q + 1 = 17 sub-tokens within each 80 ms frame (arXiv 2410.00037).
- Qwen3-Omni Talker: a linear head predicts codebook 0 per frame, and an MTP module generates the residual codebooks (arXiv 2509.17765).
- VITA-Audio: ten audio tokens in a single forward pass, 3 to 5x speed-up (arXiv 2505.03739).
- MusicGen: a delay pattern shifts codebook k by k-1 steps, so one pass predicts all codebooks (arXiv 2306.05284).
- Patches: VibeVoice and DiTAR predict a patch per step, see continuous autoregression.
- DiffuPlex predicts multiple future user and assistant frames in one backbone wake: 1.46x and 1.59x wall-clock speedups (arXiv 2610.12214).
Minimums and rules of thumb
- Pool the encoder to 12.5 to 25 Hz before the LLM (arXiv 2507.13264, 2509.17765, 2412.02612, 2504.18425).
- Default output rate 12.5 Hz (arXiv 2410.00037, 2412.02612, 2509.08753, 2602.06602); SiTok shows a steep WER penalty below it.
- Go to 25 Hz when reconstruction is the bottleneck (arXiv 2412.10117, 2601.20185; SiTok has its best WER at 25 Hz, arXiv 2602.06602).
- A lower frame rate is cheaper for the LM (arXiv 2306.06546, 2410.00037).
- When interleaving, let text lead speech (arXiv 2412.02612 at 1:2; Moshi's 3 to 4 text tokens/s, arXiv 2410.00037).
- With many codebooks, emit several tokens per backbone step (arXiv 2410.00037, 2509.17765, 2505.03739, 2610.12214).
- Inference The minimum reaction time is one frame. Practical chunks are larger: Moshi's latency is 160 ms in theory and 200 ms in practice (arXiv 2410.00037); SyncLLM uses chunks of 160 to 240 ms (arXiv 2409.15594).
- Inference from the source 6.25 Hz is viable only when the transcript is available at decode time (arXiv 2508.16790, ablation).
Worked example
Derived from the rates above, not measured.
| 12.5 Hz, 8 codebooks, depth transformer | 25 Hz, 1 codebook (CosyVoice 2 style) | |
|---|---|---|
| Tokens per second | ||
| Frame period, deadline | 80 ms per frame | 40 ms per frame |
| Backbone steps per second | 12.5 (the depth pass fills the other 7 codebooks) | 25 |
| Minimum reaction quantum | one frame, 80 ms | one frame, 40 ms |
The 25 Hz design reacts twice as finely but runs the backbone twice as often (derived). The 12.5 Hz design runs the backbone half as often but adds a depth pass inside each 80 ms deadline. See the per-frame deadline.
"I keep five numbers apart. Sample rate is samples per second, like 24 kHz. Feature rate is the 100 Hz mel hop, encoder frame rate is 50 Hz, and the rate into the LLM is pooled to 12.5 Hz. Token rate is frame rate times codebooks, 100 per second for Mimi, and bitrate adds bits per token, 1.1 kbps. A chunk is a batch of frames, so it is a latency choice and not a rate."
Producing text and speech together: Moshi
Voice-to-voice models that "reason and talk" must emit text and audio at the same time. The sources show three coupling patterns. This section covers Moshi, the delayed parallel stream; the next covers delay as a knob and fixed interleaving. The control head that decides when to speak is in the full-duplex sections.
| Pattern | How text and audio line up | Models |
|---|---|---|
| Delayed parallel stream | Same clock; text and audio are separate token streams offset by a chosen delay | Moshi (arXiv 2410.00037), DSM (arXiv 2509.08753), Hibiki (arXiv 2502.03382) |
| Fixed interleave | One sequence; N text tokens, then M speech tokens, in a fixed ratio | GLM-4-Voice (arXiv 2412.02612), Step-Audio 2 (arXiv 2507.16632) |
| Thinker-Talker | The Talker uses the Thinker's hidden representations to produce audio tokens | Qwen2.5-Omni (arXiv 2503.20215), Qwen3-Omni (arXiv 2509.17765) |
Moshi: the codec and the clock
Moshi (arXiv 2410.00037) models speech with Mimi tokens at 12.5 Hz. Mimi has 8 RVQ levels of 2048 codes. The first level is a semantic code distilled from WavLM; the other seven are acoustic. The codec is causal, with an 80 ms frame. Confirmed
Each 80 ms frame holds 17 streams: 1 text token, 8 Moshi audio tokens and 8 user audio tokens ( with ). The user stream is just another input: the model hears the user continuously while it speaks.
Two transformers per frame
- Temporal transformer: 4096-dim, 32 layers, run once per frame over time. It is initialised from the Helium text LM (about 2.1T training tokens) and outputs a context vector.
- Depth transformer: 1024-dim, 6 layers, random initialisation. It turns the context vector into up to 17 sub-tokens inside the frame.
- The split keeps the big model at 12.5 steps per second. Only the small model runs 17 times per step. Inference
Inner Monologue: text, PAD and delays
Moshi predicts a text token for the agent's own speech on the same 12.5 Hz grid. Frames with no new word carry PAD. The paper also defines an EPAD token, inserted before the next word to mark the end of the padding. Padding is about 65% of text-stream tokens in English conversational speech.
Text is the first sub-step of each frame, so that frame's audio tokens are conditioned on it (derived from the sub-step order: text, Moshi audio, user audio). Inference
| Delay | Pretraining | Fine-tuning |
|---|---|---|
| Text-audio delay | Randomised from -0.6 s to +0.6 s | 0 |
| Acoustic delay | 2 steps | 1 step |
Latency follows from the delay: 160 ms theoretical with acoustic delay 1, about 200 ms in practice. The paper also gives 640 ms for acoustic delay 2. The recipe: Helium text LM, then 7M h of audio transcribed with Whisper large-v3 (single stream), then multi-stream post-training on diarised audio, a Fisher fine-tune (2,000 h of phone conversation), and instruction tuning on more than 20k h of synthetic speech (arXiv 2410.00037). Reported
"Moshi keeps text and audio on one 12.5 Hz clock and pads the text stream, about 65% PAD. A small depth transformer expands each 80 ms frame into 17 sub-tokens, so the big model runs only 12.5 times a second."
Ways to model streaming ASR and TTS in speech LLMs
Streaming ASR and streaming TTS each split into a handful of families, and each family answers two questions. For ASR: what sets the latency floor, and who decides when to emit a word? For TTS: does the text arrive complete or incrementally, how far does the decoder look ahead, and how many tokens come out per step? Numbers are the authors' own, on different hardware and test sets, so compare shapes, not digits. Background is in Streaming approaches for ASR, Streaming and low latency, Moshi and Delay and interleaving.
Streaming ASR families
| Family | Latency source | Future context | Quality trade-off | Examples |
|---|---|---|---|---|
| 1. Chunked encoder, LLM emits per chunk | Chunk length plus decode per chunk | Bounded by the chunk | WER 2.5 / 6.5 at 2.56 s, 2.7 / 6.7 at 1.28 s, 3.1 / 7.8 at 0.32 s | SpeechLLM-XL (arXiv 2410.03752) |
| 1b. Per-embedding wait token | 240 ms input frame plus 960 ms encoder right context | About 960 ms | 80M model, WER 3.0 / 7.4 on LibriSpeech; RTF 0.79 greedy | Speech ReaLLM (arXiv 2406.09569) |
| 2. Transducer with LLM predictor | Segment size | Depends on segment | 160 ms segment: 2.47 / 6.53 against 3.65 / 8.96 for a standard RNN-T | Transducer-Llama (arXiv 2412.16464) |
| 3. Time-aligned delayed text stream | Fixed delay (2.5 s default for ASR) | Supplied by the delay | 1.7 / 4.3 against 3.3 / 4.7 for streaming Parakeet-TDT-v2; delay precision about 300 ms | Kyutai DSM (arXiv 2509.08753) |
| 4. Read/write policies on an offline model | Chunk size and policy | Some look-ahead | LocalAgreement: 3.3 s long-form latency; Simul-Whisper: 1 s chunk, 1.46% average degradation (abstract) | LocalAgreement (arXiv 2307.14743), Simul-Whisper (arXiv 2406.10052) |
| 5. One encoder for streaming and offline | Attention window size | The window | 1.7B offline 2.69 average against streaming 3.33 | Qwen3-ASR (arXiv 2601.21337) |
Chunked (SpeechLLM-XL). A decoder-only model reads audio in fixed chunks and emits the chunk's text followed by an end-of-chunk token. Training uses CTC forced alignment and an auxiliary CTC loss weighted 0.5. Chunk length is the latency dial: test clean / other WER is 2.5 / 6.5 at 2.56 s, 2.7 / 6.7 at 1.28 s and 3.1 / 7.8 at 0.32 s (arXiv 2410.03752).
Wait token (Speech ReaLLM). An RNN-T-style blank or wait token is predicted after every input embedding, so the LLM decides per frame whether to emit. Latency is the 240 ms input frame plus 960 ms of encoder right context. The 80M model reaches WER 3.0 / 7.4 on LibriSpeech, with RTF 0.79 under greedy decoding (arXiv 2406.09569).
Transducer with an LLM predictor (Transducer-Llama). The transducer keeps its streaming alignment and uses a Llama as the prediction network. With 160 ms segments and a Llama3-8b predictor, WER is 2.47 / 6.53 against 3.65 / 8.96 for a standard RNN-T. The paper uses a weak-to-strong LM swap and MWER fine-tuning (arXiv 2412.16464).
Delayed stream (Kyutai DSM). Text and audio share a clock and the text is simply delayed, 2.5 s by default for ASR. DSM-ASR scores 1.7 / 4.3 on LibriSpeech clean / other, against 3.3 / 4.7 for streaming Parakeet-TDT-v2, with delay precision of about 300 ms (arXiv 2509.08753). This is the family from Delay and interleaving.
Read/write policies. These wrap an offline model. LocalAgreement takes the longest common prefix of n = 2 successive updates over a buffer of about 30 s trimmed at sentence boundaries, at 3.3 s latency on long-form audio in the abstract (Table 3: 3.62 s at a 1.0 s minimum chunk; arXiv 2307.14743). Simul-Whisper stops decoding at the end of the received audio using cross-attention, with truncation detection (arXiv 2406.10052). Its abstract reports 1.46% average degradation at a 1 s chunk; Table 1 gives 2.34 for Large-v2, so I treat the abstract figure with care.
Unified streaming and offline (Qwen3-ASR). The AuT encoder runs at 12.5 Hz with a flash-attention window of 1 to 8 s, so one model serves both modes. The 1.7B model averages 2.69 offline and 3.33 streaming (2 s chunks in the evaluation); the 0.6B model reaches a time to first token as low as 92 ms with vLLM (arXiv 2601.21337).
Inference Two families are not covered because I found no primary source: CTC partials with LLM correction, and learned read/write agents.
Streaming TTS families
| Family | Latency source | Text input | Key knob | Examples |
|---|---|---|---|---|
| 1. Full text, AR codec LM plus causal decoder | LM time to first packet plus decode | Complete (sentence) | Packet of 4 tokens = 320 ms | Qwen3-TTS (arXiv 2601.15621), Llasa (arXiv 2502.04128) |
| 2. Incremental text, interleaved | Text tokens needed before the first speech | Arrives incrementally | Ratio N : M | CosyVoice 2 (arXiv 2412.10117), SyncSpeech (arXiv 2502.11094), SpeakStream (arXiv 2505.19206) |
| 3. AR LM plus chunk-wise causal flow | Flow chunk plus look-ahead | Either | Chunk size, look-ahead | CosyVoice 2, Kimi-Audio (arXiv 2504.18425) |
| 4. Multi-token prediction | Forward passes per audio token | Model dependent | Tokens per pass, audio delay | VITA-Audio (arXiv 2505.03739) |
| 5. Fixed text : speech ratio in dialogue | First text chunk plus first speech chunk | From the model's own reply | Ratio, block size | GLM-4-Voice, MinMo, OmniFlatten, LLaMA-Omni 2 |
1. Full text, causal decoder (Qwen3-TTS). The tokenizer runs at 12.5 Hz and is causal with no look-ahead, so a packet of 4 tokens covers 320 ms. For the 0.6B model, time to first packet is 93 ms for the LM plus 4 ms of decode, 97 ms in total; the 1.7B model takes 101 ms (Table 2; arXiv 2601.15621). The Sesame CSM README documents a single generate call that returns a complete clip and no streaming mode (github.com/SesameAILabs/csm).
2. Incremental text, interleaved. CosyVoice 2 streaming mixes text and speech tokens at N = 5 to M = 15 (arXiv 2412.10117). SyncSpeech starts speaking after 2 text tokens, where CosyVoice 2 needs 5; its first packet takes 0.06 s against 0.22 s for CosyVoice 2 on LibriSpeech test-clean (arXiv 2502.11094). SpeakStream emits each word's speech after the word, using forced-aligned boundaries, at about 30 ms TTS latency (arXiv 2505.19206). This family fits a TTS that consumes another LLM's streamed output.
3. AR LM plus chunk-wise causal flow. CosyVoice 2 trains one flow-matching model under four masks: full-causal, chunk-M, chunk-2M and non-causal. Each mask sets how much future context a chunk sees (arXiv 2412.10117). The paper gives latency formulas, not a measured first packet. Kimi-Audio cuts audio into chunks of about 1 s and appends the next n semantic tokens (for example 4) from the following chunk before decoding. This is training-free and delays the first chunk by n tokens (arXiv 2504.18425, section 2.4).
4. Multi-token prediction (VITA-Audio). The MCTP module predicts about 10 audio tokens per forward pass. The audio token delay is 0, against 1 for Moshi and 13 for GLM-4-Voice (Table 1). The streaming first chunk drops from 236 ms to 53 ms (Table 9; arXiv 2505.03739).
5. Fixed ratio in dialogue models. GLM-4-Voice interleaves 13 text : 26 speech tokens in 0.8 s blocks (arXiv 2412.02612). MinMo uses 5 semantic : 15 speech tokens, with about 600 ms end to end (arXiv 2501.06282). OmniFlatten uses 2 : 10 and reports 193 ms against Moshi at 553 ms (arXiv 2410.17799). LLaMA-Omni 2 reads R = 3 and writes W = 10 tokens; its first speech chunk takes about 583 ms on 7B, the sum of LLM, TTS, flow and vocoder time (arXiv 2505.02625).
Inference A sixth family, non-autoregressive or flow models run chunk by chunk, is not covered because I found no primary streaming paper for F5 or ZipVoice.
How to choose
- Text is complete before speech starts: use a full-text AR codec LM with a causal decoder (Qwen3-TTS reaches 97 ms).
- Text arrives token by token from another LLM: use an interleaved ratio model (CosyVoice 2, SyncSpeech).
- ASR needs partials at a fixed, acceptable delay: use a DSM-style delayed stream. SpeechLLM-XL gives the WER-versus-chunk curve if you prefer chunks.
- You already run Whisper: use Simul-Whisper for no retraining, or LocalAgreement for simplicity at the cost of more WER at the same latency.
Inference This maps onto the unified speech LLM design. The listen head is a delayed-stream or chunked ASR. The speak head is incremental-text interleaved TTS, consuming the tokens that the downstream reasoning LLM streams out.
"Streaming ASR comes in a few families: chunks with an end-of-chunk token, a per-frame wait token, a delayed text stream, or a read/write policy on top of Whisper. Streaming TTS depends on whether text arrives complete or token by token, so I would use interleaved text and speech for a speak head fed by another LLM. For listening I would take a delayed stream or chunked ASR, because chunk length or delay is the one dial that trades WER for latency."
The sources contradict themselves in places. DSM-TTS appears with 1.28 s in one place and 1.6 s in another. Simul-Whisper's abstract and its Table 1 disagree, and MinMo's abstract (about 100 ms speech to text) differs from section 4.5 (95 and 150 ms). Numbers from different hardware and test sets are not comparable.
Delay as a knob and interleaved decoders
Moshi's text-audio offset is a design choice, and other systems make the same choice differently. This section covers delay as a knob (DSM, Hibiki) and the fixed-ratio interleaving families.
DSM: delay as a knob
Delayed Streams Modeling (arXiv 2509.08753) pre-aligns streams and applies a fixed delay per stream. In the paper's framing, ASR corresponds to the text stream being delayed relative to audio, and TTS to the opposite.
| Task | Delayed stream | Delay | Authors' result |
|---|---|---|---|
| ASR | Text, behind audio | 2.5 s default, about 31 frames | Short-form average WER 6.4 (Canary-Qwen-2.5B 5.6; Whisper large-v3 7.5) |
| TTS | Audio, behind text | 1.28 s, 16 steps | Latency 150 ms at batch size 1 |
Inference Delay becomes a per-stream setting, not an architecture. ASR needs audio lookahead before it commits a word. TTS needs text lookahead before it commits prosody. For "text and voice at once", the same decoder with a chosen offset is the lever.
Hibiki: per-word delay
Hibiki (arXiv 2502.03382) is a multistream decoder-only model for speech translation. It sets a delay per word, using the perplexity of an off-the-shelf text translation model (MADLAD-3B) on source prefixes. The target is required to lag the source by at least 2 s. The authors report LAAL of 3.4 s on short-form and 5.0 s on long-form audio, against Seamless at 2.8 s and 4.2 s. On the same tables Hibiki scores ASR-BLEU 35.5 against Seamless at 33.8 (short-form) and 26.6 against 23.9 (long-form).
Interleaving and streaming decoders
| Model | Mechanism | Rates and latency |
|---|---|---|
| GLM-4-Voice (arXiv 2412.02612) | Interleave 13 text : 26 speech tokens; open weights | 12.5 Hz single codebook, 175 bps; streaming decoder block of 10 tokens = 0.8 s |
| Mini-Omni (arXiv 2408.16725) | Text-delay parallel decoding over the 8 codebook layers of SNAC; batch-parallel inference to carry text reasoning into audio | Not stated here |
| Mini-Omni2 (arXiv 2410.11190) | Command-based interruption ("Stop Omni") through frame-level irq / n-irq tokens | Not stated here |
| LLaMA-Omni 2 (arXiv 2505.02625) | Streaming decoder from Qwen2.5-0.5B; read R = 3 fused representations, write W = 10 speech tokens | 25 Hz; 400 ms chunk (derived); response latency 542.7 ms (0.5B) to 663.3 ms (14B), authors' Table 1 |
| VITA-Audio (arXiv 2505.03739) | Multiple Cross-modal Token Prediction (MCTP) module emits several audio tokens per forward pass; trained on open-source data only | The authors report a 3 to 5x inference speedup at 7B |
| Qwen2.5-Omni (arXiv 2503.20215) | Talker uses Thinker hidden representations to produce audio tokens; sliding-window DiT with a lookback of 2 blocks and a lookahead of 1 | Not stated here |
| Qwen3-Omni (arXiv 2509.17765) | Talker predicts codebook 0 per frame; ~80M MTP module predicts residual codebooks; causal ConvNet Code2Wav decodes frame by frame | 12.5 Hz; theoretical cold-start first-packet latency 234 ms (audio), 547 ms (video) |
| Step-Audio 2 (arXiv 2507.16632) | Text and audio tokens interleaved at a fixed ratio; flow-matching module + HiFi-GAN vocoder; Step-Audio 2 mini is open-source | Encoder 25 Hz, adaptor 12.5 Hz |
| Kimi-Audio (arXiv 2504.18425) | Parallel text and audio heads; flow-matching detokenizer turns 12.5 Hz semantic tokens into 50 Hz mel, then a vocoder, chunk-wise with look-ahead | Not stated here |
Reported All latencies are the authors' own figures under different hardware and definitions.
Inference Moshi aligns text to the clock (padding fills the gaps). Interleaving aligns text to the order (no clock, so no padding, but no free time axis). Thinker-Talker separates the two jobs: the Thinker can finish a thought before the Talker voices it. I found no source here that shows sustained reasoning and live speech together in one duplex model.
A ratio is not a duration. "13:26" tells you the mix of tokens, and only the speech token rate turns it into seconds. "First chunk" latency is also not the same as steady-state delay.
"DSM shows the offset between streams is a setting: delay the text for ASR, delay the audio for TTS. Interleaving models fix an order instead of a clock, so a ratio like 13:26 only becomes a duration through the speech token rate."
Full-duplex models compared
A full-duplex model listens while it speaks. Backchannels, overlaps and barge-in then come from the model's own decisions, not from a VAD timer. The sources group the designs by where the "speak or listen" decision lives.
Survey levels L0 to L3
A 2026 survey (arXiv 2606.19453) defines four levels. L0 is an external scheduler around a half-duplex model. L1 is a control head reading the LLM's hidden states. L2 encodes the duties in the token stream itself. L3 is representation-level and not realised yet. Its line to remember: "architecture sets capacity, training realizes it".
Inference My mapping: control-head models are L1; dual-stream, flattened, chunked and action-channel models are L2.
Families and numbers
| Family | Model | How it works | Reported numbers |
|---|---|---|---|
| Dual-stream | Moshi (arXiv 2410.00037) | User and agent audio plus agent text on one 80 ms clock | 160 ms theory, about 200 ms practice |
| Dual-stream | PersonaPlex (arXiv 2602.06053) | Moshi-based duplex model; hybrid system prompt of a text role prompt plus a voice-cloning speech sample | Model card, Full-Duplex-Bench: smooth turn-taking latency 0.170, user-interruption latency 0.240 (units not stated); NVIDIA Open Model License (model card) |
| Time-synchronous chunks | SyncLLM (arXiv 2409.15594) | 160 to 240 ms chunks of 25 Hz HuBERT tokens | Designed for Internet latencies of up to 240 ms |
| Flattened | OmniFlatten (arXiv 2410.17799) | Input speech, output text and output speech interleaved in one sequence; text chunks of 2, speech chunks of 10 | Average assistant turn-taking response time 193 ms against Moshi's 553 ms (authors' Table 4) |
| Control head | MinMo (arXiv 2501.06282) | Full-duplex predictor (one Transformer layer, about 18M parameters); still needs separate AEC and VAD modules; voice token LM interleaves 5 semantic vectors : 15 speech tokens | About 600 ms in theory, 800 ms in practice (authors) |
| Control head | Freeze-Omni (arXiv 2411.00774) | Frozen LLM; chunk-wise state prediction from the LLM's last layer: keep receiving speech, or the chunk ends the user's speech (with or without interrupting) | 745 ms total latency in the authors' latency breakdown |
| Time-division multiplexing | MiniCPM-o 4.5 (arXiv 2604.27393) | "Omni-Flow" groups visual, audio and output per chunk | Ablation of 1.0, 0.2 and 0.1 s chunks: the 0.2 and 0.1 s rows score lower; backbone needs 3-4 decoding steps per second |
| Three channels | DuplexSLA (arXiv 2605.20755) | 160 ms chunk clock; assistant TA4 (1 text + 4 audio); action channel: response, interrupt, backchannel; initialised from Step-Audio 2 mini | Turn-taking delay 0.27 s normal, 0.40 s interrupt, 0.32 s backchannel (authors' benchmark) |
| Rolling masked diffusion | DiffuPlex (arXiv 2610.12214) | 12.5 Hz; maximum look-ahead W = 16 frames; one backbone wake predicts several future frames | 1.46x to 1.59x deployment-path wall-clock speed-up (authors) |
Moshi's 160 ms is theoretical; MinMo gives theory and practice; Freeze-Omni averages total latency; PersonaPlex and DuplexSLA report turn-taking delays on their own tests. Hardware and definitions differ. Quote a number with its definition, never as a ranking.
Reported Most figures are authors' own. On DuplexSLA-Bench (self-reported, arXiv 2605.20755), backchannel accuracy is 0.33% for gpt-realtime-1.5 (semantic-vad-high), 40.00% for gemini-3.1-flash-live and 98.33% for DuplexSLA. Instruct-FD (arXiv 2607.20460) finds the best of six full-duplex systems follows turn-taking instructions 64.4% of the time.
Wiring the decision and the turn-taking feel
The same families can be read as three wirings of one decision. The wiring explains most of what makes a duplex model feel like, or unlike, a person talking.
Three ways to wire the decision
- Dual-stream: no separate decision; speaking and listening are both tokens on every frame.
- Flattened: one sequence, so who speaks is decided by which role's tokens come next.
- Control head: a small classifier reads hidden states and gates a mostly unchanged LLM. This is why Freeze-Omni can keep its LLM frozen.
The 2026 survey (arXiv 2606.19453) calls SyncLLM an L2-shaped but "apparent (not substantive)" full-duplex system.
What causes the turn-taking feel
Inference Two causes follow from the sources, both about the decision and not about speech quality:
- Decisions quantised at chunk boundaries. A decision waits for the next boundary, on average for chunk length (derived). That is 40 ms for an 80 ms frame, 120 ms for a 240 ms chunk and 500 ms for a 1.0 s chunk.
- Scarce interaction data. The 2025 survey names synchronous data scarcity (arXiv 2509.14515). The 2026 survey finds that observed behaviour is constrained by the interaction patterns in training and evaluation (arXiv 2606.19453).
A related finding: audio foundation models miss when to speak, interrupt too aggressively and rarely backchannel (Talking Turns, arXiv 2503.01174). Inference My reading: the speech path is not the bottleneck. The bottleneck is the duplex decision, plus ingesting user audio while the model is speaking its own.
The closest patterns are DSM-style delay streams plus an action channel (DuplexSLA), or a token-level L2 design like Moshi. I found no source here that shows sustained reasoning and speech together in a duplex model, so name that as the open problem.
"The speech path is not the hard part. The hard part is the decision, which is quantised by chunk size and limited by the interaction patterns in the training data. So I would compare duplex systems on interaction metrics at a fixed operating point, not on a single latency number."
Turn-taking prediction and the human baseline
Turn-taking is a prediction problem: when does the other speaker stop, and should I start? The field moved from stand-alone predictors to end-of-turn detectors in cascades, and now to duplex models that fold the decision into generation.
Predictors: TurnGPT and VAP
- TurnGPT (Ekstedt and Skantze, Findings of EMNLP 2020, arXiv 2010.10874): a transformer language model that predicts turn shifts in spoken dialogue from text.
- Voice Activity Projection, VAP (Ekstedt and Skantze, Interspeech 2022, arXiv 2205.09812): a self-supervised predictive objective on the voice activity of both speakers, so turn-taking models train without labels.
- Multilingual VAP (LREC-COLING 2024, arXiv 2403.06487): English, Mandarin and Japanese. A model trained on one language predicts poorly on the others; one multilingual model performs on par with the monolingual ones and learns to identify the input language.
End-of-turn models in production
| Model | Design | Reported by the vendor |
|---|---|---|
| LiveKit Turn Detector v1 (17 Jun 2026) | Semantic branch (audio encoder, adapter, fine-tuned LLM) fused with an acoustic branch; works from speech, not a transcript | 14 languages. On LiveKit's eot-bench: 9.9% false cutoffs at a 300 ms budget, 4.5% at 600 ms; 543 ms mean latency at 5% false cutoffs, 295 ms at 10% |
| Pipecat Smart Turn v3 (Daily) | About 8M parameters: Whisper Tiny encoder plus a linear classifier; BSD 2-clause | 23 languages; 8 MB quantised; as little as 10 ms on some CPUs, under 100 ms on most cloud instances |
| Deepgram Flux | End-of-turn detection inside the STT model | "~260ms end-of-turn detection" (Deepgram docs) |
Reported These are vendor numbers, measured on different benchmarks and conditions, so do not rank the vendors from this table. The eot-bench framing is worth borrowing: false-cutoff rate at a fixed latency budget (300 or 600 ms), and mean latency at a fixed false-cutoff target (5% or 10%). It compares systems at an operating point, not at a single threshold.
The human baseline
On smooth transfers, humans start speaking a median of 151 ms before the other turn ends (TurnBench, arXiv 2608.25218). Define the floor-transfer offset as
A cascade that waits for silence can only produce . A negative offset needs prediction, which is what VAP and duplex models do. Inference
TurnBench (arXiv 2608.25218, Aug 2026) is an annotated benchmark of end-of-turn (EOT) and interruption detection. The authors report about 30 h of dual-channel dyadic speech in 154 dialogues, each triple-annotated. A segment is gold when at least 2 of 3 annotators give the same label with endpoints within ms. Results are recall, false-positive rate (FPR) and median latency, across 14 turn-taking systems.
| VAP baseline | Recall | FPR | Median latency |
|---|---|---|---|
| End of turn | 0.845 | 0.055 | 368 ms |
| Interruption | 0.945 | 0.107 | 994 ms |
The TurnBench authors state the open problem: no current system matches human timing without excessive false positives.
"Humans start a median 151 ms before the other turn ends, so the target offset is negative, which needs prediction. I would report floor-transfer offset against that baseline, at a stated false-interruption rate."
Backchannels, barge-in and self-voice
A good duplex agent tells a backchannel from a barge-in, and does not mistake its own voice for the user's. Both are decision problems with an echo problem underneath.
Backchannel against barge-in
A backchannel ("mm-hm") signals attention and leaves the floor with the speaker. A barge-in takes the floor. Inference A characteristic failure follows: the system treats a backchannel as a barge-in and stops talking.
- Reported DuplexSLA-Bench (arXiv 2605.20755, Table 6, context-prefill setting, authors' numbers): backchannel accuracy 0.33% for gpt-realtime-1.5 with semantic VAD, 40.00% for gemini-3.1-flash-live, 98.33% for DuplexSLA.
- Talking Turns (ICLR 2025, arXiv 2503.01174): in a user study, audio foundation models sometimes miss when to speak, interrupt too aggressively and rarely backchannel. It uses a supervised turn-event model as judge, with test benchmarks curated from Switchboard.
- Full-Duplex-Bench v1.5 (arXiv 2507.23159) scores user interruption, user backchannel, talking to others and background speech. It measures categorical behaviour, stop and response latency, and prosodic adaptation.
Inference Two numbers define good barge-in handling: stop latency, the time from user onset to the last audible agent sample, and the false-yield rate, how often a backchannel, laugh or background voice stops the agent. Optimising only one of them breaks the other.
The full metric proposals, with operating points, are in conversational evaluation; training for these behaviours is in online RL and rewards.
Self-voice and echo
A duplex model hears the speaker output it just produced, unless something removes it. MinMo's duplex module still requires separate acoustic echo cancellation (AEC) and VAD modules (arXiv 2501.06282). SALMONN-omni (arXiv 2411.18138) is instead described as listening to its own generated speech and background sounds while speaking, and SALM-Duplex (arXiv 2505.15670) targets barge-in and turn-taking.
Inference A model that hears its own output needs an explicit reference-signal path: the playback signal goes in as an extra input, so the model or the AEC can subtract what it said from what the microphone heard. Measure stop latency on echo-cancelled output, or a barge-in test passes for the wrong reason.
A low stop latency alone is not good turn-taking. An agent that stops at every cough scores well on stop latency and badly on false yields. Report both at a stated operating point.
"A key failure is treating a backchannel as a barge-in. I would report stop latency on echo-cancelled output together with false-yield rate, at one operating point."
Streaming inference: deadlines and first packets
A duplex model is a real-time loop, not a request-response call. It must produce a frame on a fixed clock for as long as the session lasts, even when nobody is talking. This section turns the earlier rates into engineering budgets.
The per-frame deadline
Inference Moshi (arXiv 2410.00037) runs at 12.5 Hz, so it has a hard deadline of 80 ms per frame: one temporal pass plus up to 17 depth sub-steps (the paper's K = 17 streams). A missed deadline is an audible gap, because the audio must keep flowing.
The standard check is the real-time factor (RTF), compute time divided by audio time:
RTF below 1 is necessary and not sufficient: the worst frame must still fit in 80 ms. MiniCPM-o 4.5 reports RTF 0.21 (INT4) to 0.27 (FP16) with llama.cpp-omni on an RTX 4090 (arXiv 2604.27393). Reported That is 210 to 270 ms of compute per second of audio (derived).
LLaMA-Omni 2 (arXiv 2505.02625) shows the chunk version of the same arithmetic. Speech tokens run at 25 Hz, so each is 40 ms and a 10-token chunk is 400 ms. The authors report a 542.7 to 663.3 ms first chunk, so roughly 140 to 260 ms of overhead sits on top of the chunk (derived). Inference
The deadline can be relaxed by waking the backbone less often than once per frame. DiffuPlex (arXiv 2610.12214) predicts several future user and assistant frames in one backbone wake, using rolling masked diffusion over an 80 ms interaction interval. The authors report 1.46× (LISTEN) and 1.59× (SPEAK) deployment wall-clock speedups, and 1.61× and 1.80× for the core LM alone.
Chunk size trade-offs
| System | Chunk or block |
|---|---|
| Moshi (arXiv 2410.00037) | 80 ms frame |
| DuplexSLA (arXiv 2605.20755) | 160 ms chunk, 80 ms user stride |
| SyncLLM (arXiv 2409.15594) | 160, 200 or 240 ms chunks |
| LLaMA-Omni 2 (arXiv 2505.02625) | 400 ms (10 tokens at 25 Hz) |
| GLM-4-Voice decoder (arXiv 2412.02612) | 0.8 s (10 tokens at 12.5 Hz) |
| MiniCPM-o 4.5 (arXiv 2604.27393) | 1.0 s preferred in ablation over 0.2 s and 0.1 s |
MiniCPM-o's ablation (arXiv 2604.27393) finds 1.0 s gives the best balance. The authors report that shorter chunks leave less modelling budget for control and generation, and that too-short chunks lack enough information per window, causing substantial degradation. Inference Shorter chunks cut the average wait for a decision (, derived) but pay the per-step cost more often. Smaller is not automatically better.
First packet against chunk
The first packet is the time until the first playable audio. The chunk is the granularity after that. They are different numbers.
| System | First-audio figure | Condition |
|---|---|---|
| Qwen3-TTS (arXiv 2601.15621) | 97 ms | Authors, 12 Hz tokenizer |
| DSM TTS (arXiv 2509.08753) | 150 ms latency | Batch 1 (about 380 ms at batch 32), 1.8B model |
| VITA-Audio (arXiv 2505.03739) | 236 ms vanilla, 53 ms Boost | First audio token chunk only, not end to end |
| Qwen3-Omni (arXiv 2509.17765) | 234 ms audio, 547 ms video | Cold start, concurrency 1 |
| FlashTTS (arXiv 2606.09141) | First-packet latency 325 ms, against 843 ms for CosyVoice 2 | 2 NFE decoder |
| LLaMA-Omni 2 (arXiv 2505.02625) | 542.7 to 663.3 ms | Total first chunk, one L40, 0.5B to 14B |
These are authors' numbers on different hardware, batch sizes and definitions (first packet, first chunk, cold start). Never rank systems from this table.
Streaming inference: memory and many sessions
Memory, not compute, often sets how many duplex sessions one GPU can hold. This section covers the cache, long sessions and batching.
KV-cache growth
Inference This arithmetic is derived under stated assumptions: full multi-head attention, bf16 storage, and only the temporal transformer counted (32 layers, model dimension 4096, from Moshi's Table 1, arXiv 2410.00037). The depth transformer's cache can be discarded each frame.
The leading 2 is keys plus values; the trailing 2 is bytes per bf16 value. At 12.5 frames per second that is 512 KiB MiB per second, or about 23 GB for one hour (derived). Grouped-query attention would shrink it.
The cache grows linearly with session length and with the number of sessions. Inference For many concurrent sessions, cache memory, not weights, sets capacity.
Long sessions
- The Moshi paper states the model follows multi-turn conversations across 5 minutes (arXiv 2410.00037). Ask what happens beyond that before claiming more.
- One windowing pattern for audio is block-local attention in Qwen2.5-Omni's streaming codec DiT: 2 blocks of lookback and 1 of lookahead (arXiv 2503.20215).
- For video, Self Forcing (arXiv 2506.08009) uses a rolling KV cache for autoregressive video extrapolation at inference. It is a related pattern for unbounded streams, but it is a video model.
Batching many duplex sessions
Inference A turn-based server pays nothing for an idle chat. A duplex session is always active: it needs one frame every 80 ms, including silence. Batching sessions into one GPU step helps throughput, but the whole batched step still has to finish inside 80 ms. The sustainable batch size is the largest with ms.
DSM-TTS reports 150 ms latency at batch size 1 and about 380 ms at batch size 32 (arXiv 2509.08753, Table 6), so latency figures depend on load.
Streaming decoders and the latency budget
The decoder streams too, and its lookahead is latency. This section ends with the end-to-end budget and a checklist.
Streaming codec decoding
The decoder must also stream, and any lookahead it needs is added latency.
| System | Streaming decode |
|---|---|
| Mimi (arXiv 2410.00037) | Causal encoder and decoder; 80 ms frames |
| Qwen3-Omni (arXiv 2509.17765) | Lightweight causal ConvNet (Code2Wav) replaces block-wise diffusion |
| Qwen2.5-Omni (arXiv 2503.20215) | Codec DiT with 2 blocks lookback, 1 block lookahead |
| CosyVoice 2 (arXiv 2412.10117) | Chunk-aware causal flow matching for streaming and non-streaming synthesis |
| Kimi-Audio (arXiv 2504.18425) | Chunk-wise autoregressive detokenizer with look-ahead (example: 1 s chunk, 4 future semantic tokens) |
| GLM-4-Voice (arXiv 2412.02612) | 0.8 s decoder blocks; at least 10 speech tokens needed for the first output |
Inference One block of lookahead costs one block of delay. A fully causal decoder such as Mimi's pays none, which is part of why 160 ms is achievable.
Where latency hides
| Stage | Contribution | Source status |
|---|---|---|
| Network | SyncLLM (arXiv 2409.15594): handles latencies up to 240 ms; performance holds to about 200 ms and drops at 240 ms | Reported |
| Input framing | Up to one frame, 80 ms at 12.5 Hz | Derived |
| Model delay | Moshi (arXiv 2410.00037): acoustic delay of 1 step (80 ms) in post-training, 2 in pre-training | Confirmed |
| Decision wait | on average for chunk | Derived |
| Decode lookahead | One block per block of lookahead | Inference |
| Echo cancellation, VAD, playout buffer | No figure cited here | Gap |
| Gap between theory and practice | Moshi abstract: 200 ms in practice against 160 ms theoretical, so about 40 ms | Derived |
Checklist
- Report latency with its definition: theory, first packet, first chunk, turn-taking delay or total.
- State batch size, GPU and whether the run was cold start.
- Measure the worst frame, not just RTF; a missed 80 ms deadline is audible.
- Compute the KV-cache cost per session before promising concurrency.
- Test barge-in on echo-cancelled output and report stop latency.
- Add the decision wait when comparing chunked and per-frame systems.
- Run a session past the reported context (Moshi: 5 minutes) to see what happens at the limit.
"A duplex model has an 80 ms deadline every frame, silent or not. So I budget the worst frame, the cache per session and the decision wait, and I quote latency with its definition and load."
Pre-training and post-training speech-to-speech models
Nearly every open speech-to-speech model follows one recipe. Start from a strong text LLM, add speech tokens, pretrain on ASR, TTS and interleaved speech-text, run spoken-dialogue SFT, then apply DPO or RL on the text side and sometimes the speech side. The real choice is whether the text backbone stays frozen or trains on a mixed corpus.
Every recipe below is the authors' own account in the cited paper. For the TTS-only post-training view (WER and SIM rewards, hacking), see Post-training and evaluation for speech generation. The reward details for online RL are in the next section.
Stage-by-stage recipes
| System | Recipe | Frozen vs trained |
|---|---|---|
| Moshi (arXiv 2410.00037) | Helium text LM on 2.1T tokens; 7M h unsupervised audio, with half the batches text-only; multi-stream post-training; Fisher (2,000 h) fine-tuning; instruction tuning on >20k h of synthetic speech | Temporal Transformer built on the Helium text LM |
| GLM-4-Voice (2412.02612) | 12.5 Hz single-codebook tokenizer (VQ on whisper-large-v3, 700k h); init GLM-4-9B-Base; interleaved data synthesised from text corpora; SFT template alternates 13 text and 26 speech tokens; no DPO or RL stage described | All trained, with a text-only share in pretraining |
| Kimi-Audio (2504.18425) | >13M h audio; 585B audio + 585B text tokens, one epoch; init Qwen2.5-7B; 12.5 Hz semantic tokens plus 50 Hz continuous Whisper features; SFT ~300K h | Whisper extractor frozen for the first ~20% of pretraining |
| Step-Audio 2 (2507.16632) | 1.356T tokens: adaptor only on 100B ASR tokens, then +6.6K audio tokens, 800B tokens, 200B cooldown with synthesised S2S; SFT 4B tokens; PPO then GRPO | Audio encoder frozen throughout |
| Qwen2.5-Omni (2503.20215) | Stage 1 encoders; stage 2 all parameters; stage 3 32k context. Talker: context continuation, DPO, multi-speaker instruction tuning | LLM frozen in stage 1 only |
| Qwen3-Omni (2509.17765) | AuT encoder from scratch on 20M h; Thinker stage 2 ~2T tokens. Talker: monotonic mapping, long-context pretraining, DPO, speaker fine-tuning. Then SFT, strong-to-weak distillation, GSPO | LLM frozen in stage 1 only |
| MinMo (2501.06282) | Alignment in four stages: speech-to-text ~1.2M h, text-to-speech ~170k h, speech-to-speech ~10k h, duplex 4k h human-human. No DPO or RL | LLM frozen in full alignment, LoRA in SFT; duplex trains only an ~18M predictor |
| LLaMA-Omni 2 (2505.02625) | Qwen2.5 0.5B to 14B; 200K multi-turn speech dialogues; I(a) speech-to-text, I(b) TTS LM, II gate fusion and TTS LM | Speech encoder frozen in stage I(a); encoder, adapter and LLM frozen in stage II |
| Freeze-Omni (2411.00774) | CTC encoder on ~110k h ASR; prompt embedding on 60k multi-round QA; ~120M speech decoder on ~3,000 h; three-state duplex classifier | LLM frozen throughout |
| VITA-Audio (2505.03739) | Four stages; ASR and TTS ~100k h each; MCTP modules added in stages 2 to 3; SFT on 1.4M speech QA samples | Audio encoder and decoder frozen in stage 1 |
| Baichuan-Audio (2502.17239) | 887k h pretraining; 12.5 Hz 8-layer RVQ tokenizer; flow-matching decoder on ~270k h | Stage 1 LLM frozen; stage 2 all but text embedding and LM head |
Reported All rows are the authors' own accounts.
Frozen backbone or mixed text: fighting forgetting
Freeze the LLM
- Freeze-Omni and MinMo keep the text capability by construction.
- LLaMA-Omni 2 freezes the LLM in stage II; Qwen2.5-Omni and Baichuan-Audio freeze it in stage 1.
- Inference The cost is a ceiling on how deeply speech can shape the representations.
Train on a mixed corpus
- Moshi keeps half the pretraining batches text-only; Kimi-Audio uses 585B text tokens beside 585B audio tokens; Step-Audio 2 mixes text and audio tokens.
- Speech and text share one set of weights, so the mix ratio is a tuned hyperparameter.
- An unbalanced mix is the main risk.
Confirmed Adding speech capability can degrade knowledge and reasoning even for text inputs, and more for spoken queries (arXiv 2509.14930). SALAD (arXiv 2510.13632) reports that speech-adapted LLMs underperform their text counterparts and attributes the gap to forgetting and cross-modal misalignment.
Interleaved synthetic pretraining and spoken instruction data
Interleaved pretraining (arXiv 2411.17607) synthesises interleaved speech tokens from text spans with a text-to-token model and a 12.5 Hz supervised tokenizer. It used 1T tokens including 600B synthetic interleaved. Spoken QA rose from 13% (Moshi) to 31%.
Spoken instruction data is synthetic almost everywhere: an LLM writes the dialogue and TTS renders it. Moshi uses over 20k h of synthetic speech (arXiv 2410.00037), and Step-Audio 2 adds synthesised speech-to-speech data in its cooldown (arXiv 2507.16632). Inference The risk is TTS voice and prosody leakage into the model's own speaking style; mix in real recorded turns and many TTS voices.
Preference, RL and distillation
- DPO on text tokens. Moshi-Aligned (arXiv 2506.21463) applies length-normalised DPO to text-token probabilities only, because audio-token probabilities are unstable. It uses 93,490 pairs (27% timing, 73% content), judged by Mistral Large 2. Averaged QA moved 36.1 to 39.2 and safety 70.9 to 77.8 (Moshi-Instruct to Moshi-Aligned).
- Talker DPO. Qwen2.5-Omni ranks preference triplets by WER and punctuation-pause error. Qwen3-Omni runs DPO on multilingual pairs in a four-stage Talker.
- RL. Step-Audio 2 runs PPO with a binary conciseness reward on the thinking trace (60 iterations), PPO with a learned reward model (120), then GRPO for audio perception (400). Qwen3-Omni uses GSPO with rule-based and model-based rewards.
- Distillation. Qwen3-Omni distils strong to weak: off-policy, then on-policy KL against Qwen3-32B and 235B teachers.
Duplex post-training and evaluation gates
DuplexPO (arXiv 2607.07148) runs GRPO-style RL on selected windows from long human conversations. Its four-part reward (FCDR) covers turn initiation, backchanneling, yielding and regularised participation, with a Qwen2.5-7B-Instruct backbone. Reported Intelligence gains are small (Llama Questions 75.3 versus 72.0 for the SFT baseline, Table 4). The point is that timing is optimised without touching content.
Synthesis
| Stage | Objective | Typical data | Main risk |
|---|---|---|---|
| Tokenizer | Discrete semantic tokens, 12.5 to 25 Hz | Whisper-based VQ, ASR pseudo-labels (GLM-4-Voice 700k h) | Collapse, acoustic loss at low rate |
| Modality alignment | Audio encoder into the LLM | ASR ~100 to 110k h | Forgetting if unfrozen |
| Speech-text pretraining | Joint next-token | Interleaved synthetic plus unlabelled (Moshi 7M h, Kimi 13M h) | Forgetting, unbalanced mix |
| Speech decoder | Token to waveform | TTS pairs, ~3k h (Freeze-Omni) to 270k h (Baichuan) | Prosody drift, speaker leakage |
| Spoken SFT | Instruction following | Synthetic dialogues (LLaMA-Omni 2 200K; Kimi 300k h) | TTS voice overfit, weak paralinguistics |
| Preference | Better spoken replies | Pairs (Moshi-Aligned 93k) | Audio-token instability, judge bias on timing |
| RL | Quality, reasoning length | Rule and model rewards | Hacking, length collapse |
| Distillation | Text capability into speech | Teacher outputs | Teacher-student mismatch |
| Duplex | Turn-taking, barge-in | Human conversation (MinMo 4k h, Fisher) | Latency versus false interruption |
Proposed recipe for a full-duplex text+voice model
- Freeze a trusted text LLM; train the encoder and adaptor on ASR.
- Train a semantic-first 12.5 Hz supervised tokenizer plus codec; freeze after a reconstruction gate.
- Unfreeze the LLM with a high text fraction: interleaved synthetic speech (2411.17607) plus unlabelled speech with Whisper pseudo-labels.
- Spoken SFT on LLM-written dialogues rendered with many TTS voices, plus real recorded turns.
- DPO-LN on text tokens, with timing pairs.
- A small duplex head on frozen states (MinMo style), then gated GRPO duplex RL on event windows (DuplexPO style).
- Gates at every stage: ASR WER, text QA (strict), duplex timing.
Applying DPO to audio-token probabilities looks natural but Moshi-Aligned found them unstable, so it optimised text tokens only. Reward signals also miss timing: the Dual-Axis Generative Reward Model (arXiv 2604.14920) argues existing metrics are superficial proxies, so it scores semantic quality and interaction timing separately.
"I would keep the text LLM frozen through alignment, unfreeze it with a high text fraction and interleaved synthetic data, then do DPO on text tokens and GRPO on duplex timing windows. Every stage is gated on ASR WER, strict text QA and timing, because speech training erodes text ability."
Online RL and rewards for speech generation
The common pattern: the policy is a codec or discrete-token LM (sometimes flow matching), sampled in groups. Rewards come from the decoded audio: ASR error for intelligibility, speaker-verification (SV) cosine for similarity, a quality or preference predictor for naturalness. The main failure is reward hacking on any single optimised score. Duplex timing is the newest axis, with per-axis rewards derived from VAD events.
Every claim below cites a paper or an official repository or model card. Kyutai publishes RL-tuned Moshi and PersonaPlex checkpoints on its Hugging Face account. Numbers are the authors' own and come from different setups, so they are not comparable across rows.
The TTS-side summary (DiffRO, F5R-TTS, hacking signatures, listening gates) is in Post-training and evaluation for speech generation. This section adds reward implementations, the duplex rewards, and infrastructure.
Reward taxonomy and concrete implementations
| Reward | Implementation | Status |
|---|---|---|
| Intelligibility (ASR) | F5R-TTS uses ASR WER as one of two GRPO rewards (arXiv 2504.02407). GRPO for LLM-based TTS uses CER plus NLL from an off-the-shelf ASR model (arXiv 2509.18798). | Confirmed |
| CosyVoice GRPO | The official FunAudioLLM/CosyVoice README lists GRPO training support for CosyVoice 2 and an RL model of Fun-CosyVoice3-0.5B with training and inference scripts. | Confirmed |
| Reward granularity | Japanese kana-level scoring cuts target-kanji reading error by ~26% under matched GRPO (arXiv 2610.07575). | Confirmed |
| Speaker similarity | Speaker-verification similarity to the reference, paired with WER (F5R-TTS, arXiv 2504.02407; GROW, arXiv 2608.03215). | Confirmed |
| Naturalness predictors | UTMOS, DNSMOS, SCOREQ. The authors report that optimising a single score induces reward hacking while held-out judges and listeners get worse; an equal-weighted ensemble resists hacking, and a calibrated composite performs best (arXiv 2609.13150). | Reported |
| SpeechJudge | Generative RM on Qwen2.5-Omni-7B: SFT on chain-of-thought rationales, then GRPO. 77.2% agreement with human pairwise preferences versus 72.7% for Bradley-Terry; the best audio-LLM judge, Gemini-2.5-Flash, is under 70% (arXiv 2511.07931). The authors say it can serve as an RL reward. | Confirmed |
| GSRM | Reasoning RM for naturalness: acoustic features, then reasoning; 31k expert ratings; verifier for online RLHF (arXiv 2602.13891). | Confirmed |
| AudioJudge | Audio-LLM judges show verbosity and position bias. A multi-aspect ensemble (content, quality, paralinguistics) reaches up to 0.91 Spearman with human system rankings (arXiv 2507.12705). | Confirmed |
| Emotion and prosody | The official zai-org/GLM-TTS README describes GRPO with multiple reward functions (similarity, CER, emotion, laughter and others). Prosody has no verifiable reward: GRPO on CER and NLL gave monotone prosody, and iterative DPO on a few hundred human preference pairs fixed it on a Korean call-centre set (arXiv 2509.18531). | Reported |
Duplex timing rewards
- DuplexPO (arXiv 2607.07148). The Factorized Conversational Dynamics Reward covers turn initiation, backchanneling, yielding and regularised participation. It optimises only windows around annotated agent events, GRPO-style.
-
Kyutai multi-faceted alignment (arXiv 2606.11167).
Reported
RL post-training of Moshi and PersonaPlex with one reward per axis (pause handling, turn-taking, backchanneling, user interruption) plus an LLM-based response-quality reward against semantic degradation.
Per the official model card, GRPO uses rule-based rewards, segments come from Meta's Seamless Interaction corpus via VAD, and evaluation uses Full-Duplex-Bench v1 and v2.
Checkpoints:
kyutai/moshika-rl-seamlessandkyutai/personaplex-rl-seamless. - ASPIRin (arXiv 2604.10065). GRPO with a binary speaking-or-silence mapping of text tokens. The authors report over 50% fewer duplicate n-grams than standard GRPO.
- Multi-reward DPO for blockwise duplex. Semantic, audio-quality and emotion-consistency rewards aggregated in one DPO objective, studied on blockwise duplex models (arXiv 2601.19063).
Algorithms
GRPO dominates for codec LMs: sample a group of rollouts per prompt, normalise rewards within the group, and keep a KL penalty to the SFT reference. Standard notation for the advantage of rollout :
With several rewards, a common choice is to normalise each reward within the group before summing. Inference GROW (arXiv 2608.03215) standardises its rewards within the group; I have not checked other papers.
| Method | What it adds |
|---|---|
| GSPO | Qwen3-Omni Thinker post-training with rule-based and model-based rewards (arXiv 2509.17765). Speech-enhancement GSPO with DNSMOS, WER and UTMOS rewards: the composite is preferred over any single-metric variant in human evaluation (arXiv 2606.21458). |
| Flow-GRPO SDE trick | Converts the deterministic ODE into an SDE that matches the original marginals, which enables exploration for online RL; the image-domain authors report very little reward hacking (arXiv 2505.05470). |
| F5R-TTS | GRPO on flow matching with WER and SIM rewards; the authors report a 29.5% relative WER reduction and 4.6% relative SIM gain on zero-shot cloning (arXiv 2504.02407). |
| GROW | On-policy group-standardised rewards that reweight flow-matching regression. On DiTAR, average WER 2.016 to 1.558 and SIM 0.676 to 0.715 (arXiv 2608.03215). |
| FlowSE-GRPO | Speech enhancement. A single reward gives fast metric gains but degraded fidelity; a multi-metric reward balances them (arXiv 2601.16483). |
| FlowTTS-GRPO | Online RL for flow-matching TTS with a weighted multi-objective reward; improves speaker similarity and perceptual quality on CosyVoice 3.0 and F5-TTS (arXiv 2606.23190). |
Reward hacking: cases and guards
| Case | Guard |
|---|---|
| A single quality predictor improves its own score while held-out judges and listeners degrade (arXiv 2609.13150) | Equal-weighted or calibrated composite; held-out judges |
| A single enhancement metric degrades fidelity (FlowSE-GRPO, arXiv 2601.16483) | Multi-metric reward |
| Judge verbosity and position bias (AudioJudge, arXiv 2507.12705) | Randomise order; multi-aspect ensemble; validate on human labels |
| CER and NLL reward make prosody monotone (arXiv 2509.18531) | Iterative DPO with human preference pairs |
| Semantic drift while optimising timing | LLM-based response-quality reward (Kyutai, arXiv 2606.11167) |
Inference The guards in the right column are my pairing of cases with mitigations, except where a source is named.
If the reward ASR is also the evaluation ASR, WER improvements may be hacking. Evaluate with a second ASR, a second SV model, and a listening panel.
Infrastructure and cost
Every rollout must be decoded to a waveform, then passed through an ASR and an SV model. Inference A SpeechJudge-style reward model dominates the cost. Cheaper options are token-level rewards, cached reference embeddings and a small ASR for the reward.
- FunAudioLLM/CosyVoice: GRPO training support and an RL model, per the README.
- zai-org/GLM-TTS: multi-reward GRPO TTS README.
- AmphionTeam/SpeechJudge: the generative reward model.
- Kyutai RL checkpoints:
kyutai/moshika-rl-seamless,kyutai/personaplex-rl-seamless.
Bridge from GRPO on streaming ASR
- Group sampling, per-group advantage normalisation, KL to a reference and clip monitoring are the same machinery.
- WER is a reward I already know how to shape; here it runs on decoded audio, so it is a reward through a second model.
- New in TTS: rollouts need waveform decode, SV and quality rewards compete, and hacking shows up as monotone prosody rather than a bad transcript.
- New in duplex: rewards are timing events on audio, not text metrics, so windows around events replace whole-sequence rollouts.
Practical recipes
- Zero-shot TTS. WER or CER from a fixed ASR that differs from the evaluation ASR; SV cosine with cached references; a small-weight UTMOS or DNSMOS composite; GRPO with KL; per-group normalisation per reward; a duration-ratio penalty; held-out judges (second ASR, second SV, listening panel).
- Expressive TTS. Add a reasoning RM or audio-LLM judge with a rubric, or an emotion classifier, gated by an ensemble; track F0 variance, energy and rate against human references.
- Full-duplex. Per-axis timing rewards from VAD on generated audio against annotated events (DuplexPO, Kyutai); a text-level LLM-quality reward against content drift; train on windows around events.
Monitor: per-reward mean and variance, fraction of zero-advantage groups, held-out metrics, F0 spread, silence ratio, speaking rate, duration distribution, KL, clip fraction and end-of-sequence behaviour. Stop when held-out metrics degrade even if the train reward rises, and spot-check audio.
"I would run GRPO with a composite of ASR error, speaker cosine and a quality model, normalised per group, with KL and held-out judges. For duplex I would add per-axis timing rewards from VAD events plus a text-quality term so timing gains do not cost content. Single-score rewards get hacked, so I would validate every reward against held-out judges and listeners."
Evaluating conversational systems
Evaluation moved from demos to automated overlap benchmarks (Full-Duplex-Bench) and annotated dual-channel benchmarks (TurnBench, arXiv 2608.25218, Aug 2026). Latency alone is a weak number: it only means something at a stated false-interruption rate. The open problem, per the TurnBench authors, is that no current system matches human timing without excessive false positives.
Latency definitions and operating points
LiveKit's eot-bench (LiveKit blog) reports two views of the same detector: the false-cutoff rate at a fixed latency budget (300 or 600 ms), and the mean latency at a fixed false-cutoff target (5% or 10%). Reported For LiveKit's own v1, the blog gives 9.9% false cutoffs at 300 ms and 4.5% at 600 ms, and 543 ms mean latency at 5% and 295 ms at 10%. It is a vendor benchmark, but the operating-point framing is reusable for any turn-taking system.
Vendor latency claims are not comparable. Deepgram's Flux docs state "~260ms end-of-turn detection" inside the STT model, without a stated benchmark. That cannot be compared with the eot-bench operating points above.
Benchmarks
| Benchmark | What it measures | Notes |
|---|---|---|
| Full-Duplex-Bench v1 (arXiv 2503.04721) | Pause handling, backchanneling, turn-taking, interruption | Automatic, reproducible metrics; released with code |
| Full-Duplex-Bench v1.5 (2507.23159) | User interruption, user backchannel, talking to others, background speech | Categorical behaviour, stop and response latency, prosodic adaptation; on five agents the authors find "responsive" and "floor-holding" strategies (ICASSP 2026) |
| Full-Duplex-Bench v2 (2510.07838) | Multi-turn streaming interaction | Automated examiner with staged goals under Fast and Slow pacing; task families daily, correction, entity tracking and safety; supports commercial APIs and open models |
| FLEXI (2509.22243) | Latency, response quality and conversational effectiveness across six scenarios, including emergency interruption | The authors report gaps between open-source and commercial models in recognising emergencies, ending turns and latency |
| TurnBench (2608.25218) | End-of-turn and interruption detection | ~30 h dual-channel, 154 dialogues, triple-annotated, plus a 104 h training set and public leaderboard; gold is 2 of 3 annotators within ±200 ms; 14 systems scored on recall, false-positive rate, median latency |
| Talking Turns (ICLR 2025, 2503.01174) | When to speak, interrupt, backchannel | Audio foundation models sometimes miss when to speak, interrupt too aggressively and rarely backchannel; supervised turn-event model as judge; benchmarks curated from Switchboard |
Reported numbers
- TurnBench. Confirmed The VAP baseline scores end-of-turn recall 0.845, false-positive rate (FPR) 0.055, median latency 368 ms; interruption recall 0.945, FPR 0.107, median 994 ms. Humans on smooth transfers start a median 151 ms before the current turn ends.
- DuplexSLA-Bench (arXiv 2605.20755). Reported Authors' backchannel accuracy, context-prefill setting: gpt-realtime-1.5 0.33% (semantic VAD), gemini-3.1-flash-live 40.00%, DuplexSLA 98.33%.
- Instruct-FD (arXiv 2607.20460). Reported The authors report that the best of six full-duplex systems achieves only 64.4% adherence to turn-taking instructions.
- PersonaPlex (arXiv 2602.06053). Reported The authors report 0.170 s smooth turn-taking and 0.240 s user-interruption latency for the released 7B checkpoint, against 0.265 s and 0.257 s for Moshi.
DuplexSLA-Bench, Instruct-FD and PersonaPlex numbers come from the authors, and systems are measured under different conditions. LLM and audio judges need validation against human labels before their scores gate a release.
Ten proposed latency-aware and interaction-based metrics
Inference This list is my proposal, built on the benchmarks above. Every timing metric uses gold event labels and echo-cancelled agent output, never the system's own VAD.
| # | Metric | Definition and how to compute |
|---|---|---|
| 1 | Floor-transfer offset | Distribution of agent onset minus gold EOT, compared with a human baseline (anchor: 151 ms before the turn ends, TurnBench) |
| 2 | Time to first audio | Gold EOT to first agent audio; report p50, p90, p95. Use gold EOT, not the VAD stop |
| 3 | Latency at fixed false-yield rate | Threshold sweep; read mean latency at 5% and 10% false yield (eot-bench framing) |
| 4 | Stop latency after barge-in | Gold onset to last audible agent sample on echo-cancelled output; plus the fraction of agent speech after onset |
| 5 | False-yield rate per minute | Count of stops caused by backchannels, laughter or background speech, divided by conversation minutes |
| 6 | Premature-takeover rate | Fraction of user mid-turn pauses in which the agent starts speaking |
| 7 | Backchannel rate and placement | Rate versus human; share within a window after a prosodic boundary; Jensen-Shannon divergence of inter-event intervals |
| 8 | Overlap quality | Cooperative versus competitive overlap share, and the overlap-duration distribution |
| 9 | Interrupted-thread recovery | Does the agent resume or address the interrupted thread? LLM judge, validated on a human-labelled subset |
| 10 | Turn-taking naturalness MOS | Human ratings of 10 s clips, paired against human-human conversation |
The set separates timing from content, in line with DuplexPO, and ties latency to an operating point.
"I would never report latency alone. I would report time to first audio from gold end-of-turn at a fixed false-yield rate, stop latency after barge-in on echo-cancelled output, and false yields per minute, anchored to the human 151 ms offset. Judge-based metrics get validated on a human subset first."