简介 :
VoxCPM2 是 OpenBMB 团队开源的 2B 参数多语言 TTS 模型,支持 30+ 语言、情感控制、声音克隆,音质达到 48kHz。本文从实际使用和源码两个维度拆解它------不堆术语,只讲清楚它是什么、为什么好用、以及怎么把它跑起来。
为什么值得关注
在动手之前,先回答一个问题:VoxCPM2 到底解决了什么问题?
传统 TTS 系统一直卡在一个两难的死结里:
- 用离散分词器(比如把语音切成 EnCodec token)的方案训练稳定,但离散化必然丢失声学细节,合成出来的声音"能听懂但不够自然"
- 用纯连续潜变量的方案保留了全部细节,但语义规划和声学渲染在同一空间里纠缠,长句子越生成越跑偏,CER 能飙到 25% 以上
VoxCPM2 的聪明之处在于:它不二选一,而是用半离散分层建模把这个问题拆开------语义规划用离散骨架保证稳定,声学渲染在连续空间里补充细节。结果是:开源模型里 WER/CER 最低,30 语言零样本相似度多数排第一,而且完全 Apache 2.0 开源。
下面展开讲。
它到底是怎么工作的
要真正理解 VoxCPM2,先忘掉那些模块名。我们从**"让 AI 说话"这件事本身**来想。
说话这件事分两层
你自己说话的时候,脑子里其实在同时做两件事:
- 语义层:这段话是什么意思?哪里该重读?哪里该停顿?是陈述还是疑问?
- 声学层:用什么样的音色?音高怎么变化?气息怎么安排?
这两件事密切相关,但又不完全是一回事。一个专业的配音演员可以用同一段文本、同一个语义理解,演出十种不同的声学风格。
VoxCPM2 的整个架构设计,本质上就是在模仿这个"分两层处理"的过程:
文本输入
│
▼
[语义规划] ←→ TSLM(管"说什么、用什么语气")
│ 用 FSQ 量化形成稳定的语义骨架
▼
[声学渲染] ←→ RALM + LocDiT(管"用什么样的声音读")
│ 在语义骨架上补充声学细节
▼
48kHz 音频输出
关键洞察:如果让一个模块同时管语义和声学,它就会"顾此失彼"。语义规划需要稳定性(同样的文本每次生成应该差不多),声学渲染需要表现力(同样的文本可以有不同的读法)。这两个目标在一个连续空间里是相互拉扯的。
FSQ(有限标量量化)就是这个矛盾的"解耦点"------它强制把 TSLM 的输出量化为半离散的骨架,语义信息被"锁"在骨架上,声学细节则由 RALM 在骨架基础上自由补充。消融实验的数据很说明问题:去掉 FSQ 的纯连续模型,中文困难集 CER 直接从 8.87% 飙到 24.92%。
"无分词器"是什么思路
传统 TTS 的套路是:音频 → 离散 tokenizer(如 EnCodec)→ token 序列 → LM 生成 token → 声码器还原音频。
这个 pipeline 的问题在于:tokenizer 是一个有损压缩过程。EnCodec 把 24kHz 音频压缩到 75 token/s,信息瓶颈是客观存在的。
VoxCPM2 的做法是:干脆不要这个 tokenizer。
它用 AudioVAE V2 做音频编解码,但语言模型直接在 AudioVAE 的连续潜变量空间里生成,不经过离散化。这就像是:传统方案是在"像素画"上作画(token 数目有限),VoxCPM2 是在"连续画布"上作画(潜变量维度连续可微)。
那连续生成会不会不稳定?这就是 FSQ 存在的意义------它在 LM 的内部引入了一个"软离散化"的瓶颈,让语义规划这部分是稳定的,同时声学渲染仍然在连续空间里进行。这是整个设计最精妙的地方。
架构拆解:从数据流向理解每个模块
有了上面的直觉,再看具体的四阶段流水线就清晰多了。我按数据流动的顺序来讲,而不是按模块排列。
音频怎么变成 LM 能处理的序列
原始音频是每秒几万个采样点,LM 不可能逐采样点处理。VoxCPM2 用两套机制做压缩:
LocEnc(局部音频编码器):把连续音频帧分组成 patch,每个 patch 对应一小段音频的紧凑嵌入。这样做有两个好处:一是大幅降低序列长度(潜空间帧率只有 25Hz,意味着 1 秒音频只对应 25 个 patch);二是 patch 级的处理天然适合自回归生成。
AudioVAE V2 编码器:把原始波形压缩到连续潜空间。这里的"非对称"设计很值得说------编码端接受 16kHz 输入(够用且高效),但解码端直接输出 48kHz(高保真)。中间的"超分辨率"是通过解码器的采样率条件隐式学习的,不需要额外的超分模块。这个设计很优雅:编码省算力,解码保质量。
原始音频 (48kHz) → AudioVAE编码器 (16kHz输入) → 潜变量 (25Hz帧率)
↓
参考音频 → LocEnc → patch嵌入 ──────────────→ 作为TSLM的历史上下文
TSLM 怎么"读懂"文本的情感
TSLM(Text-Semantic Language Model)是整个系统最"聪明"的模块。它初始化自 MiniCPM-4(一个已经经过大规模文本预训练的 LLM),这个初始化非常关键------预训练 LLM 已经从海量文本中学会了"新闻应该用什么语气、诗歌应该用什么韵律"这样的模式。
论文里有一个很有说服力的 t-SNE 可视化:在无提示语音合成任务中,TSLM-FSQ 的输出按文本类型聚类(新闻、诗歌、对话各成一簇),说明它确实在从文本内容推断合适的韵律模式,而不是随机生成。
中文处理上有一个细节:TSLM 对中文采用字符级 BPE分词,而不是词级。原因是中文词汇稀疏(尤其是人名、地名、专业术语),字符级分词可以彻底避免 OOV 问题。这看起来是个小细节,但对中文 TTS 的可懂度影响很大。
TSLM 输出的是连续隐状态,接下来要经过 FSQ 量化。
FSQ:整个设计最精巧的地方
FSQ(Finite Scalar Quantization)的操作很简单:把连续值映射到固定网格上。但它在架构中的作用非常深刻。
直接看公式可能不好理解,换个角度:FSQ 相当于在 TSLM 和 RALM 之间加了一道"信息过滤门"------
- 只保留跨说话人稳定的语义-韵律信息(比如"这句话是疑问句,在第三个字之后应该升调")
- 过滤掉说话人相关的声学细节(比如"这个人的共振峰在什么位置")
这样 RALM 拿到的是一个"纯净的语义骨架",它的任务就变得非常明确:在这个骨架上"填上"特定说话人的声学细节。
VoxCPM2 的改进:1.x 版本里 FSQ 输出和 RALM 输出是"相加"的(h_final = FSQ + RALM),2.0 改成了"拼接+投影"(h_final = Proj(FSQ ; RALM))。为什么?因为相加隐含了"语义和声学在同一空间里可以直接相加"的假设,但实际上它们的语义空间可能并不对齐。拼接+投影让模型自己学习怎么把这两路信息融合,自由度更高,效果也更好。消融实验验证了这一点。
LocDiT:用扩散模型"画"出音频
经过前面三步,我们有了一个融合了语义和声学信息的条件信号 h_final。最后一步是把它变成实际的音频潜变量------这就是 LocDiT 做的事。
LocDiT 本质上是一个条件流匹配(Conditional Flow Matching, CFM)扩散模型。我不想在这里展开流匹配的数学(后面有推导),直觉上可以理解为:
从纯噪声出发,每一步都"朝着条件信号指引的方向"去噪,经过 10 步(默认推理步数)之后,得到干净的音频潜变量 patch。
这里有个设计细节值得注意:LocDiT 是双向 Transformer,不像 TSLM 那样是因果(单向)的。原因是 LocDiT 处理的是局部 patch 的去噪,patch 内部的每个时间步可以互相"看到",不需要因果约束。双向注意力让它能捕捉更丰富的局部声学结构。
CFG(Classifier-Free Guidance) 是另一个关键点。训练时以 0.1 的概率把条件信号 mask 掉,这样推理时可以通过 CFG 强度来控制"多大程度上听从条件信号"。论文建议 CFG=2.0,这是一个经验性的最优值------太低保真度不够,太高则声音听起来"过于机械"。
音频重建:从潜变量到波形
最后一步很简单:把 LocDiT 生成的潜变量 patch 序列送入 AudioVAE V2 的解码器,直接输出 48kHz 波形。
这里 AudioVAE 的训练目标值得提一下:它不仅有重建损失(梅尔谱损失),还有 GAN 损失(让重建音频听起来更自然)和 KL 散度损失(保持潜空间的结构性)。三者联合训练,这是当前音频 VAE 的标准做法。
数学直觉:关键公式在说什么
这一节给想深入理解的读者。我不会堆砌公式,而是解释每个公式在"干什么"。
自回归生成:看起来简单,细节很多
VoxCPM2 把语音生成建模为条件自回归过程:
p ( Z ∣ T ) = ∏ i = 1 M p ( z i ∣ T , Z < i ) p(\mathbf{Z}|\mathbf{T}) = \prod_{i=1}^{M} p(\mathbf{z}i | \mathbf{T}, \mathbf{Z}{<i}) p(Z∣T)=i=1∏Mp(zi∣T,Z<i)
这个公式看起来就是标准的自回归分解,但需要注意的是:这里的 z i \mathbf{z}_i zi 不是单个采样点,而是一个音频 patch(对应约 40ms 的音频)。patch 级自回归是 VoxCPM2 能处理长文本的关键------如果逐采样点自回归,生成一秒钟音频需要几万个 step,这是不可能的。
条件信号融合:VoxCPM2 改了什么
1.x 版本中,条件信号的融合是相加的:
h i final = FSQ ( TSLM ( ⋅ ) ) + RALM ( ⋅ ) \mathbf{h}_i^{\text{final}} = \text{FSQ}(\text{TSLM}(\cdot)) + \text{RALM}(\cdot) hifinal=FSQ(TSLM(⋅))+RALM(⋅)
2.0 版本改为拼接+投影:
h i final = Proj ( FSQ ( TSLM ( ⋅ ) ) ∥ RALM ( ⋅ ) ) \mathbf{h}_i^{\text{final}} = \text{Proj}\left(\left\\text{FSQ}(\\text{TSLM}(\\cdot)) \\;\\\|\\; \\text{RALM}(\\cdot)\\right\right) hifinal=Proj(FSQ(TSLM(⋅))∥RALM(⋅))
从代码角度看,这相当于把两个 1024 维的向量拼成 2048 维,再通过一个线性层投影回 1024 维。这个线性层是可学习的,意味着模型可以自适应地决定语义信息和声学信息各占多少权重,而不是被"相加"操作强制对等对待。
流匹配:比扩散模型更直接
LocDiT 的训练目标是流匹配损失:
L FM = E t , z i 0 , ϵ ∥ v θ ( z i t , t , h i final , z i − 1 ) − d d t ( α t z i 0 + σ t ϵ ) ∥ 2 \mathcal{L}{\text{FM}} = \mathbb{E}{t, \mathbf{z}_i^0, \boldsymbol{\epsilon}} \left \\left\\\| \\mathbf{v}_\\theta(\\mathbf{z}_i\^t, t, \\mathbf{h}_i\^{\\text{final}}, \\mathbf{z}_{i-1}) - \\frac{d}{dt}(\\alpha_t \\mathbf{z}_i\^0 + \\sigma_t \\boldsymbol{\\epsilon}) \\right\\\|\^2 \\right LFM=Et,zi0,ϵ vθ(zit,t,hifinal,zi−1)−dtd(αtzi0+σtϵ) 2
这里的直觉是:我们不是在预测噪声 ϵ \boldsymbol{\epsilon} ϵ(像 DDPM 那样),而是在预测速度场 v θ \mathbf{v}_\theta vθ------即从噪声状态到干净状态的"最优传输路径"上的速度。流匹配和扩散模型在数学上是等价的(通过 OT 路径和 VE/VP 路径的对应关系),但流匹配的数值稳定性更好,推理步数可以更少(默认 10 步,扩散模型通常需要 50-100 步)。
FSQ 量化:直通估计器是怎么工作的
FSQ 的前向传播是确定性量化:
h i , j FSQ = Δ ⋅ clip ( round ( h i , j TSLM Δ ) , − L , L ) \mathbf{h}{i,j}^{\text{FSQ}} = \Delta \cdot \text{clip}\left(\text{round}\left(\frac{\mathbf{h}{i,j}^{\text{TSLM}}}{\Delta}\right), -L, L\right) hi,jFSQ=Δ⋅clip(round(Δhi,jTSLM),−L,L)
但 round 操作不可微,怎么反向传播?答案是直通估计器(STE) :前向传播走量化路径,反向传播时梯度直接跳过量化操作(相当于 ∂ round ( x ) ∂ x = 1 \frac{\partial \text{round}(x)}{\partial x} = 1 ∂x∂round(x)=1)。这是神经量化领域的标准技巧,VQ-VAE、FVQ 等都用类似的方法。
版本对比:从 0.5B 到 2B 走了多远
把三个版本放在一起看,能清楚地看到团队的设计思路演进:
| VoxCPM-0.5B | VoxCPM1.5 | VoxCPM2 | |
|---|---|---|---|
| 参数量 | 0.5B | 0.6B | 2B |
| 音频质量 | 16kHz | 44.1kHz | 48kHz |
| 语言覆盖 | 中/英 | 中/英 | 30语+9方言 |
| 声音设计 | ❌ | ❌ | ✅ |
| RALM 融合 | 相加 | 相加 | 拼接+投影 |
| LocDiT 条件 | 单一融合 | 单一融合 | 多 token 前缀 |
最值得关注的是 VoxCPM2 的两个架构改进(拼接+投影、多 token 条件前缀),它们都不需要增加参数量,但显著提升了质量。这说明 1.x 版本的瓶颈不完全在模型规模,而在信息融合方式上。
另一个观察:VoxCPM2 的显存需求约 8GB(RTX 4090 可跑),参数量是 0.5B 的 4 倍,但显存只增加了 60%。这是因为 2B 模型使用了更高效的注意力实现和激活检查点,推理时的内存占用并不是简单地随参数量线性增长。
动手:从安装到跑出第一个音频
理论说完了,动手部分我尽量给完整可运行的代码。
环境配置
bash
# Python 3.10 环境(不要用到 3.13,有些依赖还不支持)
conda create -n voxcpm python=3.10 -y
conda activate voxcpm
# PyTorch 2.5+,CUDA 12 适配
pip install torch==2.5.1 torchaudio==2.5.1 --index-url https://download.pytorch.org/whl/cu121
# VoxCPM 主包
pip install voxcpm
# 音频保存
pip install soundfile librosa
国内用户如果 HuggingFace 下载慢,可以用 ModelScope 镜像:
python
# 先下载模型到本地,再加载
from modelscope import snapshot_download
snapshot_download('OpenBMB/VoxCPM2', local_dir='./models/VoxCPM2')
from voxcpm import VoxCPM
model = VoxCPM.from_pretrained('./models/VoxCPM2')
第一个音频:5 行代码跑起来
python
from voxcpm import VoxCPM
import soundfile as sf
model = VoxCPM.from_pretrained("openbmb/VoxCPM2")
wav = model.generate(text="你好,我是 VoxCPM2,一个开源的多语言语音生成模型。")
sf.write("hello.wav", wav, model.tts_model.sample_rate)
print(f"完成!采样率 = {model.tts_model.sample_rate}Hz") # 应该是 48000
声音设计:不用参考音频,纯文本描述生成声音
这是 VoxCPM2 最让人眼前一亮的功能。用法也很简单,在文本开头用括号写描述就行:
python
# 英文声音设计
wav = model.generate(
text="(A young woman, warm and gentle voice)Hello! This voice was created "
"entirely from a text description, without any reference audio.",
)
sf.write("voice_design_en.wav", wav, 48000)
# 中文声音设计------注意描述要用英文,模型的语言理解侧目前以英文为主
wav = model.generate(
text="(A middle-aged Chinese man, deep and steady voice)大家好,"
"这是一个通过文字描述生成的声音,不需要任何参考音频。",
)
sf.write("voice_design_zh.wav", wav, 48000)
实际操作中的经验:描述词越具体,生成结果越稳定。"A young woman" 比 "A female" 好,"warm and gentle" 比单独 "gentle" 好。建议多试几次,选效果最好的一次。
声音克隆:三种模式的完整对比
python
# === 模式一:基础克隆(3-10秒参考音频)===
wav = model.generate(
text="这是基础克隆模式,只需要一段参考音频。",
reference_wav_path="path/to/your/voice.wav",
)
sf.write("clone_basic.wav", wav, 48000)
# === 模式二:可控克隆(克隆+风格指令)===
wav = model.generate(
text="(speaking cheerfully and faster)这是可控克隆模式,可以指定情感和语速。",
reference_wav_path="path/to/your/voice.wav",
cfg_value=2.0, # CFG 强度,推荐 2.0
inference_timesteps=10, # 扩散步数,10 是质量和速度的平衡点
)
sf.write("clone_controllable.wav", wav, 48000)
# === 模式三:终极克隆(参考音频+文字稿,最高相似度)===
wav = model.generate(
text="这是终极克隆模式,提供文字稿后相似度最高。",
prompt_wav_path="path/to/your/voice.wav", # 参考音频
prompt_text="这是参考音频对应的文字稿内容。", # 对应文字稿(很重要!)
)
sf.write("clone_ultimate.wav", wav, 48000)
三种模式的核心区别:终极克隆为什么效果最好? 因为它不仅提供了音色参考(reference_wav_path),还提供了"这段参考音频说了什么"的信息(prompt_text)。这样 TSLM 可以精确地对齐语义和韵律,生成出来的音频在节奏、重音、情感上都能更好地匹配参考说话人的风格。
批量生成:做有声读物的正确姿势
python
import json, soundfile as sf
from voxcpm import VoxCPM
from pathlib import Path
model = VoxCPM.from_pretrained("openbmb/VoxCPM2")
output_dir = Path("audiobook_output")
output_dir.mkdir(exist_ok=True)
# 文本列表(实际使用时从文件读取)
texts = [
"第一章,开端。故事要从一个平凡的早晨说起。",
"李明推开窗户,深吸了一口清新的空气。",
"今天,似乎和往常有些不同。",
]
for i, text in enumerate(texts):
wav = model.generate(
text=text,
reference_wav_path="path/to/narrator_voice.wav", # 固定一个旁白音色
cfg_value=2.0,
)
sf.write(output_dir / f"chapter01_part{i:03d}.wav", wav, 48000)
print(f"已生成 {i+1}/{len(texts)}")
注意:批量生成时如果遇到长文本(超过 200 字),建议先做文本切分(按标点断句),VoxCPM2 对超长文本的处理还在优化中。
流式输出:对话系统的关键
python
from voxcpm import VoxCPM
import soundfile as sf
import numpy as np
model = VoxCPM.from_pretrained("openbmb/VoxCPM2")
# 流式生成------每个 chunk 可以实时播放
chunks = []
for i, chunk in enumerate(model.generate_streaming(
text="这是流式输出演示。每个音频块生成后立即返回,适合对话系统场景。",
reference_wav_path="path/to/voice.wav",
)):
chunks.append(chunk)
print(f"chunk {i+1} 就绪,长度 = {len(chunk)} 采样点")
# 这里可以接入实时播放(如 sounddevice 库)
# 全部拼接起来保存
wav = np.concatenate(chunks)
sf.write("streaming_output.wav", wav, 48000)
生产部署:不止于 Demo
VoxCPM2 的开源生态做得相当完善,生产部署有三条路可以走:
Nano-vLLM:高并发场景首选
bash
pip install nano-vllm-voxcpm
python
from nanovllm_voxcpm import VoxCPM
import numpy as np, soundfile as sf
# 启动推理服务(支持多 GPU)
server = VoxCPM.from_pretrained(model="/path/to/VoxCPM2", devices=[0, 1])
# 单次生成
chunks = list(server.generate(target_text="生产环境部署测试。"))
sf.write("prod_test.wav", np.concatenate(chunks), 48000)
# 并发请求(Nano-vLLM 的强项)
# 实际部署时配合 FastAPI 做 HTTP 接口
server.stop()
Nano-vLLM 在 RTX 4090 上能把 RTF 压到 0.13,意味着生成 1 秒音频只需要 0.13 秒,实时对话完全够用。
vLLM-Omni:OpenAI 兼容 API
如果你已经有基于 OpenAI TTS API 的代码,换到 VoxCPM2 几乎不用改:
bash
uv pip install vllm==0.19.0 --torch-backend=auto
git clone https://github.com/vllm-project/vllm-omni.git
cd vllm-omni && uv pip install -e .
vllm serve openbmb/VoxCPM2 --omni --port 8000
python
from openai import OpenAI
client = OpenAI(base_url="http://localhost:8000/v1", api_key="dummy")
response = client.audio.speech.create(
model="openbmb/VoxCPM2",
voice="default",
input="通过 OpenAI 兼容 API 调用 VoxCPM2。",
)
response.stream_to_file("openai_api_test.wav")
边缘部署:没有 GPU 怎么办
社区提供了几个不需要高端 GPU 的方案:
- VoxCPM.cpp:GGUF 量化格式,CPU 可以跑,树莓派也有机会
- VoxCPM-ONNX:ONNX Runtime,Windows 上部署最方便
- VoxCPMANE:Apple 设备专用,调用 Neural Engine,iPhone 上可以离线跑
微调:让模型学会你的声音
官方支持 LoRA 微调,我实际测过,5-10 分钟的音频就能出不错的效果。
LoRA 微调实战
bash
# 1. 准备数据
# 数据格式:一个 JSONL 文件,每行格式如下:
# {"audio": "path/to/audio.wav", "text": "对应的文字稿"}
# 2. 修改配置(conf/voxcpm_v2/voxcpm_finetune_lora.yaml)
# 关键参数:
# lora_rank: 16 # LoRA 秩,越大拟合能力越强,显存占用也越大
# batch_size: 4 # 根据显存调整
# learning_rate: 5e-5 # 学习率,LoRA 微调通常用 1e-4 ~ 5e-5
# 3. 启动训练
python scripts/train_voxcpm_finetune.py \
--config_path conf/voxcpm_v2/voxcpm_finetune_lora.yaml
训练完成后,LoRA 权重只有几十 MB,和基础模型分开存储,部署时动态加载。
WebUI 微调:不想写配置的话
bash
python lora_ft_webui.py
# 浏览器打开 http://localhost:7860
# 界面里可以上传音频、设置参数、启动训练、试听效果
效果怎么样:数据和主观感受
客观指标
Seed-TTS-Eval 是目前最权威的零样本 TTS 评测基准。VoxCPM2 的表现:
| 指标 | VoxCPM2 | 说明 |
|---|---|---|
| 英文 WER | 1.84% | 开源模型最低,可懂度极高 |
| 中文 CER | 0.97% | 同上 |
| 英文 SIM | 75.3% | 说话人相似度,闭源 Seed-TTS 是 78.1% |
| 中文 SIM | 79.5% | 同上 |
客观来说,VoxCPM2 在开源模型里是第一名,和闭源最强模型(Seed-TTS)的差距已经很小(SIM 差 2-3 个点)。
主观感受
我自己测试下来的感受:
- 自然度:确实比 CosyVoice2 和 IndexTTS2 好,尤其是韵律的自然度。CosyVoice2 有时候听起来"每个字都很标准,但连起来不像人说的",VoxCPM2 在这方面改善明显
- 声音克隆:终极克隆模式的相似度很高,但可控克隆(加风格指令)的效果还不够稳定,有时候指令没有被很好地执行
- 中文韵律:比英文稍弱,但已经比 1.x 版本好很多。诗歌、对话这类需要较强韵律变化的场景,效果提升尤其明显
- 48kHz 音质:能听出区别,尤其是高频部分(s音、sh音)更清晰。16kHz 模型在这些细节上确实有损失
消融实验告诉我们什么
论文的消融实验是最值得细读的部分,因为它告诉你"哪些设计是真的有用,哪些只是看上去有用":
- FSQ 必须有:去掉后 CER 从 8.87% 飙到 24.92%。这验证了"语义-声学解耦"不是玄学,是硬需求
- FSQ 维度 256 是最优点 :太低(4 维)约束过强,太高(1024 维)离散化不足。这个维度选择背后有信息论的依据------256 维的离散空间有 9 256 9^{256} 9256 种组合,足够编码语义-韵律信息,同时稀疏性足够强以产生解耦效果
- RALM 必须有历史声学输入:去掉后性能明显退化。这说明 RALM 不是简单地"查表"恢复声学细节,而是需要真正的声学上下文才能工作
- CFG=2.0 是最优点:这个和扩散模型的经验一致------适度的引导提升质量,过度的引导让生成结果失去多样性
局限性:诚实地说说当前的问题
作为一个还在快速迭代的项目,VoxCPM2 肯定不完美。实际使用中我遇到的主要问题:
-
情感细粒度控制不够:声音设计目前只能做粗粒度的描述("开心"、"悲伤"),无法精确到"带点无奈的苦笑"这种程度。论文也坦诚地说了这是一个待改进的方向
-
超长文本的一致性:虽然用了 patch 级自回归,但生成超过 30 秒的音频时,后半段的韵律有时会"漂移"。目前的 workaround 是手动做文本切分,每段不超过 200 字
-
中文方言的数据不均衡:9 种方言里,粤语和四川话的效果明显好于其他方言,这和训练数据的分布有关
-
实时性还不够极致:RTF=0.3 意味着还没到"无感延迟"的程度。对话系统通常需要 RTF < 0.1,目前的 Nano-vLLM 方案(RTF=0.13)离这个目标已经很近了
总结:VoxCPM2 的真正价值
写到这里,我想回到最开始的问题:VoxCPM2 的价值到底是什么?
我觉得不只是"效果好"或"开源"这么简单。它的真正价值在于:它证明了"无分词器"这条路是走得通的,而且可以做得很好。
在过去两年里,TTS 领域的主流思路一直是"用 LLM 生成语音 token,再用声码器还原"------这是一条简单直接的路,社区积累也深厚。VoxCPM2 选择了一条更难的路(直接在连续潜变量空间里生成,还要解决稳定性问题),并用扎实的工程和实验证明了这条路的可行性。
对于做 TTS 研究的同学,这个方向值得跟进。对于做应用的同学,VoxCPM2 现在已经是一个可以放心用的开源方案------Apache 2.0 许可证,质量接近商用闭源模型,社区生态也在快速完善。
最后,项目的 GitHub 地址是 https://github.com/OpenBMB/VoxCPM,论文在 arXiv:2606.06928。如果你跑通了本文的代码,欢迎在评论区分享你的生成效果------尤其是声音设计功能,多试几次可能会有惊喜。
2026 年 6月,写于 VoxCPM2 发布后两个月。相关代码和模型权重截至发稿时均为最新版本。