Model reference · open weights
glm-4-voice-of-reason is an open-weight language model from kyutai. glm-4-voice-of-reason-9b (BF16) weighs 19.1 GB; the smallest configuration that runs it is 2× RTX 3060 12 GB.
For self-hosting, compare this build's requirements below with the GPU you plan to rent.
Summary of the kyutai/glm-4-voice-of-reason-9b model card, 2026-10-01
What it is
| Released by | kyutai |
|---|---|
| Released | 2026-08-04 |
| Parameters | 9.5B |
| VRAM | 19.1 GB for the weights |
What it runs on
| Card | Requests at once | Context max | Memory | |
|---|---|---|---|---|
| 8K each | 32K each | |||
| RTX 3060 12 GB … RTX 4060 Ti 16 GB 2 smaller cards | ||||
| RTX 3090 24 GB | 10 | 2 | 84K | 23.4 GB |
| RTX 4090 24 GB | 10 | 2 | 83K | 23.4 GB |
| RTX 5090 32 GB | 33 | 8 | 128K | 31.0 GB |
| L40S 48 GB | 71 | 17 | 128K | 44.0 GB |
| A100 80 GB | 173 | 43 | 128K | 78.2 GB |
| H100 80 GB | 159 | 39 | 128K | 78.1 GB |
| RTX PRO 6000 Blackwell 96 GB | 206 | 51 | 128K | 93.8 GB |
| DGX Spark (GB10) 128 GB unified | 247 | 61 | 128K | 107 GB |
| H200 141 GB | 338 | 84 | 128K | 138 GB |
| B200 180 GB | 450 | 112 | 128K | 176 GB |
| 2× RTX 3060 12 GB tensor parallel | 7 | 1 | 61K | 11.6 GB a card |
| 2× RTX 4060 Ti 16 GB tensor parallel | 30 | 7 | 128K | 15.4 GB a card |
| 2× RTX 4090 24 GB tensor parallel | 77 | 19 | 128K | 23.4 GB a card |
| Requests at once | 8K tokens each | 32K tokens each |
|---|---|---|
| 1 | 20.2 GB | 21.2 GB |
| 5 | 21.5 GB | 26.6 GB |
| 8 | 22.6 GB | 30.6 GB |
| 16 | 25.2 GB | 41.3 GB |
| 32 | 30.6 GB | 62.8 GB |
| 64 | 41.3 GB | 106 GB |
One card, with vLLM's small-card settings.
From the model card
A speech-to-speech model that reasons before it speaks. GLM-4-Voice-9B trained with reinforcement learning against a binary LLM judge on math word problems — no supervised finetuning stage, the reasoning behaviour is learned from the reward alone.
Scores 0.706 on GSM8K (1310 test items, written channel, gpt-4o-2024-11-20 as judge).
The audio front end is GLM-4-Voice's, unchanged and not in this repo, so clone it for the speech tokenizer:
git clone https://github.com/THUDM/GLM-4-Voice
uv init glm-of-reason && cd glm-of-reason
uv add "transformers>=4.44,<4.48" torch torchaudio accelerate tiktoken soundfile
tiktoken is needed by the tokenizer's remote code and soundfile by torchaudio to read your
file; both fail late and unhelpfully if missing. Save the script below as demo.py, point AUDIO
at your wav — anything torchaudio can read, any sample rate — and run uv run demo.py:
import sys, torch
sys.path.insert(0, "../GLM-4-Voice") # the clone, next to the project
from transformers import AutoModel, AutoTokenizer, WhisperFeatureExtractor
from speech_tokenizer.modeling_whisper import WhisperVQEncoder
from speech_tokenizer.utils import extract_speech_token
AUDIO = "question.wav" # <-- your spoken question
REPO = "kyutai/glm-4-voice-of-reason-9b"
SYSTEM = (
"User will provide you with a speech instruction. Do it step by step. "
"First, think about the instruction and respond in a interleaved manner, "
"with 13 text token followed by 26 audio tokens. "
)
tokenizer = AutoTokenizer.from_pretrained(REPO, trust_remote_code=True)
model = AutoModel.from_pretrained(
REPO, torch_dtype=torch.bfloat16, device_map="cuda", trust_remote_code=True
).eval()
whisper = WhisperVQEncoder.from_pretrained("THUDM/glm-4-voice-tokenizer").eval().to("cuda")
features = WhisperFeatureExtractor.from_pretrained("THUDM/glm-4-voice-tokenizer")
audio_tokens = extract_speech_token(whisper, features, [AUDIO])[0]
user = "" + "".join(f"" for t in audio_tokens) + ""
prompt = f"\n{SYSTEM}\n{user}streaming_transcription\n"
inputs = tokenizer(prompt, return_tensors="pt").to("cuda")
out = model.generate(
**inputs,
max_new_tokens=1000,
do_sample=False,
pad_token_id=tokenizer.pad_token_id,
eos_token_id=tokenizer.convert_tokens_to_ids(""),
)
new = out[0, inputs.input_ids.shape[1]:].tolist()
audio_offset = tokenizer.convert_tokens_to_ids("")
text = tokenizer.decode([t for t in new if t < audio_offset], skip_special_tokens=True)
speech_tokens = [t - audio_offset for t in new if t >= audio_offset]
print(text)
There is no hidden channel here: the model reasons in the answer it speaks, step by step, so text
is the whole response. Its
stitch sibling keeps the reasoning
unspoken instead, wrapped in [SOPR] ... [EOPR].
speech_tokens are the audio codes of that answer; feed them to
THUDM/glm-4-voice-decoder to get a waveform,
or run the full duplex demo from the GLM-4-Voice repo with --model-path pointing here.
This script was run as printed, on one H100, with transformers 4.47.1 and torch 2.8.0. Pick a
torch build that matches your driver: the newest wheel needs a newer CUDA than many clusters run.
Inherited from GLM-4-Voice; see the license link above.
Quoted from the model card on Hugging Face. The full card is behind the Hugging Face link above.