Research-note teardown · Sesame · February 2025

Crossing the uncanny valley: the Conversational Speech Model, read closely.

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.

SOURCE 1 research note + 2 papers DEPTH hand-arithmetic to code WIDGETS 11 interactive CHAPTERS 11

00 Concept constellation

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 problem The token stack The architecture Training & scale Evaluation & frontier Has a lesson on this site

Five clusters, five questions

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.

01
The problem

Why good TTS still feels dead

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.

02
The token stack

What speech is made of, discretely

Semantic tokens, acoustic tokens, residual vector quantisation, the split-RVQ Mimi tokenizer at 12.5 Hz, and the delay pattern that made streaming awkward.

03
The architecture

Who predicts which codebook

A multimodal backbone for codebook zero, a small depth decoder for the rest, interleaved text and audio, speaker identity carried inside the text stream.

04
Training & scale

What made it affordable

The batch-size explosion of an autoregressive decoder over frames, the one-sixteenth compute amortisation scheme, one million hours of audio, three model sizes.

05
Evaluation & frontier

How you know it worked

Saturated word error rate, homograph disambiguation, pronunciation continuation consistency, two CMOS studies, and the context gap that is still open.

The one-sentence claim

Strip the note to a single testable sentence and you get this:

If a speech model is conditioned on the history of the conversation — the actual audio of what was said before, not just its transcript — then it can choose among the many valid ways of speaking a sentence, and the chosen rendition will be more appropriate than one produced from text alone.

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.

The evidence base

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.

SourceDateRole in this lessonWhat it pins down
Sesame research note
“Crossing the uncanny valley of conversational voice”
Feb 2025Primary. 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 2024Secondary. 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 2023Secondary. 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.

Reading rules for this teardown

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:

  1. Every architectural claim is traced

    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 note
  2. Vague spots are named, not smoothed over

    The 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 this
  3. Comparisons are structural, not promotional

    VALL-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 centrepiece

Which numbers are real

This 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.

QuantityValue usedStatus
Frame rate12.5 Hzstated in the note Via Mimi, cited to the Moshi paper.
Sequence length2,048 positionsstated “~2 minutes of audio”, five epochs.
Model sizes1B/100M, 3B/250M, 8B/300Mstated Backbone and decoder for each of three sizes.
Dataset~1,000,000 hoursstated “Predominantly English”, after filtering.
Amortisation ratio1 frame in 16stated Decoder only; codebook 0 sees every frame.
Evaluation protocols200 samples each; 5 and 10 wordsstated Including the phonetic recogniser used.
Codebook count $N$32 in examplesassumed Never stated. See Chapter 08 for the single ambiguous clue.
Codebook size2,048 entriesfrom Moshi Mimi’s configuration; gives 11 bits per code, 1.1 kbps.
Decoder shape6 layers, $d = 1024$from Moshi Used as a stand-in for memory estimates only.
Batch size $B$32assumed Never stated; used to make the memory ledger concrete.
Step latencies20 ms backbone, ~2 ms decoderassumed 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.

Concept check
The note reports that listeners show no clear preference between CSM audio and human recordings when no context is given, but consistently prefer the human recording when ninety seconds of conversational context is provided. What does that pair of results establish?

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.”

01 The assistant that got boring

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.

Four components of presence

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.

01
Emotional intelligence

Reading and responding to emotional context

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.

02
Conversational dynamics

Timing, pauses, interruptions, emphasis

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.

03
Contextual awareness

Adjusting tone and style to the situation

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.

04
Consistent personality

A coherent, reliable, appropriate presence

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.

The productive way to read a research note’s framing section is as a constraint list for the architecture that follows. “Emotional intelligence” is not a vibe; it is the sentence “the model must receive audio, not transcripts, as context.” “Consistent personality” is the sentence “the model’s own past output must be in its own context window.” If you translate each bullet into an input requirement, the model design becomes almost forced.

The one-to-many problem

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:

Classical TTS — text in, audio out $$ p(\text{audio} \mid \text{text}) $$

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:

Conversational speech generation — history in, audio out $$ p\big(\text{audio}_t \mid \text{text}_t,\; (\text{text}_{1:t-1},\, \text{audio}_{1:t-1})\big) $$
  • $\text{text}_t$ — what this turn should say. The only thing classical TTS gets.
  • $\text{text}_{1:t-1}$ — the transcript of the conversation so far. Carries topic, register, and (in CSM) speaker identity.
  • $\text{audio}_{1:t-1}$ — the actual sound of every previous turn, from both parties. Carries emotion, energy, pace, accent, and how a contested word was pronounced last time.

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.

This is the same move as everywhere else in modern machine learning, and recognising it is worth more than memorising it. Ambiguity that looks like a modelling problem is usually a conditioning problem. Image super-resolution is one-to-many until you condition on a text prompt. Next-token prediction is one-to-many until you condition on a long enough prefix. Speech synthesis is one-to-many until you condition on the conversation. In every case the fix is not a better decoder — it is a wider input.

How many ways, exactly? A back-of-envelope count

“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 dimensionDistinct optionsCount
Emphasised wordI / can’t / believe / you / did / that6
Terminal contourfalling (statement) / rising (question) / level (trailing off)3
Speaking rateslow / medium / fast3
Loudnesswhisper / conversational / raised3
Voice qualitybreathy / modal / creaky / tense4
Pause placementnone / after “believe” / after “you”3
Worked count, every step shown.

Total combinations, treating the dimensions as independent:
$6 \times 3 = 18$
$18 \times 3 = 54$
$54 \times 3 = 162$
$162 \times 4 = 648$
$648 \times 3 = \mathbf{1{,}944}$ distinct renditions.

Now prune to the plausible. Not every combination is a real utterance: a whispered, fast, rising, creaky reading with emphasis on “I” is not something a person produces. Say generously that one in four combinations is natural — $1{,}944 / 4 = \mathbf{486}$ renditions that a human might actually say.

Finally, ask how many are appropriate in one specific moment: your friend has just handed you a gift you mentioned wanting six months ago. Emphasis on “believe” or “you”; contour rising or level; rate medium-to-fast; loudness conversational-to-raised; voice quality modal or breathy; pause optional. That is roughly $2 \times 2 \times 2 \times 2 \times 2 \times 2 = \mathbf{64}$.

The ratio is the point. $64 / 486 \approx \mathbf{13\%}$. Speaking from text alone, a model choosing uniformly among natural renditions is wrong about seven times out of eight — and every single one of its wrong answers passes a naturalness test, because each is a perfectly natural way to say the sentence. It is just the wrong one.

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.

Widget: the rendition fan

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.

Appropriate here Natural, but wrong for this moment Mode-seeking output (the flat assistant)

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 illustration is schematic — the dots are generated, not measured, and prosody is not really two-dimensional. What is not schematic is the geometry of the argument: conditioning does not move the model to a better place in prosody space; it tells the model which place is the right one. Same decoder, same expressive range, different information.

Why this became the frontier in 2025 and not 2020

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:

  1. Intelligibility (through roughly 2016)

    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 successors
  2. Naturalness (roughly 2016–2022)

    Neural 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 saturated
  3. Speaker identity and zero-shot cloning (2023)

    VALL-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 apart
  4. Contextual appropriateness (2024 onward)

    With 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 lesson

Each 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.

