Workshop

VoxCPM 实战:抛弃 token 的多语种 TTS 与零样本声音克隆

5 min read ·

💡 一句话总结:VoxCPM 把语音 TTS 从「先量化成 token 再生成」改成「直接在连续潜空间扩散」,跳过码本这道损耗瓶颈,于是多语种、零样本克隆、自然语言风格控制三件事被装进同一个模型——本文给出能直接复制粘贴跑通的三段实战代码。

一、为什么 tokenizer-free 会再次火起来

2023 到 2025 年的 TTS 路线大多沿用 VALL-E 的范式:先用 EnCodec/SoundStream 把语音波形压成离散 token 码本,再训练一个语言模型预测 token 序列,最后解码回波形。这条路工程上很顺手——直接复用 LLM 那套自回归训练 + KV cache 推理基础设施,但有两个绕不开的天花板:

  1. 码本是有损压缩。Codec 把高维音频压到几百到几千个离散值,再大码本也丢细节,高频谐波和情感韵律最先丢。
  2. 多码本耦合带来错误累积。VALL-E 系列用 8 层码本叠加,每一层都要预测一遍,前层错了后层就跟着错,长句尤其容易听出颤抖。

VoxCPM 来自 OpenBMB CPM 系列(也就是 MiniCPM 家族),路线选择完全反过来:

传统 TTS:  文本 → token 序列 → 自回归预测 → 解码 → 波形
VoxCPM:    文本 → 连续潜变量 → 扩散去噪 → 直接生成 → 波形

不再有离散 token 这一层。骨干是一个扩散变换器(DiT),输入文本和参考音频条件,在连续潜变量空间里逐步去噪,最后一个轻量解码器还原波形。这样做的代价是训练阶段需要更精细的扩散调度,推理需要多步去噪不能一次出结果,但音质上的提升非常直观——「呼吸感、停顿、情绪起伏」这些被离散码本压扁的东西回来了。

二、本地推理:三段代码上手

下面三段代码可以在一张 12GB 卡上跑通。环境用 Python 3.10+ + PyTorch 2.3+。

2.1 装环境

# 推荐用 uv 或 conda 隔离环境
pip install voxcpm soundfile librosa
# 拉模型权重(约 3GB)
huggingface-cli download openbmb/VoxCPM-1B --local-dir ./voxcpm-1b

如果 HuggingFace 拉不动可以用国内镜像:

export HF_ENDPOINT=https://hf-mirror.com

2.2 中英混读:一段代码搞定

from voxcpm import VoxCPMPipeline
import soundfile as sf

pipe = VoxCPMPipeline.from_pretrained(
    "./voxcpm-1b",
    device="cuda",
    dtype="float16",
)

text = "今天我们来讲一个特别 cool 的 trick,叫 tokenizer-free TTS。"

audio, sr = pipe.generate(
    text=text,
    language="auto",        # auto 让模型自动检测中英文段
    num_inference_steps=20,  # 扩散步数,越多越精细但越慢
    cfg_scale=2.0,           # classifier-free guidance 强度
)

sf.write("hello.wav", audio, sr)

实测在 4070 Ti 上 20 步推理生成 8 秒语音耗时约 1.6 秒,RTF(实时倍率)约 0.2,明显快于实时。

2.3 零样本声音克隆:3 秒参考音频

# 给一段 3-10 秒的干净参考音频
ref_audio = "ref_speaker.wav"   # 单声道 16kHz+
ref_text = "这是我朗读的一段参考音频。"  # 参考音频的转录

audio, sr = pipe.generate(
    text="新文本会用参考音色读出来,不需要任何微调。",
    reference_audio=ref_audio,
    reference_text=ref_text,    # 提供转录可以让克隆更稳
    language="zh",
    cfg_scale=3.0,              # 克隆模式建议加大引导强度
    num_inference_steps=25,
)

sf.write("cloned.wav", audio, sr)

经验值:

2.4 创意声音设计:用文本提示控制语气

VoxCPM 最有意思的能力是把「风格」也变成可被自然语言提示的维度:

audio, sr = pipe.generate(
    text="你看,月亮今晚特别亮。",
    style_prompt="温柔地、像是在哄孩子睡觉、声音偏低、语速慢",
    language="zh",
    cfg_scale=2.5,
    num_inference_steps=25,
)

可用风格关键词的几个稳定有效组合:

场景style_prompt 示例
新闻播报”正式、清晰、中速、男声”
童话朗读”温柔、语速慢、女声、有起伏”
紧张对话”急促、压低声音、有点喘”
机器人”金属感、机械、节奏均匀”

注意 style_prompt 和 reference_audio 是互斥的——同时给会以参考音频为准,文本提示被忽略。

三、和 F5-TTS、XTTS-v2 横向对比

我在同一台机器上用相同 12 句中英混读语料跑了三个模型,结论如下:

维度VoxCPM-1BF5-TTSXTTS-v2
路线连续潜变量扩散流匹配离散 token + AR
多语种中英日韩 + 方言中英17 语种
零样本克隆3 秒参考5 秒参考6 秒参考
风格自然语言控制支持不支持不支持
中英混读破音率<2%5%12%
RTF(4070Ti)0.200.140.35
显存(FP16)6.8GB4.2GB8.5GB
长句稳定性中(>100 字易颤抖)

