← Home 日本語

Inside Inkling: Audio Design

How a frontier open model hears: dMel tokens, a lookup-table encoder, and interleaved inference.

Thinking Machines Lab just released Inkling, their first open-weights model: a 975B-parameter Mixture-of-Experts Transformer with 41B active parameters, a context window of up to 1M tokens, and Apache-2.0 weights, pretrained from scratch on 45 trillion tokens of text, images, audio, and video. A smaller sibling, Inkling-Small (12B active), is previewed alongside it. The authors say plainly that it is not the strongest model available. It is built as a broad, customizable base, and as the background reasoning model for their real-time interaction models, where a user talks to the system with voice and vision. Read that way, the interesting question is not "is it SOTA," but "where did they spend capacity, and where did they refuse to?"

Audio is the sharpest answer, and it is the part I care most about as a speech researcher. Inkling has no audio encoder. Sound becomes roughly twenty tokens per second through a discretize-and-embed front end, then the same decoder that reads text does all the listening. This post walks through that decision in three parts: how audio is modeled, how well that actually works, and how the resulting interleaved inference is served. If you build voice agents or omni models, each part has one idea worth taking home.

Everything here traces to a primary source: the Thinking Machines model post and model card for architecture and benchmarks, the SGLang and Thinking Machines write-up on LMSYS Org for serving, SGLang PR #31358 for the audio rate, and the Tinker cookbook audio recipes for reproducible fine-tuning numbers. Figures from those sources are attributed inline.

Part 1 · ModelingAudio as tokens, not features

The usual way to give a language model ears is to bolt on an audio encoder: run the waveform through a stack of convolutions and transformer blocks, often tens to hundreds of millions of parameters, then project the features into the LM's embedding space. Inkling skips all of it. The model post is explicit that the multimodal inputs are encoder-free. Audio comes in as dMel spectrograms (Bai et al., 2024), "transformed via a light-weight embedding layer and processed jointly with text tokens." In plain terms: audio is tokenized, the same way text is.

Here is the whole pipeline, one step at a time. The point of the design is that nothing heavier happens.

Audio → embedding → decoder, step by step 1 / 7

Interactive: how one 50 ms slice of audio becomes one language-model token, and where that token goes. Original figure; step through with the tabs or Prev/Next.

Concretely: 16 kHz mono audio becomes an 80-channel log-mel spectrogram with a hop of 800 samples (50 ms) and a 1600-sample (100 ms) window. Each of the 80 mel energies in a frame is quantized to one of 16 levels; that is the "d" in dMel. The entire audio "encoder" is then a single embedding layer:

nn.Embedding(n_mel_bins × mel_vocab_size = 80 × 16 = 1280 → 6144)

Each (bin, level) pair owns one row of the table. A frame's 80 rows are summed into one 6144-dimensional vector, with an optional RMSNorm, and that vector is the audio token. The parameter cost is 1,280 × 6,144 ≈ 7.9M weights. For scale, that is two orders of magnitude smaller than a typical speech encoder checkpoint.

Why this is a reasonable bet

Why should summing 80 lookups work at all? Three observations:

Back-of-envelope vs. a Whisper-style front end. A typical log-mel encoder uses 10 ms frames (100 per second) and a 2× conv downsample, giving ~50 tokens/s, plus an encoder of ~108 parameters and real FLOPs per frame. Inkling: 50 ms frames, 20 tokens/s, ~7.9M embedding parameters, and no encoder compute at all. Roughly 2.5× fewer tokens per second of audio, and orders of magnitude fewer audio-specific parameters.

The rate itself falls out of one constant. In the serving code, InklingAudioEncoderParams sets audio_token_duration_s = 0.05 and window_size_multiplier = 2.0. From these, hop = 0.05 × 16000 = 800, window = 1600, and, with no frame stacking or pooling, 16000 / 800 = 20 frames (tokens) per second. The released config exposes audio_mode: "dmel", n_mel_bins: 80, mel_vocab_size: 16, and the quantizer's clamp range (dmel_min_value: −7.0, dmel_max_value: 2.0). The rate lives in the code.

20 tok/s 1 min → 1,200 tokens · 20 min → ~24,000 tokens (~2.4% of 1M) · the 1M window ≈ 13.9 hours of audio

Because the rate is fixed and low, the context budget is trivial to reason about. The model card asks for WAV at 16 kHz and recommends keeping clips within 20 minutes. That guidance is about the training distribution, not a context ceiling: 24k tokens is a rounding error against 1M.

Part 2 · PerformanceDoes a lookup table cost you audio quality?

The obvious worry about throwing away the encoder, and quantizing the mel bins to 16 levels, is that you lose fidelity. The evidence says you largely don't. Here is the audio section of the model post's own evaluation table, reported at thinking effort 0.99, against the omni models they compare to:

BenchmarkInklingQwen3-OmniNemotron-3 Nano-OmniQwen3.5 Omni-PlusGemini 3.1 Pro (closed)
AudioMC56.624.323.237.666.8
MMAU77.277.576.781.182.5
VoiceBench91.488.889.492.494.3

Numbers from the model post, effort 0.99. Bold marks the best open-weights score per row. Two footnotes from the source worth keeping: AudioMC scores for the other models were evaluated internally by the Inkling team since they are not on the official leaderboard, and VoiceBench grades with hard-coded string matching, so a system message was added instructing models to follow the expected answer format. Kimi K2.5 and K2.6 report no audio numbers.

