Clonación de voz con VoxCPM2 en Mac
Ejecuta VoxCPM2 localmente en Apple Silicon con MLX para clonar una voz o diseñarla mediante una descripción. Este modelo de OpenBMB genera voz a 48 kHz en 30 idiomas. Escucha los ejemplos y prueba la CLI con la grabación de referencia y su transcripción exacta.
Muestras de audio · Clona una voz con la CLI · VoxCPM2 frente a Qwen3-TTS
Muestras de clonación de voz
Estos clips en inglés proceden de la comparación FLEURS publicada. La referencia y la voz generada dicen frases distintas. Cada salida es una muestra representativa; las métricas resumen varios clips.
Transcripción de referencia: One can only wonder what the keyboard will become when something newer comes along.
Texto generado: While he was working at the hospital Liggins began to investigate premature labor during his spare time.
Texto generado: While he was working at the hospital Liggins began to investigate premature labor during his spare time.
Clona una voz con la CLI
Descarga Audio de referencia como reference.wav. El comando usa su transcripción exacta; sustituye tanto la grabación como la transcripción si utilizas tu propia muestra.
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
Qué es
- Salida a 48 kHz — el único motor on-device de este stack con sample rate de estudio. El resto de TTS llega como máximo a 24 kHz.
- Diseño de voz — control de estilo por lenguaje natural:
--voxcpm2-instruct "young female voice, warm and gentle". Ningún otro motor expone esto. - Clonación de voz — clonación con una sola referencia desde un clip a 16 kHz; "ultimate cloning" (audio de referencia + transcripción) para preservar mejor la prosodia.
- 30 idiomas — inglés, chino, indonesio, japonés, coreano y más. Detección automática desde el texto.
- Apache 2.0 — los pesos heredan la licencia de openbmb upstream; nuestro port en Swift mantiene la misma.
Arquitectura
Cinco componentes cooperan para producir la forma de onda a 48 kHz:
| Componente | Descripción |
|---|---|
| MiniCPM-4 base LM | MiniCPM-4 de 28 capas con LongRoPE, GQA (16 cabezas Q / 2 KV, dim de cabeza 128) y MLP SwiGLU. Se condiciona sobre tokens de texto + latentes de audio. |
| Residual LM | Variante MiniCPM-4 de 8 capas sin embeddings rotativos. Refina el estado oculto del LM base por cada patch de audio generado. |
| FSQ + Local DiT estimator | Estados ocultos cuantizados escalarmente alimentan un Diffusion Transformer (V2) de 12 capas que opera sobre latentes de audio de 64 dim en parches de 4. Solver Euler CFG-zero-star, 10 pasos por defecto. |
| AudioVAE V2 | Decoder convolucional causal. Lee audio de referencia a 16 kHz y emite la onda a 48 kHz (sobremuestreo 3× incorporado). |
| Cabezal Stop | Clasificador binario por paso sobre el estado oculto del LM. argmax = 1 termina la generación tras minTokens patches. |
Paquetes
La CLI actual admite paquetes bf16 e int8 convertidos desde el checkpoint original openbmb/VoxCPM2. Se cuantizan las proyecciones del modelo de lenguaje y de difusión; el decodificador de audio conserva la precisión completa.
| Paquete | Cuantización | Tamaño | HuggingFace |
|---|---|---|---|
| bf16 | Ninguna (referencia) | ~5.0 GB | aufklarer/VoxCPM2-MLX-bf16 |
| int8 | MLX QuantizedLinear, group size 64 | ~3.0 GB | aufklarer/VoxCPM2-MLX-int8 |
ASR round-trip (Qwen3-ASR 0.6B, 8 frases, Apple Silicon serie M):
| Variante | WER | RTF |
|---|---|---|
| bf16 | 2.04 % | 1.38 |
| int8 | 0.00 % | 1.02 |
| int4 (retirado) | 4.08 % | 0.83 |
La CLI usa bf16 por defecto; elige int8 para reducir la descarga. int4 está retirado y solo aparece en la tabla como medición histórica.
Inicio rápido
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
Selecciona explícitamente el paquete int8:
let tts = try await VoxCPM2TTSModel.fromPretrained(
modelId: "aufklarer/VoxCPM2-MLX-int8"
)
Diseño de voz (por instrucción)
Pasa una descripción de estilo en lenguaje natural; el modelo se condiciona sobre ella sin necesidad de audio de referencia:
let audio = try await tts.generateVoxCPM2(
text: "Welcome to the show.",
instruct: "A young woman, gentle and warm voice."
)
Clonación de voz
Clonación con una sola referencia desde un clip mono a 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 — pasa a la vez el audio de referencia y su transcripción para que el LM se condicione también sobre el contexto léxico y preserve mejor la prosodia y el acento:
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
Banderas: --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 para síntesis reproducible.
VoxCPM2 frente a Qwen3-TTS
Resultados publicados en inglés con diez pares de referencia y objetivo FLEURS por modelo: medias de WER y UTMOS, y mediana de RTF. WER y RTF más bajos son mejores; UTMOS predice la naturalidad, no es una valoración humana. Los resultados no establecen una clasificación universal.
| Modelo | WER ↓ | RTF ↓ | UTMOS ↑ |
|---|---|---|---|
| VoxCPM2 bf16 | 1.8% | 1.11 | 2.97 |
| Qwen3-TTS Base 1.7B bf16 ICL | 2.4% | 1.70 | 3.50 |
Comparación de clonación en cinco idiomas y metodología.
Cómo elegir entre los módulos TTS de speech-swift
| Kokoro-82M | Qwen3-TTS | CosyVoice3 | VoxCPM2 | VibeVoice 1.5B | |
|---|---|---|---|---|---|
| Parámetros | 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 |
| Idiomas | 10 | 10 | 9 | 30 | EN + ZH |
| Diseño de voz | Presets fijos | — | — | Por instrucción | — |
| Clonación de voz | — | Referencia ICL | Referencia zero-shot | Referencia + ultimate | Audio + transcripción |
| Formato largo | Corto / medio | Streaming | Streaming | Streaming por patches | Hasta 90 min |
…necesites salida a 48 kHz (música / radiodifusión) o diseño de voz por lenguaje natural sin un clip de referencia. Para TTS de máxima calidad en inglés corto con menor descarga, CosyVoice3 o Qwen3-TTS son más ligeros. Para podcasts y audiolibros largos en EN/ZH, VibeVoice 1.5B está hecho para eso.
Uso responsable
Incluye clonación de voz. Obtén consentimiento para cualquier voz que clones y no uses el modelo para suplantar a personas, generar desinformación o cometer fraude. Aplica la guía completa de seguridad de openbmb/VoxCPM2.