Coqui TTS 是 XTTS 声音克隆的官方参考实现,功能很全——如果你要训练模型的话。但如果你只想做推理:克隆一个声音、合成一段文字、拿到一个 WAV 文件,你却要连带装下一整套训练框架里用不到的东西:trainer、coqpit、gruut、jamo、g2pkk、bnnumerizer、umap-learn、matplotlib。十几个包的存在只是为了支撑训练流程和多语言 G2P 管线,而大多数推理场景根本用不上。
TTS-Clone-Inference 就是把这些都去掉之后剩下的东西:只留 XTTS 模型本身。
一个模型,一个文件
在上游 Coqui TTS 中,XTTS 模型被拆分在包里的六七个文件中:TTS/tts/layers/xtts/gpt.py、hifigan_decoder.py、tokenizer.py、stream_generator.py、xtts_manager.py,还有一个 BaseTTS 基类,以及整个框架各类模型共用的 Coqpit 配置系统。
这个 fork 把这一切——GPT-2 自回归核心、HiFi-GAN 声码器、ResNet 说话人编码器、BPE 分词器、Perceiver 重采样模块、配置类——全部合并进两个文件:xtts.py 和 utils.py。不依赖 Coqpit,不依赖 trainer,也完全不依赖更大的 TTS 包本身。模型完全自包含,可以直接搬走用。
一个只干一件事的 CLI
Coqui 的 Synthesizer 类是个通用调度器——它要处理 Tacotron、VITS、Bark、XTTS、声码器链路、说话人管理、语言管理、ONNX 导出,因为它要服务整个框架支持的所有模型。
这个 fork 里的 Synthesizer 只做一件事:跑 XTTS。CLI 也因此变得直接:
python tts_clone_inference/main.py --text "你好世界" --speaker speaker.wav --language zh --output out.wav
没有繁杂的配置,没有模型类型参数——只有文本、参考音色、输出路径。
Coqui 没有的功能:时长匹配
配音和旁白工作经常需要生成的语音落在一个固定时长窗口内——匹配视频片段长度、幻灯片计时、对白时长。Coqui TTS 本身没有内置的方式做这件事。
这个 fork 直接把它加进了 CLI:
python tts_clone_inference/main.py --text "..." --speaker speaker.wav --duration 15.0 --output out.wav
设定目标秒数,工具会先合成、量出实际时长,再用 librosa.effects.time_stretch 按精确比例拉伸——如果你已经知道想要的速度倍率,也可以直接传 --ratio。这只是个不大的功能,但它是”生成了音频”和”生成了刚好合适的音频”之间的差别。
为什么这有意义
这些改动都不会改变 XTTS 听起来的样子——模型权重和架构完全没动。改变的是运行它的成本:
- 依赖更少。 不需要
gruut,不需要用不到的语言处理工具链,不需要只为训练服务的包。用uv管理,配完整锁文件,安装可复现。 - 一口气就能读完。 两个文件,而不是散落各处的包——你可以真正读懂整条推理路径。
- 为实际用途而生。 一个用来克隆和合成的 CLI,而不是一整套训练实验用的框架界面。
如果你的需求是”给一个参考音色,拿到音频”——而不是”训练新的 TTS 模型”——去掉框架的冗余之后,这就是它该有的样子。