Clonage vocal avec VoxCPM2 sur Mac

Exécutez VoxCPM2 en local sur Apple Silicon avec MLX pour cloner une voix ou la concevoir à partir d’une description. Ce modèle OpenBMB génère une voix à 48 kHz dans 30 langues. Écoutez les exemples, puis testez la CLI avec l’enregistrement de référence et sa transcription exacte.

Extraits audio · Cloner une voix avec la CLI · VoxCPM2 face à Qwen3-TTS

Exemples de clonage vocal

Ces extraits anglais proviennent de la comparaison FLEURS publiée. La référence et la voix générée prononcent des phrases différentes. Chaque sortie est un exemple représentatif ; les mesures regroupent plusieurs extraits.

Audio de référenceAnglais · 16 kHz

Transcription de référence: One can only wonder what the keyboard will become when something newer comes along.

VoxCPM2 bf16Anglais · 48 kHz

Texte généré: While he was working at the hospital Liggins began to investigate premature labor during his spare time.

Qwen3-TTS Base 1.7B bf16 ICLAnglais · 24 kHz

Texte généré: While he was working at the hospital Liggins began to investigate premature labor during his spare time.

Cloner une voix avec la CLI

Téléchargez l’Audio de référence sous le nom reference.wav. La commande utilise sa transcription exacte ; remplacez l’enregistrement et la transcription pour votre propre échantillon.

speech speak "Hello from the cloned voice." \
    --engine voxcpm2 \
    --voxcpm2-variant bf16 \
    --voice-sample reference.wav \
    --voxcpm2-prompt-audio reference.wav \
    --voxcpm2-prompt-text "One can only wonder what the keyboard will become when something newer comes along." \
    --seed 42 \
    --output clone.wav

Présentation

Architecture

Cinq composants coopèrent pour produire la forme d'onde 48 kHz :

ComposantDescription
MiniCPM-4 base LMMiniCPM-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 LMVariante 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 estimatorLes 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 V2Dé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 StopClassifieur binaire par pas sur le hidden state du LM. argmax = 1 termine la génération après minTokens patches.

Bundles

La CLI actuelle prend en charge les bundles bf16 et int8 convertis depuis le checkpoint original openbmb/VoxCPM2. Les projections des modèles de langage et de diffusion sont quantifiées ; le décodeur audio reste en pleine précision.

BundleQuantificationTailleHuggingFace
bf16Aucune (référence)~5.0 GBaufklarer/VoxCPM2-MLX-bf16
int8MLX QuantizedLinear, group size 64~3.0 GBaufklarer/VoxCPM2-MLX-int8

ASR round-trip (Qwen3-ASR 0.6B, harnais 8 phrases, Apple Silicon série M) :

VarianteWERRTF
bf162.04 %1.38
int80.00 %1.02
int4 (retiré)4.08 %0.83

La CLI utilise bf16 par défaut ; choisissez int8 pour un téléchargement plus léger. int4 est retiré et ne figure dans le tableau qu’à titre de mesure historique.

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

Sélectionnez explicitement le bundle int8 :

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}, --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.

VoxCPM2 face à Qwen3-TTS

Résultats anglais publiés sur dix paires FLEURS de référence et de cible par modèle : moyennes WER et UTMOS, médiane RTF. Des WER et RTF plus faibles sont préférables. UTMOS prédit le naturel et ne remplace pas une évaluation humaine. Ces résultats ne constituent pas un classement universel.

ModèleWER ↓RTF ↓UTMOS ↑
VoxCPM2 bf161.8%1.112.97
Qwen3-TTS Base 1.7B bf16 ICL2.4%1.703.50

Comparaison du clonage dans cinq langues et méthodologie.

Choisir parmi les modules TTS de speech-swift

Kokoro-82MQwen3-TTSCosyVoice3VoxCPM2VibeVoice 1.5B
Paramètres82M0.6 / 1.7 B0.5B2B1.5B
Sample rate24 kHz24 kHz24 kHz48 kHz24 kHz
BackendCoreML (ANE)MLX, CoreMLMLXMLXMLX
Langues1010930EN + ZH
Design vocalPresets figés——Par instruction—
Clonage de voix—Référence ICLRéférence zero-shotRéférence + ultimateAudio + transcription
Format longCourt / moyenStreamingStreamingStreaming par patchesJusqu'à 90 min
Choisissez VoxCPM2 quand…

…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.