跳到主要内容

语音合成 / TTS

VITS 本地部署:36.3M 参数、145MB 权重,一张卡吃下推理与微调

把声学模型和声码器合并成一张图的端到端 TTS,也是今天 MMS-TTS、VITS2、Bert-VITS2、MeloTTS、GPT-SoVITS 共同的祖宗。选对分支比选对显卡更重要。

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、fp1622.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 卡富余;权重 ~145MB16kHzMeta 用 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.05kHzKong 等人的续作:时长预测器加 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 自部署最经典的两个翻车点

  1. 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))"
  2. 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
  3. 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
  4. 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 —

常见问题

VITS 推理需要多大显存?一张 24GB 的 3090 够不够?

远远够,甚至是浪费。官方 kakao-enterprise/vits-ljs 标注 36.3M 参数,fp32 权重 36.3M × 4 字节 ≈ 145MB,加上 CUDA context 和一句话的激活也就 1GB 出头的量级。真正决定体验的是吞吐——论文在 V100 上测到 67.12 倍实时,DDP 版本 90.93 倍。所以选卡看的是每小时多少钱能换到多少并发,NexGPU 的 RTX 3090 24GB 是 $0.193/卡·时,按秒计费,压完测就停。

训练 VITS 需要几张卡?我一张卡能不能从头训?

论文的原配置是混合精度 + 4 张 NVIDIA V100,每卡 batch size 64,训练到 800k 步,ljs_base.json 里的 batch_size 64 / fp16_run true 就是从这里来的。单卡当然能训,Coqui 官方的 LJSpeech recipe 就是 batch_size 32 + mixed_precision,只是收敛要等更久。NexGPU 上 Tesla V100 32GB 是 $0.188/卡·时,正好可以按论文原样开四卡($0.752/时),单节点最多支持 14 张卡;想缩短墙钟时间就换 RTX 4090 24GB $0.540/卡·时。

VITS、VITS2、Bert-VITS2、so-vits-svc、GPT-SoVITS 到底什么关系?我该用哪个?

VITS(arXiv:2106.06103)是根;VITS2(arXiv:2307.16430)是同一批人的架构改良;Bert-VITS2 在 VITS2 主干上挂多语 BERT,2023 年 12 月 v2.3 之后作者已宣布不再维护;so-vits-svc 做的是歌声转换(SVC)而不是 TTS,名字像但不是一回事,且早在 2023 年 11 月就归档了;VITS-fast-fine-tuning 也已于 2025 年 11 月 21 日归档。今天要落地:中英混读选 MeloTTS(MIT),少样本音色克隆选 GPT-SoVITS(MIT,5 秒零样本、1 分钟少样本)。不论选哪一支,NexGPU 的 2,000+ 预置镜像都有对应的 PyTorch 底座,开机就能 clone 起跑。

VITS 可以商用吗?授权到底怎么算?

看你用的是哪份权重,不是看架构。原仓库 jaywalnut310/vits 以及 Kakao 的 vits-ljs、vits-vctk checkpoint 都是 MIT,可商用;Meta 的 MMS-TTS 那 1,107 个语种 checkpoint 是 CC-BY-NC 4.0,明确禁止商用;Bert-VITS2 是 AGPL-3.0,会传染到你的服务端代码;MeloTTS 和 GPT-SoVITS 是 MIT。授权这件事得你自己拍板,但把训练放在你自己租的实例上、权重只落在你自己的存储里、随时可销毁,这件事 NexGPU 可以替你兜住。

为什么我拿原版仓库跑中文,合出来全是乱码或者干脆没声音?

因为原仓库压根没打算支持中文。ljs_base.json 里的 text_cleaners 是 english_cleaners2,走的是 espeak 英文 IPA 音素化,vocab_size 只有 38,中文丢进去要么被清洗掉要么映射到错误音素。正确做法是换 G2P 前端:用 MMS-TTS 的中文 checkpoint(记得先 uroman 罗马化,且它训练时是小写无标点),或者直接上 MeloTTS(原生中英混读)、Bert-VITS2 Extra-v2(中文 G2P 特化)。这些分支的依赖树都不小,在 NexGPU 上开一台 RTX 3090($0.193/卡·时)试错,比在本机反复重装 CUDA 和 espeak 划算得多。

同一句话每次合出来语速韵律都不一样,是模型坏了吗?

不是,这是 VITS 的核心设计。随机时长预测器加 normalizing flow 让同一段文本可以有多种读法,论文称之为 one-to-many。要复现同一条结果就 set_seed;想调稳定性改 noise_scale(默认 0.667)和 noise_scale_duration(默认 0.8),语速用 speaking_rate(默认 1.0)。这种参数扫描动辄要跑几十上百次采样,正好适合在 NexGPU 上开一台按秒计费的卡,跑完就停,不用为闲置时间买单——有问题直接在 Telegram 上找我们,中英文都行,没有工单排队。

开始使用 NexGPU

无论你是企业研发团队还是独立开发者,都可以在几分钟内跑起第一个任务。

注册即可浏览全网实时价格,无需绑定支付方式。