Nemotron 3.5 Transcribe
See how a frozen diarizer tags every audio frame with who is speaking, why six attention layers make an hour of audio affordable, and what speculative decoding does to serving.
Jump to a section
Why this matters
Nemotron 3.5 Transcribe is NVIDIA's open-weights speech LLM, released with a technical report on 28 October 2026. It is a speech-augmented language model: an audio encoder turns sound into embeddings, and those embeddings are placed inside the prompt of a decoder-only LLM, which writes the answer as text.
The point of using an LLM decoder is that transcription becomes promptable. One checkpoint produces verbatim or written-form transcripts, uses supplied vocabulary, labels who spoke, tags laughter and breaths, translates, and identifies the language, in 40 languages and for recordings up to an hour. The instruction alone selects the task. The model has 34B parameters, of which about 4.3B are active per token.
On the public section of the Open ASR Leaderboard its mean word error rate is 4.71%, the best among open-weights models when the report was written. Some commercial systems are still more accurate.
Most accurate open model on the public English leaderboard
- Nemotron 3.5 Transcribe
- Other open weights
- Commercial
Table 6: the nine public test sets of the Open ASR Leaderboard and their unweighted mean, with baselines as of 21 October 2026. At 4.71 mean WER it leads the open-weights models by 0.23 points; the report counts seven commercial systems ahead of it, five of which are listed here. Switch sets to see where it trails: Granite-Speech on meetings (AMI), Qwen3-ASR and Granite-Speech on degraded audio (URGENT).
Nemotron 3.5 Transcribe report · Table 6Build the mental model
The encoder has two branches that run side by side on 30-second chunks of audio. A trainable ASR encoder, a 32-layer Transformer, turns 128-bin log-mel features into one 1,280-dimensional frame every 80 ms. A frozen diarizer estimates, for the same frames, which of eight speaker slots is active. The diarizer's answer is folded into the ASR frames as a fixed code, so each frame reaches the LLM already labelled with who was speaking. The LLM learns to turn those codes into <spk:0> to <spk:7> tags without any change to its architecture or sequence length.
A single linear layer maps 1,280 to 2,688 dimensions, the LLM width, and the frames replace an <|audio|> placeholder in the prompt: 12.5 positions for every second of audio. The decoder is a hybrid of Mamba-2 state-space layers, mixture-of-experts feed-forward layers and only six attention layers, which keeps memory small for hour-long prompts.
Two extra parts sit around the decoder. A shared multi-token prediction layer learns to guess the next two tokens after the one being generated, and serves as a draft model for speculative decoding. After generation, a 50M-parameter CTC adapter aligns the finished transcript with the ASR frames to produce word timestamps; it never changes the text. Choose a task to see the prompt change while the model stays the same.
One checkpoint; the instruction picks the task
Parallel Expert Encoder
<|im_start|>user Transcribe this audio. … Start every speaker turn with a speaker tag such as <spk:0>, <spk:1>, <spk:2>, etc.; assign one stable tag per speaker. …<|audio|><|im_end|> <|im_start|>assistant <think></think><spk:0> so what did you think <spk:1> um i think it went well <spk:0> yeah
- Mamba-2 × 23
- MoE feed-forward × 23
- Attention (GQA) × 6
Redrawn from Figure 2 and Table 1, with the exact layer order from config.json. Instructions are those in Figure 1 (abbreviated there with “…”); the assistant lines are the report’s illustrations of output format, not model samples.
Nemotron 3.5 Transcribe report · Figure 2, Table 1Work through the math
Speaker fusion. Let be the ASR frame at time and the diarizer's activity for slot . The released implementation computes
where is fixed: and with . These are the sinusoidal position codes of the original Transformer, indexed by speaker slot instead of position. Since ,
so the similarity of two slot codes depends only on how far apart their indices are. The LayerNorm over eight slots makes one active speaker, two overlapping speakers and silence produce different weightings; silence produces exactly zero.
Who is speaking becomes part of every frame
Twelve 80 ms frames of an authored example; rows are speaker slots 0–2 (slots 3–7 stay silent). Select a frame.
11000000
1.731.73-0.58-0.58-0.58-0.58-0.58-0.58
Each slot’s kernel row is a fixed sinusoidal code. Because sin·sin + cos·cos = cos(Δ), the similarity of two rows depends only on the difference between their slot indices: every diagonal of this matrix is constant. By gap: 1.00, 0.97, 0.91, 0.83, 0.77, 0.74, 0.74, 0.73. The codes are far from orthogonal, because the many slow frequencies barely change between slots.
From §2.1 and the fusion in vLLM’s implementation: activity > 0.5 is binarized, normalized by a LayerNorm over the 8 slots (shown with unit scale and zero shift; trained values are not published), multiplied by the kernel and added to the LayerNorm-ed ASR states. Silence gives a zero infusion. Slot indices are local to each 30 s chunk; the LLM keeps labels consistent across chunks.
vLLM nemotron3_5_transcribe_audio.py · _sinusoid_kernel, _fuseLength. At 80 ms per frame, one hour is positions, or 120 chunks of 375. Attention inside each chunk costs query–key pairs, against for one window over the whole hour: 120 times fewer. In the decoder, each attention layer stores keys and values for 2 heads of 128 dimensions, so the six attention layers hold bytes per position at BF16, about 276 MB for an hour of audio. The 23 Mamba-2 layers keep a fixed state of about 48 MB whatever the length.
Six attention layers make an hour of audio affordable
- Mamba-2 × 23
- MoE feed-forward × 23
- Attention (GQA) × 6
| 30 s encoder chunks · 375 frames each | 120 |
| Audio positions in the LLM prompt · 12.5 per second | 45,000 |
| Encoder attention pairs, chunked versus one window | 16.9M vs 2.02B |
| K/V cache for the audio · 6 attention layers, BF16 / FP8 | 276.5 MB / 138.2 MB |
| Mamba-2 state · 23 layers, FP32, independent of length | 48.2 MB |
Our arithmetic from config.json and §2.1: 6 layers × K and V × 2 KV heads × 128 dimensions = 6,144 bytes per position at BF16. Training covered recordings up to one hour (45,000 audio positions) in sequences up to 65,536 tokens. Chunking makes encoder attention linear in length; the report notes memory would be linear anyway with FlashAttention, and that the diarizer was trained on short contexts. Text tokens, weights, convolution state (under 1 MB) and runtime overhead are excluded.
config.json · llm_config, pe_encoder_configRead the implementation
This executable Python example builds the speaker kernel and fusion exactly as described, then checks the length arithmetic. LayerNorm is shown without its learned scale and shift, which are not published.
1import math
2
3def kernel(speakers=8, width=1280):
4 """Fixed sinusoidal speaker kernel: sin at even columns, cos at odd, row = speaker slot."""
5 return [[math.cos(s * math.exp(-(j - j % 2) * math.log(10000) / width)) if j % 2
6 else math.sin(s * math.exp(-(j - j % 2) * math.log(10000) / width))
7 for j in range(width)] for s in range(speakers)]
8
9def layer_norm(x, eps=1e-5):
10 mean = sum(x) / len(x)
11 var = sum((v - mean) ** 2 for v in x) / len(x)
12 return [(v - mean) / math.sqrt(var + eps) for v in x]
13
14def infusion(probs, K, threshold=0.5):
15 weights = layer_norm([1.0 if p > threshold else 0.0 for p in probs])
16 return [sum(w * K[s][j] for s, w in enumerate(weights)) for j in range(len(K[0]))]
17
18K = kernel()
19dot = lambda a, b: sum(x * y for x, y in zip(a, b))
20assert abs(dot(K[0], K[2]) - dot(K[3], K[5])) < 1e-6 # similarity depends on slot difference only
21assert abs(dot(K[1], K[1]) - 640) < 1e-6 # every row has the same length
22
23assert max(abs(v) for v in infusion([0.1] * 8, K)) == 0 # silence adds nothing
24solo = infusion([0.9, 0.2, 0, 0, 0, 0, 0, 0], K)
25overlap = infusion([0.9, 0.8, 0, 0, 0, 0, 0, 0], K)
26assert max(abs(a - b) for a, b in zip(solo, overlap)) > 1 # overlap is a different code
27
28frames = 3600 * 1000 // 80 # one hour of 80 ms encoder frames
29assert frames == 45_000 == 120 * 375 # 120 chunks of 30 s
30print(frames ** 2 // (120 * 375 ** 2), "x fewer encoder attention pairs with 30 s chunks")
31kv_bytes = 6 * 2 * 2 * 128 * 2 * frames # attention layers, K and V, KV heads, head dim, BF16
32print(kv_bytes / 1e6, "MB of audio K/V in the six attention layers")Training has no separate alignment stage with a frozen LLM: every part except the diarizer trains together from the first step. Each example gets a randomly chosen task instruction, so the same recording can teach verbatim transcription one time and contextual transcription the next. The multi-token prediction loss is added with weight 0.1. A short reinforcement-learning stage then rewards directly.
Supervised first, then reward the transcript
- 1InitializeLightning 30B-A3B, a TDT-pretrained ASR encoder, the frozen Sortformer, one MTP layer
- 2Supervised fine-tuning28.5k steps on 256 H100s, 65,536 packed tokens per GPU; a random task instruction per example; CE + 0.1 · MTP + 10⁻⁴ · MoE balance
- 3Reinforcement learningGSPO for 400 steps on 20k selected transcription prompts; reward 1 − WER
- 4Add-ons on the frozen modelThe CTC timestamp adapter and a DFlash2 draft model
The reward only scores reference transcripts, yet RL also lowered multilingual error, number errors and hallucinated insertions. Translation and multi-speaker sessions barely moved, and audio reasoning on MMAR fell by 7.8 points. Scores are from an evaluation run before the report’s final prompts, so they differ slightly from later tables.
Nemotron 3.5 Transcribe report · §3, Figure 4, Table 5Questions and trade-offs
What does speculative decoding buy? The MTP layer drafts tokens that the full model verifies in one pass, so accepted drafts skip sequential decoding steps. On a single 30-second request, MTP cuts latency 1.4–1.5× and the separately trained DFlash2 drafter 2.0–2.5×. Raising concurrency trades latency for throughput: with NVFP4 weights and DFlash2, one GPU transcribes about 2,238 seconds of audio per second at 256 concurrent requests. Drafts are accepted less often on long recordings, so the gains narrow at 10 minutes.
Concurrency buys throughput; drafting buys latency
- BF16
- FP8
- NVFP4
- No speculation
- MTP, 8 tokens
- DFlash2, 15 tokens
Vertical: throughput as the inverse real-time factor, seconds of audio per second. Numbers mark 1 to 256 concurrent requests on the fastest line.
Redrawn from Figure 8, digitized from the PDF’s vector paths, on one RTX PRO 6000 Blackwell GPU served by NVIDIA’s NIM with optimizations not yet in the open-source release. For a single 30 s request, MTP drafting cuts latency 1.4–1.5× and DFlash2 2.0–2.5×. Mean accepted tokens per draft round are lower on long-form audio (Table 18), which narrows the gain at 10 minutes.
Nemotron 3.5 Transcribe report · §4.13, Figure 8, Table 18What did optimizing for transcription cost? The RL reward only scored transcripts, and audio reasoning on MMAR fell from 67.01 to 59.18. The report states that preserving the LLM's text-only abilities was not a goal: treat this as a transcription model, not a general assistant.
Where is it weaker? Granite-Speech is more accurate on meeting audio (AMI), and Qwen3-ASR and Granite-Speech on degraded audio. On full-length long-form recordings it leads the open models with 10.98% WER, but generation loops hit 7 of 451 recordings; without the released loop guardrail the mean would be 12.87%. The checkpoint is 67.5 GB in BF16, about 35 GB in FP8 and about 21 GB in NVFP4.
Check your understanding
You need speaker-attributed transcripts of 50-minute meetings with up to ten participants. What does the design let you expect, and what should you test first?
Fifty minutes is within the one-hour recordings seen in training, and the 30-second chunking does not cap length. Speaker labels are the risk. The diarizer and the output both have eight speaker slots, <spk:0> to <spk:7>, so ten participants cannot all receive distinct tags. Slot indices are also local to each 30-second chunk, leaving the LLM to keep labels consistent across chunks, and meetings are where other open models beat it on plain WER. Measure concatenated minimum-permutation WER (cpWER) on your own recordings before relying on the labels.
Source and scope
Nemotron 3.5 Transcribe Technical Report, §2–4, Tables 1, 5–7 and 18, Figures 1–4 and 8; the model card and config.json; and the speaker fusion in vLLM's implementation, read on 28 October 2026. Figure 8 was digitized from the report's vector graphic. Cache, state and attention-pair arithmetic, the code and the scenario are LiminalML derivations. Benchmarks are NVIDIA's. We have not run the model.
Oliver Perrin
Machine Learning Engineer · Founder, LiminalML
LiminalML brings together concept explanations, mathematical examples, and working visuals. Find more writing by Oliver on the LiminalML Substack.
Keep exploring the idea.
Ask a follow-up in a guided session, work through the self-check, or open the visual in Studio to build on it.
Related concepts
Deep Learning
Linear Attention
Understand recurrent memory, gated delta updates, and why modern hybrids retain some full-attention layers.
Model breakdowns
DeepSeek-V4
Distinguish active experts from stored parameters, then separate compression from sparse attention.
LLMs
KV Cache
See which token projections caching saves, what attention must still read, and how memory use grows with context.