VoxCPM1 is a tokenizer-free TTS model from OpenBMB that generates 16 kHz mono speech. The audio.cpp package uses a native GGUF layout with audio.cpp tensor names, embedded config/tokenizer sidecars, folded AudioVAE weights, and materialized SR-conditioning tensors.
| Field | Value |
|---|---|
| Family | voxcpm1 |
| Model directory | models/VoxCPM1-GGUF (0.5B) |
| Tasks | tts, clon |
| Modes | offline, streaming |
| Languages | Model auto-handles supported languages (zh, en, ja, ko validated) |
| Voice input | Optional reference WAV; optional transcript via --reference-text |
| Built-in voices | Not exposed |
| Output | mono 16 kHz WAV |
# Via model manager (recommended)
python3 tools/model_manager_v2.py install voxcpm1_0_5b_q8_0 --models-root modelsThis downloads the voxcpm-0.5b-q8_0-audiovae-f16.gguf package (~690 MB) to models/VoxCPM1-GGUF/.
chmod +x scripts/build_linux.sh
./scripts/build_linux.sh --backend cpu --target audiocpp_cliFor CUDA (recommended for production):
./scripts/build_linux.sh --backend cuda --target audiocpp_cliText-to-speech (offline):
./build/linux-cpu-release/bin/audiocpp_cli \
--task tts \
--family voxcpm1 \
--model models/VoxCPM1-GGUF/voxcpm-0.5b-q8_0-audiovae-f16.gguf \
--backend cpu \
--text "Hello from VoxCPM1." \
--out out.wavVoice clone (continuation-mode):
./build/linux-cpu-release/bin/audiocpp_cli \
--task tts \
--family voxcpm1 \
--model models/VoxCPM1-GGUF/voxcpm-0.5b-q8_0-audiovae-f16.gguf \
--backend cpu \
--text "Hello from VoxCPM1." \
--voice-ref assets/resources/b.wav \
--reference-text "Some call me nature. Others call me Mother Nature." \
--out out.wavclon is an alias to the same synthesis path. Route selection does not change
the existing reference-audio or continuation-prompt behavior.
Streaming output:
./build/linux-cpu-release/bin/audiocpp_cli \
--task tts \
--family voxcpm1 \
--model models/VoxCPM1-GGUF/voxcpm-0.5b-q8_0-audiovae-f16.gguf \
--backend cpu \
--mode streaming \
--text "Hello from VoxCPM1 streaming." \
--request-option retry_badcase=false \
--out out.wavMeasured on Ubuntu 24.04 with OpenMP optimization (CPU backend):
- GGUF package size: ~690 MB (Q8_0 LLM + F16 AudioVAE)
- Startup latency: Instant (<0.01s) via
mmaplazy loading - Inference speed (short sentence): ~0.25 RTF on CPU (~4x faster than real-time)
- Idle VRAM (with
mem_saver): ~1.4 GB; long text up to ~3.5 GB
| Option | Values | Default | Meaning |
|---|---|---|---|
--voice-ref |
WAV path | not set | Reference speaker audio for voice cloning. |
--reference-text |
text | empty | Transcript of the reference audio (for clone prompting). |
--mode |
offline, streaming |
offline |
Full-output or streaming run mode; streaming does not retry bad cases. |
--session-option voxcpm1.mem_saver |
true, false |
false |
Use tighter graph workspaces and release request runtime graphs to reduce resident VRAM. |
--session-option voxcpm1.prompt_cache_slots |
integer | 1 |
Prompt and prompt-audio embedding cache slots. Set 0 to disable prompt caching. |
--session-option voxcpm1.weight_type |
native, f32, f16, bf16, q8_0 |
native |
Generator weight storage for the session. |
--session-option voxcpm1.lora |
directory or checkpoint file | not set | Native LoRA weights with adjacent lora_config.json; merged at session creation. |
--session-option voxcpm1.lora_scale |
finite float | 1 |
Multiplier for the configured alpha/r scaling. |
--session-option voxcpm1.audiovae_weight_type |
native, f32, f16, bf16, q8_0 |
native |
AudioVAE weight storage for the session. |
--max-tokens |
integer | 4096 |
Maximum MiniCPM output tokens; default 4096. Zero selects model max_length; negative counts are rejected. |
--num-inference-steps |
integer | 10 |
CFM diffusion sampling steps; default 10. Must be positive. |
--guidance-scale |
float | 2.0 |
CFM classifier-free guidance rate. Must be nonnegative. |
--request-option retry_badcase |
true, false |
offline: true; streaming: false |
Auto-retry when generation is detected as a bad case. Streaming ignores explicit true with a warning. |
--request-option retry_badcase_max_times |
integer | 3 |
Maximum total generation attempts, including the initial attempt. |
--text-chunk-mode |
default, tag_aware, japanese, endline |
tag_aware |
Long-form text chunking strategy. |
Use these names with --session-option. They size host graph metadata in MiB,
not device workspace. The old *_graph_context_mb aliases remain accepted with
the same voxcpm1. prefix. Weight-context controls are separate and unchanged.
| Option | Default MiB |
|---|---|
voxcpm1.text_embedding_graph_arena_mb |
64 |
voxcpm1.lm_step_graph_arena_mb |
1024 |
voxcpm1.projection_graph_arena_mb |
256 |
voxcpm1.local_encoder_graph_arena_mb |
512 |
voxcpm1.dit_graph_arena_mb |
1024 |
voxcpm1.audiovae_graph_arena_mb |
1024 |
voxcpm1.audiovae_encoder_graph_arena_mb |
1024 |
- Base LM: 24-layer MiniCPM transformer (1024 hidden, 73,448 vocab)
- Residual LM: 6-layer autoregressive refinement
- Local Encoder: 4-layer feature encoder (FSQ quantization, 8 codebooks)
- Local DiT: 4-layer diffusion transformer for CFM sampling
- AudioVAE: Encoder (128 dim, rates
[2,5,8,8]) + Decoder (1536 dim, rates[8,8,5,2]) - Output: 16 kHz mono
The GGUF is produced from the original OpenBMB files with:
python3 tools/community_models/convert_voxcpm1.py --overwriteThe converter stages the OpenBMB PyTorch checkpoint as audio.cpp tensor names, folds AudioVAE weight_v / weight_g pairs through the shared GGUF conversion path, embeds the required sidecars, and writes one native GGUF. The runtime expects that native layout directly; it does not adapt third-party VoxCPM GGUF metadata at load time.
| Mode | Status | Notes |
|---|---|---|
| Offline TTS | ✅ Works | "This is a test run for the fix" → transcribes as "This is a test." (SenseVoice) |
| Voice Clone | ✅ Works | 6/6 target sentences transcribe exactly via SenseVoice; continuation-mode with reference audio + transcript |
| Streaming | ✅ Works | SSE PCM chunks at native 16 kHz; retries default to false, and an explicit true is ignored with a warning. On CPU, CUDA, HIP and Vulkan each patch is decoded with the AudioVAE's causal-convolution state carried over from the previous patch, so patch boundaries closely match the offline decode. Metal remains on the per-patch fallback and is expected to show the same boundary artifacts; it was not tested. |
| Reference-only clone | ref_start/ref_end fails identically in the golden VoxCPM.cpp — model-level limitation |
Regression guard: VoxCPM2 path is untouched (config.v1 default false); still generates 48 kHz speech with byte-identical output.
The default package is the standalone GGUF:
| Package ID | Display Name | Format | Precision | Files |
|---|---|---|---|---|
voxcpm1_0_5b_q8_0 |
VoxCPM 0.5B Q8_0 GGUF | gguf | q8_0 (LLM) + f16 (AudioVAE) | VoxCPM1-GGUF/voxcpm-0.5b-q8_0-audiovae-f16.gguf |
The GGUF embeds:
- Hybrid-quantized model (LLM Q8_0, AudioVAE F16)
- Full config sidecar (
config.json) - BPE tokenizer sidecars (
tokenizer.json,tokenizer_config.json)
No separate tokenizer or config files are needed at inference time.
- Upstream model: OpenBMB/VoxCPM
- Reference port: VoxCPM.cpp
- audio.cpp porting doc: VOXCPM1_Porting.md
- Model spec: model_specs/voxcpm1.json
- Main docs: docs/tts.md#voxcpm1