Chatterbox 开源文本转语音上手:从选对模型到验证水印的 4 步
【免费下载链接】chatterboxSoTA open-source TTS项目地址: https://gitcode.com/GitHub_Trending/chatterbox7/chatterbox
给应用加语音时,先卡住人的往往不是合成质量,而是一串实际问题:到底该用哪个模型?中文说得地道吗?显存不够怎么办?生成的声音能不能像某个特定的人?Chatterbox 是 Resemble AI 开源的一套完整文本转语音(TTS)方案,它把几个不同定位的模型放在同一个代码库里:面向低延迟的 Chatterbox-Turbo、能跑在纯 CPU 上的 Chatterbox-Nano、覆盖 23 种语言的多语言版 Multilingual V3,外加零样本声音克隆、语音转换(Voice Conversion)和内置音频水印,装完即用。
第 1 步:先选对模型,再谈跑起来
Chatterbox 不是一个模型,而是一个模型家族,选错方向后面全白搭。官方在 README 里维护了一张 Model Zoo,对照你的场景看:
| 模型 | 参数量 | 语言 | 适合谁 |
|---|---|---|---|
| Chatterbox-Turbo | 350M | 英文 | 语音代理、生产环境,计算量和显存占用更低 |
| Chatterbox-Nano | 110M | 英文 | 端侧、纯 CPU 推理,8 核 CPU 上 3 倍实时速度 |
| Chatterbox-Multilingual V3 | 500M | 23 种 | 全球多语言应用、跨语言声音克隆 |
| Single Language Pack | 500M × 6 | 6 个专项微调 | 对特定语言/方言质量要求高的场景 |
几个选型的直白判断:
- 只做英文、追求延迟:用 Turbo;显存或内存更紧张就换 Nano,两者架构相同,Nano 通过
nano=True加载 - 要合成中文、法语等非英文文本:必须用 Multilingual V3(通过
t3_model="v3"加载,不传则默认 V2 旧版),它支持 ar、de、en、fr、ja、ko、ru、zh 等 23 种语言,完整清单写死在 src/chatterbox/mtl_tts.py 的SUPPORTED_LANGUAGES里 - 只要中文,且在意方言和稳定性:Single Language Pack 里有专门微调的 zh-cmn 版本(另外 5 个是拉美/西班牙西语、巴西/葡萄牙葡语、印地语)
- 想调情感、做创意控制(
exaggeration、cfg_weight参数):只有原版 Chatterbox 和 Multilingual 支持,Turbo 不支持,下文会提到
第 2 步:本地安装与第一次合成
选好了模型,剩下的是最普通的安装步骤。
- 用 pip 装(最省事):
pip install chatterbox-tts- 或者从源码装,方便改代码(官方在 Python 3.11 + Debian 11 上开发测试,依赖版本锁定在 pyproject.toml,要求 Python ≥ 3.10):
git clone https://gitcode.com/GitHub_Trending/chatterbox7/chatterbox cd chatterbox pip install -e .- 跑第一段语音。下面这段代码直接加载多语言 V3 并合成一句中文,
language_id传语言码:
import torchaudio as ta from chatterbox.mtl_tts import ChatterboxMultilingualTTS device = "cuda" # 没有 GPU 就写 "cpu" 或 "mps" model = ChatterboxMultilingualTTS.from_pretrained(device=device, t3_model="v3") text = "你好,今天天气真不错,希望你有一个愉快的周末。" wav = model.generate(text, language_id="zh") ta.save("test-chinese.wav", wav, model.sr)from_pretrained会自动从 Hugging Face 拉取权重,首次运行需要点时间。想换声音,只要在generate里多传一个audio_prompt_path="YOUR_FILE.wav",传入一段参考音频就能做零样本声音克隆——原版英文模型(ChatterboxTTS)自带内置音色,不传参考音频也能出声。仓库里的 example_tts.py 就是完整可跑的版本。
到这里你可能会想:这几个模型代码入口不同,内部是不是各搞一套?其实不是。所有模型共用同一条管线:文本先过 T3 语言模型转成语音 token(src/chatterbox/models/t3/),再由 S3Gen 解码回音频波形(src/chatterbox/models/s3gen/)。Turbo/Nano 的区别主要是 T3 换了更小的 GPT2 主干,S3Gen 换成了单步 meanflow 解码器——这也正是下一节低延迟的来源。
第 3 步:低延迟场景用 Turbo,设备受限用 Nano
如果你的场景是语音代理这种"每句话都要快"的应用,Turbo 是官方的主推选择。相比之前的模型,它把语音 token 到梅尔频谱的解码从 10 步压缩到 1 步,显存和算力占用都更低,而且支持副语言标签——直接在文本里写[chuckle]、[laugh]、[cough],合成结果就会带出对应的笑声、咳嗽声,这是做拟人化对话很省事的一个功能。
from chatterbox.tts_turbo import ChatterboxTurboTTS # Nano 只是多传一个 nano=True,其余完全一样;device="cpu" 也能跑 model = ChatterboxTurboTTS.from_pretrained(device="cuda", nano=True) text = "Hi there, Sarah here from MochaFone calling you back [chuckle], have you got one minute?" wav = model.generate(text, audio_prompt_path="your_ref_clip.wav")用 Turbo/Nano 有两个和前面模型不同的地方,第一次用很容易踩:
- 参考音频必须超过 5 秒,代码里有硬性断言(
prepare_conditionals里会检查时长),给一段 10 秒左右的干净人声最稳妥 - 传
cfg_weight、exaggeration、min_p会触发警告并被忽略——这些旋钮只对原版 Chatterbox 和 Multilingual 生效
顺路看看语音转换:不写文本,只换声音
除了"文字变声音",Chatterbox 还内置了 Voice Conversion:把一段现成录音的音色换成目标说话人,内容、语调原样保留。入口在 src/chatterbox/vc.py,用法只有两个参数——源音频和目标声音:
from chatterbox.vc import ChatterboxVC model = ChatterboxVC.from_pretrained(device) wav = model.generate(audio="input.wav", target_voice_path="target_voice.wav")想试完整效果可以看 example_vc.py,它和 TTS 示例共享同一套设备探测写法(cuda → mps → cpu)。
调参避坑:3 个直接改变听感的设置
参数调不好的典型表现是:声音像参考人的语言、语速偏快、或者听着平淡。官方 README 的 "Tips" 一节给了三组针对性建议(适用于原版 Chatterbox 和 Multilingual):
- 默认值先跑起来:
exaggeration=0.5、cfg_weight=0.5对大多数提示词就够用,别一上来就猛调 - 参考音频语言要匹配
language_id:比如你标了language_id="fr"却传了段英文参考音频,输出可能带着英文口音;如果无法避免语言不匹配,把cfg_weight设为0可以缓解口音迁移 - 语速和情感是联动的:参考说话人语速快时,把
cfg_weight降到0.3左右能让节奏更从容;想要戏剧化表达,用低cfg_weight(约 0.3)配高exaggeration(0.7+)——注意高exaggeration本身会让语速变快,低cfg_weight是用来对冲这个加速的
生成的音频怎么验证带水印
一个容易被忽略的细节:Chatterbox 输出的每一段音频都自动嵌入了 PerTh(Perceptual Threshold)神经水印。它不可感知,MP3 压缩、剪辑之后仍能保持接近 100% 的检测准确率。水印是在generate内部由perth.PerthImplicitWatermarker强制打上的(看 src/chatterbox/tts.py 结尾的apply_watermark调用),你无法跳过。
验证也很简单,用下面这段脚本判断一段音频是否有水印,输出1.0代表有、0.0代表没有:
import perth import librosa audio, sr = librosa.load("YOUR_FILE.wav", sr=None) watermark = perth.PerthImplicitWatermarker().get_watermark(audio, sample_rate=sr) print(f"Extracted watermark: {watermark}")想先听效果再动手?内置 Gradio 演示页
不想写代码的话,仓库根目录带了四个开箱即用的 Web 界面:gradio_tts_app.py(原版 + 多语言)、gradio_tts_turbo_app.py(Turbo)、gradio_vc_app.py(语音转换)和 multilingual_app.py(多语言专题)。装好依赖后直接python gradio_tts_app.py即可在浏览器里试参数,界面里暴露的滑块和上面讲的exaggeration、cfg_weight、temperature是一一对应的,可以先在这里摸熟手感再回代码里用。
下一步
Chatterbox 这套方案的核心价值在于:英文低延迟、多语言、端侧三种部署场景各自有现成模型,克隆和转换能力开箱即用,音频还自带可验证的水印。建议你现在就 clone 仓库,先跑通 example_tts_turbo.py 听一次副语言标签的效果,再换一段自己 10 秒左右的参考音频试试声音克隆——这两步跑通,后面对接你自己的应用就不会有陌生感了。
【免费下载链接】chatterboxSoTA open-source TTS项目地址: https://gitcode.com/GitHub_Trending/chatterbox7/chatterbox
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考