There is a general lesson here about benchmarks that this note demonstrates rather than states. A saturated benchmark is often described as “solved” or “useless.” Both framings miss the point. A saturated benchmark is a measuring instrument that has run out of resolution. The correct response is not to abandon measurement but to build the next instrument — which is exactly what Chapters 06 and 07 show Sesame doing, and it is the more transferable half of the note.
Concept check
A text-to-speech model trained by maximum likelihood on a large single-sentence corpus tends to produce flat, neutral prosody. What is the most accurate explanation?

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.

02 What CSM actually is

“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:

“There are two key takeaways from our work. The first is that CSM operates as a single-stage model, thereby improving efficiency and expressivity. The second is our evaluation suite, which is necessary for evaluating progress on contextual capabilities and addresses the fact that common public evaluations are saturated.”

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.

What enters the model

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.

StageInputOutputRate / shape
Text tokenizerTurn transcript with speaker markerLlama subword token ids~3–4 tokens per second of speech
Mimi tokenizerTurn waveform$N$ codebook indices per frame — one semantic, $N-1$ acoustic12.5 frames per second
InterleaveText tokens + audio frames, turn by turnOne flat multimodal sequence2,048 positions ≈ 2 minutes
BackboneInterleaved sequence up to position $s-1$Hidden state; logits for codebook 0 at frame $s$1B / 3B / 8B parameters
Depth decoderBackbone state + codebook 0 of this frameCodebooks $1 \dots N-1$ of the same frame100M / 250M / 300M parameters
Mimi decoderAll $N$ codebooks of a frame80 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.

Worked: does 2,048 positions really hold two minutes?

Audio side. Two minutes is $120$ seconds. At $12.5$ frames per second:
$120 \times 12.5 = \mathbf{1{,}500}$ audio frames.

Text side. Conversational English runs about 150 words per minute; a Llama tokenizer averages roughly 1.3 tokens per word, and the note itself is consistent with the Moshi paper’s figure of “3 to 4 text tokens per second” of speech. Take 3.5:
$120 \times 3.5 = \mathbf{420}$ text tokens.

Total: $1{,}500 + 420 = \mathbf{1{,}920}$ positions.

Budget: $2{,}048$. Remainder for speaker markers, turn boundaries and end-of-turn symbols: $2{,}048 - 1{,}920 = \mathbf{128}$ positions — about one per second of conversation, which is exactly the right order for turn markers in a two-party dialogue.

The arithmetic closes. Which confirms the interpretation that matters: a sequence position at the backbone is one audio frame or one text token, not one RVQ code. If each of the $N$ codebooks consumed its own position, two minutes of audio alone would need $1{,}500 \times N$ positions — at $N = 32$, that is 48,000, and the stated context would be off by a factor of twenty-four. Chapter 04 is where that collapse is engineered.

Speaker identity lives in the text stream

“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:

A
Speaker embedding

A learned vector per speaker

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.

B
Acoustic prompt

Prefix the audio of the target voice

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.”

C
A text marker

Write the speaker into the transcript

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.

Compare with how instruction-tuned language models handle roles. Nobody adds a “role embedding” pathway to a chat model; the role is a token, and everything else follows from attention. CSM applies the same principle to voices. When a modality can be expressed inside the sequence, expressing it inside the sequence is almost always the better engineering choice — it inherits every capability of the sequence model for free, including in-context generalisation to combinations never seen in training.

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 inference loop, step by step

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:

  1. Interleave and feed

    “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
  2. Backbone predicts codebook zero

    “…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
  3. Depth decoder fills in the rest

    “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
  4. Feed the completed frame back

    “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
  5. Stop at end of turn

    “…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
  6. Next request, with the interim as context

    “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 words

Step 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.

Widget: the interleaved stream

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.

Text tokens Audio frames (user) Audio frames (model) Being generated now

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.

What “single-stage” is arguing against

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:

“A common strategy first models semantic tokens and then generates audio using RVQ or diffusion-based methods. Decoupling these steps allows for a more structured approach to speech synthesis — the semantic tokens provide a compact, speaker-invariant representation that captures high-level linguistic and prosodic information, while the second stage reconstructs the fine-grained acoustic details needed for high-fidelity speech. However, this approach has a critical limitation; semantic tokens are a bottleneck that must fully capture prosody, but ensuring this during training is challenging.

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 emitsA full sequence of semantic tokens for the whole utteranceOne semantic code for the next frame — then immediately its acoustic codes
Prosody pathwayMust survive the semantic bottleneckBackbone state feeds the acoustic decoder directly, every frame
Training signalTwo objectives, separately optimisedOne end-to-end objective over all codebooks
Failure modeFlat delivery that stage 2 cannot repairErrors in codebook 0 propagate within the frame
Latency structureWhole utterance, then reconstructionFrame 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.

A useful way to hold the distinction: in a two-stage system, the second stage asks “what does this semantic token sound like?” In CSM, the depth decoder asks “what does this frame sound like, given everything the backbone knows about this conversation?” The first question has an answer that does not depend on the conversation. The second one does. That dependency is exactly the capability the note is trying to buy.
Concept check
In CSM’s inference loop, the completed audio frame — all $N$ codebook values — is fed back to the backbone as a single sequence position. Why does that matter more than it might first appear?

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.

03 Two kinds of audio token, and the traffic jam between them

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:

Semantic tokens: “Compact speaker-invariant representations of semantic and phonetic features. Their compressed nature enables them to capture key speech characteristics at the cost of high-fidelity representation.”

Acoustic tokens: “Encodings of fine-grained acoustic details that enable high-fidelity audio reconstruction. These tokens are often generated using Residual Vector Quantization (RVQ). In contrast to semantic tokens, acoustic tokens retain natural speech characteristics like speaker-specific identity and timbre.”

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.

Residual vector quantisation, by hand, every number

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:

The frame we must encode $$ x = [\,0.90,\; -0.35\,] $$

and three tiny codebooks, each at half the scale of the one before — coarse, finer, finest:

CodebookEntry 0Entry 1Entry 2Entry 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]
Level 1 — quantise $x$. Squared distances from $x = [0.90, -0.35]$ to each entry of $C^{(1)}$:
to [1, 0]: $(0.90-1)^2 + (-0.35-0)^2 = 0.01 + 0.1225 = \mathbf{0.1325}$
to [0, 1]: $(0.90)^2 + (-1.35)^2 = 0.81 + 1.8225 = 2.6325$
to [-1, 0]: $(1.90)^2 + (0.35)^2 = 3.61 + 0.1225 = 3.7325$
to [0, -1]: $(0.90)^2 + (0.65)^2 = 0.81 + 0.4225 = 1.2325$
Winner: index 0. Residual $r_1 = x - [1, 0] = [-0.10,\, -0.35]$.

Level 2 — quantise $r_1$. Squared distances from $[-0.10, -0.35]$ to $C^{(2)}$:
to [0.50, 0]: $(0.60)^2 + (0.35)^2 = 0.36 + 0.1225 = 0.4825$
to [0, 0.50]: $(0.10)^2 + (0.85)^2 = 0.01 + 0.7225 = 0.7325$
to [-0.50, 0]: $(0.40)^2 + (0.35)^2 = 0.16 + 0.1225 = 0.2825$
to [0, -0.50]: $(0.10)^2 + (0.15)^2 = 0.01 + 0.0225 = \mathbf{0.0325}$
Winner: index 3. Residual $r_2 = r_1 - [0, -0.50] = [-0.10,\, 0.15]$.

