VoxCPM2
VoxCPM2 es un modelo TTS difusión-autoregresivo sin tokenizador, de 2000 millones de parámetros, publicado por OpenBMB. Sintetiza audio a 48 kHz con calidad de estudio en 30 idiomas y ofrece tres modos productivos: zero-shot, clonación de voz por referencia única y diseño de voz por instrucciones en lenguaje natural ("a young female voice, warm and gentle"). En Apple Silicon corre de forma nativa con MLX en bf16, int8 e int4 — sobre la prueba de 8 frases, el paquete int8 alcanza un WER del 0 % en el round-trip con Qwen3-ASR y un RTF ≈ 1,0.
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
Tres variantes cuantizadas, todas convertidas desde los checkpoints PyTorch upstream openbmb/VoxCPM2. La cuantización afecta a los Linear del LM / LM residual / estimador DiT / cabezales de proyección; el vocoder AudioVAE se mantiene en fp16/bf16 porque cuantizarlo degrada la calidad.
| 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 |
| int4 | MLX QuantizedLinear, group size 64 | ~1.9 GB | aufklarer/VoxCPM2-MLX-int4 |
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 | 4.08 % | 0.83 |
int8 es la opción recomendada — coincide bit a bit con el pipeline Python upstream en la ruta del LM, es más rápido y un 40 % menor que bf16. int4 es el paquete más pequeño con un WER aceptable para uso casual.
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
Pasa un model ID explícito para elegir el paquete int8 / int4:
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,int4}, --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.
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.