VoxCPM2
VoxCPM2 est un modèle TTS diffusion-autorégressif sans tokenizer, de 2 milliards de paramètres, publié par OpenBMB. Il synthétise un audio 48 kHz qualité studio dans 30 langues, avec trois modes de production : zéro-shot, clonage de voix par référence unique et design vocal en langage naturel ("a young female voice, warm and gentle"). Sur Apple Silicon, il tourne nativement via MLX en bf16, int8 ou int4 — sur le harnais de 8 phrases, le bundle int8 atteint 0 % de WER en round-trip Qwen3-ASR pour un RTF ≈ 1,0.
Présentation
- Sortie 48 kHz — la seule engine on-device du stack à proposer une fréquence d'échantillonnage studio. Les autres TTS plafonnent à 24 kHz.
- Design vocal — contrôle stylistique en langage naturel :
--voxcpm2-instruct "young female voice, warm and gentle". Aucun autre moteur n'expose cette fonctionnalité. - Clonage de voix — clonage par référence unique à partir d'un clip 16 kHz ; "ultimate cloning" (audio de référence + transcription) pour préserver la prosodie plus fidèlement.
- 30 langues — anglais, chinois, indonésien, japonais, coréen et plus. Détection automatique depuis le texte.
- Apache 2.0 — les poids héritent de la licence amont openbmb ; notre port Swift est sous la même licence.
Architecture
Cinq composants coopèrent pour produire la forme d'onde 48 kHz :
| Composant | Description |
|---|---|
| MiniCPM-4 base LM | MiniCPM-4 à 28 couches, LongRoPE, GQA (16 têtes Q / 2 KV, dim de tête 128), MLP SwiGLU. Conditionné sur les tokens textuels + latents audio. |
| Residual LM | Variante MiniCPM-4 à 8 couches sans embeddings rotatifs. Raffine le hidden state du LM de base pour chaque patch audio généré. |
| FSQ + Local DiT estimator | Les hidden states quantifiés scalairement alimentent un Diffusion Transformer (V2) à 12 couches qui opère sur des latents audio 64 dim par patches de 4. Solveur Euler CFG-zero-star, 10 timesteps par défaut. |
| AudioVAE V2 | Décodeur convolutionnel causal. Lit l'audio de référence en 16 kHz et émet une forme d'onde 48 kHz (sur-échantillonnage 3× intégré). |
| Tête Stop | Classifieur binaire par pas sur le hidden state du LM. argmax = 1 termine la génération après minTokens patches. |
Bundles
Trois variantes quantifiées, toutes converties depuis les checkpoints PyTorch amont openbmb/VoxCPM2. La quantification s'applique aux couches Linear du LM / LM résiduel / estimateur DiT / têtes de projection ; le vocoder AudioVAE reste en fp16/bf16, parce que sa quantification dégrade la qualité audio.
| Bundle | Quantification | Taille | HuggingFace |
|---|---|---|---|
| bf16 | Aucune (référence) | ~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 |
ASR round-trip (Qwen3-ASR 0.6B, harnais 8 phrases, Apple Silicon série M) :
| Variante | WER | RTF |
|---|---|---|
| bf16 | 2.04 % | 1.38 |
| int8 | 0.00 % | 1.02 |
| int4 | 4.08 % | 0.83 |
int8 est l'option recommandée par défaut — bit à bit identique au pipeline Python amont sur le chemin LM, tout en étant plus rapide et 40 % plus léger que bf16. int4 est le plus petit bundle au WER acceptable, pour un usage occasionnel.
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
Passez un model ID explicite pour choisir le bundle int8 / int4 :
let tts = try await VoxCPM2TTSModel.fromPretrained(
modelId: "aufklarer/VoxCPM2-MLX-int8"
)
Design vocal (instruction-driven)
Passez une description stylistique en langage naturel ; le modèle s'y conditionne sans audio de référence :
let audio = try await tts.generateVoxCPM2(
text: "Welcome to the show.",
instruct: "A young woman, gentle and warm voice."
)
Clonage de voix
Clonage à référence unique depuis un clip mono 16 kHz :
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 — passez à la fois l'audio de référence et la transcription correspondante pour que le LM se conditionne aussi sur le contexte lexical et préserve mieux la prosodie et l'accent :
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 pour une synthèse reproductible.
Choisir parmi les modules TTS de speech-swift
| Kokoro-82M | Qwen3-TTS | CosyVoice3 | VoxCPM2 | VibeVoice 1.5B | |
|---|---|---|---|---|---|
| Paramètres | 82M | 0.6 / 1.7 B | 0.5B | 2B | 1.5B |
| Sample rate | 24 kHz | 24 kHz | 24 kHz | 48 kHz | 24 kHz |
| Backend | CoreML (ANE) | MLX, CoreML | MLX | MLX | MLX |
| Langues | 10 | 10 | 9 | 30 | EN + ZH |
| Design vocal | Presets figés | — | — | Par instruction | — |
| Clonage de voix | — | Référence ICL | Référence zero-shot | Référence + ultimate | Audio + transcription |
| Format long | Court / moyen | Streaming | Streaming | Streaming par patches | Jusqu'à 90 min |
…il vous faut une sortie 48 kHz (musique / broadcast) ou un design vocal en langage naturel sans clip de référence. Pour un TTS court anglais de qualité maximale avec un téléchargement plus petit, CosyVoice3 ou Qwen3-TTS sont plus légers. Pour les podcasts et livres audio longs en EN/ZH, VibeVoice 1.5B est conçu pour ça.
Usage responsable
Le clonage de voix est inclus. Obtenez le consentement pour toute voix que vous clonez ; n'utilisez pas le modèle pour usurper l'identité, générer de la désinformation ou commettre une fraude. Le guide de sécurité complet de openbmb/VoxCPM2 s'applique.