VoxCPM2
VoxCPM2 ist ein tokenizerfreies, diffusions-autoregressives TTS-Modell mit 2 Mrd. Parametern von OpenBMB. Es synthetisiert Audio in 48 kHz Studioqualität in 30 Sprachen mit drei produktiven Modi: Zero-Shot, Voice Cloning per Einzelreferenz und natursprachliches Voice Design ("a young female voice, warm and gentle"). Auf Apple Silicon läuft es nativ über MLX in bf16, int8 oder int4 — auf der 8-Sätze-Testharness erreicht das int8-Bundle 0 % WER beim Round-Trip durch Qwen3-ASR bei einem RTF ≈ 1,0.
Was es ist
- 48 kHz Ausgabe — die einzige On-Device-Engine im Stack mit Studio-Samplerate. Alle anderen TTS-Module enden bei 24 kHz.
- Voice Design — Stilsteuerung per natürlicher Sprache:
--voxcpm2-instruct "young female voice, warm and gentle". Keine andere Engine bietet das. - Voice Cloning — Einzelreferenz-Cloning aus einem 16 kHz-Clip; "Ultimate Cloning" (Referenzaudio + Transkript) für eine treuere Prosodie.
- 30 Sprachen — Englisch, Chinesisch, Indonesisch, Japanisch, Koreanisch und mehr. Automatische Erkennung aus dem Text.
- Apache 2.0 — die Modellgewichte erben die Upstream-Lizenz von openbmb; unser Swift-Port nutzt dieselbe Lizenz.
Architektur
Fünf zusammenarbeitende Komponenten erzeugen die 48 kHz-Wellenform:
| Komponente | Beschreibung |
|---|---|
| MiniCPM-4 base LM | MiniCPM-4 mit 28 Schichten, LongRoPE, GQA (16 Q-/2 KV-Köpfe, Kopf-Dim 128) und SwiGLU MLP. Konditioniert auf Text-Tokens + Audio-Latents. |
| Residual LM | 8-Schicht-Variante von MiniCPM-4 ohne Rotary Embeddings. Verfeinert den Hidden State des Basis-LM für jeden generierten Audio-Patch. |
| FSQ + Local DiT estimator | Skalar-quantisierte Hidden States treiben einen 12-schichtigen Diffusion Transformer (V2), der auf 64-dim Audio-Latents in 4er-Patches arbeitet. CFG-zero-star Euler-Solver, standardmäßig 10 Zeitschritte. |
| AudioVAE V2 | Kausaler Convolution-Decoder. Liest 16 kHz-Referenzaudio ein und gibt 48 kHz-Wellenform aus (3× Upsampling integriert). |
| Stop-Head | Pro-Schritt-Binärklassifikator auf dem Hidden State des LM. argmax = 1 beendet die Generierung nach minTokens Patches. |
Bundles
Drei Quantisierungsvarianten, alle aus den Upstream-PyTorch-Checkpoints openbmb/VoxCPM2 konvertiert. Quantisierung greift bei den Linear-Schichten in LM / Residual LM / DiT-Estimator / Projection-Heads; der AudioVAE-Vocoder bleibt fp16/bf16, weil Quantisierung dort die Audioqualität verschlechtert.
| Bundle | Quantisierung | Größe | HuggingFace |
|---|---|---|---|
| bf16 | Keine (Referenz) | ~5.0 GB | aufklarer/VoxCPM2-MLX-bf16 |
| int8 | MLX QuantizedLinear, group size 64 | ~3.0 GB | aufklarer/VoxCPM2-MLX-int8 |
| int4 | MLX QuantizedLinear, group size 64 | ~1.9 GB | aufklarer/VoxCPM2-MLX-int4 |
Round-Trip-ASR (Qwen3-ASR 0.6B, 8-Satz-Harness, Apple Silicon M-Serie):
| Variante | WER | RTF |
|---|---|---|
| bf16 | 2.04 % | 1.38 |
| int8 | 0.00 % | 1.02 |
| int4 | 4.08 % | 0.83 |
int8 ist der empfohlene Standard — entspricht im LM-Pfad bitgenau der Upstream-Python-Pipeline, ist dabei schneller und 40 % kleiner als bf16. int4 ist das kleinste Bundle mit noch akzeptablem WER für Casual-Use.
Quickstart
import VoxCPM2TTS
let tts = try await VoxCPM2TTSModel.fromPretrained() // defaults to bf16
let audio = try await tts.generate(text: "Hello from VoxCPM2.", language: "english")
// audio: [Float] at 48 kHz mono
Übergib eine explizite Model-ID, um int8 / int4 zu wählen:
let tts = try await VoxCPM2TTSModel.fromPretrained(
modelId: "aufklarer/VoxCPM2-MLX-int8"
)
Voice Design (per Instruktion)
Übergib eine natursprachliche Stilbeschreibung; das Modell wird darauf konditioniert, ganz ohne Referenzaudio:
let audio = try await tts.generateVoxCPM2(
text: "Welcome to the show.",
instruct: "A young woman, gentle and warm voice."
)
Voice Cloning
Einzelreferenz-Cloning aus einem 16 kHz-Mono-Clip:
let ref = try AudioFileLoader.load(url: URL(fileURLWithPath: "speaker.wav"),
targetSampleRate: 16000)
let audio = try await tts.generateVoxCPM2(
text: "This is a cloned voice.",
refAudio: ref
)
Ultimate Cloning — übergib Referenzaudio und das passende Transkript gemeinsam, damit das LM auch auf den lexikalischen Kontext konditioniert wird und Prosodie/Akzent treuer erhalten bleiben:
let audio = try await tts.generateVoxCPM2(
text: "Hello from the cloned voice.",
refAudio: ref,
promptText: "this is what the reference clip actually said",
promptAudio: ref
)
CLI
speech speak "Hello there." \
--engine voxcpm2 \
--voxcpm2-variant int8 \
--output hello.wav
# Voice design
speech speak "Welcome to the show." \
--engine voxcpm2 \
--voxcpm2-instruct "A young woman, gentle and warm voice." \
--output design.wav
# Voice cloning
speech speak "This is a cloned voice." \
--engine voxcpm2 \
--voice-sample speaker.wav \
--output clone.wav
Flags: --voxcpm2-variant {bf16,int8,int4}, --voxcpm2-instruct, --voxcpm2-ref-audio, --voxcpm2-prompt-audio + --voxcpm2-prompt-text, --voxcpm2-cfg-value, --voxcpm2-timesteps, --voxcpm2-max-tokens, --voxcpm2-min-tokens, --seed für reproduzierbare Synthese.
Auswahl unter den TTS-Modulen von speech-swift
| Kokoro-82M | Qwen3-TTS | CosyVoice3 | VoxCPM2 | VibeVoice 1.5B | |
|---|---|---|---|---|---|
| Parameter | 82M | 0.6 / 1.7 B | 0.5B | 2B | 1.5B |
| Samplerate | 24 kHz | 24 kHz | 24 kHz | 48 kHz | 24 kHz |
| Backend | CoreML (ANE) | MLX, CoreML | MLX | MLX | MLX |
| Sprachen | 10 | 10 | 9 | 30 | EN + ZH |
| Voice Design | Feste Presets | — | — | Instruktionsbasiert | — |
| Voice Cloning | — | ICL-Referenz | Zero-Shot-Referenz | Referenz + Ultimate | Audio + Transkript |
| Langform | Kurz/Mittel | Streaming | Streaming | Patch-Streaming | Bis zu 90 Min. |
… 48 kHz-Ausgabe gefragt ist (Musik / Broadcast) oder natursprachliches Voice Design ohne Referenzclip nötig wird. Für maximale Qualität bei kurzem englischem TTS mit kleinerem Download sind CosyVoice3 oder Qwen3-TTS leichter. Für lange Podcasts/Hörbücher in EN/ZH ist VibeVoice 1.5B der Spezialist.
Verantwortungsvolle Nutzung
Voice Cloning ist enthalten. Hol dir vorab die Zustimmung für jede Stimme, die du klonst, und nutze das Modell nicht für Identitätsdiebstahl, Desinformation oder Betrug. Es gelten die vollständigen Sicherheitsempfehlungen von openbmb/VoxCPM2.