Level 3 — quantise $r_2$. Squared distances from $[-0.10, 0.15]$ to $C^{(3)}$:
to [0.25, 0]: $(0.35)^2 + (0.15)^2 = 0.1225 + 0.0225 = 0.1450$
to [0, 0.25]: $(0.10)^2 + (0.10)^2 = 0.01 + 0.01 = \mathbf{0.0200}$
to [-0.25, 0]: $(0.15)^2 + (0.15)^2 = 0.0225 + 0.0225 = 0.0450$
to [0, -0.25]: $(0.10)^2 + (0.40)^2 = 0.01 + 0.16 = 0.1700$
Winner: index 1. Residual $r_3 = r_2 - [0, 0.25] = [-0.10,\, -0.10]$.

The code and the reconstruction. Three indices: $(0, 3, 1)$. Reconstruction is a sum, not a lookup:
$\hat{x} = [1, 0] + [0, -0.50] + [0, 0.25] = [\,1.00,\; -0.25\,]$
Error $= x - \hat{x} = [-0.10, -0.10]$, matching $r_3$ exactly — as it must.

The error ladder. $\|x\| = \sqrt{0.81 + 0.1225} = 0.966$
after level 1: $\|r_1\| = \sqrt{0.1325} = 0.364$ → 37.7% of the original magnitude
after level 2: $\|r_2\| = \sqrt{0.0325} = 0.180$ → 18.7%
after level 3: $\|r_3\| = \sqrt{0.0200} = 0.141$ → 14.6%

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.

Worked: Mimi’s bitrate.
Bits to name one entry among 2,048: $\log_2 2048 = \mathbf{11}$ bits.
Bits per frame: $8 \text{ codebooks} \times 11 = \mathbf{88}$ bits.
Bits per second: $88 \times 12.5 = \mathbf{1{,}100}$ bits per second $= 1.1$ kbps.

That matches the figure reported in the Moshi paper exactly. For scale: a phone call over G.711 is 64 kbps, and a good Opus voice stream is around 24 kbps. Mimi is representing speech at roughly one fiftieth of a phone call’s bitrate, in a form a language model can predict token by token.

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.

Why Mimi splits the RVQ

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:

  1. One plain vector quantiser for semantics

    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 predicts
  2. A separate RVQ, in parallel, for acoustics

    Seven 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
  3. Sum the two outputs

    “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 deleted
This is a small design decision with an outsized consequence for CSM, and it is worth stating explicitly because the note assumes you will infer it. Because Mimi’s codebook 0 is a parallel semantic quantiser rather than the first level of a residual chain, the split “backbone predicts codebook 0, decoder predicts the rest” is a split along a genuine semantic-versus-acoustic seam. The large model handles the part of the signal that carries meaning and prosodic structure; the small model handles the part that carries timbre and detail. Split the same way on a plain RVQ and you would be splitting at an arbitrary point in a residual cascade.

The sequential dependency problem, and the delay-pattern answer

Now 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:

“Models must account for the sequential dependency between codebooks in a frame. One method, the delay pattern, shifts higher codebooks progressively to condition predictions on lower codebooks within the same frame. A key limitation of this approach is that the time-to-first-audio scales poorly because an RVQ tokenizer with $N$ codebooks requires $N$ backbone steps before decoding the first audio chunk. While suitable for offline applications like audiobooks, this delay is problematic in a real-time scenario.”

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.

Worked: time to first audio under the delay pattern.

Let $N$ be the number of codebooks, $f$ the frame rate, and $\tau$ the wall-clock cost of one backbone step.

Steps before the first complete frame: $\mathbf{N}$.
Wall-clock before the first 80 ms of audio: $N \cdot \tau$.

Put in numbers. With $N = 8$ and a backbone step of $\tau = 20$ ms:
$8 \times 20 = \mathbf{160}$ ms before any sound exists.

With $N = 32$ and the same step:
$32 \times 20 = \mathbf{640}$ ms — before transport, before endpointing, before the language model even finished deciding what to say.

Now the contrast that motivates CSM. Under the backbone-plus-decoder split, the first complete frame needs one backbone step plus $N-1$ decoder steps. If the decoder step costs $\tau_d = 2$ ms (it is a model roughly thirty times smaller):
$20 + 31 \times 2 = 20 + 62 = \mathbf{82}$ ms.

640 ms versus 82 ms for the same $N$. Same codebooks, same dependency structure, same total number of predictions — different assignment of predictions to models. That ratio is the entire practical argument for the architecture in Chapter 04.

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.

Widget: the delay pattern and its cost

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.

Produced by a backbone step Produced by a decoder step First decodable frame Faded = not yet produced

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.

Why the note rejects both incumbent options

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.

DesignHow codes get producedObjection 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 frameAccepted. “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.

Concept check
Under the delay pattern, why does time-to-first-audio scale with the number of codebooks $N$, when the total number of predictions is the same as any other schedule?

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.

04 One question, three answers

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.