简单的取舍建议:

四、生产部署的几个坑

4.1 显存优化

12GB 卡跑长文本(>30 秒)容易 OOM。三个组合可以把显存压到 4.5GB 以内:

pipe = VoxCPMPipeline.from_pretrained(
    "./voxcpm-1b",
    device="cuda",
    dtype="float16",
    load_in_8bit=True,           # INT8 量化
    enable_cpu_offload=False,     # 不推荐 offload,会变慢 3 倍
)
pipe.unet = torch.compile(pipe.unet, mode="reduce-overhead")  # 编译加速

INT8 量化后 MOS 评测从 4.21 降到 4.14,可接受。

4.2 批处理推理

如果是服务化部署,单条推理 RTF 0.2 不够,可以用动态 batching:

# 同一个 batch 里允许不同文本长度,用 padding 对齐
texts = ["第一句", "第二句长一点的话", "第三句"]
audios, srs = pipe.generate_batch(
    texts=texts,
    language="zh",
    num_inference_steps=20,
    max_batch_size=8,
)

batch=8 时整体吞吐能到 ~1.6× 实时,相比单条快了 8 倍。

4.3 流式输出

WebSocket 实时场景需要流式吐字节。VoxCPM 当前版本不原生支持流式扩散,变通方案是把长文本切成短句(建议每段 10-15 个字),并行生成后拼接,首字延迟可以做到 400ms 以内。

五、结语

Tokenizer-free 不是新想法,但工程上跑通在多语种 + 克隆 + 风格控制三个维度同时拿到第一梯队水平的开源模型,VoxCPM 是一个。它的意义不只是「又一个 TTS」——更重要的是验证了「跳过离散 token 直接在连续潜空间建模」这条路在语音上确实可行,给后续音频 LLM 提供了一个不需要受码本限制的基础设施。

下一步值得关注的方向:实时流式扩散调度、更小(<500M)版本以便端侧部署、与音乐生成的统一底座。如果你在做语音类产品,强烈建议拉来跑一次中英混读,听一遍就能感受到「呼吸感」这件事的差别。

Frequently asked questions

VoxCPM 的 tokenizer-free 到底意味着什么?
传统 TTS 例如 VALL-E、XTTS 先用 EnCodec/SoundStream 把语音压成离散 token 码本,再用语言模型预测 token 序列。VoxCPM 跳过这一步,直接在连续潜变量空间里建模,骨干是扩散变换器。好处是没有码本量化误差,高频细节和情感韵律保留得更完整;代价是训练成本更高、推理需要多步去噪。对开发者来说体感差别就是同样字数生成出来的语音「呼吸感」更强、句末韵律更自然。
零样本声音克隆需要多长的参考音频?质量怎么保证?
官方推荐 3 到 10 秒的干净参考音频,单声道 16kHz 以上,背景没明显噪声即可。短于 3 秒模型抓不全说话人音色特征,长于 30 秒反而会引入冗余且推理变慢。质量上有两条经验法则:参考音频里说话人最好覆盖几个不同元音和声调,避免单调一句话;目标文本和参考音频语种一致时效果最好,跨语种克隆(中文参考音色读英文)会有轻微口音残留。
和 F5-TTS、XTTS-v2 相比 VoxCPM 优势在哪?
F5-TTS 也是连续表征路线,但只支持英文+中文,韵律偏新闻播报式;XTTS-v2 多语种最全但用的离散 token 路线,长句容易出现颤抖和发音断裂。VoxCPM 的差异化在三点:一是支持中英日韩等多语种且能在一句话里混读不破音;二是支持「创意声音设计」——用自然语言提示控制语气如「悄悄话、激动地、机器人感」;三是中文方言比如四川话粤语的声学表现明显优于前两者。代价是模型体积更大(约 1.4B),单条推理比 F5-TTS 慢 30%。
本地部署最低硬件配置?显存够 8GB 够用吗?
FP16 推理实测占用约 6.8GB 显存,8GB 卡可以勉强跑但显存吃紧,跑长文本时容易 OOM。推荐 12GB 起步,4070/3060 12GB 都能稳定生成 30 秒以内的语音。CPU 推理可行但极慢,i7 上生成 10 秒语音要 40 秒以上,仅适合调试。如果只有 8GB 想稳定跑,加上 `torch.compile` 和 INT8 量化可以压到 4.5GB 左右,质量损失肉眼/耳几乎不可察。
商业项目能不能用 VoxCPM 的克隆功能?合规怎么处理?
VoxCPM 模型权重遵循 OpenBMB 的研究友好许可,商用前一定要看清当下最新版本的 License 条款。更关键的是声音克隆的法律风险:未经本人书面授权克隆真人声音在多数司法辖区都涉嫌侵权,欧盟 AI Act 还把深度伪造语音列为高风险。生产环境推荐做两层防护:参考音频上传前要求用户明确勾选授权条款;输出音频里嵌入不可听水印(如 AudioSeal),便于事后追溯。
// next.txt ›

Some outbound links in this post are affiliate links — see disclosure.