VITS 的全称是 Variational Inference with adversarial learning for end-to-end Text-to-Speech,论文 arXiv:2106.06103,作者 Jaehyeon Kim、Jungil Kong、Juhee Son,出自 Kakao Enterprise。它把变分自编码器、标准化流和 GAN 判别器塞进同一个网络:训练时后验编码器从线性谱里抽 latent,推理时直接从文本先验采样、经 flow 变换后交给 HiFi-GAN 风格的解码器出波形——中间没有梅尔谱这一步,也没有单独训练的声码器。原仓库 jaywalnut310/vits 是 MIT 协议,7.9k star。
尺寸小到不像一个还在被广泛部署的模型。Hugging Face 上官方的 kakao-enterprise/vits-ljs 标注 36.3M 参数,fp32 权重是 36.3M × 4 字节 ≈ 145MB。配置一眼看得完:inter_channels 和 hidden_channels 都是 192、filter_channels 768、6 层文本编码器、2 个注意力头,HiFi-GAN 解码器的 upsample_rates 是 [8, 8, 2, 2]、初始通道 512。论文在 V100 上测到 1480.15 kHz 的合成吞吐,约 67.12 倍实时,DDP 版本是 2005.03 kHz、90.93 倍实时。所以推理这件事上,VITS 的瓶颈从来不是显存,唯一要适应的是它的非确定性——随机时长预测器加 normalizing flow 让同一句文本每次采样出来的韵律都不一样,这是论文刻意设计的 one-to-many 能力,不是 bug。
真正吃卡的是训练。ljs_base.json 里 batch_size 写死 64、fp16_run 是 true,论文原文写的是 mixed precision training on 4 NVIDIA V100 GPUs、batch size 64 per GPU、训练到 800k 步。Coqui 官方的 LJSpeech recipe 保守一些,batch_size 32 配 mixed_precision。另外要提醒一句:这条技术线在 2023 年之后分叉得很厉害——Bert-VITS2 停在 v2.3、VITS-fast-fine-tuning 已于 2025 年 11 月 21 日归档、so-vits-svc 更早在 2023 年 11 月归档,而 MeloTTS 和 GPT-SoVITS 还在活跃迭代。开卡之前先想清楚你要跑的是哪一支。
01 —
VITS 家族里到底有哪些能跑的东西
同一套架构分出去的六条线,授权、采样率和维护状态各不相同
| 版本 | 参数量 | 显存 | 上下文 | 说明 |
|---|---|---|---|---|
| VITS 原版 · ljs_base(jaywalnut310/vits,MIT) | 36.3M | 推理 fp32 权重 ~145MB;训练按论文 4×V100 32GB、每卡 batch 64、fp16 | 22.05kHz 单说话人 | LJ Speech 13,100 条、约 24 小时单人语料。text_cleaners 是 english_cleaners2,走 espeak 的英文 IPA,vocab_size 只有 38——纯英文起点。 |
| VITS 多说话人 · vctk_base(train_ms.py) | 36.3M + speaker embedding | 与单说话人同量级;显存由 batch_size 和 segment_size 8192 决定 | 22.05kHz / 109 说话人 | VCTK 约 44,000 条、44 小时、109 位英语母语者,需先下采样到 22kHz。想做多音色就从这个 config 起步,而不是训 109 个单说话人模型。 |
| MMS-TTS(facebook/mms-tts-*,CC-BY-NC 4.0) | 36.3M / 每个语种独立 checkpoint | 任意 16GB 卡富余;权重 ~145MB | 16kHz | Meta 用 VITS 架构给 1,107 个语种各训了一份,transformers 里 VitsModel.from_pretrained 直接可用。协议是 CC-BY-NC 4.0,禁止商用;非拉丁文字要先过 uroman 罗马化,而且训练语料是小写无标点的。 |
| VITS2(arXiv:2307.16430 / p0p4k/vits2_pytorch,MIT) | 与 VITS 同量级,改动在架构 | 参考 VITS;flow 里换成 transformer block 后略增 | 22.05kHz | Kong 等人的续作:时长预测器加 LSTM 判别器做对抗训练、normalizing flow 里塞 transformer block、说话人 embedding 下沉进文本编码器、MAS 加噪。社区实现放出过 64k 步的 LJSpeech checkpoint 和 ONNX 导出。 |
| Bert-VITS2 v2.3 / Extra-v2 / JP-Extra(fishaudio,AGPL-3.0) | VITS2 主干 + 多语 BERT 前端 | 明显高于原版——多挂一个 BERT 编码器,建议 24GB 起步、48GB 以上更稳 | 高采样率分支 | v2.3 是 2023 年 12 月 19 日的收官版本,加了 BF16 训练、去掉 CLAP;之后只有 Extra-v2(中文 G2P 特化)和 JP-Extra(日文,约 800 小时单语数据)。作者已明确表示短期内不再维护,转去做 Fish-Speech。 |
| MeloTTS / GPT-SoVITS(VITS 血统的现役分支,均为 MIT) | MeloTTS 承自 VITS/VITS2/Bert-VITS2;GPT-SoVITS 是 GPT + SoVITS 混合 | MeloTTS 号称 CPU 即可实时;GPT-SoVITS 推理 RTF 0.028(RTX 4060 Ti)、0.014(RTX 4090) | GPT-SoVITS v4 原生 48kHz | 要中英混读选 MeloTTS(MIT 与 MyShell 出品,中文 speaker 支持中英混合);要音色克隆选 GPT-SoVITS,5 秒零样本、1 分钟少样本,v2Pro / v3 / v4 并存,支持中英日韩粤。 |
02 —
该租哪张卡
按你实际要做的事选,别为 145MB 的权重去买 80GB
跑通推理、起一个 TTS 服务或做批量合成
RTX 3090 24GB$0.193/卡·时
145MB 的权重连 24GB 的零头都填不满,显存完全不是瓶颈,真正决定体验的是解码器带宽和每小时单价——3090 在这两项上是最划算的组合。
单卡微调 VITS(Coqui LJSpeech recipe:batch_size 32 + mixed_precision)
RTX 4090 24GB$0.540/卡·时
batch 32 的 fp16 训练吞吐直接决定你要等几天,4090 的半精度算力能把 LJSpeech 规模的微调压进一两个通宵。
照论文原样复现:4 卡、每卡 batch 64、fp16、训到 800k 步
Tesla V100 32GB ×4$0.188/卡·时(4 卡合计 $0.752/时)
论文用的就是 4×V100 32GB,每卡 batch 64 是被作者验证过装得下的配置;同一款卡在我们目录里恰好是最低单价。
Bert-VITS2 这类带 BERT 前端的分支、多说话人大 batch、高采样率训练
A100 PCIE 80GB$0.824/卡·时
额外挂一个 BERT 编码器加上更长的 segment,24GB 会直接 OOM;80GB 让你不必为了塞进显存而反复砍 batch 重跑。
03 —
从开机到出声
包含 VITS 自部署最经典的两个翻车点
- 01
开一台带 CUDA 的实例,先确认卡认得出来
在 console.nexgpu.net 选一台 RTX 3090 或 RTX 4090,直接用 2,000+ 预置镜像里的 PyTorch 镜像开机,SSH、Jupyter 或 Web 终端进去先验一遍环境。计费按秒走,验完不合适随时停,没有最低消费也不用提工单申请配额。
nvidia-smi && python -c "import torch; print(torch.__version__, torch.cuda.get_device_name(0))" - 02
最快路径:用 transformers 的 VitsModel 三行出声
不想碰原仓库就直接拉 Hugging Face 上的官方 checkpoint。注意两件事:VITS 的 flow 和随机时长预测器是非确定性的,不 set_seed 每次结果都不一样;如果你换成 MMS-TTS 的非拉丁语种 checkpoint,还要先用 uroman 把文本罗马化。
pip install -U transformers torch scipy accelerate python - <<'PY' from transformers import VitsModel, AutoTokenizer, set_seed import scipy.io.wavfile as wav m = VitsModel.from_pretrained("kakao-enterprise/vits-ljs").cuda() tk = AutoTokenizer.from_pretrained("kakao-enterprise/vits-ljs") set_seed(555) out = m(**tk("hello world", return_tensors="pt").to("cuda")) wav.write("out.wav", m.config.sampling_rate, out.waveform[0].detach().cpu().numpy()) PY - 03
要训练就得走原仓库:装 espeak,再手动编译 monotonic_align
这是两个绕不过去的坑。文本前端依赖系统级的 espeak,pip 装不上;单调对齐搜索(MAS)是 Cython 写的,克隆完仓库必须自己 build 一次,否则 train.py 一启动就 ImportError。这两步在一台干净的 PyTorch 镜像上两分钟就能做完,在本机折腾往往要一晚上。
sudo apt-get install -y espeak && pip install -r requirements.txt && cd monotonic_align && mkdir -p monotonic_align && python setup.py build_ext --inplace - 04
开训,并用 TensorBoard 盯住对齐图
单说话人跑 train.py,多说话人跑 train_ms.py。ljs_base.json 默认 batch_size 64、fp16_run true、segment_size 8192、learning_rate 2e-4、epochs 20000,日志 200 步一打、eval 1000 步一次。显存不够优先砍 batch_size,不要先动 segment_size——它同时决定了判别器看到的波形长度。前几万步别急着听效果,先看 attention 图有没有出现清晰的对角线,没有对角线就是白烧钱。
python train.py -c configs/ljs_base.json -m ljs_base # 多说话人:python train_ms.py -c configs/vctk_base.json -m vctk_base
算一笔真账
推理压测:RTX 3090 24GB 是 $0.193/卡·时,开两小时把一批句子合完,0.193 × 2 = $0.386。单卡微调:RTX 4090 24GB $0.540/卡·时,按 Coqui 的 batch_size 32 recipe 连跑 20 小时,0.540 × 20 = $10.80;再挂 50GB 存储放语料和 checkpoint,存储中位价 $0.414/GB·月 折成一天是 0.414 × 50 ÷ 30 ≈ $0.69,合计约 $11.49。想照论文原样开 4 张 Tesla V100 32GB:0.188 × 4 = $0.752/时,连跑 72 小时是 0.752 × 72 = $54.14——同样的四卡配置,作者当年跑的是 800k 步。合成好的 wav 拉回本地按出网中位价 $0.0081/GB 计,1GB 音频约 $0.01。全程按秒计费、按小时报价,没有最低消费、没有开通费;实例一停算力就不再计费,存储费用则持续到你把它销毁为止。
04 —
