VoxCPM2
VoxCPM2 é um modelo TTS de difusão-autoregressivo sem tokenizador, com 2 bilhões de parâmetros, publicado pela OpenBMB. Sintetiza áudio em 48 kHz com qualidade de estúdio em 30 idiomas e oferece três modos de produção: zero-shot, clonagem de voz por referência única e design de voz por instruções em linguagem natural ("a young female voice, warm and gentle"). Em Apple Silicon roda nativamente via MLX em bf16, int8 ou int4 — no harness de 8 frases, o pacote int8 atinge WER 0 % no round-trip via Qwen3-ASR e RTF ≈ 1,0.
Visão geral
- Saída em 48 kHz — o único motor on-device do stack com taxa de amostragem de estúdio. Todos os outros TTS terminam em 24 kHz.
- Design de voz — controle de estilo por linguagem natural:
--voxcpm2-instruct "young female voice, warm and gentle". Nenhum outro motor expõe isso. - Clonagem de voz — clonagem por referência única a partir de um clipe 16 kHz; "ultimate cloning" (áudio de referência + transcrição) para preservar melhor a prosódia.
- 30 idiomas — inglês, chinês, indonésio, japonês, coreano e mais. Detecção automática a partir do texto.
- Apache 2.0 — os pesos herdam a licença upstream do openbmb; nosso port em Swift mantém a mesma.
Arquitetura
Cinco componentes cooperam para gerar a forma de onda em 48 kHz:
| Componente | Descrição |
|---|---|
| MiniCPM-4 base LM | MiniCPM-4 de 28 camadas, LongRoPE, GQA (16 cabeças Q / 2 KV, dim de cabeça 128) e MLP SwiGLU. Condicionado em tokens de texto + latentes de áudio. |
| Residual LM | Variante MiniCPM-4 de 8 camadas sem embeddings rotativos. Refina o hidden state do LM base a cada patch de áudio gerado. |
| FSQ + Local DiT estimator | Hidden states quantizados escalarmente alimentam um Diffusion Transformer (V2) de 12 camadas que opera sobre latentes de áudio de 64 dim em patches de 4. Solver Euler CFG-zero-star, 10 timesteps por padrão. |
| AudioVAE V2 | Decoder convolucional causal. Lê áudio de referência em 16 kHz e emite a onda em 48 kHz (upsampling 3× embutido). |
| Cabeça Stop | Classificador binário por passo sobre o hidden state do LM. argmax = 1 encerra a geração após minTokens patches. |
Pacotes
Três variantes quantizadas, todas convertidas a partir dos checkpoints PyTorch upstream openbmb/VoxCPM2. A quantização atinge as camadas Linear dentro do LM / LM residual / estimador DiT / cabeças de projeção; o vocoder AudioVAE fica em fp16/bf16 porque quantizá-lo prejudica a qualidade do áudio.
| Pacote | Quantização | Tamanho | HuggingFace |
|---|---|---|---|
| bf16 | Nenhuma (referência) | ~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 série M):
| Variante | WER | RTF |
|---|---|---|
| bf16 | 2.04 % | 1.38 |
| int8 | 0.00 % | 1.02 |
| int4 | 4.08 % | 0.83 |
int8 é o padrão recomendado — equivalente bit a bit ao pipeline Python upstream no caminho do LM, sendo mais rápido e 40 % menor que bf16. int4 é o menor pacote com WER aceitável para uso casual.
Início 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
Passe um model ID explícito para escolher o pacote int8 / int4:
let tts = try await VoxCPM2TTSModel.fromPretrained(
modelId: "aufklarer/VoxCPM2-MLX-int8"
)
Design de voz (por instrução)
Passe uma descrição de estilo em linguagem natural; o modelo se condiciona a ela sem áudio de referência:
let audio = try await tts.generateVoxCPM2(
text: "Welcome to the show.",
instruct: "A young woman, gentle and warm voice."
)
Clonagem de voz
Clonagem com referência única a partir de um clipe 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 — passe ao mesmo tempo o áudio de referência e sua transcrição correspondente para que o LM se condicione também sobre o contexto lexical e preserve melhor prosódia e sotaque:
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 para síntese reproduzível.
Escolhendo entre os módulos TTS do 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 |
| Design de voz | Presets fixos | — | — | Por instrução | — |
| Clonagem de voz | — | Referência ICL | Referência zero-shot | Referência + ultimate | Áudio + transcrição |
| Formato longo | Curto / médio | Streaming | Streaming | Streaming por patches | Até 90 min |
…precisar de saída em 48 kHz (música / broadcast) ou de design de voz em linguagem natural sem clipe de referência. Para TTS curto em inglês com a maior qualidade e download menor, CosyVoice3 ou Qwen3-TTS são mais leves. Para podcasts e audiolivros longos em EN/ZH, VibeVoice 1.5B foi feito para isso.
Uso responsável
Inclui clonagem de voz. Obtenha consentimento para qualquer voz clonada e não use o modelo para se passar por alguém, gerar desinformação ou cometer fraude. Aplica-se o guia completo de segurança de openbmb/VoxCPM2.