📌 项目地址:OpenBMB/VoxCPM | ⭐ 21,644 颗星 | 🔧 Python | 📜 Apache-2.0
这不是又一个TTS,它跳过了最笨的那一步
大多数TTS模型第一步是把声音切碎成几千个离散token,然后像语言模型一样预测下一个token。切的时候信息就丢了——语气里微弱的犹豫、换气时气流的变化、音色边缘那些不规则的细节,都被量化的网格压平了。VoxCPM2不干这事,它直接输出连续的声音表示,用扩散过程一步步去噪。官方叫“端到端扩散自回归架构”,说白了就是让模型自己决定声音的“形状”,而不是猜下一个积木。
参数2B,训练数据200万小时以上,覆盖30种语言。输出48kHz,参考音频只需要16kHz,内置AudioVAE V2做上采样,省了一个外部超分器的钱。Apache-2.0,商用无限制。HuggingFace上21.6k星,社区活跃度可以。
同一份权重,三个不同的玩法
HuggingFace仓库是openbmb/VoxCPM2。一套模型,三种用途,调用接口写在官方文档里。我分别试过,各有各的脾气。
语音设计:给文字描述,出声音
不需要参考音频。输入“老年女性,语气温柔,语速慢”,模型直接生成一段音频。你可以调的属性:性别、年龄、语气、情感、语速、音色。官方README举的例子是“嘶哑、有磁性、像电台主播”这种组合。我自己的经验:描述越具体,结果越不稳定。比如“嘶哑”这个属性,模型理解的和你想的可能差很远——它可能把“嘶哑”理解成声带拉紧的那种,而不是烟嗓。建议从2-3个属性起步,比如“年轻男性、平静、语速中等”,觉得方向对了再加维度。
注意:这不是用文字“画”声音,而是用文字“引导”模型在预训练空间里选一个点。所以你不能指望它无中生有出完全独特的音色,更像是在一个50维的滑块面板上调参数。
可控克隆:参考音频 + 风格指令
传一段16kHz的参考音频(注意:必须是16kHz,44.1kHz会报错,先降采样),再加文字风格描述,比如“激动”、“悲伤”、“自信”。模型保留原说话人的音色,只改变情感和语速。输出直接是48kHz。
有个坑:参考音频里的环境噪声会被完整保留。你拿一段有风扇嗡嗡声的录音做克隆,生成的语音里也有同样的嗡嗡声。想要干净的音色,先在外部降噪(比如用demucs分离人声,或用noise gate)再喂给模型。
终极克隆:参考音频 + 转录
提供参考音频和它的逐字文字转录。模型不是从零模仿,而是从参考音频的最后一帧之后继续生成。节奏、停顿、呼吸、情绪全部继承。这是VoxCPM1.5就有的功能,官方叫“无缝延续”。适合补全录音缺的后半段,或者让虚拟角色在多轮对话里保持一致的语感。
硬约束:转录必须一字不差。错一个字或漏一个字,模型对情绪的推理就会跑偏。我试过故意把转录里的一个“嗯”删掉,结果生成出来的语气变犹豫了。建议先用Whisper做ASR转录,然后人工校对一遍。Whisper对中文和英文的准确率还行,但方言(特别是粤语、四川话)容易出错,必须逐句核对。
30种语言 + 9种方言,自动检测
30种语言列表在README:阿拉伯语、缅甸语、中文、英语、日语、韩语、泰语、越南语、印尼语、马来语、菲律宾语、印地语、阿拉伯语等等。9种中国方言:四川话、粤语、吴语、东北话、河南话、陕西话、山东话、天津话、闽南话。模型自动判断输入语言,不需要你加语言标签。
中英语混合句可以生成,但句子复杂度高时效果会下降。比如“我今天去了the supermarket,然后买了一些apples”,模型还能处理。但如果句子是“这个算法的时间复杂度是O(n log n),但需要balance memory和cache”,模型可能在中英文切换的地方断句或语气不自然。建议全文用同一种语言,或者分段生成再拼接。
部署:4090实时流式,低端卡离线更稳
官方数据:RTX 4090上原始推理RTF约0.3(1秒音频生成需0.3秒),可流式输出。半精度推理显存约4-5GB。如果你要同时跑多个请求,建议8-10GB。
社区项目Nano-vLLM和vLLM-Omni可以加速到RTF约0.13。vLLM-Omni整合了PagedAttention和OpenAI兼容API。注意:这两个不是官方项目,GitHub上有使用指引,但需要手动装对应版本的vLLM,否则可能报错。我没有试过vLLM-Omni,但社区反馈说对小批量生成提升明显。
低端显卡(RTX 3060 12GB)可以离线生成单段音频,实时流式时RTF可能翻倍到0.6以上,会有明显延迟。如果你手头没有4090,建议先用离线方式生成,别指望实时对话。
实际使用的坑,挨个记清楚
-
参考音频采样率16kHz:输入44.1kHz会直接报错。用
ffmpeg -i input.wav -ar 16000 output.wav降采样,或者用librosa.resample。注意:降采样不能解决噪声问题。 -
声音设计的精细度:描述词越具体,结果越难精确命中。建议从简单开始:性别+年龄段+一个情感词。多试几次找到模型的“语言”,再往描述里加维度。
-
终极克隆依赖转录准确性:缺少转录或转录有错会导致情绪和节奏崩掉。流程:Whisper转录 → 人工校对 → 喂给模型。别省人工审核那一步。
-
噪声被保留:参考音频里的任何环境声都会成为克隆的一部分。如果你用手机在嘈杂环境录的参考音频,克隆出来的语音也带着底噪。要么在录音时尽量安静,要么用降噪工具预处理。
-
vLLM加速需要手动配置:如果你要上vLLM-Ommi,先看它的文档确认版本兼容。官方文档里提到了这两个社区项目,但没有给出一键安装脚本。
我建议的用法
- 多语言配音:用纯一种语言输入最稳。如果需要混合语言,分段生成然后拼接。
- 游戏角色或虚拟主播:用声音设计快速生成新角色,省去录音棚。先试性别+年龄,不满意就调描述,直到找到顺耳的音色。
- 补录播客或视频的口误:用终极克隆保持原氛围。前提是你有准确的转录。
- 高音质输出:直接拿48kHz的生成结果,省掉外部超分。用16kHz参考音频即可。
如果你需要可控克隆,先检查参考音频的噪声。如果你需要终极克隆,必须提供准确转录。低端显卡离线生成更靠谱,4090可以实时流式。具体代码调用看官方Docs(voxcpm.readthedocs.io),权重在huggingface.co/openbmb/VoxCPM2。