VoxCPM2
VoxCPM2 是 OpenBMB 发布的 20 亿参数、无 tokenizer 的扩散-自回归 TTS 模型。它能在 30 种语言下合成 48 kHz 录音棚级音频,提供三种生产模式:零样本合成、单参考语音克隆,以及自然语言驱动的声音设计(例如 "a young female voice, warm and gentle")。在 Apple Silicon 上通过 MLX 原生运行,支持 bf16、int8、int4 — 在 8 句测试集上,int8 版本经由 Qwen3-ASR 回采的 WER 为 0%,RTF ≈ 1.0。
概述
- 48 kHz 输出 — 本工具链中唯一支持录音棚采样率的设备端引擎,其他 TTS 模块均上限 24 kHz。
- 声音设计 — 通过自然语言控制风格:
--voxcpm2-instruct "young female voice, warm and gentle"。其他引擎均无此能力。 - 声音克隆 — 从 16 kHz 单段参考音频克隆;"ultimate cloning"(参考音频 + 文本)能更好地保留韵律。
- 30 种语言 — 英语、中文、印尼语、日语、韩语等。语言会从文本自动检测。
- Apache 2.0 — 模型权重沿用上游 openbmb 许可,Swift 移植端遵循相同许可。
架构
由五个相互配合的组件合成 48 kHz 波形:
| 组件 | 说明 |
|---|---|
| MiniCPM-4 base LM | 28 层 MiniCPM-4,LongRoPE、GQA(16 Q / 2 KV 头,每头维度 128)、SwiGLU MLP。以文本 token + 音频 latent 作为条件。 |
| Residual LM | 8 层 MiniCPM-4 变体,不使用旋转位置编码。每生成一个音频 patch 后细化基础 LM 的隐状态。 |
| FSQ + Local DiT estimator | 标量量化的隐状态驱动一个 12 层 Diffusion Transformer(V2),在 64 维音频 latent 上以 patch=4 运算。默认使用 CFG-zero-star Euler 求解器,10 步时间。 |
| AudioVAE V2 | 因果卷积解码器。输入 16 kHz 参考音频,输出 48 kHz 波形(内置 3× 上采样)。 |
| 停止头 | 对 LM 隐状态做逐步二分类。argmax = 1 表示在生成至少 minTokens 个 patch 后结束。 |
版本
三个量化版本,均从上游 PyTorch openbmb/VoxCPM2 检查点转换而来。量化作用于 LM / 残差 LM / DiT 估计器 / 投影头中的 Linear,AudioVAE 声码器保持 fp16/bf16 — 量化它会损害音质。
| 版本 | 量化方式 | 大小 | HuggingFace |
|---|---|---|---|
| bf16 | 无(参考) | ~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(Qwen3-ASR 0.6B,8 句测试集,M 系列 Apple Silicon):
| 版本 | WER | RTF |
|---|---|---|
| bf16 | 2.04 % | 1.38 |
| int8 | 0.00 % | 1.02 |
| int4 | 4.08 % | 0.83 |
推荐使用 int8 — 在 LM 路径上与上游 Python 流水线逐位一致,速度更快,比 bf16 小 40%。int4 是 WER 仍可接受、体积最小的版本,适合休闲场景。
快速开始
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
传入显式 model ID 即可选择 int8 / int4:
let tts = try await VoxCPM2TTSModel.fromPretrained(
modelId: "aufklarer/VoxCPM2-MLX-int8"
)
声音设计(指令驱动)
传入一段自然语言风格描述,模型即可无需参考音频按描述合成:
let audio = try await tts.generateVoxCPM2(
text: "Welcome to the show.",
instruct: "A young woman, gentle and warm voice."
)
声音克隆
从 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 — 同时传入参考音频和与之匹配的转写文本,LM 还会条件于词汇上下文,更好地保留韵律和口音:
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
可用标志:--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(可复现的合成)。
在 speech-swift TTS 模块中如何选择
| Kokoro-82M | Qwen3-TTS | CosyVoice3 | VoxCPM2 | VibeVoice 1.5B | |
|---|---|---|---|---|---|
| 参数量 | 82M | 0.6 / 1.7 B | 0.5B | 2B | 1.5B |
| 采样率 | 24 kHz | 24 kHz | 24 kHz | 48 kHz | 24 kHz |
| 后端 | CoreML (ANE) | MLX, CoreML | MLX | MLX | MLX |
| 语言数 | 10 | 10 | 9 | 30 | EN + ZH |
| 声音设计 | 固定音色 | — | — | 指令驱动 | — |
| 声音克隆 | — | ICL 参考 | 零样本参考 | 参考 + ultimate | 音频 + 转写 |
| 长文本 | 短 / 中等 | 流式 | 流式 | Patch 流式 | 最长 90 分钟 |
需要 48 kHz 输出(音乐 / 广播)或无需参考音频的自然语言声音设计时。如果需要最高质量的英语短文本 TTS 且包体更小,CosyVoice3 或 Qwen3-TTS 更轻量;如果是英 / 中长篇播客或有声书,VibeVoice 1.5B 才是为此而生。
负责任使用
本模型包含声音克隆能力。请在克隆任何人声前取得本人同意,不要用模型冒充他人、生成假信息或实施欺诈。完整安全准则请参考 openbmb/VoxCPM2。