导航

VoxCPM2:扔掉Tokenizer之后,TTS终于可以“造声音”了

Posted on 2026-09-30 16:42  蝈蝈俊  阅读(46)  评论(0)    收藏  举报

做TTS的开发者大概都有过这种体验:合成出来的语音,文本一个字没错,但听起来就是差点什么。换气节奏不对,句尾该上扬的地方是平的,情绪转折处像是机器人在念稿。

问题可能不在模型大小,不在训练数据量,而在一个被大多数TTS方案默认接受的前置步骤:把音频剁成离散token。

VoxCPM 是目前开源TTS里第一个把Tokenizer彻底扔掉、并在连续潜空间里跑扩散自回归的方案。不是“改进Tokenizer”,不是“用更好的codebook”,是直接把这一刀给去掉了。

assets/VoxCPM2:扔掉Tokenizer之后,TTS终于可以“造声音”了/file-20260930162834220.png

https://github.com/OpenBMB/VoxCPM/

一、扔掉Tokenizer:TTS“没魂”的根源被切掉了

先说一个可能让人意外的事实:对于大多数标准朗读场景,传统TTS的离散token方案已经做得足够好,普通人确实很难一耳朵听出问题。

但“听不出问题”不等于“没有损失”。

传统TTS的流程是:音频 → 神经音频编解码器 → 离散token序列 → 语言模型预测token → 声码器还原波形。中间那个“离散化”步骤,本质上是有损压缩。一个连续音频信号被编码器压缩成每秒几十个token,每个token只能从有限的码本里选一个值。韵律的细微波动 —— 一句话结尾语气微微上扬的幅度,某个词上多停了50毫秒,换气时气流摩擦声的质感 —— 这些东西在离散化过程中被“四舍五入”掉了。

在标准朗读、情绪平稳的短句里,这些细节的缺失并不影响语义理解,听感上最多觉得“有点平”或“有点机械”。但当语音需要承载丰富的情感、复杂的韵律和强烈的风格时,离散化丢弃的那些细节,恰恰是“灵魂”所在:

  • 有声书中的情绪转折:从平静叙述到激动质问,如果丢失了语气渐变过程中的细微声学线索,转换就会显得突兀生硬。

  • 角色配音中的复杂表演:哭腔、笑意或疲惫感的台词,高度依赖连续声学信号,离散化可能将其“压平”成标准化的情绪标签。

  • 长文本的连贯表达:离散token的误差会在长序列生成中累积,可能导致后半段音质下降、韵律漂移。

  • 声音克隆的“传神” :离散方案能克隆音色,但很难复刻参考音频中独特的、连续变化的说话节奏和韵律习惯。

VoxCPM的解法是:不压缩了,直接建模连续表示。

VoxCPM2 采用连续音频表征、扩散自回归范式,模型在 AudioVAE 的连续隐空间中通过四阶段处理:LocEnc → TSLM → RALM → LocDiT,实现丰富的表现力语音合成和 48kHz 原生音频输出。

assets/VoxCPM2:扔掉Tokenizer之后,TTS终于可以“造声音”了/file-20260930161325772.png

在VoxCPM 1.0、1.5与2上,系列共用同一条高层生成路径:文本 → 四阶段生成流水线 → AudioVAE解码器 → 波形。

生成主干分为四个阶段:

  • Local Encoder:将输入音频分块编码为紧凑的局部表示,缩短语言模型需要处理的有效序列长度
  • Text-Semantic LM:基于MiniCPM-4的因果语言模型,联合处理文本token与音频嵌入,负责“说什么”——规划韵律、节奏与重音
  • Residual Acoustic LM:融合语义层与声学层信息,建模细粒度声学细节;在文本语义规划与最终音频生成之间起到衔接作用。
  • Local DiT (CFM):以 LM 输出为条件的条件流匹配(CFM)扩散 Transformer,生成连续音频潜变量;在每个自回归步输出高保真语音 patch。