The joint distribution every system is factorising $$ p(\mathbf{c}) = p\big(c_{1,1}, \ldots, c_{T,N}\big), \qquad c_{t,k} \in \{1, \ldots, V\} $$
  • $t = 1 \ldots T$ — time, one index per audio frame.
  • $k = 1 \ldots N$ — depth, one index per codebook level within the frame.
  • $V$ — codebook size; 2,048 in Mimi, giving 11 bits per code.
  • The dependencies: $c_{t,k}$ depends on all $c_{

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.

VALL-E: autoregressive, then parallel

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:

VALL-E, AR stage $$ p\big(c_{:,1} \mid x, \tilde{C}_{:,1}; \theta_{AR}\big) = \prod_{t} p\big(c_{t,1} \mid c_{
  • $x$ — the phoneme sequence for the text to be spoken.
  • $\tilde{C}$ — codes of the three-second enrolment recording, used as a prefix. This is the zero-shot voice cloning mechanism: the prompt is not a special conditioning pathway, it is simply the beginning of the sequence.
  • $T$ steps of the large model — one per frame.
  • 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$.

    PropertyVALL-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 countTwo transformers, trained separately.
    Where the voice comes fromThree 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.”

    There is a second, subtler cost. Within a NAR pass, all positions of level $i$ are predicted independently given the shallower levels. That is a genuine independence assumption — the model cannot express “if frame 40 got this acoustic detail, frame 41 should match.” In practice the shallower levels carry enough structure that this is tolerable, which is precisely why the trick works at all. But it is an approximation traded for speed, and it is the kind of thing that shows up as subtle texture artefacts rather than as an obvious failure.

    Moshi: the RQ-Transformer

    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:

    RQ-Transformer — the temporal step $$ z_s = \mathrm{Tr}_{\text{Temp}}\big(V_0, \ldots, V_{s-1}\big) \in \mathbb{R}^d $$
    RQ-Transformer — the depth step, for $1 < k \le K$ $$ l_{s,k} = \mathrm{Tr}_{\text{Depth}}\big(z_s,\, V_{s,1}, \ldots, V_{s,k-1}\big) \in \mathbb{R}^{N_k} $$
    • $V_s = (V_{s,1}, \ldots, V_{s,K})$ — all $K$ sub-sequences at step $s$, stacked.
    • $z_s$ — the temporal context vector: everything the big model knows, compressed into one vector per step.
    • $l_{s,1} = \mathrm{Lin}(z_s)$ — the first sub-sequence gets its own linear head straight off the temporal transformer. Remember this line; it is where CSM differs.

    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.

    CSM: split at the zeroth codebook

    from the note Now read the note’s sentence with the Moshi formalism in hand, because every clause is now legible:

    “CSM is a multimodal, text and speech model that operates directly on RVQ tokens. Inspired by the RQ-Transformer [4], we use two autoregressive transformers. Different from the approach in [5], we split the transformers at the zeroth codebook. The first multimodal backbone processes interleaved text and audio to model the zeroth codebook. The second audio decoder uses a distinct linear head for each codebook and models the remaining $N-1$ codebooks to reconstruct speech from the backbone’s representations. The decoder is significantly smaller than the backbone, enabling low-latency generation while keeping the model end-to-end.”

    Four claims, taken one at a time:

    1. “Inspired by the RQ-Transformer [4]”

      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 not
    2. “Different from the approach in [5], we split at the zeroth codebook”

      In 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 rung
    3. “A distinct linear head for each codebook”

      The 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 so
    4. “Significantly smaller… while keeping the model end-to-end”

      The 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 budget

    Why 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.

    So the design reads as an allocation of capacity to difficulty. The hard, context-dependent, one-to-many decision — which of 486 natural renditions fits this moment — is made by the 8B model that has the whole conversation in its context. The easy, local, largely deterministic decision — given this semantic code and this frame state, what are the acoustic residuals — is made by a 300M model that never has to know what the conversation is about. Chapter 05’s amortisation trick is only defensible because of this allocation: you can afford to train the decoder on one frame in sixteen precisely because its job does not require conversational understanding.

    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.

    Showcase: all three factorisations on the same grid

    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.

    Predicted by the large model Predicted by the small model / NAR pass Frame complete — audio available Not yet produced

    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.

    The one-word difference, stated as a table

    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 codeThe AR model (it is codebook 1)The depth transformerThe backbone
    Who predicts textN/A — text is input, as phonemesTemporal transformer’s linear headBackbone, interleaved in the sequence
    StreamableNoYesYes
    Steps to first decodable frame$T + N - 1$1 large $+\;K-1$ small1 large $+\;N-1$ small
    ConditioningPhonemes + 3 s enrolment promptTwo audio streams + inner monologue textInterleaved conversation history, text + audio
    DuplexNoYes — models both sides simultaneouslyNo — 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.

    The loop in code — three forms

    Start with the shape of the thing, in the most explicit form possible: nested loops, no batching, no caching, every step visible.

    python · form 1 — the loop as written on a whiteboard
    # 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:

    python · form 2 — with the key-value cache made explicit
    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:

    python · form 3 — the frame, as one expression
    frame = depth_decode(backbone_state, c0, N)   # N-1 tiny AR steps
    # everything above is the body of depth_decode plus one backbone step
    
    Concept check
    The note says CSM differs from Moshi by splitting “at the zeroth codebook.” Given that Moshi’s first sub-sequence is the text token, what is the concrete consequence of that difference?

    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.

    05 A small model with an enormous batch

    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:

    “This design introduces significant infrastructure challenges during training. The audio decoder processes an effective batch size of $B \times S$ and $N$ codebooks autoregressively, where $B$ is the original batch size, $S$ is the sequence length, and $N$ is the number of RVQ codebook levels. This high memory burden even with a small model slows down training, limits model scaling, and hinders rapid experimentation, all of which are crucial for performance.”

    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.

    This is a failure mode worth internalising because it recurs everywhere hierarchical models appear. Whenever an inner model operates per position of an outer model, the inner model’s batch dimension silently absorbs the outer model’s sequence dimension. The inner model can be a hundred times smaller and still dominate memory, because memory scales with batch × depth, and its batch just got multiplied by 2,048. “Small model” does not imply “small cost” when the small model runs everywhere.

    The ledger, every number

    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.

    Step 1 — how many positions does the backbone handle?
    $B \times S = 32 \times 2048 = \mathbf{65{,}536}$ positions.
    The backbone predicts codebook 0 at each of them, so: 65,536 predictions.

    Step 2 — how many decoder problems is that?
    One per position: $\mathbf{65{,}536}$ independent decoder rollouts.

    Step 3 — how long is each rollout?
    The decoder predicts codebooks $1 \dots N-1$, so $N - 1 = 32 - 1 = \mathbf{31}$ steps.

    Step 4 — total decoder predictions per training step.
    $65{,}536 \times 31 = \mathbf{2{,}031{,}616}$.
    Check the multiplication: $65{,}536 \times 31 = 65{,}536 \times 32 - 65{,}536 = 2{,}097{,}152 - 65{,}536 = 2{,}031{,}616$. ✓

    Step 5 — the ratio.
    Decoder predictions per backbone prediction: $2{,}031{,}616 / 65{,}536 = \mathbf{31}$.
    Of course — it is exactly $N-1$, by construction. But seeing it as two million versus sixty-five thousand is what makes it visceral.

    Step 6 — the share of total work.
    Total predictions: $65{,}536 + 2{,}031{,}616 = \mathbf{2{,}097{,}152}$ (which is $2^{21}$, a pleasant confirmation that the arithmetic is right).
    Decoder share: $2{,}031{,}616 / 2{,}097{,}152 = \mathbf{96.9\%}$.

    The headline. Ninety-seven percent of the token predictions in this model are made by the component that has three percent of the parameters. That is the sentence the note compresses into “high memory burden even with a small model.”

    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.

    What it costs in memory

    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.

    A deliberately conservative lower bound. Take the Moshi paper’s depth-transformer configuration as a stand-in for CSM’s decoder, since the note gives no layer counts: 6 layers, $d = 1024$. Count only one hidden state per layer per position — ignoring attention scores, MLP intermediates (typically $4d$), and normalisation buffers, all of which are real.

    Decoder positions per training step: $B \times S \times N = 32 \times 2048 \times 32$
    $32 \times 2048 = 65{,}536$
    $65{,}536 \times 32 = \mathbf{2{,}097{,}152}$ positions.

    Floats to retain: $2{,}097{,}152 \times 6 \text{ layers} \times 1024 \text{ dims}$
    $2{,}097{,}152 \times 6 = 12{,}582{,}912$
    $12{,}582{,}912 \times 1024 = 12{,}884{,}901{,}888$ floats.

    In bfloat16 (2 bytes each): $12{,}884{,}901{,}888 \times 2 = 25{,}769{,}803{,}776$ bytes
    $= \mathbf{25.8}$ GB.

    Twenty-six gigabytes for the smallest possible accounting of a 300M-parameter model’s activations — on top of the backbone’s own activations, its optimiser states, and its gradients. Include MLP intermediates at $4d$ and the honest figure is several times higher. This is why the note calls it an infrastructure challenge rather than an inefficiency.

    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.

    One frame in sixteen

    The fix, in the note’s words:

    “To address these challenges, we use a compute amortization scheme that alleviates the memory bottleneck while preserving the fidelity of the full RVQ codebooks. The audio decoder is trained on only a random 1/16 subset of the audio frames, while the zeroth codebook is trained on every frame. We observe no perceivable difference in audio decoder losses during training when using this approach.”

    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:

    Step 1 — frames per sequence that reach the decoder.
    $S / 16 = 2048 / 16 = \mathbf{128}$ frames.

    Step 2 — the decoder’s new effective batch.
    $B \times (S/16) = 32 \times 128 = \mathbf{4{,}096}$ — down from 65,536.

    Step 3 — decoder predictions per step.
    $4{,}096 \times 31 = \mathbf{126{,}976}$ — down from 2,031,616.
    Check: $4{,}096 \times 31 = 4{,}096 \times 32 - 4{,}096 = 131{,}072 - 4{,}096 = 126{,}976$. ✓

    Step 4 — the backbone is untouched.
    Still $\mathbf{65{,}536}$ predictions on codebook 0. Nothing was skipped there.

    Step 5 — the new balance.
    Decoder / backbone $= 126{,}976 / 65{,}536 = \mathbf{1.94}$ — down from 31.
    Total predictions $= 65{,}536 + 126{,}976 = \mathbf{192{,}512}$, down from 2,097,152.
    Overall reduction: $2{,}097{,}152 / 192{,}512 = \mathbf{10.9\times}$.
    Decoder-only reduction: exactly $\mathbf{16\times}$, as designed.

    Step 6 — memory, same accounting as before.
    $25.8 \text{ GB} / 16 = \mathbf{1.6}$ GB. The bottleneck stops being a bottleneck.

    Step 7 — the share of work flips.
    Decoder share of predictions: $126{,}976 / 192{,}512 = \mathbf{66\%}$, down from 96.9%. The model has gone from “a backbone with a runaway appendage” to something with a sane cost profile.

    Why the trick is legal here — and where it would not be

    “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.

    How much decoder training signal survives?

    Dataset: approximately one million hours of audio.
    $1{,}000{,}000 \text{ h} \times 3600 \text{ s/h} = 3.6 \times 10^{9}$ seconds.
    At 12.5 frames per second: $3.6 \times 10^{9} \times 12.5 = \mathbf{4.5 \times 10^{10}}$ frames per epoch.

    Five epochs: $5 \times 4.5 \times 10^{10} = 2.25 \times 10^{11}$ frame-instances.
    One sixteenth reach the decoder: $2.25 \times 10^{11} / 16 = \mathbf{1.4 \times 10^{10}}$ frames.
    At 31 code predictions each: $\approx 4.4 \times 10^{11}$ decoder predictions over training.

    Fourteen billion training frames is not a small sample. The decoder’s task — a local, low-entropy mapping from state to acoustic residual — is nowhere near needing that many examples. The one-sixteenth subsample is not on the edge of sufficiency; it is comfortably inside it, which is exactly why the loss curves showed nothing.

    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.

    ComponentCross-frame state?Task complexitySafe to subsample?
    Backbone / codebook 0Yes — fully autoregressive over the conversationHigh: semantics, prosody, speaker, turn structureNo. Holes break the causal chain.
    Depth decoder / codebooks 1..N−1No — context is one frameLow: local residual reconstructionYes. Independent problems; ordinary minibatching.
    The generalisable rule: you may subsample the training signal of a submodule exactly to the extent that its examples are independent of one another and its task is data-cheap relative to the whole. Both conditions have to hold. Independence without cheapness means you have simply trained it less; cheapness without independence means you have corrupted the sequence. CSM’s decoder satisfies both, which is why one-sixteenth was free rather than merely tolerable.

    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.

    Widget: the amortisation ledger

    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.

    Backbone predictions (codebook 0) Decoder predictions (codebooks 1..N−1) Saved by amortisation

    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.

    Three forms of the same code

    First, the training step written out longhand, so the shape of the tensors is unambiguous.

    python · form 1 — explicit, no amortisation
    # 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:

    python · form 2 — amortised, step by step
    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:

    python · form 3 — the trick in one line
    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.

    Concept check
    Why is the zeroth codebook trained on every frame while the remaining codebooks are trained on only one frame in sixteen?

    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.

    06 Two tests that a saturated benchmark cannot run

    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:

    01
    Paralinguistics

    Sounds that are not words

    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.

    02
    Foreign words

    Text outside the phonetic norm

    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.

    03
    Contextual expressivity

    Continuation after a chime

    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.

    04
    Pronunciation correction

    Adapting to a human recording

    “Pronunciation correction sentence is a recording, all other audio is generated.” A human says a word a particular way; the model must follow.

    05
    Multiple speakers

    Two voices, one generation

    “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.

    There is a methodological point worth extracting before the details. Demos are unfalsifiable — a curated sample proves the capability is possible, not that it is reliable. The move from “listen to this” to “here is an accuracy on 200 held-out samples” is the move from advertisement to evidence, and it is the part of this note that other model releases most conspicuously skip.

    Test 1: homograph disambiguation — does the model understand the text?

    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.”

    Reading the protocol as a design.

    Cells in the design: $5 \text{ homographs} \times 2 \text{ variants} = \mathbf{10}$ conditions.
    Samples per condition: $200 / 10 = \mathbf{20}$.

    Is 20 enough? For a per-condition accuracy estimate, the standard error of a proportion near $p = 0.9$ is
    $\sqrt{p(1-p)/n} = \sqrt{0.9 \times 0.1 / 20} = \sqrt{0.0045} = 0.067$ — about 7 percentage points.
    Aggregated over all 200 samples, that tightens to $\sqrt{0.9 \times 0.1 / 200} = \mathbf{2.1}$ percentage points.

    Conclusion: the design supports a confident overall accuracy figure and cannot support confident per-word claims. That is the right trade for a headline metric, and it is worth knowing which claims the sample size does and does not license.

    The five words and their two readings each:

    HomographReading AReading BWhat disambiguates it
    lead/lɛd/ — the metal/liːd/ — to guideNoun vs verb; surrounding syntax
    bass/beɪs/ — low frequency/bæs/ — the fishSemantic domain: music vs fishing
    tear/tɪər/ — from the eye/tɛər/ — to ripNoun vs verb, plus semantic context
    wound/wuːnd/ — an injury/waʊnd/ — past tense of windTense and argument structure
    row/roʊ/ — a line, or to paddle/raʊ/ — an argumentRegister 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.

    This is a transferable technique for building an evaluation when your metric has saturated: find a representation in which the remaining errors are visible. The errors did not disappear when word error rate flattened; they moved somewhere the metric does not look. Phonetic transcription is the obvious place to look for pronunciation errors, and it required no new human labelling — just a different off-the-shelf model pointed at the same audio.

    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.

    Test 2: pronunciation continuation consistency — does the model listen?

    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.”

    Reading this protocol.

    Samples per word: $200 / 10 = \mathbf{20}$.
    Chance performance: each word has (at least) two accepted variants, so a model choosing at random scores about 50%. That is the floor any reported number must be read against.

    What makes a sample correct: the word appeared with a particular variant in an earlier turn of the same conversation, and the generated turn must use the same variant. Not the more common variant, not the dictionary variant — the one this conversation established.

    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.

    WordVariant AVariant BTypical 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.

    Compare the two tests as information-flow probes and the elegance becomes obvious. Homograph disambiguation asks: did the text channel get used for understanding? Pronunciation continuation asks: did the audio channel get used for memory? Between them they cover both halves of the architecture’s central claim. And critically, neither can be passed by accident by a model that merely sounds good — which is exactly the failure of the metric they replace.

    Why these two, and not others

    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.

    1. Automatically scoreable

      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 table
    2. Binary and unambiguous

      The 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 improvements
    3. Blind to everything except the capability of interest

      A 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
    TestInformation neededWhere it livesWhich system fails
    Word error rateWhich words were saidThe text being synthesisedNobody, any more — saturated
    Speaker similarityTimbre of the target voiceThe enrolment audioNobody, any more — saturated
    Homograph disambiguationSentence meaning and syntaxThe current turn’s textModels with weak language understanding in the speech path
    Pronunciation continuationHow a word was said earlierPrior turns’ audio onlyAny 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.

    Widget: the two tests, side by side

    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.

    Correct choice Wrong choice Information available Information destroyed

    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 scaling claim, read carefully

    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.

    A benchmark that only your architecture can attempt is a legitimate research contribution and an illegitimate product comparison. Both readings are available in the note, and only the first is defensible. When you build an evaluation for a capability your system was designed around, publish the architectural precondition alongside the scores — otherwise the table reads as a quality ranking when it is really a capability inventory.
    Concept check
    Why can a cascaded voice pipeline (recogniser → language model → synthesiser) not exceed chance on the pronunciation continuation test, even with perfect components?

    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.

    07 When a metric stops telling you anything

    “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.

    Sesame’s own presentation makes the point visually: the note captions its objective-metric figure “showing the metrics are saturated (matching human performance).” A figure whose purpose is to demonstrate that the figure is uninformative is an unusual and honest thing to publish.

    The arithmetic of a dead metric

    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?

    Worked: the sample size needed to see 0.1 percentage points.

    Model each word as a Bernoulli trial with error probability $p$. For two systems evaluated on $n$ words each, the standard error of the difference in error rates is
    $\mathrm{SE} = \sqrt{\dfrac{p_A(1-p_A)}{n} + \dfrac{p_B(1-p_B)}{n}}$.

    With $p_A = 0.021$ and $p_B = 0.020$, use the pooled $p = 0.0205$:
    $p(1-p) = 0.0205 \times 0.9795 = 0.02008$
    $\mathrm{SE} = \sqrt{\dfrac{2 \times 0.02008}{n}} = \sqrt{\dfrac{0.04016}{n}}$

    To detect a difference of $\delta = 0.001$ with 95% confidence and 80% power, we need $\delta \ge 2.8 \times \mathrm{SE}$ (the 2.8 combines $z_{0.975} = 1.96$ and $z_{0.80} = 0.84$):
    $0.001 \ge 2.8\sqrt{0.04016 / n}$
    $\dfrac{0.001}{2.8} \ge \sqrt{0.04016 / n}$
    $3.571 \times 10^{-4} \ge \sqrt{0.04016 / n}$
    Square both sides: $1.275 \times 10^{-7} \ge 0.04016 / n$
    $n \ge \dfrac{0.04016}{1.275 \times 10^{-7}} = \mathbf{314{,}900}$ words.

    Convert to speech. At roughly 150 words per minute:
    $314{,}900 / 150 = 2{,}099$ minutes $= \mathbf{35}$ hours of evaluated speech — per system, per comparison.

    And that is the optimistic case. The calculation assumes independent errors and perfectly correct reference transcripts. Real reference transcripts contain errors at a rate comparable to the difference being measured, which does not merely add noise — it puts a floor under the whole exercise. Below that floor, more data buys nothing.

    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.

    There is a general prescription buried here, and it is the reusable half of this chapter. When a metric saturates you have exactly three moves. One: change the representation the metric operates on, so remaining errors become visible — phonemes instead of words, which is Chapter 06. Two: change the task so it requires a capability the old metric never probed — multi-turn consistency instead of single-utterance accuracy. Three: change the judge, from an automatic scorer to a human with the relevant context — which is the CMOS study below. Sesame used all three, which is why the evaluation section is the more durable contribution of the note.

    CMOS: comparing against a reference instead of scoring in isolation

    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 elementSesame’s choiceWhy it matters
    Scale7-point preference, generated versus referenceCaptures magnitude of preference, not just direction; symmetric around “no preference.”
    ReferenceGround-truth human recording from the same datasetThe strongest possible comparison target. Beating a weaker system proves less than tying with a person.
    DatasetExpresso — expressive, emotionally and prosodically variedA neutral read-speech corpus would hide exactly the differences under test. Choosing a hard dataset is the honest choice.
    Raters80 paid participants, ~15 examples eachRoughly 1,200 ratings. Paid rather than volunteer reduces self-selection toward enthusiasts.
    Model testedCSM-Medium (8B backbone) onlySubjective studies are expensive; the largest model is the informative one. But no subjective scaling curve exists as a result.
    What resolution do 1,200 ratings buy?

    Treat each rating as a win or a loss for the generated sample and suppose the studies split the ratings evenly — roughly $n = 600$ per study.

    Standard error of a proportion at $p = 0.5$:
    $\mathrm{SE} = \sqrt{\dfrac{0.5 \times 0.5}{600}} = \sqrt{\dfrac{0.25}{600}} = \sqrt{4.167 \times 10^{-4}} = 0.0204$.

    A 95% confidence interval is $\pm 1.96 \times 0.0204 = \pm 0.040$, i.e. ±4.0 percentage points.

    So “no clear preference” means the observed win rate landed within about four points of 50% — the study can rule out a preference larger than roughly 54:46, and cannot rule out a smaller one. Meanwhile a “consistent” preference in the context study must be comfortably outside that band to be worth reporting.

    Not stated The note does not say whether the 80 raters and ~15 examples describe each study or both combined. If both, each study has roughly 600 ratings as assumed here; if each, the intervals are $\sqrt{2}$ tighter at about ±2.8 points. The qualitative conclusions survive either way, which is presumably why the ambiguity was tolerable to the authors.

    Two studies, one variable

    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.

    1. Study one: no context

      “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
    2. Study two: ninety seconds of context

      “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 recordings

    One 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.

    Observe what the design accomplishes. Both studies use the same audio. If study two had used different, harder samples, the flip could be attributed to sample difficulty. If it had used different raters, to rater pool. If it had used a different question with a different scale, to instrument. By changing exactly one thing, the result becomes attributable to exactly one thing. This is a two-cell experiment and it is worth more than a table of twenty numbers from twenty uncontrolled conditions.

    Widget: what a win rate can tell you

    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.

    Hours of speech needed Win rate estimate 95% confidence interval The 50:50 line

    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.

    The context gap, three readings

    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.

    A
    Capability gap

    The model uses context, but not well enough

    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.

    B
    Structural gap

    The missing signal is conversational structure

    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.

    C
    Evaluation artefact

    Human recordings have unfair advantages

    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.

    And a sharper unstated point. The note says the listeners were given ninety seconds of context. It does not say whether the model was conditioned on the same ninety seconds when generating the sample being judged. Given that contextual conditioning is the model’s entire premise, the intended answer is presumably yes — but it is not written down, and the training sequence length is about two minutes, so ninety seconds sits close enough to the limit that the question is not idle. This is the single most consequential omission in the evaluation section.

    How would you tell the readings apart? Each makes a different prediction, which is the useful thing about naming them:

    ReadingPredictsExperiment that would separate it
    A — capabilityThe gap narrows with model sizeRun the context CMOS study on Tiny, Small and Medium. Only Medium was tested.
    B — structureThe gap persists at every size, concentrated on timing and turn-final phenomenaScore raters’ free-text reasons, or evaluate on isolated utterances with no turn boundary.
    C — artefactThe gap shrinks when the context audio is also generatedRe-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.

    Building the next instrument: a checklist you can reuse

    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.

    1. Is the metric saturated, or is the problem solved?

      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 up
    2. Where did the remaining errors go?

      They 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 representation
    3. Can the new failure be made binary?

      Graded 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 sample
    4. Can it be scored without humans?

      A 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 used
    5. Is it orthogonal to what already saturated?

      If 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 instrument
    6. Does the test require an architecture, and did you say so?

      The 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 benchmark
    Run that checklist against a benchmark in your own field and the result is usually uncomfortable. Most saturated benchmarks are not replaced; they are reported for another two years with shrinking deltas and growing confidence intervals, because building the replacement is harder than running the incumbent. The evaluation half of this note is a demonstration that the replacement is buildable in a few weeks with two hundred samples and an off-the-shelf phonetic recogniser.
    Concept check
    The two CMOS studies use the same audio samples, the same seven-point scale and the same rater pool, differing only in whether listeners hear ninety seconds of prior conversation. What does that design buy that two separate studies with different samples would not?

    Cost 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.

    08 What the note does not say

    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:

    01
    Benign

    Standard practice, safely assumed

    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.

    02
    Consequential

    Changes how you would build it

    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.

    03
    Load-bearing

    Changes what the results mean

    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 missing $N$, and the one typo that might leak it

    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:

    “The backbone transformer models the zeroth level across all frames (highlighted in blue), while the decoder predicts the remaining N – 31 levels, but only for a random 1/16th of the frames (highlighted in green).”

    Everywhere else the note says $N-1$. Two readings are available, and honesty requires presenting both:

    1. Reading one: a plain typographical error

      “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 text
    2. Reading two: a partial substitution

      Someone 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 = 32

    Outside 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.

    Worth noticing how much of the note’s argument survives without $N$. The structure of every claim — delay pattern costs $N$ large steps, CSM costs one large plus $N-1$ small, decoder batch is $B \times S$ — is fully specified symbolically. Only the numbers are missing. That is the signature of a note written by people who understood their own argument: the reasoning is complete and the calibration is withheld.

    Architecture: what a reimplementer would have to guess

    Suppose you sat down to build CSM from the note alone. Here is your decision list, and none of these are answered:

    DecisionStatus in the noteWhy 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 widthAbsent — only parameter totals100M 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 configRotary versus learned positions, attention grouping, normalisation, all differ across Llama generations.
    Loss weighting across codebooksAbsentUniform weighting over-weights inaudible deep residuals; Moshi found the semantic weight materially affects quality.
    Acoustic delay between semantic and acoustic codesAbsentMoshi reports that a 1–2 step delay “greatly improves the quality of the generation.” Whether CSM uses one is not stated.
    Sampler at inferenceAbsentTemperature 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 unspecifiedSeparate 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,048AbsentA 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.

    Data: the largest gap, in one sentence

    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.

    1. “Publicly available”

      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 deploying
    2. “Transcribe”

      With 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 evaluation
    3. “Diarize”

      Speaker 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 metrics
    4. “After filtering”

      Filtered 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 choice

    There 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.

    Compare with the Whisper approach, where the data pipeline is a first-class contribution described in detail because the authors understood that at this scale the pipeline is the model. CSM’s note gives its data one sentence and its architecture six paragraphs. For a system whose central claim is about learned conversational behaviour, that ratio is inverted relative to where the risk lives.

    Training, and the ablations that would have settled it

    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:

    • Batch size, optimiser, learning rate, schedule, warm-up. Benign omissions individually — but they make the memory discussion in Chapter 05 unanchorable, since $B$ is the one free variable in $B \times S$.
    • Hardware and wall-clock. The note motivates amortisation by saying the memory burden “slows down training, limits model scaling, and hinders rapid experimentation.” No before-and-after throughput figure is given for the fix that claim justifies.
    • Why one-sixteenth. No sweep, no comparison against one-eighth or one-thirty-second. “No perceivable difference in audio decoder losses” is reported as an observation, with no curve.
    • Whether the backbone is initialised from a pretrained language model. Actually this one is answered, in the limitations: “It also does not take advantage of the information present in the weights of pre-trained language models.” So: trained from scratch. That is a significant and easily-missed fact, and it makes the homograph results more impressive — whatever text understanding the model has, it learned from transcribed speech alone.
    • Ablation of the split point. The central architectural claim — that splitting at codebook zero beats splitting where Moshi splits — is never tested in the note. No comparison, no perplexity, no listening study. It is asserted as a design choice, not demonstrated as an improvement.

    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.

    Evaluation: figures without numbers

    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.

    ResultWhat the prose saysWhat 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 consistencySameSame, 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.

    Widget: the specification map

    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.

    Fully specified Partially specified Mentioned only 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.

    Concept check
    Of everything the note leaves unspecified, which omission most directly undermines its first stated contribution?

    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.

    09 A companion, not an assistant

    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 assistantCompanion
    Session shapeSeconds. “Set a timer.”Minutes to hours, repeated daily.
    Success criterionTask completed correctlyUser comes back tomorrow
    Cost of flat prosodyNear zero — nobody wants warmth from a timerCompounding — the note’s “exhausting”
    What must be modelledIntent, entities, toolsEmotion, timing, personality, memory
    Context needed per turnThe current utteranceThe conversation, and eventually the relationship
    Latency toleranceA second is fineSub-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.

    Read this way, the open-sourcing decision reads differently too. “Our models will be available under an Apache 2.0 license.” If your product is a companion — personality, memory, relationship, a running conversation — then the speech model is the least defensible part of the stack. Releasing it costs little, buys research credibility, recruits engineers, and standardises the ecosystem around your token format and your evaluation suite. The moat, if there is one, was never the codebook decoder.

    The real-time budget, derived from first principles

    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 1 — how long is a frame?
    $1 / 12.5 = \mathbf{0.08}$ seconds $= \mathbf{80}$ ms of audio per frame.

    Step 2 — what must happen inside 80 ms to keep up?
    One backbone step (predicting codebook 0) plus $N-1$ decoder steps.
    With $N = 32$: $1$ backbone step $+\; \mathbf{31}$ decoder steps, every 80 ms.

    Step 3 — per second of generated audio.
    Backbone steps: $12.5$ per second.
    Decoder steps: $12.5 \times 31 = \mathbf{387.5}$ per second.
    Total forward passes per second of speech: $12.5 + 387.5 = \mathbf{400}$.

    Step 4 — the decoder’s per-step deadline.
    Suppose the backbone takes 20 ms per step (a plausible figure for an 8B model with a warm cache on a modern accelerator).
    Time left in the frame: $80 - 20 = 60$ ms.
    Per decoder step: $60 / 31 = \mathbf{1.94}$ ms.

    That is the design constraint that sets the decoder’s size. Under two milliseconds per forward pass, including sampling and the embedding lookup, thirty-one times per frame. You cannot spend 300M parameters loosely at that budget — and you certainly cannot spend 8B. The decoder is small because the deadline says so.

    Step 5 — and if you had used the delay pattern instead?
    All 32 steps would be backbone steps: $32 \times 20 = 640$ ms of compute per 80 ms of audio — a real-time factor of 8× slower than real time. Not a latency inconvenience; a categorical impossibility.

    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.

    Which model actually costs more?

    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$.

    CSM-Medium: 8B backbone, 300M decoder.

    Backbone: $2 \times 8 \times 10^{9} = 1.6 \times 10^{10}$ FLOP per step.
    $\times\; 12.5$ steps per second $= \mathbf{2.0 \times 10^{11}}$ FLOP/s $= 200$ GFLOP/s.

    Decoder: $2 \times 3 \times 10^{8} = 6 \times 10^{8}$ FLOP per step.
    $\times\; 387.5$ steps per second $= \mathbf{2.33 \times 10^{11}}$ FLOP/s $= 232.5$ GFLOP/s.

    The 300M decoder costs more per second of audio than the 8B backbone.
    Ratio: $232.5 / 200 = \mathbf{1.16\times}$. Decoder share of inference compute: $\mathbf{53.8\%}$.

    CSM-Tiny: 1B backbone, 100M decoder.
    Backbone: $2 \times 10^{9} \times 12.5 = 2.5 \times 10^{10} = 25$ GFLOP/s.
    Decoder: $2 \times 10^{8} \times 387.5 = 7.75 \times 10^{10} = 77.5$ GFLOP/s.
    Decoder is $\mathbf{3.1\times}$ the backbone. Decoder share: $\mathbf{75.6\%}$.

    CSM-Small: 3B backbone, 250M decoder.
    Backbone: $6 \times 10^{9} \times 12.5 = 75$ GFLOP/s.
    Decoder: $5 \times 10^{8} \times 387.5 = 193.75$ GFLOP/s.
    Decoder is $\mathbf{2.6\times}$ the backbone. Decoder share: $\mathbf{72.1\%}$.

    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$.

    The transferable lesson: in a hierarchical model, compare components by parameters × invocations, never by parameters alone. Chapter 05 showed the same multiplier destroying the training memory budget; here it is quietly dominating the inference budget. Any time you see “a small model handles the rest,” ask how many times it runs. If the answer scales with something, that component is the system’s real cost centre.

    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.

    Widget: the inference budget

    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.

    Backbone compute Decoder compute Slack inside the 80 ms frame Over the deadline

    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.

    Why the decoder barely grows across model sizes

    Look again at the three configurations and notice the asymmetry:

    SizeBackboneDecoderBackbone growthDecoder growthRatio
    Tiny1B100M10:1
    Small3B250M3.0×2.5×12:1
    Medium8B300M8.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.

    Put those together and the size table stops looking like a set of arbitrary configurations and starts looking like the solution to a constrained optimisation: maximise conversational quality subject to a per-frame deadline, given that decoder capacity saturates and backbone capacity does not. The correct answer is to grow the backbone aggressively and hold the decoder at the smallest size that reconstructs cleanly — which is precisely the shape of the table.

    What the product needs that CSM is not

    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.

    1. Something must decide what to say

      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 scope
    2. Something must transcribe the user

      Step 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, unnamed
    3. Something must decide when the user has finished

      The 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 lesson
    4. Something must handle interruption

      When 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 stack
    5. Something must remember beyond two minutes

      The 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 component

    None 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.

    Concept check
    CSM-Medium pairs an 8B backbone with a 300M decoder — a 27:1 parameter ratio. At $N = 32$ codebooks, how do their inference compute costs per second of generated audio compare?

    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.

    10 A speaking model, at the edge of a conversation model

    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.

    “Ultimately, while CSM generates high quality conversational prosody, it can only model the text and speech content in a conversation — not the structure of the conversation itself. Human conversations are a complex process involving turn taking, pauses, pacing, and more. We believe the future of AI conversations lies in fully duplex models that can implicitly learn these dynamics from data. These models will require fundamental changes across the stack, from data curation to post-training methodologies, and we’re excited to push in these directions.”

    Read that against Chapter 01’s four components of voice presence and the accounting becomes exact:

    ComponentRequiresDelivered by CSM?
    Emotional intelligenceThe user’s audio in contextYes — interleaved audio tokens
    Contextual awarenessPrior turns as conditioningYes — the central mechanism
    Consistent personalityThe model’s own prior audio in contextYes — and measured by the continuation test
    Conversational dynamicsModelling turn structure itselfNo — 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.

    Content versus structure, made concrete

    What does “the structure of the conversation” contain, exactly? Enumerate it, because the list is the specification of the next model:

    • Turn taking. Who speaks next, and how the handover is negotiated — usually through prosodic cues in the final syllables rather than through content.
    • Pause length. A 200 ms gap before “yes” means something different from a 900 ms gap before the same word. The gap is a message.
    • Overlap. Real conversation is full of it — simultaneous starts, collaborative completions, the speaker who keeps going for half a second after the other begins.
    • Backchannels. “Mm-hm”, “right”, a short laugh — produced while the other person is speaking, and absent from any turn-based formulation by definition.
    • Interruption and recovery. Being cut off, yielding, retaking the floor, repairing a half-finished sentence.
    • Pacing over the whole exchange. Conversations accelerate and slow, and both parties converge on a shared rhythm.

    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.

    Notice the shape of the limitation. It is not that CSM does turn-taking badly — it is that turn-taking is not in its output space. This is the difference between a quality gap and a representational gap, and it is why the note says duplex models “will require fundamental changes across the stack, from data curation to post-training.” You cannot fine-tune your way from a single-stream model to a dual-stream one. The training data itself has to change: unsegmented, undiarised, two-channel conversation instead of clean turns.

    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.

    Widget: turn-based against duplex

    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.

    User speech Model speech Silence, modelled Cannot be represented

    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.

    Honest critique, six items

    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.

    1. The central architectural claim is unevaluated

      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
    2. No latency numbers, in a paper about latency

      “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 checked
    3. A capability benchmark presented as a product comparison

      The 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 not
    4. All quantitative results live inside images

      No 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
    5. One sentence of data description for one million hours

      “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 scale
    6. Two known weaknesses, disclosed by the authors

      English-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 interesting

    What the note gets right

    Criticism 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.

    01
    Published a negative result

    “Evaluators consistently favour the original recordings”

    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.

    02
    Built the instrument

    New tests instead of new claims on old ones

    Recognising saturation and responding by constructing automatic, binary, capability-isolating tests is the durable contribution here — more durable, probably, than the architecture.

    03
    Named its own ceiling

    Content, not structure

    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.

    04
    A trick worth stealing

    One-sixteenth amortisation

    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.

    Where CSM sits in the lineage

    Place the note on the timeline and its contribution becomes easy to state in one line.

    SystemYearThe move it madeWhat it left open
    EnCodec / SoundStream2021–22Speech becomes discrete tokens via RVQ — the substrate everything else stands on.Tokens have no language model over them.
    AudioLM2022Semantic tokens then acoustic tokens; audio generation as language modelling.The semantic bottleneck; no text control.
    VALL-E2023Text-to-speech as codec language modelling; three-second prompt gives zero-shot voice cloning.Cannot stream; conditioned on a sentence, not a conversation.
    Moshi2024RQ-Transformer plus Mimi plus dual-stream duplex; inner monologue; real-time dialogue.Reasoning quality of a speech-native model; single system, hard to compose.
    CSM2025Split 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 kin2025–26Thinker–talker split: a text brain and a speech mouth sharing context, streaming end to end.Still largely half-duplex in deployment.
    Duplex speech-language-action2026Synchronised 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.

    Connections

    This lesson sits in the middle of two ladders that meet at voice. Here is where to go next in each direction.

    Prerequisites and background

    Where to go from here

    • The voice agent stack. Everything Chapter 09 said CSM is not: recognition, endpointing, barge-in, transport, the latency ledger, and the production decisions that turn a speech model into a product.
    • Voice turn-taking. The endpointing and barge-in problem from zero — the “structure” half that CSM declines to model.
    • Streaming speech. Chunked attention, incremental decoding, and where the milliseconds actually go.
    • Qwen2.5-Omni. The thinker–talker answer to the same factorisation question, with a pretrained language model as the brain — the thing CSM’s limitations section says it does not yet do.
    • PersonaPlex. Voice and role control for full-duplex models, and a benchmark for interruption handling.
    • Duplex speech-language-action. Where the note’s closing paragraph points: synchronised speech, reasoning, and action in one real-time loop.
    One last thing to carry out of this lesson, independent of speech entirely. The most reusable idea here is not the architecture — it is the discipline of noticing that your metric has stopped measuring, and then building the next instrument instead of reporting a better number on the old one. Sesame changed the representation (phonemes not words), changed the task (multi-turn consistency not single-utterance accuracy), and changed the judge (a listener with context, not a listener without). Any field that has saturated a benchmark has those same three moves available.
    Final check
    The note says CSM “can only model the text and speech content in a conversation — not the structure of the conversation itself.” Why can that limitation not be fixed by scaling CSM up or training it on more conversational data as currently prepared?

    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.”