Text-to-speech got good enough that human listeners cannot tell a generated sentence from a recorded one — and conversations with those same models still feel dead. Sesame’s research note names the gap (voice presence), builds a model around one architectural bet (condition on the conversation, not the sentence), and then — unusually — publishes the evaluation that shows the bet has not yet paid off. This teardown reconstructs the whole argument: the token stack underneath it, the three ways the field has factorised the same prediction problem, the training trick that made it affordable, the two pronunciation tests that replaced a saturated benchmark, and an honest catalogue of everything the note leaves unspecified.
Every idea in this lesson, clustered by the question it answers, wired by what depends on what. Hover a node for its one-line summary; click one to jump to the chapter that teaches it — or to the lesson elsewhere on this site that owns it in full.
The clusters are not decorative. Each one is a question the note has to answer, and the answers constrain one another in a specific order: the problem determines what you must condition on, conditioning determines the token stack, the token stack determines the factorisation, the factorisation determines the training cost, and the training cost determines what you can afford to evaluate.
Voice presence, the one-to-many problem, emotional flatness as an accumulating cost rather than a first-impression one. The chapter that manufactures the need.
Semantic tokens, acoustic tokens, residual vector quantisation, the split-RVQ Mimi tokenizer at 12.5 Hz, and the delay pattern that made streaming awkward.
A multimodal backbone for codebook zero, a small depth decoder for the rest, interleaved text and audio, speaker identity carried inside the text stream.
The batch-size explosion of an autoregressive decoder over frames, the one-sixteenth compute amortisation scheme, one million hours of audio, three model sizes.
Saturated word error rate, homograph disambiguation, pronunciation continuation consistency, two CMOS studies, and the context gap that is still open.
Strip the note to a single testable sentence and you get this:
Everything in the note is either the machinery that makes that sentence implementable at scale, or the measurement that checks whether it is true. And the measurement, reported honestly by the authors themselves, says: partially. Without context, listeners cannot separate the model from a human recording. With ninety seconds of context, they consistently prefer the human. That single asymmetry is the most valuable result in the note, and Chapter 07 is where we take it apart.
Three documents carry every claim in this lesson. Their roles are different and the difference matters: one is a company research note with no appendix, no ablation table, and no released numbers in tabular form; two are peer-reviewed papers with full architectural specifications. Where the note is vague, the papers let us say precisely what kind of vague it is.
| Source | Date | Role in this lesson | What it pins down |
|---|---|---|---|
| Sesame research note “Crossing the uncanny valley of conversational voice” | Feb 2025 | Primary. Every architectural claim about CSM traces to this text and nothing else. | Two transformers split at codebook zero, Mimi split-RVQ at 12.5 Hz, one-sixteenth amortisation, three model sizes, one million hours, the evaluation suite. |
| Moshi arXiv 2410.00037 | Oct 2024 | Secondary. The note cites it as reference [5] — both for Mimi and for the transformer split it deliberately differs from. | The RQ-Transformer formalism: temporal transformer over $S$ steps, depth transformer over $K$ codebooks, and exactly where the two meet. |
| VALL-E arXiv 2301.02111 | Jan 2023 | Secondary. The prior generation’s answer to the same factorisation question. | Autoregressive first codebook, non-autoregressive remaining seven, three-second enrolment prompt, and why that split cannot stream. |
A research note is not a paper. It has the density of a paper and the accountability of a blog post, which is a genuinely difficult combination to read well. So this lesson adopts three rules and applies them visibly:
When the lesson says CSM does something, that sentence exists in the note. Where a number or mechanism comes from somewhere else — the Moshi paper, the VALL-E paper, the open-source release — it is tagged.
Tags: from the note from a cited paper outside the noteThe note omits the number of codebooks, the decoder’s layer count, the sampler, the loss weighting, the diarisation pipeline, and every numeric evaluation result. Chapter 08 is a full catalogue rather than a footnote, because knowing the shape of what is missing is itself technical knowledge.
Chapter 08 exists specifically for thisVALL-E, Moshi and CSM answer the same question three ways. The showcase in Chapter 04 runs all three side by side on the same token grid so you can watch the differences rather than read adjectives about them.
Chapter 04 is the centrepieceThis lesson computes a great deal, and the honest thing to do up front is to say which quantities came from the note and which are stand-ins chosen so the arithmetic can be carried out. Every worked example downstream carries the same labels.
| Quantity | Value used | Status |
|---|---|---|
| Frame rate | 12.5 Hz | stated in the note Via Mimi, cited to the Moshi paper. |
| Sequence length | 2,048 positions | stated “~2 minutes of audio”, five epochs. |
| Model sizes | 1B/100M, 3B/250M, 8B/300M | stated Backbone and decoder for each of three sizes. |
| Dataset | ~1,000,000 hours | stated “Predominantly English”, after filtering. |
| Amortisation ratio | 1 frame in 16 | stated Decoder only; codebook 0 sees every frame. |
| Evaluation protocols | 200 samples each; 5 and 10 words | stated Including the phonetic recogniser used. |
| Codebook count $N$ | 32 in examples | assumed Never stated. See Chapter 08 for the single ambiguous clue. |
| Codebook size | 2,048 entries | from Moshi Mimi’s configuration; gives 11 bits per code, 1.1 kbps. |
| Decoder shape | 6 layers, $d = 1024$ | from Moshi Used as a stand-in for memory estimates only. |
| Batch size $B$ | 32 | assumed Never stated; used to make the memory ledger concrete. |
| Step latencies | 20 ms backbone, ~2 ms decoder | assumed The note reports no latency figures at all. |
Six rows of stated fact, three of borrowed specification, three of honest assumption. That ratio is itself a finding: the note is symbolically complete and numerically sparse, which means its reasoning can be verified while its calibration cannot.
One more orientation note before we start. CSM is a speaking model, not a conversation model. It generates one side of a dialogue, conditioned on what came before, and stops when it emits an end-of-turn symbol. The note says this plainly in its final paragraph, and it is the single most important framing fact in the whole document — because almost every reaction to the Sesame demo treated it as a conversational agent. Chapter 10 is where that distinction becomes an architecture argument.
Same audio, same listeners, one variable changed: whether the judge could hear the conversation the sample belongs to. That is a clean isolation of contextual appropriateness from raw naturalness, and it is why the note calls its own naturalness result “saturated.”
The note opens with an unusual complaint. Not that voice assistants sound robotic — they largely do not, any more — but that speaking to one is exhausting. That word choice is the entire research programme in disguise.
Here is the observation, as the note states it: “A personal assistant who speaks only in a neutral tone has difficulty finding a permanent place in our daily lives after the initial novelty wears off. Over time this emotional flatness becomes more than just disappointing — it becomes exhausting.”
Read that as an engineering claim and it says something specific and testable: the cost of flat prosody is not paid on the first turn; it accumulates across turns. That is why the failure is invisible to the benchmark that the entire text-to-speech field spent a decade optimising. Sample one sentence, play it to a listener, ask “does this sound human?” — the answer is yes. Play forty turns of it and ask “would you use this daily?” — the answer changes, and no per-sentence metric registers the change.
You have felt this yourself in a non-speech setting. A colleague who replies to every message with “Sounds good.” is not being rude, and no individual message is defective. After two weeks you stop telling them things. The information content was fine; the signal about the relationship was absent, and the absence compounded.
Sesame gives the missing quality a name: voice presence — “the magical quality that makes spoken interactions feel real, understood, and valued.” It is a deliberately non-technical phrase, and the note is upfront about why: they do not have a metric for it. What they have is a decomposition.
The note lists four ingredients. It is worth reading them not as marketing bullets but as a specification of what has to be conditioned on — because each one names a different piece of context the model must see in order to produce the right output.
Requires hearing how the user spoke, not just what they said. A transcript deletes exactly this. If the pipeline is speech → text → speech, this component is architecturally unreachable.
Requires modelling the turn structure itself. The note later admits CSM does not do this — it models content, not structure. Hold onto that; it is the honest limitation of Chapter 10.
Requires the previous turns as input. This is the one component CSM is actually built to deliver, and the one the evaluation suite is designed to measure.
Requires the model’s own previous audio in context, so the voice it used two minutes ago constrains the voice it uses now. Falls out of history conditioning almost for free.
Notice how three of the four are conditioning problems, and one (dynamics) is a structural problem. That split predicts the entire architecture: CSM will be a model that eats conversation history, and it will not be a model that handles turn-taking. Both of those are true, and both were decided by this list before a single layer was specified.
Now the technical core of the chapter, and the reason context is not a nice-to-have but a mathematical necessity. The note states it compactly: models “struggle with the one-to-many problem: there are countless valid ways to speak a sentence, but only some fit a given setting.”
Formally, text-to-speech is asked to model a conditional distribution:
and that distribution is enormously multi-modal in the statistical sense — it has many separated peaks. The sentence “I can’t believe you did that” has a delighted reading, a devastated reading, a sarcastic reading, a flat administrative reading, a whispered reading, and a reading where the emphasis lands on you instead of did. All are correct renderings of the text. None is the right rendering of the moment.
A model trained by maximum likelihood on this distribution faces an unpleasant choice. Either it samples from the full distribution — in which case it is unpredictable, sometimes delivering condolences in a bright cheerful lilt — or it collapses toward the mode, which is the safest, most neutral, most averaged rendition available. The neutral assistant voice is not a design decision. It is what mode-seeking looks like when the conditioning is impoverished.
The fix is to condition on more:
The claim is that this second distribution is far less multi-modal than the first. Once you know the user just said “my dog died last night” in a shaking voice, the delighted reading of the next sentence has essentially zero probability. Conditioning did not make the model more expressive; it made the correct rendition identifiable, which is the thing that was missing.
“Countless valid ways” is rhetorically fine and technically unsatisfying. Let us put a number on it, because the number is what makes the conditioning argument concrete.
Take the six-word sentence “I can’t believe you did that.” Enumerate a deliberately coarse set of prosodic choices — coarse enough that every option is clearly audible and clearly distinct:
| Prosodic dimension | Distinct options | Count |
|---|---|---|
| Emphasised word | I / can’t / believe / you / did / that | 6 |
| Terminal contour | falling (statement) / rising (question) / level (trailing off) | 3 |
| Speaking rate | slow / medium / fast | 3 |
| Loudness | whisper / conversational / raised | 3 |
| Voice quality | breathy / modal / creaky / tense | 4 |
| Pause placement | none / after “believe” / after “you” | 3 |
And this is a six-word sentence with six coarse dimensions. Real prosody is continuous, jointly distributed, and unfolds over a whole paragraph. The count is illustrative, not measured — but the order of magnitude explains something the note only asserts: why naturalness metrics saturated while conversational quality did not. A metric that asks “is this a natural rendition?” gives full marks to all 486. A listener who heard the conversation gives full marks to 64.
Below, the same sentence is drawn as a cloud of candidate renditions in a two-dimensional prosody space — energy on the horizontal axis, warmth on the vertical. Every dot is a natural way to say the line. Choose what happened immediately before, and watch the admissible set collapse. The number in the readout is the fraction of natural renditions that remain appropriate: your model’s odds of getting it right by luck.
Two behaviours are worth provoking deliberately. First, switch between “gift” and “loss” and notice the admissible regions barely overlap — the same text needs almost disjoint deliveries. Second, tick mode-seeking collapse with no context selected: the single output the model converges to sits in the dead centre, appropriate to none of the four situations and offensive in none of them either. That dot is every voice assistant you have ever used.
The note makes a sharp historical claim in passing: “Even though recent models produce highly human-like speech, they struggle with the one-to-many problem.” The word doing the work is even though. Contextual expressivity became the frontier precisely because per-sentence quality stopped being one.
Trace the sequence of bottlenecks, because it explains why nobody worked on this earlier:
Concatenative and parametric systems produced speech you could understand but never mistake for a person. The bottleneck was the vocoder, and the metric was word error rate on the synthesised audio. No one asks whether a diphone concatenation is emotionally appropriate.
Fixed by neural vocoders — WaveNet and successorsNeural sequence models and neural vocoders closed the gap on single sentences. Mean opinion scores climbed until systems scored within noise of recorded speech, at which point the metric stopped discriminating between systems.
Fixed by end-to-end neural TTS; metric saturatedVALL-E reframed TTS as language modelling over codec tokens and showed that a three-second enrolment recording is enough to carry a voice into arbitrary new text — in-context learning for speech. Speaker similarity became a headline metric, and then it too saturated.
Chapter 04 takes VALL-E’s architecture apartWith quality and identity solved per-sentence, the only remaining audible defect is choosing the wrong rendition for the moment — which requires the moment to be in the model’s input. This is where CSM sits, and why its evaluation suite had to be invented rather than adopted.
The whole rest of this lessonEach rung of that ladder was made visible by the rung below being finished. You cannot notice that a model chose the wrong emotional reading while you are still noticing that it sounds like a robot. Saturation is not the end of a research direction; it is the instrument that reveals the next one.
Option 0 is a real effect but secondary — expressive corpora exist and models trained on them still flatten under weak conditioning. The distinction that matters: this is an identifiability problem, not a capacity problem. The expressive range is already in the model; the input does not say which part of it to use.
“We introduce the Conversational Speech Model (CSM), which frames the problem as an end-to-end multimodal learning task using transformers. It leverages the history of the conversation to produce more natural and coherent speech.” Two sentences, and every architectural decision in the note is downstream of them.
The note names its own two contributions, which is a courtesy worth honouring by quoting them exactly:
Note what is not claimed. Not a new tokenizer — CSM uses Mimi, from the Moshi paper. Not a new transformer — both components are Llama variants. Not a scaling result — three modest sizes, the largest an 8B backbone. The contribution is a factorisation plus a measuring instrument, which is a much more honest pair of claims than most model releases make.
So the chapter has one job: establish precisely what the model eats and what it emits, with shapes, before Chapter 04 asks why the internal split is where it is.
From the note: “Training samples are structured as alternating interleaved patterns of text and audio, with speaker identity encoded directly in the text representation.” Unpack that into an actual sequence.
A conversation is a list of turns. Each turn contributes two things to the sequence: the text of what was said, tokenised with a Llama tokenizer, and the audio of how it was said, tokenised with Mimi into $N$ codebooks per frame at 12.5 Hz. They are interleaved — text for turn 1, audio for turn 1, text for turn 2, audio for turn 2, and so on — so that by the time the model is asked to speak turn $t$, both the words and the sound of every earlier turn are in its context.
| Stage | Input | Output | Rate / shape |
|---|---|---|---|
| Text tokenizer | Turn transcript with speaker marker | Llama subword token ids | ~3–4 tokens per second of speech |
| Mimi tokenizer | Turn waveform | $N$ codebook indices per frame — one semantic, $N-1$ acoustic | 12.5 frames per second |
| Interleave | Text tokens + audio frames, turn by turn | One flat multimodal sequence | 2,048 positions ≈ 2 minutes |
| Backbone | Interleaved sequence up to position $s-1$ | Hidden state; logits for codebook 0 at frame $s$ | 1B / 3B / 8B parameters |
| Depth decoder | Backbone state + codebook 0 of this frame | Codebooks $1 \dots N-1$ of the same frame | 100M / 250M / 300M parameters |
| Mimi decoder | All $N$ codebooks of a frame | 80 ms of waveform | $1/12.5 = 0.08$ s per frame |
Two of those rows deserve a moment.
The 12.5 Hz frame rate is the load-bearing number of the entire design. It comes from Mimi, the split-RVQ tokenizer introduced in the Moshi paper, which the note cites as reference [5]. Twelve and a half frames per second means one frame covers 80 ms of audio — roughly the duration of a single phone in conversational speech. Compare with earlier neural codecs operating at 50 or 75 Hz: a four-times reduction in sequence length for the same audio, which is what makes a 2,048-position context hold two minutes of conversation instead of thirty seconds.
The context length is a conversation length, not a sentence length. The note reports training “with a 2048 sequence length (~2 minutes of audio) over five epochs.” Let us check that the two numbers are consistent, because doing so tells us something the note never states outright.
“Speaker identity encoded directly in the text representation.” Nine words, and a genuinely interesting design decision hides inside them.
There are at least three places you could put speaker identity in a multi-speaker speech model:
The classical multi-speaker TTS answer. Requires a closed speaker set, or an encoder that maps a reference clip to a vector. Adds a conditioning pathway separate from the sequence.
The VALL-E answer: three seconds of enrolment audio as a prefix, and the language model continues in that voice. Elegant, but consumes context and conflates “who” with “how they sounded in that clip.”
What CSM does. Speaker identity is a token in the same stream as the words — no extra pathway, no separate embedding table, no architectural special case.
Choice C is the one that costs nothing and composes with everything. The model already has to attend over the text stream; putting speaker there means multi-speaker conversation is not a feature bolted on but a consequence of the sequence format. It also explains how the note’s “conversations with multiple speakers” sample works: “single generation using audio prompts from two speakers” — one forward pass produces both voices, because the marker in the text tells the model whose turn is being rendered, and the previous audio of that speaker is already in context to supply the timbre.
Not specified The note does not say what the marker looks like — a reserved token, a name string, a bracketed prefix — nor whether identity generalises to unseen speakers by name or only by acoustic context. Chapter 08 collects this with the rest of the unstated details.
The note’s figure caption is unusually precise, and it is the closest thing to pseudocode the document contains. Here it is, decomposed into the loop it describes:
“Text (T) and audio (A) tokens are interleaved and fed sequentially into the Backbone.” The context is the whole conversation so far plus the text of the turn being spoken. One position per text token, one position per audio frame.
Backbone context = conversation history, not just this sentence“…which predicts the zeroth level of the codebook.” One forward pass of the large model produces one token: the semantic code for the next 80 ms frame. This is the expensive step, and it happens once per frame.
Cost: one large-model step per 80 ms of audio“The Decoder then samples levels 1 through N – 1 conditioned on the predicted zeroth level.” A much smaller model runs $N-1$ autoregressive steps within the frame, each conditioned on the backbone’s representation and the codes already chosen for this frame.
Cost: N–1 small-model steps per frame“The reconstructed audio token (A) is then autoregressively fed back into the Backbone for the next step.” The full frame — all $N$ codes — becomes one input position for the backbone’s next step. This is the compression that keeps the sequence at 12.5 Hz.
N codes collapse into one backbone position“…continuing until the audio EOT symbol is emitted.” The model decides when the utterance is finished. Note the consequence: generation is bounded by a learned end-of-turn, which is a content decision, not a timing decision.
Turn-based by construction — see Chapter 10“This process begins again on the next inference request, with the interim audio (such as a user utterance) being represented by interleaved audio and text transcription tokens.” The user’s reply is transcribed and tokenised as audio, then appended. Both representations of the same utterance go into context.
The user's actual voice is in context, not just their wordsStep 6 is the one people skim, and it is where the entire “voice presence” thesis is cashed out. The user’s utterance enters the context as audio tokens as well as text. That is what makes emotional intelligence architecturally possible: the model can attend to how the user sounded, not merely to what a recogniser thought they said. Every cascaded voice pipeline in production throws this away at the first text boundary.
Step 4 is where the efficiency lives. $N$ codes per frame become one input position. The backbone’s sequence length is the number of frames, not the number of codes — which is the difference between a two-minute context and a five-second one.
Build a short conversation and watch the sequence the backbone actually sees. Text blocks are Llama tokens; audio blocks are Mimi frames at 12.5 Hz. Toggle between what CSM receives and what a classical text-to-speech model receives at the same moment, and watch the context evaporate.
The readout counts positions, so you can watch the 2,048-position budget being spent. Two things to notice. First, audio dominates — even at 12.5 Hz, frames outnumber text tokens roughly three to one, which is why the frame rate is the design’s most consequential number. Second, in cascade mode the position count collapses by about three quarters, and that looks like efficiency until you remember what was deleted: every acoustic property of every previous turn.
The word “single-stage” is a contrast, and the thing being contrasted with is the dominant design of the preceding two years. The note describes it plainly:
Read the criticism carefully, because it is subtler than “two stages are slower.” The complaint is informational. In a two-stage system, stage one produces semantic tokens and stage two turns them into audio. Whatever prosody stage one failed to encode is unrecoverable — stage two has nothing else to condition on. The semantic tokens are a strict information bottleneck between the part of the system that knows about the conversation and the part that produces sound.
And the note names the specific difficulty: ensuring that the semantic tokens carry prosody is hard during training. Semantic tokens are usually trained to be speaker-invariant and phonetically discriminative — which is to say, trained to discard exactly the acoustic variation that prosody consists of. You are asking one representation to be simultaneously invariant to how something was said and informative about how something was said.
| Two-stage (semantic then acoustic) | CSM (single-stage) | |
|---|---|---|
| What stage 1 emits | A full sequence of semantic tokens for the whole utterance | One semantic code for the next frame — then immediately its acoustic codes |
| Prosody pathway | Must survive the semantic bottleneck | Backbone state feeds the acoustic decoder directly, every frame |
| Training signal | Two objectives, separately optimised | One end-to-end objective over all codebooks |
| Failure mode | Flat delivery that stage 2 cannot repair | Errors in codebook 0 propagate within the frame |
| Latency structure | Whole utterance, then reconstruction | Frame by frame — first 80 ms is available immediately |
“End-to-end” in the note’s sense therefore means something precise: the gradient from the acoustic codebooks reaches the same backbone that read the conversation history. The decoder is not a separately trained vocoder receiving a summary; it is a head on the same model, conditioned on the same state. That is the whole argument for the word.
Memory is a real benefit but a secondary one. The primary consequence is that context length is denominated in frames — the single fact that makes conversation-history conditioning affordable at all. At $N=32$, flattening the codes would shrink two minutes of context to about five seconds.
Before any architecture can be discussed, the substrate has to be clear: what a discrete audio token is, why there are two flavours of them, and why having several per frame creates a scheduling problem that three different papers solve three different ways.
The note’s background section is compact and precise, so start from its own definitions:
The division of labour is worth stating in one line: semantic tokens know what was said; acoustic tokens know what it sounded like. Neither is sufficient. A stream of semantic tokens can be decoded into intelligible speech in some generic voice; a stream of acoustic tokens without semantic structure is a high-fidelity recording of noise.
Both are discrete, and that is not incidental. Discretising audio is what allows a transformer trained on next-token prediction to model it at all — the same machinery that predicts the next word predicts the next 80 ms of sound. The whole line of work from AudioLM onward exists because of this one move.
RVQ appears in every sentence of this literature and is rarely worked out. It is simple enough to do on paper, so let us do it on paper — because the arithmetic explains both why one codebook is never enough and why the codebooks are ordered, which is the fact the whole architecture chapter depends on.
The setup: an encoder has produced a continuous vector for one frame of audio. We want to represent it with a few discrete indices. A single vector quantiser replaces the vector with the nearest entry of a codebook. RVQ then quantises what is left over, again and again.
Take a two-dimensional vector so every step is visible:
and three tiny codebooks, each at half the scale of the one before — coarse, finer, finest:
| Codebook | Entry 0 | Entry 1 | Entry 2 | Entry 3 |
|---|---|---|---|---|
| $C^{(1)}$ coarse | [1.00, 0.00] | [0.00, 1.00] | [-1.00, 0.00] | [0.00, -1.00] |
| $C^{(2)}$ finer | [0.50, 0.00] | [0.00, 0.50] | [-0.50, 0.00] | [0.00, -0.50] |
| $C^{(3)}$ finest | [0.25, 0.00] | [0.00, 0.25] | [-0.25, 0.00] | [0.00, -0.25] |
Four facts fall directly out of that arithmetic, and every one of them matters later.
One. The codebooks are strictly ordered. Level 2 quantises the residual of level 1. You cannot compute index 2 without index 1 — not as a modelling preference but as an arithmetic fact. This is the “sequential dependency between codebooks in a frame” the note refers to, and it is the origin of every scheduling headache in this chapter.
Two. Early codebooks carry most of the information. Level 1 removed 62% of the magnitude; level 3 removed a further 4 percentage points. Truncate the code after $k$ levels and you get a valid, lower-fidelity reconstruction — which is why RVQ codecs offer a bitrate dial, and why a model that gets codebook 0 right is most of the way to intelligible speech.
Three. Diminishing returns are real but exaggerated here. Our codebooks have four entries; production codecs have 2,048. With 2,048 entries per level the improvement per level stays substantial much longer — but the shape of the curve, steep then flat, is the same.
Four. The bitrate arithmetic is trivial once you see it. Mimi, as specified in the Moshi paper: $Q = 8$ quantisers, codebook size 2,048, frame rate 12.5 Hz.
Not specified The note never states how many codebooks CSM uses — it writes $N$ throughout. Chapter 08 shows why an apparent typo in one figure caption is the only clue the document contains.
The note says CSM processes audio “using Mimi, a split-RVQ tokenizer, producing one semantic codebook and $N-1$ acoustic codebooks per frame at 12.5 Hz”, citing the Moshi paper. That word — split — is doing real work, and the reason is a conflict the Moshi authors measured.
The obvious design is a single RVQ stack whose first level is trained to be semantic, by distilling from a self-supervised speech model. Moshi tried exactly that: distil WavLM embeddings into the first quantiser of an eight-level RVQ. The result was a trade-off they describe plainly — distillation “significantly improves the phonetic discriminability of the first quantizer… it also affects audio quality negatively.”
The mechanism is the residual structure we just computed by hand. Levels 2 through 8 quantise the residual of level 1. If level 1 is pulled toward phonetic discriminability, its residual is no longer the well-behaved leftover that the acoustic levels were designed to encode. In their words: “as higher-order quantizers operate on the residual of the first one, the latter needs to trade audio quality for phonetic discriminability.”
The split-RVQ fix is structural rather than a loss-weighting compromise:
A single, non-residual VQ, trained with a distillation loss against WavLM embeddings. Its job is phonetic discriminability, full stop.
Codebook 0 — the one CSM's backbone predictsSeven levels in Moshi’s configuration, operating on the input rather than on the semantic quantiser’s residual. Its job is reconstruction quality.
Codebooks 1 to N−1 — what CSM's depth decoder predicts“We sum their outputs, such that while both can be used for reconstruction, we remove the constraint that acoustic information should be conserved in the residual of the semantic quantizer.”
The constraint that caused the conflict is simply deletedNow the traffic jam. Each frame carries $N$ codes, and (within the acoustic RVQ) they are ordered: code $k$ is only meaningful given codes $1 \dots k-1$. A transformer predicting one token per step therefore has a scheduling question: in what order do the $N \times T$ codes of a $T$-frame utterance get produced?
The note describes the incumbent answer and its cost:
The delay pattern — introduced for music generation and cited by the note as reference [3] — is an elegant trick. Lay the codes out as a grid: rows are codebooks, columns are frames. Then shift row $k$ rightward by $k-1$ columns. Now every column of the shifted grid contains codes that depend only on earlier columns, so a model can emit one whole column per step, in parallel across codebooks, and every dependency is still respected.
The cost is at the edges. The first column of the shifted grid contains only codebook 1 of frame 1; the rest of that column belongs to frames that do not exist yet. You need $N$ steps before any complete frame is available, and a frame is the unit the codec can decode.
The step costs above are illustrative — the note gives no latency figures at all, which Chapter 08 flags. The structure of the comparison, however, is exactly what the note asserts: $N$ large-model steps versus one large-model step plus $N-1$ small-model steps.
The grid below is a token schedule — rows are codebooks, columns are frames. Each view is a snapshot: it shows exactly which codes exist at the moment the first frame becomes decodable, so you can see what the schedule spent its start-up on. Switch between the flattened schedule (every code gets its own backbone step), the delay pattern (one shifted column per step), and CSM’s split.
Drag $N$ from 4 to 32 with the delay pattern selected and watch time-to-first-audio grow linearly. Then switch to CSM’s split and drag it again: the line barely moves, because the growth term now multiplies the small model’s step cost. That is the whole point in one gesture — the architecture does not remove work, it moves the term that scales with $N$ onto a model that is cheap per step.
By this point the note has set up two rejected designs and one accepted one, and it is worth laying the argument out as a table because the reasoning is genuinely tight.
| Design | How codes get produced | Objection in the note |
|---|---|---|
| Two-stage semantic → acoustic | Model the whole semantic sequence, then reconstruct acoustics with RVQ or diffusion | “Semantic tokens are a bottleneck that must fully capture prosody, but ensuring this during training is challenging.” An information objection. |
| Single model + delay pattern | One transformer emits a shifted column of codes per step | “Time-to-first-audio scales poorly — $N$ backbone steps before decoding the first audio chunk.” A latency objection. |
| CSM backbone + depth decoder | Large model emits codebook 0; small model emits the rest, inside the frame | Accepted. “The decoder is significantly smaller than the backbone, enabling low-latency generation while keeping the model end-to-end.” |
Two rejections for two different reasons — one about information, one about time — and one design that dodges both. Whether it dodges them as cleanly as claimed is a question Chapter 10 returns to. But the argument as constructed is coherent, and it is far more specific than most architecture justifications in company research notes.
Option 2 inverts the mechanism — the delay pattern exists precisely so codebooks can be emitted in parallel within a step. The cost is at the boundary: the diagonal fill means the first frame is only finished after $N$ steps. Steady-state throughput is fine; it is the start-up transient that kills real-time use.
Every model in this literature faces the same arithmetic. A $T$-frame utterance with $N$ codebooks has $N \times T$ discrete values to produce, with a dependency structure that is causal in time and ordered in depth. Who predicts what, and in what order? Three landmark systems give three different answers, and the differences are entirely visible.
Set the problem up once, precisely, so the three answers can be compared on identical terms.
There are $N \times T$ values. A fully autoregressive model over the flattened sequence would need $N \times T$ forward passes and is correct but hopeless: at $N = 32$ and 12.5 frames per second, one second of audio costs 400 forward passes of a multi-billion-parameter model. Every system below is a scheme for spending fewer large-model passes without breaking the dependency structure — or for breaking it deliberately, in a place where it does not hurt much.
from arXiv 2301.02111 VALL-E (January 2023) was the model that reframed text-to-speech as language modelling over codec tokens, and its factorisation is the cleanest possible split of the problem in two.
Stage 1 — autoregressive over codebook 1. A decoder-only transformer conditioned on the phoneme sequence and an acoustic prompt predicts the first quantiser’s codes, one frame at a time:
Stage 2 — non-autoregressive over codebooks 2 to 8. A second transformer, architecturally similar but with eight separate acoustic embedding layers, predicts an entire codebook level for the whole utterance in one pass. It attends over all positions at once — “unlike AR, the NAR model allows each token to attend to all the input tokens in the self-attention layer.” The current level $i$ is injected via adaptive layer normalisation, and the input is the summed embeddings of levels $1 \ldots i-1$ plus the phoneme and acoustic prompts.
Seven such passes complete the frame stack. Total large-model passes: $T + 7$.
| Property | VALL-E |
|---|---|
| Passes over the sequence | $T$ (AR) $+\; N-1$ (NAR) |
| Dependency respected in depth? | Yes across levels — each NAR pass sees all shallower levels. But within a level, positions are conditionally independent. |
| Streamable? | No. The NAR passes need the whole utterance’s codebook-1 sequence before they can start. |
| Model count | Two transformers, trained separately. |
| Where the voice comes from | Three seconds of enrolment audio as a sequence prefix — in-context learning for speech. |
The strength is efficiency: seven passes instead of $7T$. The weakness is the one that matters for conversation. You cannot emit a single millisecond of audio until the autoregressive stage has finished the entire utterance, because the NAR stage operates on the whole sequence. For an audiobook that is irrelevant. For a companion that has to answer you, it is fatal — and it is exactly the constraint the note gestures at when it says the delay problem is “suitable for offline applications like audiobooks.”
from arXiv 2410.00037 Moshi (October 2024) — the note’s reference [5], and the source of both Mimi and the architecture CSM is explicitly differentiated from — takes the hierarchical route. Two transformers, but split along depth rather than along stages.
The formalism is worth reading in the original notation because CSM inherits it exactly:
The efficiency argument is stated directly in the paper: “the number of steps in the Temporal Transformer is always equal to $S$, rather than $K \cdot S$, and the number of steps in the Depth Transformer is at most $K$.” The large model runs once per timestep; the small model runs $K$ times within the timestep. The flattened sequence never exists.
Two configuration details from the paper are worth carrying forward. The depth transformer has 6 layers, dimension 1024, 16 attention heads — genuinely small. And it uses different parameters per depth index for its linear, projection and feed-forward layers, on the reasoning that “different sub-sequences might require different transformations.” Codebook 4 and codebook 20 are encoding different kinds of residual detail, so giving them separate weights is cheap and helps.
Now the part that makes the comparison interesting. In Moshi, what is sub-sequence $k = 1$? Not the semantic audio code. It is the text token: “We insert $W$ as the first sub-sequence in $V$, such that it acts as a prefix to the generation of semantic tokens.” This is Moshi’s Inner Monologue — the model writes what it is about to say, then says it, within the same timestep.
Which means the split lands here: the temporal transformer’s linear head predicts the text token, and the depth transformer predicts everything audio — the semantic codebook included.
from the note Now read the note’s sentence with the Moshi formalism in hand, because every clause is now legible:
Four claims, taken one at a time:
Reference [4] is Lee et al. (2022), the original RQ-Transformer for image generation — a large model along the sequence axis, a small one along the depth axis. CSM credits the pattern to its origin rather than to Moshi, which is correct scholarship: Moshi also cites Lee et al. as the source.
The pattern is borrowed; the split point is notIn Moshi the temporal transformer’s head emits the text token and the depth transformer emits all audio codebooks. In CSM the backbone emits the semantic audio code itself, and the depth decoder only ever sees acoustic residuals. The split moved down by one rung.
The whole chapter is about this one rungThe same per-index parametrisation Moshi introduced, and for the same reason: the mapping from “frame state” to “residual code at level 7” is a different function from the one at level 24, and separate heads are nearly free on a 100M–300M model.
Inherited, and the note says soThe stated sizes make “significantly” concrete: 1B/100M, 3B/250M, 8B/300M. At the largest size the decoder is about 3.6% of the backbone’s parameter count — and note that it grows far more slowly than the backbone across the three sizes.
Chapter 09 turns these ratios into a latency budgetWhy does moving the split down one rung matter? Because of what the semantic codebook is. After Mimi’s split-RVQ design, codebook 0 is the distilled, phonetically discriminative, speaker-invariant representation — the code that decides what phone is being uttered and with what prosodic shape. Everything the conversation history should influence is concentrated there.
Inference, not stated The note does not spell out this reasoning. It says what it split and where, not why that rung rather than another. The argument above is the most coherent reconstruction available from the note plus the Moshi paper’s description of Mimi — and it is flagged as reconstruction rather than presented as the authors’ claim.
This is the chapter’s centrepiece. One utterance, one token grid — rows are codebooks, columns are frames — and three schedules filling it. Press play and watch the fill order. The ledger tracks the two numbers that decide whether a design can hold a conversation: large-model passes, and how many steps elapse before the first frame is decodable.
Three things to provoke deliberately.
Run VALL-E to the end. Notice that the green “audio available” band does not appear until the very last passes — nothing is playable until the whole utterance is done. That is the audiobook regime, and it is a perfectly good design for the problem it was built for.
Compare Moshi and CSM at the same $N$. The fill patterns look nearly identical, because they are: one large-model step per column, then a fast vertical sweep. The difference is the colour of the top row. In Moshi the semantic code is filled by the small model; in CSM it is filled by the large one. Same throughput, different allocation of intelligence.
Raise $N$ with CSM selected. The number of large-model passes does not change at all — it is $T$, always. Only the small model’s inner loop grows. This is what “scaling depth is cheap” means concretely, and it is why an $N$ of 32 is affordable here and would not be under a delay pattern.
All three systems, side by side, on identical terms. The columns are chosen so that no row is a matter of taste.
| VALL-E (2023) | Moshi (2024) | CSM (2025) | |
|---|---|---|---|
| Large-model passes | $T$ | $T$ | $T$ |
| Small-model passes | $N-1$ full-sequence NAR passes | $K-1$ per timestep | $N-1$ per timestep |
| Who predicts the semantic code | The AR model (it is codebook 1) | The depth transformer | The backbone |
| Who predicts text | N/A — text is input, as phonemes | Temporal transformer’s linear head | Backbone, interleaved in the sequence |
| Streamable | No | Yes | Yes |
| Steps to first decodable frame | $T + N - 1$ | 1 large $+\;K-1$ small | 1 large $+\;N-1$ small |
| Conditioning | Phonemes + 3 s enrolment prompt | Two audio streams + inner monologue text | Interleaved conversation history, text + audio |
| Duplex | No | Yes — models both sides simultaneously | No — one turn at a time |
The last row is the one that keeps the comparison honest, and Chapter 10 develops it. Moshi is doing something CSM explicitly is not: modelling the user’s stream and its own stream simultaneously, so that overlap, interruption and backchannel fall out of the architecture. CSM is a better speaker with a richer conditioning story; Moshi is a conversation model. They are not competing on one axis.
Start with the shape of the thing, in the most explicit form possible: nested loops, no batching, no caching, every step visible.
# Generate one turn. `ctx` is the interleaved conversation so far: # text tokens and audio frames from every previous turn, plus the # text of the turn we are about to speak. frames = [] while True: # --- one BACKBONE step: the expensive one, once per 80 ms --- h = backbone(ctx) # [d_model] temporal state c0 = sample(backbone_head(h)) # scalar, codebook 0 if c0 == AUDIO_EOT: break # --- N-1 DECODER steps: cheap, inside the frame --- codes = [c0] state = decoder_init(h, c0) for k in range(1, N): state = decoder_step(state, codes[-1]) codes.append(sample(head[k](state))) # distinct head per codebook # --- the whole frame becomes ONE backbone input position --- frames.append(codes) ctx = ctx + [embed_frame(codes)] audio = mimi_decode(frames) # 80 ms per frame
Read the two loops as a cost statement. The outer loop runs once per 80 ms of output and costs one forward pass of an 8B model. The inner loop runs $N-1$ times per outer iteration and costs $N-1$ forward passes of a 300M model. Everything the architecture claims is contained in those two lines.
Now the same loop with the caching that any real implementation needs, since the backbone must not recompute its context every frame:
kv = backbone.new_cache() kv = backbone.prefill(kv, ctx) # history: paid once per turn for t in range(max_frames): h, kv = backbone.step(kv, last_frame_embedding) c0 = sample(backbone_head(h)) if c0 == AUDIO_EOT: break # the decoder's context is ONE frame long, so its cache is tiny dkv = decoder.new_cache() dkv = decoder.prefill(dkv, [h, embed0(c0)]) codes = [c0] for k in range(1, N): s, dkv = decoder.step(dkv, embed[k-1](codes[-1])) codes.append(sample(head[k](s))) last_frame_embedding = sum(embed[k](codes[k]) for k in range(N))
Two details in that version are load-bearing. The decoder’s cache is re-created every frame and is at most $N$ positions long — it has no memory across frames, which is what keeps it cheap and what makes Chapter 05’s subsampling trick legal. And the frame embedding fed back to the backbone is a sum over per-codebook embedding tables, which is the same construction Moshi describes: “the Temporal Transformer receives at each step $s$ as input the sum of $K$ learnt embedding tables.”
Finally, the one-liner — not because you would write it this way, but because it names the operation:
frame = depth_decode(backbone_state, c0, N) # N-1 tiny AR steps # everything above is the body of depth_decode plus one backbone step
Both are streamable and both use two transformers; the codebook count is unchanged. The split point is an allocation decision: which model gets to make the semantic choice. Note the honest caveat — the note states where it split, not why, so the “capacity where the difficulty is” reading is a reconstruction, and Chapter 08 lists it as such.
The elegant architecture of Chapter 04 has an ugly consequence at training time, and the note is refreshingly direct about it. The fix is three sentences long, saves an order of magnitude, and is the single most reusable idea in the document.
Here is the problem, in the note’s words:
Read the first clause slowly, because it contains the whole difficulty. The decoder’s effective batch is $B \times S$.
Why? Because the decoder does not run once per training example. It runs once per frame. During training the backbone is teacher-forced — it processes all $S$ positions of all $B$ sequences in a single parallel pass, which is what makes transformer training efficient. But the decoder’s job is defined per frame: given this frame’s backbone state and its codebook 0, produce codebooks 1 through $N-1$. Every one of the $B \times S$ positions is an independent instance of that job.
So a batch of 32 sequences becomes a batch of 65,536 decoder problems, each of which is itself an autoregressive rollout of length $N-1$. The decoder is a 300M-parameter model being asked to run at a batch size three orders of magnitude larger than the model that fed it.
Put real values in. Take $B = 32$, $S = 2048$ (the note’s stated sequence length), and $N = 32$ codebooks. Every step below is arithmetic you can check on paper.
And note that this ratio is set by $N$, not by the model sizes. Double the backbone to 16B and the imbalance is unchanged. Double $N$ to 64 and it gets worse. The problem is structural.
Predictions are cheap to count; activations are what actually kill a training run. Backpropagation requires keeping intermediate activations alive from the forward pass until the backward pass reaches them, so the memory is proportional to the number of positions the decoder processed.
Estimated, not stated The note gives no memory figures, no layer counts, and no batch size. The $B = 32$ and 6-layer/1024-dim decoder above are stand-ins, chosen to be plausible and clearly labelled. What is not a stand-in is the structure: memory scales as $B \times S \times N$, and that is stated outright.
The fix, in the note’s words:
Two clauses, and the asymmetry between them is the entire design.
The zeroth codebook is trained on every frame. Non-negotiable. Codebook 0 is what the backbone predicts, and it is the autoregressive spine of the model — every frame’s semantic code conditions every subsequent frame. Skip frames here and you are training a language model on a sequence with holes in it.
The decoder is trained on a random one-sixteenth of frames. Cheap, because the decoder’s task is local. It has no state that crosses frames; each frame is an independent problem of the form “given this state and this semantic code, produce the acoustic residuals.” Sampling a subset of independent problems is ordinary minibatching, applied one level down.
Redo the ledger with the trick applied:
“We observe no perceivable difference in audio decoder losses” is an empirical claim, but it is not a surprising one, and it is worth working out why — because that reasoning tells you when you may reuse the trick and when you may not.
Reason one: the decoder is stateless across frames. Its context is one frame long. Skipping frame 7 does not corrupt frame 8’s training example, because frame 8’s decoder rollout never depended on frame 7’s decoder rollout. Contrast with the backbone, where skipping a frame breaks the causal chain for every subsequent frame.
Reason two: the sample is still enormous. Count it.
Reason three: the tasks have wildly different sample complexity. The backbone is learning conversational prosody, semantics, speaker behaviour, and turn structure — a task with essentially unbounded appetite for data. The decoder is learning “what acoustic residual accompanies this semantic code in this state” — a much narrower function. Giving them the same number of gradient samples was never the right allocation; one-sixteenth is a correction toward the right one.
| Component | Cross-frame state? | Task complexity | Safe to subsample? |
|---|---|---|---|
| Backbone / codebook 0 | Yes — fully autoregressive over the conversation | High: semantics, prosody, speaker, turn structure | No. Holes break the causal chain. |
| Depth decoder / codebooks 1..N−1 | No — context is one frame | Low: local residual reconstruction | Yes. Independent problems; ordinary minibatching. |
The natural follow-up question — why sixteen and not eight or sixty-four — the note does not answer. Nor does it report the sweep that presumably found it. Chapter 08 files this with the rest.
Set the batch, sequence length, codebook count and subsample rate, and watch where the work goes. The bars are prediction counts; the readout carries the memory estimate using the same conservative accounting as above. Drag the subsample slider from 1 to 16 and watch the decoder bar collapse while the backbone bar does not move at all.
Set the subsample to 1 and $N$ to 32 to see the pathology the note describes: a bar chart where the small model’s work is thirty times the large model’s. Then set it to 16. The interesting part is that no other number moved — same batch, same sequence, same codebooks, same backbone training signal. Only the redundant part of the decoder’s diet was removed.
First, the training step written out longhand, so the shape of the tensors is unambiguous.
# text_audio: the interleaved batch, [B, S] # codes: ground-truth Mimi codes, [B, S, N] h = backbone(text_audio) # [B, S, d] logits0 = head0(h) # [B, S, V] loss0 = cross_entropy(logits0, codes[:, :, 0]) # every frame # every position becomes a decoder problem — this is the explosion h_flat = h.reshape(B * S, d) # [B*S, d] 65,536 rows c_flat = codes.reshape(B * S, N) # [B*S, N] loss_rest = decoder_loss(h_flat, c_flat) # 31 AR steps each loss = loss0 + loss_rest
Now the amortised version. The change is three lines, and only three lines:
h = backbone(text_audio) # [B, S, d] unchanged logits0 = head0(h) loss0 = cross_entropy(logits0, codes[:, :, 0]) # STILL every frame # --- the amortisation: pick a random 1/16 of the frames --- keep = S // 16 # 2048 // 16 = 128 idx = torch.randperm(S, device=h.device)[:keep] # fresh every step h_sub = h[:, idx, :] # [B, 128, d] c_sub = codes[:, idx, :] # [B, 128, N] h_flat = h_sub.reshape(B * keep, d) # [4096, d] not [65536, d] c_flat = c_sub.reshape(B * keep, N) loss_rest = decoder_loss(h_flat, c_flat) loss = loss0 + loss_rest # gradients still reach the backbone
Three details in that listing repay attention.
The mask is resampled every step. A fixed subset would train the decoder on a fixed 6.25% of frame positions, which correlates the subsample with position in the sequence — frames near a turn boundary would be systematically over- or under-represented. Fresh randomness makes the estimator unbiased over training.
The backbone loss is computed before the subsample. Order matters. Codebook 0 sees every frame; only the decoder’s branch is thinned.
Gradients still flow back into the backbone through h_sub. The decoder’s loss teaches the backbone something about producing states that are decodable — on one frame in sixteen. That is the “end-to-end” property surviving the optimisation, at a sixteenth of the density.
And the one-liner — the whole scheme, as an index expression:
idx = torch.randperm(S)[:S // 16] # everything else is bookkeeping
It is worth sitting with how small that is. One line of indexing recovers an order of magnitude of training throughput, and the note reports no measurable cost. The reason it works is not the line; it is the architecture that made the line safe — a decoder with no cross-frame state and a task that does not need every example.
Option 3 is the tempting wrong answer — the acoustic codebooks matter enormously to quality, and the note explicitly says the scheme “preserv[es] the fidelity of the full RVQ codebooks.” Nothing was traded away. The asymmetry is about dependency structure, not importance.
The note’s second stated contribution is an evaluation suite. Two of its tests are genuinely novel, and both are constructed on the same principle: build a task where the only way to succeed is to use a specific conditioning pathway, then see whether the model uses it.
Before the tests, look at what the note chooses to demonstrate. The sample sections are a list of capabilities, and each one names a different kind of context:
Laughter, sighs, breath, hesitation. These have no orthographic representation at all, so a model that renders text can only produce them if the audio modelling is genuinely joint with the text.
Names and loanwords whose pronunciation is not derivable from English letter-to-sound rules. Tests whether the model learned pronunciation from audio rather than from a lexicon.
Samples from the Expresso dataset where the model continues an utterance. The prosody of the continuation is only correct if the preceding audio was used.
“Pronunciation correction sentence is a recording, all other audio is generated.” A human says a word a particular way; the model must follow.
“Single generation using audio prompts from two speakers.” The speaker marker in the text stream plus prior audio is enough to render both sides.
Notice that categories 3 and 4 are demonstrations of exactly the same claim from opposite directions: the model’s output depends on audio it was given, not just on text. The two objective tests formalise that claim so it can be measured rather than listened to.
A homograph is a word whose spelling is fixed and whose pronunciation is not. The note’s example: “lead” as /lɛd/, the metal, versus “lead” as /liːd/, to guide.
The protocol, stated precisely in the note: “For Homograph accuracy we generated 200 speech samples covering 5 distinct homographs — lead, bass, tear, wound, row — with 2 variants for each and evaluated pronunciation consistency using wav2vec2-lv-60-espeak-cv-ft.”
The five words and their two readings each:
| Homograph | Reading A | Reading B | What disambiguates it |
|---|---|---|---|
| lead | /lɛd/ — the metal | /liːd/ — to guide | Noun vs verb; surrounding syntax |
| bass | /beɪs/ — low frequency | /bæs/ — the fish | Semantic domain: music vs fishing |
| tear | /tɪər/ — from the eye | /tɛər/ — to rip | Noun vs verb, plus semantic context |
| wound | /wuːnd/ — an injury | /waʊnd/ — past tense of wind | Tense and argument structure |
| row | /roʊ/ — a line, or to paddle | /raʊ/ — an argument | Register and semantic domain |
Now the crucial property of this test, and the reason it exists: word error rate is blind to it. Synthesise “the lead pipe” with the wrong vowel and a speech recogniser will still transcribe the word as “lead” — because English orthography maps both pronunciations to the same letters. The error is inaudible to the metric and glaringly audible to a human. A saturated benchmark is not merely uninformative here; it is actively misleading.
Hence the evaluator: wav2vec2-lv-60-espeak-cv-ft is a model that transcribes audio into phonemes rather than words. Run it on the generated sample, look at which phoneme sequence appears where the homograph should be, and compare with the reading the sentence requires. The metric changed representation — from orthography to phonetics — because the failure lives in the gap between them.
One more property makes this test specifically about text understanding. Everything needed to choose the right reading is in the sentence itself. No conversational history is required. So a failure here is a failure of the backbone’s language modelling, not of its use of audio context — which is precisely what makes it a clean complement to the second test.
The second test inverts the information channel. From the note: “Audio understanding through Pronunciation Continuation Consistency: Evaluates whether the model maintains pronunciation consistency of a specific word with multiple pronunciation variants in multi-turn speech. One example is ‘route’ (/raʊt/ or /ruːt/), which can vary based on region of the speaker and context.”
The protocol: “For Pronunciation Consistency we generated 200 speech samples covering 10 distinct words that have common pronunciation variants — aunt, data, envelope, mobile, route, vase, either, adult, often, caramel.”
Here is the key structural fact: the information required to pass is present only in the audio. Transcribe the earlier turn and you get the word “route” — identical text for both variants. The distinction lives entirely in the acoustic realisation. A pipeline that converts speech to text and then text to speech has thrown the answer away before the question is asked.
| Word | Variant A | Variant B | Typical driver of the split |
|---|---|---|---|
| route | /raʊt/ | /ruːt/ | Region: much of the US vs UK and parts of the US |
| aunt | /ænt/ | /ɑːnt/ | Region and social register |
| data | /deɪtə/ | /dætə/ | Region and professional idiom |
| either | /iːðər/ | /aɪðər/ | Idiolect — varies within a single region |
| often | /ɒfən/ | /ɒftən/ | Register: the pronounced “t” is a spelling pronunciation |
| caramel | /kɑrəmɛl/ | /kɑrməl/ | Region, two syllables versus three |
And notice why consistency rather than correctness is the metric. There is no correct pronunciation of “either.” Both variants are standard. What would be wrong is saying it one way at turn two and the other way at turn five — because real speakers do not do that, and a listener hears the inconsistency as a break in identity. The test measures whether the model maintains a persona across turns, which is the fourth of the note’s four voice-presence components, made numeric.
Plenty of contextual capabilities could have been tested. Emotional appropriateness, turn-final intonation, emphasis placement, code-switching. Why these two? Three properties, and any evaluation you design yourself should aim for the same three.
Both reduce to comparing a phoneme sequence against an expected one, using an off-the-shelf phonetic recogniser. No human raters, no cost per evaluation, so they can be run on every checkpoint. Emotional appropriateness has no such scorer — which is why it stayed in the CMOS studies of Chapter 07.
Cheap enough to be a training-time signal, not just a paper tableThe word was pronounced one way or the other. There is no partial credit, no rater disagreement, no scale to calibrate. Contrast with “was the emphasis in the right place,” where three annotators produce three answers.
Low-variance metrics detect small model improvementsA model can be beautiful, expressive, perfectly timed, and still fail both tests. A model can be flat and monotone and pass both. The tests are almost orthogonal to naturalness, which is exactly what you want when naturalness has saturated.
Orthogonality is what makes a new benchmark informative| Test | Information needed | Where it lives | Which system fails |
|---|---|---|---|
| Word error rate | Which words were said | The text being synthesised | Nobody, any more — saturated |
| Speaker similarity | Timbre of the target voice | The enrolment audio | Nobody, any more — saturated |
| Homograph disambiguation | Sentence meaning and syntax | The current turn’s text | Models with weak language understanding in the speech path |
| Pronunciation continuation | How a word was said earlier | Prior turns’ audio only | Any system with a text bottleneck between turns |
That last row is the whole thesis of the model expressed as a test case. A cascaded voice pipeline — recogniser, language model, synthesiser — cannot pass pronunciation continuation above chance except by luck, because the information was destroyed at the first text boundary. Not badly modelled: destroyed. The test is constructed so that architecture, not model quality, determines the ceiling.
Left panel: a homograph sentence, its two candidate phoneme sequences, and which one each kind of system chooses. Right panel: a two-turn conversation where the earlier turn establishes a pronunciation variant, and the later turn must match it. Switch the system under test and watch which channel each one can actually read.
Select the cascade and flip the prior-turn variant. The right panel’s answer does not change — because nothing in the cascade’s input changed. Its transcript of the earlier turn says “route” either way. This is the clearest possible demonstration that the continuation test is measuring an architectural property, not a quality difference.
The note reports: “In general, we observe that performance improves with larger models, supporting our hypothesis that scaling enhances the synthesis of more realistic speech.” The accompanying figure compares Tiny, Small and Medium against Play.ht, ElevenLabs and OpenAI, “made with default settings and voices from their respective API documentation.”
Four observations, in descending order of confidence.
The trend direction is credible and unsurprising. Homograph disambiguation is a language-understanding task, and language understanding scales with model size in every other setting. That a 8B backbone beats a 1B backbone at deciding whether “lead” is a noun is about as safe a prediction as this field offers.
No numbers are given in the text. Not stated The accuracies exist only inside a figure. There is no table, no confidence interval, and no per-word breakdown. You cannot reproduce, cite, or compare against these results numerically from the note alone.
The baseline comparison is generous to CSM in a specific way. “Default settings and voices” is the honest thing to disclose, and disclosing it is to the authors’ credit. It is also the weakest configuration of each competitor: commercial systems offer pronunciation dictionaries, phoneme override tags, and SSML controls that a default API call does not use. The comparison measures out-of-the-box behaviour, which is a real thing to measure — but it is not the ceiling of those systems.
The continuation test is structurally unfair to the baselines, and that is the point. None of the compared APIs accepts multi-turn audio history as conditioning. They are not underperforming on this test; they are not playing it. The correct reading is not “CSM is better than ElevenLabs” but “this capability requires an architecture that these products do not have.” The note does not spell that out, and it should have.
The “synthesisers default to the frequent variant” option describes a real tendency but not a ceiling — a synthesiser could be told which variant to use. The point is that in a cascade, nothing knows which variant to ask for. “Perfect components” does not help when the interface between them cannot carry the signal.
“Traditional benchmarks, such as word error rate (WER) and speaker similarity (SIM), have become saturated — modern models, including CSM, now achieve near-human performance on these metrics.” That sentence deserves an entire chapter, because “saturated” is a statistical statement and almost nobody treats it as one.
A saturated metric is not a metric that has been maximised. It is a metric whose remaining variation is smaller than its noise floor. The difference matters enormously. A maximised metric says “this problem is solved.” A saturated metric says “this instrument can no longer distinguish the things I care about” — which is compatible with large, audible, important differences between systems.
Word error rate on read speech is now around 1.5% for good systems, and human transcribers disagree with each other at a similar rate. When your measurement error and your signal are the same size, the measurement has stopped being a measurement. And critically, the errors that remain in generated speech — wrong homograph reading, inconsistent pronunciation, prosody inappropriate to the moment — are largely invisible to word error rate by construction, since they do not change which words a recogniser outputs.
Let us make saturation quantitative, because the number that comes out is startling and explains why the field needed new tests rather than more data.
Suppose system A has a true word error rate of 2.1% and system B of 2.0%. That is a real difference — B makes five percent fewer errors. How much speech must you evaluate to detect it reliably?
Thirty-five hours to resolve a tenth of a point. And a tenth of a point is not what separates a delightful voice from an exhausting one — two systems with identical word error rates can be worlds apart conversationally. That is saturation in one sentence: the metric’s resolution and the differences you care about have parted company.
The same logic applies to speaker similarity, which the note also reports as saturated. Cosine similarity between speaker embeddings of the generated and reference audio approaches the similarity between two genuine recordings of the same person. Once you are inside the within-speaker variation, the number has nothing left to say.
Mean opinion score asks a listener to rate one sample on a five-point scale. It is famously unstable: scores drift with the rater pool, the playback equipment, the order of presentation, and what the listener heard yesterday. When systems are far apart that instability is tolerable. When they are close it is fatal.
Comparative mean opinion score fixes the frame of reference by construction. The listener hears two samples — here, one generated and one genuine human recording — and rates the generated one relative to the other on a seven-point preference scale. Absolute calibration no longer matters, because every judgement is a comparison within a pair.
| Design element | Sesame’s choice | Why it matters |
|---|---|---|
| Scale | 7-point preference, generated versus reference | Captures magnitude of preference, not just direction; symmetric around “no preference.” |
| Reference | Ground-truth human recording from the same dataset | The strongest possible comparison target. Beating a weaker system proves less than tying with a person. |
| Dataset | Expresso — expressive, emotionally and prosodically varied | A neutral read-speech corpus would hide exactly the differences under test. Choosing a hard dataset is the honest choice. |
| Raters | 80 paid participants, ~15 examples each | Roughly 1,200 ratings. Paid rather than volunteer reduces self-selection toward enthusiasts. |
| Model tested | CSM-Medium (8B backbone) only | Subjective studies are expensive; the largest model is the informative one. But no subjective scaling curve exists as a result. |
This is the part of the note worth admiring, and it is easy to skim past. The two studies are identical except for one thing.
“We presented the generated and human audio samples with no context and asked listeners to ‘choose which rendition feels more like human speech.’” The question is about naturalness in isolation.
Result: no clear preference — naturalness is saturated“We also provide the previous 90 seconds of audio and text context, and ask the listeners to ‘choose which rendition feels like a more appropriate continuation of the conversation.’” Same samples, same scale, same rater pool.
Result: evaluators consistently favour the original recordingsOne variable changed — whether the judge could hear the conversation — and the outcome flipped. That is a controlled experiment, and it licenses a conclusion neither study could support alone: the residual gap between generated and human speech is not in the signal; it is in the choice of rendition relative to the conversation.
The note states the conclusion without hedging: “These findings suggest a noticeable gap remains between generated and human prosody in conversational speech generation.” A company research note reporting that its flagship model loses to humans on the exact axis the model was designed for is unusual, and it is the reason this document is worth reading closely at all.
The left panel is the discrimination curve for word error rate: how many words you must evaluate to detect a given true difference. The right panel is the CMOS win rate with its confidence interval, so you can see what “no clear preference” and “consistently favoured” look like as intervals rather than adjectives.
Two exercises. Set the WER gap to 1 percentage point — a big difference — and note that a few tens of minutes suffice; then drag it down to 0.1 and watch the requirement explode past thirty hours. Saturation is that curve, not a philosophical position. Then set the win rate to 50% and shrink the rating count: watch the confidence interval widen until “no clear preference” becomes compatible with a substantial real preference. The interval is the finding; the point estimate never was.
What actually causes the second study’s result? The note does not say, and this is where careful reading earns its keep. At least three explanations are consistent with the reported evidence, and they have very different implications.
Conditioning works; the prosodic choice it makes is simply less apt than a human’s. Implication: scale, data, and better objectives should close it. This is the reading the note implicitly favours by pointing at scaling.
Appropriateness includes timing, hesitation, overlap and the length of the pause before answering — things a turn-based generator does not model at all. Implication: no amount of scale fixes it; you need a duplex model. The note’s own final paragraph supports this reading.
The ground-truth continuation is the actual continuation — it matches the reference in room acoustics, microphone, recording session, and micro-timing. A listener given 90 seconds of the same session may be detecting session identity rather than prosodic appropriateness.
Reading C deserves more attention than it usually gets. Give a listener ninety seconds of a recording and then two candidate continuations, one of which came from the same recording session, and you have handed them a channel-matching cue that has nothing to do with prosody. Whether that is controlled for — by matching acoustics, or by using generated audio for the context too — the note does not say.
How would you tell the readings apart? Each makes a different prediction, which is the useful thing about naming them:
| Reading | Predicts | Experiment that would separate it |
|---|---|---|
| A — capability | The gap narrows with model size | Run the context CMOS study on Tiny, Small and Medium. Only Medium was tested. |
| B — structure | The gap persists at every size, concentrated on timing and turn-final phenomena | Score raters’ free-text reasons, or evaluate on isolated utterances with no turn boundary. |
| C — artefact | The gap shrinks when the context audio is also generated | Re-run with model-generated context, so no session-matching cue exists. |
None of these experiments is in the note. That is not a scandal — it is a research note, not a paper — but it does mean the honest summary of the headline result is narrower than it first appears: on Expresso, with human context, listeners preferred human continuations of CSM-Medium’s size, for reasons the note does not isolate. That is still a valuable, publishable, and unusually candid finding.
Generalise what Sesame did, because the procedure transfers to any field whose headline metric has flattened. Six questions, in order, and the note answers five of them well.
Compute the sample size needed to resolve the differences you still care about. If the answer is absurd — tens of hours, millions of examples, more labelled data than exists — the metric is saturated and the problem is not solved. This is a calculation, not an opinion.
Answered by the arithmetic two sections upThey did not disappear. They moved into a dimension the metric does not represent. Ask what your metric projects away: word error rate projects away everything about how a word was said, which is precisely where prosodic failure lives.
Leads directly to phonetic transcription as the new representationGraded judgements need many raters and produce wide intervals. Binary ones need few samples and detect small improvements. Homograph choice is binary; “was the emphasis apt” is not. Prefer the binary version even if it captures less, because it will actually move.
Both new tests are pass/fail per sampleA test that needs a rater pool runs once per paper. A test scored by an off-the-shelf model runs on every checkpoint and becomes a development signal rather than a publication artefact. Sesame’s two objective tests can run nightly; the CMOS studies cannot.
Automatic scoring is what makes a benchmark usedIf a model can pass your new test by being more natural, you have built a second naturalness metric. Check the corners: a flat, monotone model should be able to pass, and a beautiful, expressive model should be able to fail. Both are true of the two tests here.
Orthogonality is the whole point of a new instrumentThe one Sesame skipped. If only systems built a certain way can attempt your benchmark, publish that precondition next to the scores — otherwise a capability inventory gets read as a quality ranking, which is what happened here.
The failure mode of every self-designed benchmarkCost is a real side benefit and power is unchanged. The value is causal: a one-variable design converts “these two numbers differ” into “this variable caused the difference.” It is the cheapest good experiment in the note.
Every teardown reaches a point where the honest move is to stop reconstructing and start listing. This chapter is the catalogue of everything the note leaves unspecified — not as a complaint, but because the shape of what is missing is itself information about what kind of document you are reading.
A research note occupies an awkward genre. It has the technical density of a paper and none of a paper’s apparatus: no appendix, no hyperparameter table, no ablation grid, no error bars, no reproducibility statement. Read one as if it were a paper and you will silently promote plausible inferences into stated facts. Read one as if it were marketing and you will discard genuinely specific technical content. The correct posture is a third thing: treat every claim as true and every absence as significant.
Three kinds of absence appear below, and it is worth separating them:
Optimiser choice, learning-rate schedule, positional-encoding scheme. Any competent implementer picks something reasonable and the result barely changes. Omitting these costs the reader nothing.
The number of codebooks, the decoder’s depth, the loss weighting across codebook levels, the sampler. You cannot reimplement without choosing, and different choices give materially different systems.
Whether the model was given the same context the raters heard; what “publicly available audio” means; the actual accuracy numbers behind the figures. These affect the interpretation of the evidence, not just its reproduction.
The most conspicuous omission is the simplest. The note never states how many codebooks CSM uses. It writes $N$ throughout: “one semantic codebook and $N-1$ acoustic codebooks”, “models the remaining $N-1$ codebooks”, “an RVQ tokenizer with $N$ codebooks requires $N$ backbone steps”.
This matters more than a missing hyperparameter usually would, because almost every quantity in Chapters 03 through 05 is a function of $N$: time-to-first-audio, the decoder’s effective batch, the memory bound, the amortisation ratio, the inner-loop cost at inference. Without $N$, none of the note’s efficiency claims can be checked numerically.
There is exactly one clue in the document, and it is an inconsistency. The caption of the amortisation figure reads:
Everywhere else the note says $N-1$. Two readings are available, and honesty requires presenting both:
“N – 31” is a corruption of “N – 1”, perhaps from a stray character or a copy-edit. Under this reading the caption carries no information about $N$ and the mystery stands.
Simplest explanation; the phrase is inconsistent with the body textSomeone rendered the caption for a concrete configuration and half-substituted a numeral — leaving a hybrid of the symbolic form and the numeric one. If the concrete value was 32, then “31” is exactly $N-1$, and the caption is the symbol and its value collided into one string.
Would imply N = 32Outside the note The open-source CSM release that followed uses a Mimi configuration with 32 codebooks, which is consistent with reading two. Treat that as a pointer to check against the released code rather than as a fact established by the note, because the note itself establishes nothing of the kind. Every worked example in this lesson that uses $N = 32$ is labelled as an assumption for exactly this reason.
Suppose you sat down to build CSM from the note alone. Here is your decision list, and none of these are answered:
| Decision | Status in the note | Why it changes the system |
|---|---|---|
| Number of codebooks $N$ | Absent (one ambiguous caption) | Sets latency, memory, bitrate, and the inner-loop cost. The single most consequential number. |
| Decoder depth and width | Absent — only parameter totals | 100M can be many shapes. Depth versus width trades quality against per-step latency, which is the decoder’s whole job. |
| Which Llama variant | “Variants of the Llama architecture” — no version, no config | Rotary versus learned positions, attention grouping, normalisation, all differ across Llama generations. |
| Loss weighting across codebooks | Absent | Uniform weighting over-weights inaudible deep residuals; Moshi found the semantic weight materially affects quality. |
| Acoustic delay between semantic and acoustic codes | Absent | Moshi reports that a 1–2 step delay “greatly improves the quality of the generation.” Whether CSM uses one is not stated. |
| Sampler at inference | Absent | Temperature and top-$k$ on codebook 0 directly control the expressivity-versus-stability trade the whole note is about. |
| How text and audio embeddings share space | “Interleaved” — mechanism unspecified | Separate vocabularies with a shared position stream, or a merged vocabulary, are different models. |
| Speaker marker format | “Encoded directly in the text representation” | Reserved token versus name string determines whether unseen speakers generalise. |
| Context handling beyond 2,048 | Absent | A companion runs for an hour. Truncation, summarisation, or sliding window — each has a different failure mode. |
The last row is worth dwelling on, because it is the gap between the note and the product. Two minutes of context is enough to demonstrate contextual expressivity in an evaluation. It is nowhere near enough for a companion that remembers a conversation you had last week — and the note’s own framing section promises exactly that (“builds confidence and trust over time”, “memory” listed among the fronts of progress). Whatever bridges that gap is not in this document.
The dataset description is a single sentence: “We use a large dataset of publicly available audio, which we transcribe, diarize, and segment. After filtering, the dataset consists of approximately one million hours of predominantly English audio.”
That sentence contains four verbs, each of which is a pipeline with its own failure modes, and none of which is described.
Not defined. Public-domain, openly licensed, and publicly accessible are three very different sets, and the difference is the entire content of the licensing question. One million hours is far beyond the size of the audio corpora with unambiguous open licences.
Load-bearing for anyone reproducing or deployingWith what? A recogniser’s error rate becomes the model’s text supervision. If the transcriber mishears a homograph, the model learns the wrong text-to-pronunciation association — on the exact axis Chapter 06 measures.
Directly upstream of the headline evaluationSpeaker segmentation is the mechanism that produces the turn structure and the speaker markers. Diarisation errors merge two speakers into one identity, which would teach the model that a single speaker’s voice changes mid-conversation — the precise opposite of the consistency the note wants.
Failure mode is invisible in aggregate metricsFiltered on what? Audio quality, transcription confidence, language, duration, speaker count, licence? The filter defines the dataset far more than the raw source does, and one million hours is the number after it.
The most consequential undocumented design choiceThere is one revealing detail elsewhere in the note. In the limitations section: “CSM is currently trained on primarily English data; some multilingual ability emerges due to dataset contamination, but it does not perform well yet.”
“Contamination” is a candid word. It tells you the language filter was imperfect, that non-English audio entered the corpus without being intended, and — interestingly — that the resulting multilingual ability was noticed rather than designed. It is a small admission that says a great deal about the pipeline: automatic, large-scale, and imperfectly controlled, which is what a million hours implies anyway.
What the note gives: three sizes (1B/100M, 3B/250M, 8B/300M), sequence length 2048, five epochs, and the one-sixteenth amortisation ratio. What it does not give:
That final bullet is the most important one in this chapter. The note’s first stated contribution is unevaluated. Everything measured in the evaluation section compares CSM against other products and against human recordings; nothing compares CSM against CSM-with-a-different-split. The architectural argument is coherent, well motivated, and entirely theoretical as presented.
Every quantitative result in the note lives inside an image. There are no tables in the text, no accuracy values, no confidence intervals, no win-rate percentages. What is reported in prose is the direction of each result.
| Result | What the prose says | What is missing |
|---|---|---|
| WER / SIM | “Saturated — matching human performance” | The actual rates, the test set, the recogniser used to compute WER. |
| Homograph accuracy | “Performance improves with larger models” | All three accuracies; per-homograph breakdown; the chance baseline; whether the phonetic recogniser was validated on human speech first. |
| Pronunciation consistency | Same | Same, plus how “the earlier variant” was established and verified in the prompt audio. |
| CMOS, no context | “No clear preference” | The win rate and its interval; how far from 50:50 the observation actually fell. |
| CMOS, with context | “Consistently favour the original recordings” | The magnitude. “Consistently” is compatible with 55:45 and with 80:20, and those imply very different amounts of remaining work. |
| Baselines | “Default settings and voices” | Which model versions, on what date. Commercial APIs change monthly; an undated comparison ages instantly. |
The single most useful number in the entire note — how big the context gap is — is the one you cannot extract. That is worth stating plainly, because it is what separates “we are nearly there” from “this is a different order of problem,” and the note’s own final paragraph leans toward the second while its figure could support either.
Every substantive claim in the note, plotted by how completely it is specified. Click any bar to see what is known, what is missing, and what it would take to close the gap. Filter by category to see the shape of the document: architecture is well specified, data is not, and evaluation is directionally reported but numerically absent.
The distribution is the finding. A document that specifies its architecture in symbolic detail and its dataset in one sentence is telling you where its authors believe the contribution lies — and, inadvertently, where the risk actually lives.
The licence question is serious but external to the technical claim; the optimiser is benign; the missing $N$ blocks numerical verification but not the argument. The first contribution is stated as “CSM operates as a single-stage model, thereby improving efficiency and expressivity” — and no experiment in the note isolates the effect of that choice. Coherent motivation is not evidence.
Strip the technical section away and the note’s opening is a product thesis with a specific shape. It is not arguing that voice interfaces should be more pleasant. It is arguing that a particular product category — the always-on companion — is impossible without solving prosody, and that everything else follows.
The tell is in the failure mode they describe. Not “users find it frustrating” but “after the initial novelty wears off.” That is a retention claim, and retention claims are about the shape of a curve, not a single interaction.
Consider the two product categories side by side, because the engineering requirements diverge almost immediately:
| Task assistant | Companion | |
|---|---|---|
| Session shape | Seconds. “Set a timer.” | Minutes to hours, repeated daily. |
| Success criterion | Task completed correctly | User comes back tomorrow |
| Cost of flat prosody | Near zero — nobody wants warmth from a timer | Compounding — the note’s “exhausting” |
| What must be modelled | Intent, entities, tools | Emotion, timing, personality, memory |
| Context needed per turn | The current utterance | The conversation, and eventually the relationship |
| Latency tolerance | A second is fine | Sub-second, because silence is interpreted |
Every column-two entry is a conditioning or timing requirement, and every one of them is what CSM was built to address. The architecture is not a general improvement to text-to-speech; it is the speech component of a companion, designed backwards from that product.
This also explains the note’s otherwise-odd structure: a warm, non-technical product essay, then a dense technical section, then a hiring pitch. The document is doing three jobs, and the technical section’s job is to make the product essay credible.
A companion has to answer in real time, so let us derive what that requires from the two numbers we have: a frame rate of 12.5 Hz and a two-model inference loop. This is the arithmetic that explains every size decision in the note.
Step 5 is the note’s architecture argument reduced to a single ratio. The delay pattern is not merely worse for time-to-first-audio; at any reasonable $N$ it cannot sustain real-time generation at all. Splitting the work between a large model that runs once per frame and a small one that runs $N-1$ times is the only structure that fits inside 80 ms.
Step costs assumed The 20 ms backbone step is a stand-in — the note reports no latency figures whatsoever, which for a real-time conversational system is a striking omission. What is not assumed is the structure: 12.5 frames per second and one backbone step per frame are both stated.
Here is a result that inverts the intuition the note’s language creates. “The decoder is significantly smaller than the backbone” is true of parameter counts and false of inference cost.
Use the standard estimate that a forward pass costs about $2P$ floating-point operations per token, where $P$ is the parameter count. Then compute the cost of one second of generated audio for each model size, with $N = 32$.
Three sizes, and in every one of them the “small” decoder consumes the majority of inference compute. The parameter ratio at Medium is about 27:1 in the backbone’s favour; the compute ratio is 1:1.16 in the decoder’s. The multiplier that flips it is $N-1 = 31$.
This also puts a hard limit on scaling $N$. Doubling the codebook count buys a modest gain in reconstruction fidelity and doubles the decoder’s inference cost, which is already the majority of the budget. Mimi’s aggressive 12.5 Hz frame rate is what keeps the arithmetic survivable at all: at 50 Hz, every number in this section would be four times worse.
Choose a model size and a codebook count, and watch the per-second budget split between the two models. The deadline bar shows whether one frame’s work fits inside 80 ms at the chosen step latencies — drag the backbone step cost up and watch the decoder’s per-step budget collapse toward impossibility.
Set $N$ to 4 and the decoder nearly disappears from the budget — at the cost of audio fidelity, since four codebooks cannot reconstruct speech well. Set it to 32 and the decoder dominates. Somewhere in the middle is a design point, and the note never tells us which one was chosen. This widget is, in effect, the search space the Sesame team explored and did not report.
Look again at the three configurations and notice the asymmetry:
| Size | Backbone | Decoder | Backbone growth | Decoder growth | Ratio |
|---|---|---|---|---|---|
| Tiny | 1B | 100M | — | — | 10:1 |
| Small | 3B | 250M | 3.0× | 2.5× | 12:1 |
| Medium | 8B | 300M | 8.0× | 3.0× | 27:1 |
The backbone grows eight-fold from Tiny to Medium; the decoder grows three-fold, and almost all of that growth happens in the first step. Why?
Because the two models are scaling against different limits. The backbone’s job — conversational understanding, prosodic planning, homograph resolution — is the kind of task that improves with capacity indefinitely, which is exactly what the note’s scaling observation reports. The decoder’s job is a local reconstruction mapping that saturates early: past a certain capacity, there is nothing more to learn about turning a semantic code and a frame state into acoustic residuals.
And because the decoder pays a 31× latency tax. Every parameter added to the decoder is multiplied by 31 invocations per frame in both the training-memory ledger and the inference budget. Adding 100M to the backbone costs 12.5 extra forward passes per second of audio; adding 100M to the decoder costs 387.5. The decoder is the expensive place to spend parameters even though it is the cheap-looking place.
Here is a distinction the demo blurred and the technical section is careful about: CSM is not a conversational agent. It generates speech, conditioned on conversation history. Everything else a companion requires sits outside it.
The note is a speech-generation paper. The text of the turn is an input. Whatever produces that text — a language model, a retrieval system, a persona — is not described anywhere in the document.
The interesting half of a companion is out of scopeStep 6 of the inference loop requires the user’s utterance “represented by interleaved audio and text transcription tokens.” The audio the model can tokenise itself; the transcription implies a recogniser in the loop, with its own latency and its own errors.
A speech recogniser is a required dependency, unnamedThe model starts generating when asked. Deciding when to ask — endpointing, turn detection, handling a mid-sentence pause — is a whole discipline, and it is the discipline that determines whether a voice product feels responsive or rude.
See the turn-taking lessonWhen the user talks over the model, generated audio is already in a playback buffer and already in the conversation history. Cancelling, flushing and repairing the context is an engineering problem no model architecture solves for you.
See the voice agent stackThe training context is about two minutes. A companion’s premise is memory across days. The note lists memory as a front of progress and does not describe a mechanism.
Named as a goal, not as a componentNone of this is a criticism of the model — it is a correction of the frame. The demo people reacted to was a system; the note describes one component of that system, and the component it describes is the one that makes the others worth building. But if you are budgeting a voice product from this document, four of the five items above are yours to solve.
200 GFLOP/s versus 232.5 GFLOP/s at $N = 32$. Parameters × invocations is the quantity that matters, and the invocation count differs by a factor of 31. At the Tiny size the decoder is over three times the backbone’s cost.
The note ends with a paragraph that reframes everything before it. Most readers stop at the demo. The paragraph is the most important technical statement in the document.
Read that against Chapter 01’s four components of voice presence and the accounting becomes exact:
| Component | Requires | Delivered by CSM? |
|---|---|---|
| Emotional intelligence | The user’s audio in context | Yes — interleaved audio tokens |
| Contextual awareness | Prior turns as conditioning | Yes — the central mechanism |
| Consistent personality | The model’s own prior audio in context | Yes — and measured by the continuation test |
| Conversational dynamics | Modelling turn structure itself | No — explicitly out of scope |
Three out of four, with the fourth named as the frontier. That is an unusually precise self-assessment, and it lines up exactly with the CMOS result: listeners with context prefer the human, and one entirely plausible reason is that human continuations carry the timing and pacing information a turn-based model structurally cannot produce.
What does “the structure of the conversation” contain, exactly? Enumerate it, because the list is the specification of the next model:
Every one of these is a property of two streams in time, not of a single utterance. A model that emits one turn and stops cannot represent any of them, however good the turn is. And the architecture that can is the one Moshi built: two audio streams modelled simultaneously, so silence, overlap and interruption are all just token patterns in a joint sequence.
There is a real irony here, and it is worth naming. CSM’s data pipeline — “transcribe, diarize, and segment” — is the very process that destroys the structural information a duplex model would need. Diarisation and segmentation take overlapping, messy, human conversation and turn it into tidy alternating turns. The preprocessing that makes CSM trainable is the preprocessing that makes duplex untrainable on the same corpus.
One conversation, two architectures. The top pair of lanes is a turn-based model: the user speaks, a gap, the model speaks. The bottom pair is a duplex model holding both streams at once. Trigger an interruption or a backchannel and watch what each architecture can represent.
Select “user backchannels”. In the duplex lanes the “mm-hm” overlaps the model’s speech and the model keeps going — which is what a person does. In the turn-based lanes there is nowhere to put it: either it is a turn, in which case the model must stop and respond to it, or it does not exist. Both options are wrong, and no amount of prosodic quality fixes either.
Then select “user pauses mid-thought”. The turn-based system faces a decision it has no information to make: is this the end of a turn or a pause inside one? That decision is made outside the model, by an endpointer, on a timer — which is why a turn-based architecture pushes its hardest conversational problem into a component that knows the least.
Everything below is a criticism of the document, not of the work. Several of these are entirely reasonable things for a research note to omit; they are listed because a reader who does not notice them will over-read the evidence.
Splitting at the zeroth codebook is the note’s first stated contribution, and nothing in the note compares it against splitting elsewhere. No perplexity, no listening test, no latency measurement of the alternative. The argument is sound; the evidence is absent.
Severity: high — it is the headline claim“Enabling low-latency generation” is the justification for the whole design, and the document contains no milliseconds anywhere. Time-to-first-audio, real-time factor, throughput at each size — all absent, all easy to measure.
Severity: high — directly checkable, and not checkedThe pronunciation continuation test requires multi-turn audio conditioning, which the compared commercial APIs do not accept. Charting them side by side implies a quality ranking where the real finding is an architectural precondition.
Severity: medium — the finding is real, the framing is notNo tables, no values in prose, no intervals. “Consistently favour” is compatible with 55:45 and 80:20, and the difference between those two is the difference between a nearly-solved problem and an open one.
Severity: medium — blocks citation and comparison“Publicly available” is undefined; the transcription, diarisation and filtering pipelines are unnamed; the licensing question is untouched. For a system whose behaviour is learned from conversational structure, the corpus deserved more than the architecture got.
Severity: medium–high — the pipeline is the model at this scaleEnglish-only with “multilingual ability… due to dataset contamination”, and no use of pretrained language-model weights. Both are stated plainly in the limitations, which is to the note’s credit — and the second one means every bit of text understanding in the homograph results was learned from transcribed speech alone.
Severity: low as a criticism — disclosed, and interestingCriticism is cheap. Four things in this document are genuinely better than the norm, and it is worth being specific about them because they are the parts worth imitating.
A company research note reporting that its flagship model loses to humans on the exact capability it was built for. That sentence had to survive several review cycles, and it is the most credible thing in the document.
Recognising saturation and responding by constructing automatic, binary, capability-isolating tests is the durable contribution here — more durable, probably, than the architecture.
The final paragraph tells you precisely what class of problem the model does not address and what would be required to address it. Most releases leave the reader to discover the ceiling by hitting it.
Three sentences, an order of magnitude, and a principle that generalises to any hierarchical model whose inner module runs once per outer position. This is the paragraph most likely to end up in someone else’s training loop.
And one structural virtue worth calling out: the technical section reasons symbolically. Every claim is stated in terms of $N$, $B$, $S$ — which means the argument can be checked, generalised and reused even though the constants are missing. That is a sign of authors who understood their design rather than merely reporting it.
Place the note on the timeline and its contribution becomes easy to state in one line.
| System | Year | The move it made | What it left open |
|---|---|---|---|
| EnCodec / SoundStream | 2021–22 | Speech becomes discrete tokens via RVQ — the substrate everything else stands on. | Tokens have no language model over them. |
| AudioLM | 2022 | Semantic tokens then acoustic tokens; audio generation as language modelling. | The semantic bottleneck; no text control. |
| VALL-E | 2023 | Text-to-speech as codec language modelling; three-second prompt gives zero-shot voice cloning. | Cannot stream; conditioned on a sentence, not a conversation. |
| Moshi | 2024 | RQ-Transformer plus Mimi plus dual-stream duplex; inner monologue; real-time dialogue. | Reasoning quality of a speech-native model; single system, hard to compose. |
| CSM | 2025 | Split at codebook zero; conditioning on full conversation history; an evaluation suite for contextual capability. | Turn-based; no conversation structure; no pretrained language model. |
| Qwen2.5-Omni and kin | 2025–26 | Thinker–talker split: a text brain and a speech mouth sharing context, streaming end to end. | Still largely half-duplex in deployment. |
| Duplex speech-language-action | 2026 | Synchronised speech, language and tool use in one always-listening loop. | The current frontier. |
In one line: CSM is the model that took conversation history seriously as conditioning, and measured whether that was enough. Its answer — necessary but not sufficient — is what points the field at duplex.
The lineage also explains why CSM is not simply superseded by Moshi despite Moshi being duplex and a year older. They optimise different things. Moshi’s dual-stream architecture models structure and pays for it with a speech-native model whose linguistic reasoning is weaker than a comparable text model’s. CSM models content extremely well, conditioned on more context than anything before it, and declines to model structure at all. The next generation is trying to have both, which is exactly the “fundamental changes across the stack” the note predicted.
This lesson sits in the middle of two ladders that meet at voice. Here is where to go next in each direction.
Context length is a real constraint but a separate one. The point is representational: overlap, backchannels and negotiated handovers require two simultaneous streams in the output space, and the data pipeline that makes clean turns is the same pipeline that deletes the overlap. Hence “fundamental changes across the stack, from data curation to post-training.”