生成的潜变量再由AudioVAE解码为原始波形。

关键设计在 FSQ(有限标量量化)层,它位于 Text-Semantic LM 和 Residual Acoustic LM 之间。系统以MiniCPM-4为骨干,结合分层语言建模与FSQ约束的连续潜变量,将高层语义规划与低层声学渲染分离开来。FSQ的作用不是把表示“量化成离散token”,而是用FSQ对连续隐状态施加正则化约束——它作为可微瓶颈,将TSLM输出的连续隐向量投影到结构化格点空间,生成半离散表征,同时通过直通估计器保持端到端可微性。量化不是预测目标,而是约束隐状态空间的手段。

翻译成体感:语义部分该稳的稳,声学部分该活的活。

落到实际听感上,VoxCPM合成的语音在换气节奏、句尾拖音、情感转折这些“非文本”维度上,明显比离散方案自然。“AI味”更淡,“人味”更浓。


二、音色设计:不需要任何参考音频,用一句话“造”出一个声音

这是VoxCPM2最让人眼前一亮的能力。

你不需要任何参考音频,不需要去找配音演员,只需要用自然语言描述你想要的音色,模型就能凭空创造出一个全新的声音。

支持描述的维度包括性别、年龄、音调、语速、情绪基调、音色质感等。写法很简单——把控制指令写在目标文本前面的括号里,中英文都可以:

from voxcpm import VoxCPM
import soundfile as sf
model = VoxCPM.from_pretrained("openbmb/VoxCPM2", load_denoiser=False)

# 用自然语言描述凭空创建音色
wav = model.generate(
    text="(A young woman, gentle and sweet voice)你好,欢迎来到VoxCPM的世界。",
    cfg_value=2.0,
    inference_timesteps=10,
)
sf.write("voice_design.wav", wav, model.tts_model.sample_rate)

换个描述就是另一个声音:

# 沉稳的播音腔
wav = model.generate(
    text="(中年男性,沉稳磁性,播报风格)今天是2026年9月30日,欢迎收看新闻。"
)
# 活泼的少女音
wav = model.generate(
    text="(年轻女孩,活泼俏皮,语速偏快)哇!这个功能也太好用了吧!"
)

对做产品的人来说,这意味着你不需要提前准备音色素材库,不需要找配音,不需要录音。游戏NPC、有声书角色、动画配音、广告旁白——全都可以用自然语言“定制”。ElevenLabs也有类似功能,但那是付费的。VoxCPM开源免费,Apache-2.0许可,明确可商用。


三、可控克隆:克隆音色的同时,还能“指挥”情绪和语速

克隆声音这件事,现在很多TTS都能做。但VoxCPM2的克隆有一个关键区别:克隆出来之后,你还能继续控制它。

传统克隆方案通常是“给什么音频,出什么效果”——参考音频里是什么情绪、什么语速,克隆出来就跟着是什么风格。你没法在保留音色的同时,让它换一种情绪说话。

VoxCPM2把这两件事拆开了:参考音频负责“音色”,括号里的指令负责“风格” 。

# 克隆音色 + 控制情绪和语速
wav = model.generate(
    text="(slightly faster, cheerful tone)这就是克隆出来的声音,但语气完全由我控制。",
    reference_wav_path="speaker.wav",
    cfg_value=2.0,
    inference_timesteps=10,
)
sf.write("controllable_clone.wav", wav, model.tts_model.sample_rate)

格式: 在 text 开头用括号写入音色描述(如 "(音色描述)要合成的文本。"):

同一段参考音频,换一个风格指令,出来就是完全不同的表达:

# 同一个音色,沉稳播报风格
wav = model.generate(
    text="(语速缓慢,沉稳严肃)这是一条重要通知。",
    reference_wav_path="speaker.wav",
)
# 同一个音色,激动风格
wav = model.generate(
    text="(语速快,情绪激动)我们成功了!",
    reference_wav_path="speaker.wav",
)