The honest read: Inkling leads every open-weights model on AudioMC by a wide margin, sits within a point of Qwen3.5 Omni-Plus on VoiceBench, and trails it on MMAU. Gemini 3.1 Pro, closed, leads all three. For a first release that hears through 20 embedding lookups per second, "among the strongest open-weights audio models" is not marketing. It is what the table says.

Leaderboards aside, what I find more useful are reproducible downstream results. The Tinker cookbook ships three audio fine-tuning recipes, and their reported numbers are a clean read on what the encoder-free representation can carry:

Task (recipe)Metric · setupBaseTuned
LibriSpeech ASRWER · zero-shot~0.06n/a
Medical ASR (EkaCare)WER · 12-epoch LoRA SFT0.1570.072
Medical ASR (EkaCare)medical-entity hit rate0.8060.915
Medical ASR (EkaCare)medical-entity CER0.1020.037
Emotion + ASR (Expresso)style accuracy · SFT → +GRPO0.3610.757 → 0.852
Emotion + ASR (Expresso)WER · SFT → +GRPO0.0950.050 → 0.044

A few things worth drawing out:

Caveat, stated plainly. These recipes are small (hundreds to a few thousand clips) and explicitly meant to demonstrate the pipeline, not to chase SOTA. The Expresso authors note they did not tune hyperparameters. Read them as existence proofs: the encoder-free dMel representation is accurate zero-shot on clean speech, cheaply adaptable, and keeps paralinguistic detail.

Part 3 · InferenceServing interleaved audio, and the kernels it took

Inkling's decoder makes three departures from the common recipe. Each one breaks an assumption a standard decoder-only server is tuned for, which is why day-0 support (built with RadixArk on SGLang and Miles) needed dedicated kernels.

token hidden state router sigmoid + bias 256 routed experts top-6 selected 2 shared experts scored, not always-on joint renorm log σ, one group (6 + 2 weights) Σ output
The shared-expert sink: the routed top-6 and the 2 shared experts share one normalization budget. Original figure.

Where audio touches the serving path

At serve time, one audio item is a single sentinel token that expands into \(f\) d-mel-frame positions. The dMel featurization is CPU work done at render time, and the server reports the realized count per response as meta_info["audio_tokens"]. Two consequences follow. First, MoE routing is recorded after this expansion, so Miles' rollout routing replay (R3) indexes expert IDs over the media-expanded sequence, where the 20-per-second audio frames appear as concrete token positions. Second, the ShortConv branch keeps a small per-request convolution state, so a served request now has three heterogeneous state types to manage: full-attention KV, sliding-window KV, and ShortConv conv state.

Interleaved inference, step by step 1 / 4

Interactive: one request with audio, from sentinel token to typed cache pages. Original figure.

That three-state shape is the interesting serving problem. SGLang handles all three through a single UnifiedRadixCache over typed components (FULL, SWA, MAMBA; the conv state reuses the pool built for Mamba-style layers even though Inkling has no SSM), with HiCache tiering and prefill-decode disaggregation transferring all three. MXFP8 KV roughly doubles cache capacity on Blackwell (≈4.7 µs quantization, ~5% decode penalty). Speculative decoding runs an 8-layer MTP chain captured in a single CUDA graph with a fully sync-free decode round, plus an optional DFlash draft model trained with the Modal team.

The architecture-specific kernels are where the measured wins are:

OptimizationEffect
Fused ShortConv (prologue + all-reduce)2.08–3.60× kernel; +5–8% end-to-end
Custom all-reduce2.1× vs torch multimem_all_reduce
Prefill full CUDA graph+14–17% at launch-bound shapes
Shared-expert top-k (fused)1.6–5.6× (CUDA-JIT 3.4× @ T=4096)
Shared-expert linearized GEMM (B200)+5.8–11.1% input throughput; −5.5–10% TTFT

End to end on a B200 node at 8192-in / 1024-out:

71.7k tok/s aggregate input throughput at batch size 32 (TP=8); 171 tok/s per user at batch size 1; inter-token latency stays in single-digit ms through batch size 8
Inkling serving throughput-interactivity Pareto frontier on B200
Throughput vs. interactivity on B200 (ISL=8192 / OSL=1024), swept over batch size at TP=4 and TP=8. Source: SGLang and Thinking Machines Lab, LMSYS Org (2026).

The same architecture is trained with RL through Miles, which preserves train-inference consistency via precision-aligned ShortConv, relative-attention, and FP32-MoE kernels plus routing replay. Adapter-only LoRA sync ships just the low-rank delta between runtimes over CUDA IPC, cutting weight-update latency from 49.4 s to 2.5 s. That is the mechanism behind the fast audio fine-tuning in Part 2.

CodaWhat I don't know yet

A close read is also an inventory of gaps. Filing them here so they can be checked rather than implied away:

The design in one line

Inkling treats audio the way it treats text: tokenize, embed, and let the shared decoder do the perception. A dMel spectrogram, a ~7.9M-parameter lookup table, twenty tokens a second, no encoder. Judging by the benchmark table, the zero-shot WER, and how quickly ASR, medical dictation, and emotion tasks adapt, very little is lost for it. It is a modest amount of machinery for a capability that usually costs much more.


Sources & references

The audio-modeling numbers (20 tokens/s, 50 ms hop, ~7.9M-parameter embedding) were derived from the linked SGLang source. Benchmark numbers are quoted from the model post's evaluation table, and downstream numbers from the Tinker cookbook recipe READMEs. Embedded performance figures are © the SGLang / Thinking Machines authors, reproduced with attribution. The interactive pipeline, interleaved-inference, and shared-sink diagrams are original. This post was drafted with help from Claude Code, and every claim was checked against the primary sources before posting.

← Back to Home