而且,克隆时不需要提供参考音频的对应文字转写。VoxCPM2引入了隔离式参考音频通道,克隆时只需要音频本身。你拿到一段素材,不用先人工转写一遍才能用。

如果追求最高相似度,还可以使用高保真克隆模式,同时提供参考音频和逐字转写,模型用转写精确对齐prompt音频,克隆保真度最高。

wav = model.generate(
    text="这是使用VoxCPM2的极致克隆演示。",
    prompt_wav_path="path/to/voice.wav",
    prompt_text="参考音频的文本转录。",
    reference_wav_path="path/to/voice.wav",  # 可选,提升相似度
)
sf.write("hifi_clone.wav", wav, model.tts_model.sample_rate)

为获得最高克隆相似度,将同一音频同时传给 reference_wav_path 和 prompt_wav_path:


四、30种语言 + 9种中文方言 + 原生48kHz

VoxCPM2在VoxCPM 1.x的中英双语基础上,扩展到30种语言、8个语系,训练数据约236万小时(180万小时中英基础 + 56万小时多语言)。

覆盖的语系包括东亚(中文、日语、韩语)、东南亚(缅甸语、印尼语、高棉语、老挝语、马来语、他加禄语、泰语、越南语)、南亚(印地语)、欧洲各语族、闪米特语族(阿拉伯语、希伯来语)以及非洲的斯瓦希里语。

中文侧还覆盖四川话、粤语、吴语、东北话、河南话、陕西话、山东话、天津话、闽南语9大方言。面壁智能官方演示过用VoxCPM2让《哆啦A梦》讲方言的效果——零人工配音,直接合成。

演示功能看:
https://openbmb.github.io/voxcpm2-demopage/

音质方面,VoxCPM2的AudioVAE V2做了非对称编解码:编码端接受16kHz参考音频,解码端直接输出48kHz,路径中不需要任何外部上采样器。你给一段手机录音当参考,出来的是录音棚采样率。48kHz能完整保留呼吸声、唇齿音、情感起伏的细微变化。


五、微调:5-10分钟音频数据,就能让模型“认识”你的声音

这是VoxCPM对技术人员最实用的能力之一。

VoxCPM支持两种微调方式:全参数微调(SFT) 和 LoRA微调。

LoRA在冻结基座的前提下,仅训练少量附加参数,多数微调任务建议从此入手。实测准备大约5-10分钟的纯净单人讲话音频即可适配特定说话人、语言或领域。

硬件门槛方面:VoxCPM 2的LoRA微调约需20GB显存,全量微调约40GB。这意味着单张RTX 4090可以完成微调。

数据格式就是一个JSONL文件,每行一条:

{"audio": "path/to/audio1.wav", "text": "对应转写"}
{"audio": "path/to/audio2.wav", "text": "对应转写", "ref_audio": "path/to/audio1.wav"}

具体参考微调文档

https://voxcpm.readthedocs.io/zh-cn/latest/finetuning/finetune.html

建议30%–50%的训练样本带ref_audio,这样模型不会丢掉零样本克隆能力。

什么场景下需要微调? 模型对某个特定说话人的音色还原不够像;某个小语种的发音不够标准;某个垂直领域(医疗、法律、游戏)的术语读法需要纠正;需要用特定的录音条件来适配。这些场景下,5-10分钟的音频就能看到明显改善。

总结

assets/VoxCPM2:扔掉Tokenizer之后,TTS终于可以“造声音”了/file-20260930164015594.png

VoxCPM2把三件事放在了一起:开源可商用、连续潜空间架构带来的自然听感、以及让技术人员能在消费级硬件上完成微调和部署的工程效率。 对于需要集成TTS到产品里的开发者来说,这是一个值得认真评估的选项。

项目地址:https://github.com/OpenBMB/VoxCPM/