首页
/ GPT-SoVITS 实战指南:环境搭建、预训练模型、数据集标注与 Few-shot 微调全流程解析

GPT-SoVITS 实战指南:环境搭建、预训练模型、数据集标注与 Few-shot 微调全流程解析

2026-09-04 20:19:44作者:胡唯隽

本文以 GPT-SoVITS 主 README 为主线,覆盖零样本/少样本语音克隆的能力边界、Windows/Linux/macOS/Docker 四类部署方式、五类预训练依赖模型的落盘位置,以及从数据集 .list 标注格式、ASR 后端选型到 GPT 与 SoVITS 两阶段微调的完整工作流。读完本篇,你可以独立完成 GPT-SoVITS 的环境搭建,并基于约 1 分钟目标说话人音频跑通“切分—降噪—ASR—标注—训练—推理”全流程。

项目定位与核心能力

GPT-SoVITS 的定位是“强力 Few-shot 语音转换与文本转语音 WebUI”,核心卖点是极少数据即可训练出高质量 TTS 模型。README 中声明的四大能力:

  1. Zero-shot TTS:输入 5 秒目标人声音频即可即时语音合成;
  2. Few-shot TTS:仅用约 1 分钟训练数据微调,即可获得更高音色相似度与真实感;
  3. 跨语言合成:推理语言可以与训练集语言不同,当前支持中文(zh)、日语(ja)、英语(en)、韩语(ko)、粤语(yue)五种语言;
  4. 一体化 WebUI 工具链:内置人声/伴奏分离(UVR5)、训练集自动切分、多语种 ASR(Fun-ASR-Nano、SenseVoice、经典 FunASR)与文本标注(SubFix),帮助新手从零构建训练集与 GPT/SoVITS 模型。

关于推理速度,README 给出了官方口径的 RTF(实时率)数据:v2ProPlus 在 4060Ti 上测得 0.028,在 4090 上测得 0.014(约 1400 词、4 分钟语音,推理耗时 3.36 秒),在 M4 CPU 上为 0.526。这些数字代表该版本的官方测试结论,实际体验仍取决于本地硬件。

从源码结构看,整个系统是一个“两阶段”架构:GPT_SoVITS/s1_train.py 训练负责内容语义的 GPT 模块(对应配置 GPT_SoVITS/configs/s1longer.yamls1* 系列),GPT_SoVITS/s2_train.py 训练负责把语义 token 还原为波形的 SoVITS 模块(对应 GPT_SoVITS/configs/s2.jsons2* 系列)。数据准备脚本的命名 1-get-text.py2-get-hubert-wav32k.py2-get-sv.py3-get-semantic.py 也正对应这一流水线:文本前端 → 32k 自监督特征 → 语义 token → 两个模型分别训练。

安装与环境

已测试环境组合

README 给出的经过验证的环境矩阵如下:

Python 版本 PyTorch 版本 设备
Python 3.10 PyTorch 2.5.1 CUDA 12.4
Python 3.11 PyTorch 2.5.1 CUDA 12.4
Python 3.11 PyTorch 2.7.0 CUDA 12.8
Python 3.9 PyTorch 2.8.0dev CUDA 12.8
Python 3.9 PyTorch 2.5.1 Apple silicon
Python 3.11 PyTorch 2.7.0 Apple silicon
Python 3.9 PyTorch 2.2.2 CPU

一键安装(Windows / Linux / macOS)

三种平台的推荐做法一致:先创建 conda 环境,再运行安装脚本:

# Windows
conda create -n GPTSoVits python=3.10
conda activate GPTSoVits
pwsh -F install.ps1 --Device <CU126|CU128|CPU> --Source <HF|HF-Mirror|ModelScope> [--DownloadUVR5]
# Linux
conda create -n GPTSoVits python=3.10
conda activate GPTSoVits
bash install.sh --device <CU126|CU128|ROCM|CPU> --source <HF|HF-Mirror|ModelScope> [--download-uvr5]
# macOS(README 说明:Mac 上 GPU 训练质量明显偏低,故暂时使用 CPU)
conda create -n GPTSoVits python=3.10
conda activate GPTSoVits
bash install.sh --device <MPS|CPU> --source <HF|HF-Mirror|ModelScope> [--download-uvr5]

对照 install.sh 的参数解析逻辑可以补充几点细节:--device--source 为必填项,--download-uvr5 可选;--device 取值支持 CU126/CU128/ROCM/MPS/CPU,其中 MPS 在脚本内部按 CPU 路径处理USE_CPU=true),这与 README 中“macOS 暂用 CPU”的说明相互印证;模型源支持 HFHF-MirrorModelScope 三选一。脚本自带错误回溯(trap ERR 打印失败行号与调用栈),并依赖 conda 已安装(command -v conda 检查)。

手动安装

若不走一键脚本,手动安装的依赖顺序是(见 README 与 requirements.txtextra-req.txt):

conda create -n GPTSoVits python=3.10
conda activate GPTSoVits

pip install -r extra-req.txt --no-deps
pip install -r requirements.txt

另外必须准备 FFmpeg,README 按平台给出方案:

  • Conda 用户conda activate GPTSoVits && conda install ffmpeg
  • Ubuntu/Debiansudo apt install ffmpeg && sudo apt install libsox-dev
  • Windows:将 ffmpeg.exeffprobe.exe 放到 GPT-SoVITS 根目录,并安装 Visual Studio 2017 运行库
  • macOSbrew install ffmpeg

Docker 部署

仓库提供了 Dockerfiledocker-compose.yamldocker_build.sh。README 对镜像使用有若干关键提示:

  • 镜像发布周期慢于代码迭代,选 tag 前请先确认 Docker Hub 上的最新标签;Lite 镜像不含 ASR 模型与 UVR5 模型(UVR5 模型需手动下载,ASR 模型会在需要时自动下载);
  • 架构(amd64/arm64)镜像会在 Compose 阶段自动选择;
  • Compose 会把当前目录全部文件挂载进容器,因此务必先切到项目根目录并拉取最新代码再启动;
  • 也可以本地构建镜像以获得最新代码:
bash docker_build.sh --cuda <12.6|12.8> [--lite]

docker-compose.yaml 定义了 4 个服务:GPT-SoVITS-CU126GPT-SoVITS-CU128(完整版)与对应 -Lite 版(精简依赖与功能),均映射端口 9871–9874 与 9880,配置 is_half=trueshm_size: "16g"。Lite 服务额外把宿主机 tools/asr/modelstools/uvr5/uvr5_weights 挂载到容器内,用以弥补镜像中缺失的模型文件。

常用命令:

# 运行指定服务
docker compose run --service-ports <GPT-SoVITS-CU126-Lite|GPT-SoVITS-CU128-Lite|GPT-SoVITS-CU126|GPT-SoVITS-CU128>

# 进入运行中的容器
docker exec -it <GPT-SoVITS-CU126-Lite|GPT-SoVITS-CU128-Lite|GPT-SoVITS-CU126|GPT-SoVITS-CU128> bash

环境方面注意两点:is_half 环境变量控制是否启用 fp16 半精度,GPU 支持时建议设为 true 以省显存;Windows 的 Docker Desktop 默认共享内存较小,README 建议在 Compose 中调大 shm_size(例如 16g),仓库提供的 Compose 文件正是按 16g 配置的。

预训练模型与依赖文件清单

install.sh 执行成功,README 提示可跳过下面第 1、2、3 项。完整的预训练依赖清单及落盘位置:

  1. GPT-SoVITS 主模型:从 Hugging Face 的 lj1995/GPT-SoVITS 仓库下载,放入 GPT_SoVITS/pretrained_models
  2. G2PW 中文多音字模型(仅中文 TTS 需要):下载 G2PWModel.zip,解压重命名为 G2PWModel,放入 GPT_SoVITS/text
  3. UVR5 人声分离权重:放入 tools/uvr5/uvr5_weights。若使用 bs_roformermel_band_roformer,模型文件与同名配置文件必须成对放置(仅后缀不同),且文件名必须包含 roformer 字样才会被识别为 roformer 类模型;README 建议直接在模型名与配置名中写明类型,如 mel_mand_roformerbs_roformer,否则将依据配置文件内特征比对来判定类型。例如 bs_roformer_ep_368_sdr_12.9628.ckptbs_roformer_ep_368_sdr_12.9628.yaml 是一对;
  4. FunASR 模型:首次使用时自动下载。WebUI 提供 Fun-ASR-Nano(多语种与方言)、SenseVoice(极速转写)、经典 Paraformer/UniASR(中文与粤语)。若需离线使用经典中文模型,需手动下载 ASR 模型、VAD 模型与标点模型三份文件到 tools/asr/models
  5. Faster Whisper(英语/日语 ASR 可选):下载 faster-whisper-large-v3 模型放入 tools/asr/models,Systran 的其它同系模型体积更小、效果相近。

config.py 中维护了各版本底模的具体文件名,可据此核对下载是否完整:

版本 SoVITS 底模(s2G) GPT 底模(s1)
v1 pretrained_models/s2G488k.pth pretrained_models/s1bert25hz-2kh-longer-epoch=68e-step=50232.ckpt
v2 pretrained_models/gsv-v2final-pretrained/s2G2333k.pth pretrained_models/gsv-v2final-pretrained/s1bert25hz-5kh-longer-epoch=12-step=369668.ckpt
v3 pretrained_models/s2Gv3.pth pretrained_models/s1v3.ckpt
v4 pretrained_models/gsv-v4-pretrained/s2Gv4.pth pretrained_models/s1v3.ckpt
v2Pro pretrained_models/v2Pro/s2Gv2Pro.pth pretrained_models/s1v3.ckpt
v2ProPlus pretrained_models/v2Pro/s2Gv2ProPlus.pth pretrained_models/s1v3.ckpt

另外 v3/v4/v2Pro 系列还需要说话人验证模型 pretrained_models/sv/pretrained_eres2netv2w24s4ep4.ckpt(见 webui.py 中硬编码的 sv_path),v3/v4 还涉及 BigVGAN vocoder 目录 models--nvidia--bigvgan_v2_24khz_100band_256x。启动 WebUI 时,webui.py 的 check_pretrained_is_exist() 会自动检查上述底模与 chinese-roberta-wwm-ext-large、chinese-hubert-base 是否存在并打印缺失告警。

数据集格式与标注

.list 标注文件格式

TTS 训练集标注采用四段式 .list 文件:

vocal_path|speaker_name|language|text

语言字段取值:

  • zh:中文
  • ja:日语
  • en:英语
  • ko:韩语
  • yue:粤语

示例:

D:\GPT-SoVITS\xxx\xxx.wav|xxx|en|I like playing Genshin.

这个格式正是 ASR 工具链的直接产物:tools/asr/funasr_asr.py 在合成结果行时拼的就是 音频路径|输出文件夹名|语言|识别文本,与 README 定义的四段式一一对应——即 ASR 输出的 .list 可直接作为数据集标注进入后续切分与训练流程。

WebUI 路径自动填充的六步工作流

README 的“Path Auto-filling”流程为:填音频路径 → 切分音频 → 降噪(可选) → ASR → 校对 ASR 文本 → 切到下一个 Tab 微调模型。对照 webui.py 的进程管理函数,每一步背后对应的实际子进程是:

  1. 切分open_slice):调用 tools/slice_audio.py,参数含阈值、最小时长、最短间隔、hop_size 等,支持按 GPU 卡数多进程切分;
  2. 降噪open_denoise):调用 tools/cmd-denoise.py,精度跟随 is_half(float16/float32);
  3. ASRopen_asr):按所选模型拼接 tools/asr/{funasr_asr.py|fasterwhisper_asr.py} 命令行并等待完成,输出 {输入目录名}.list
  4. 文本校对change_label):调用 tools/subfix_webui.py 打开 SubFix 标注界面。

ASR 后端一览(来自 tools/asr/config.pyasr_dict):

后端 定位 支持语言 模型规格 精度选项
Fun-ASR-Nano 31 语种+方言,推荐 zh/en/ja/ko/yue/auto large float32
SenseVoice 极速 zh/en/ja/ko/yue/auto large float32
达摩 ASR(经典 FunASR) 中文经典 zh/yue large float32
Faster Whisper 多语种 auto/en/ja/ko medium ~ large-v3-turbo float32/float16/int8

命令行方式(无 WebUI)

README 还给出了一组不依赖 WebUI 的命令,适合脚本化批处理:

UVR5 人声分离 WebUI:

python tools/uvr5/webui.py "<infer_device>" <is_half> <webui_port_uvr5>

数据集音频切分:

python audio_slicer.py \
    --input_path "<原始音频文件或目录>" \
    --output_root "<切分片段保存目录>" \
    --threshold <音量阈值> \
    --min_length <每段最小时长> \
    --min_interval <相邻最短间隔> \
    --hop_size <音量曲线计算步长>

注意:从源码看,WebUI 实际调用的切分入口是 tools/slice_audio.pywebui.py 中以位置参数传 threshold/min_length/min_interval/hop_size/max_sil_kept/_max/alpha/分片号),README 中的 audio_slicer.py 为旧命名,实际使用时以仓库内 tools/slice_audio.py 为准。

FunASR 命令行识别(Fun-ASR-Nano 为中文/英/日/韩的默认后端并支持自动语言检测,粤语走经典 FunASR 后端):

python tools/asr/funasr_asr.py -i <输入目录> -o <输出目录> -l zh

funasr_asr.py 的参数定义显示:-i/--input_folder(必填,WAV 所在目录)、-o/--output_folder(必填)、-s/--model_size(默认 large)、-l/--language(可选值 zh/yue/ja/en/ko/auto)、-p/--precisionfloat16/float32,默认 float16,源码注释标注该选项尚未完全接入)。

Faster Whisper 后端同样可用(无进度条,GPU 上可能出现耗时抖动):

python ./tools/asr/fasterwhisper_asr.py -i <输入目录> -o <输出目录> -l <语言> -p <精度>

微调与推理

启动 WebUI

集成包用户双击 go-webui.bat(或 go-webui.ps1);切换到 v1 则用 go-webui-v1.bat/go-webui-v1.ps1。源码用户:

python webui.py <语言(可选)>
# 切换到 v1
python webui.py v1 <语言(可选)>

也可以在 WebUI 内手动切换版本。从源码看,webui.py 顶部将默认版本写死为 v2Pro,语言参数取自 sys.argv[-1] 且须在 i18n 支持的语言列表内,否则回落到 Auto

推理 WebUI 可单独启动:

python GPT_SoVITS/inference_webui.py <语言(可选)>
# 或者启动主 WebUI 后进入 1-GPT-SoVITS-TTS/1C-inference 页签

集成包对应 go-webui-v2.bat/go-webui-v2.ps1。从 webui.py 的 change_tts_inference() 可见,勾选加速推理时子进程会切换为 GPT_SoVITS/inference_webui_fast.py,否则使用 GPT_SoVITS/inference_webui.py;同时通过环境变量把 GPT/SoVITS 权重路径、GPU 编号、is_half 等传递给推理进程。

数据准备的源码级流水线

WebUI 训练页的 1a/1b/1c 三个步骤,在 webui.py 中分别对应:

步骤 名称 实际脚本 产物
1a 文本分词与特征提取 GPT_SoVITS/prepare_datasets/1-get-text.py 2-name2text.txt
1b 语音自监督特征提取 GPT_SoVITS/prepare_datasets/2-get-hubert-wav32k.py 32k 自监督特征
1b(Pro 版附加) 说话人特征提取 GPT_SoVITS/prepare_datasets/2-get-sv.py ERes2Net 说话人向量
1c 语义 Token 提取 GPT_SoVITS/prepare_datasets/3-get-semantic.py 6-name2semantic.tsv

其中 1b 步骤只有在版本名含 “Pro”(v2Pro/v2ProPlus)时才会额外执行 2-get-sv.py 提取说话人向量,见 webui.pyif "Pro" in version 分支。支持多卡并行:1a/1b/1c 均会按所选 GPU 数量(gpu_numbers 形如 0-1)拆分为多进程任务,并逐卡设置 _CUDA_VISIBLE_DEVICES

训练入口与配置注入

1B 步骤内部分两步:先训 GPT(1Bb),再训 SoVITS(1Ba)。open1Bb() 根据版本选择 GPT 配置——v1 用 GPT_SoVITS/configs/s1longer.yaml,其余版本用 GPT_SoVITS/configs/s1longer-v2.yaml——写入临时配置后调用 GPT_SoVITS/s1_train.py --config_fileopen1Ba() 的 SoVITS 配置选择逻辑为:v2Pro/v2ProPlus 用 GPT_SoVITS/configs/s2v2Pro.json/s2v2ProPlus.json,其余版本用 GPT_SoVITS/configs/s2.json;训练脚本按版本分流——v1/v2/v2Pro/v2ProPlus 走 GPT_SoVITS/s2_train.py,v3/v4 走带 LoRA 的 GPT_SoVITS/s2_train_v3_lora.py

WebUI 会把界面上的训练参数逐项写回配置字典(batch_sizeepochstext_low_lr_ratesave_every_epochlora_rank 等),并注意一个细节:is_half == False 时,fp16 被关闭且 batch_size 自动减半webui.py)。

训练默认值由 set_default() 按显存与版本自动推导:

  • batch_size:v3/v4 为 最小显存(GB)//8,其它版本为 //2(下限 1);
  • SoVITS 训练:v1/v2 默认 8 epoch(上限 25),v3/v4 默认 2 epoch(上限 16)。

GPT_SoVITS/configs/s2v2Pro.json 为例,关键参数包括:learning_rate: 0.0001batch_size: 32fp16_run: truesegment_size: 20480text_low_lr_rate: 0.4(文本嵌入层使用更低的相对学习率)、grad_ckpt(梯度检查点开关),数据侧 sampling_rate: 32000hop_length: 640n_speakers: 300,模型侧 semantic_frame_rate: "25hz"(25Hz 语义帧率)、content_module: "cnhubert"(以 CNHuBERT 作为内容编码模块)、freeze_quantizer: true。这些配置项解释了 WebUI 界面上各训练滑块的实际作用对象。

训练产物与推理

训练权重按版本落盘到独立目录(见 config.py):SoVITS_weightsSoVITS_weights_v2SoVITS_weights_v2ProPlus 存放 .pthGPT_weightsGPT_weights_v2GPT_weights_v2ProPlus 存放 .ckpt。训练完成后 get_weights_names() 会自动扫描这些目录刷新 WebUI 下拉框,推理页即可加载对应权重。底模路径(如“不训练直接推 v2Pro 底模”)也在 config.py 中集中定义。

版本演进:v2 / v3 / v4 / v2Pro 有何不同

README 的 Release Notes 各版本要点:

V2(2k 小时 → 5k 小时预训练):

  1. 支持韩语与粤语;
  2. 优化的文本前端;
  3. 预训练数据从 2k 小时扩充到 5k 小时;
  4. 低质量参考音频下的合成质量改善。

V3

  1. 音色相似度更高,直接不微调使用底模时相似度已显著提升,逼近目标说话人所需训练数据更少;
  2. GPT 模型更稳定,重复、漏读更少,更容易合成情感更丰富的语音。

V4

  1. 修复 v3 因非整数倍上采样导致的金属感伪影,原生输出 48k 音频(v3 仅原生 24k,48k 下 v3 会发闷)。作者视 v4 为 v3 的直接替代;
  2. 音频超分模型可从 tools/AP_BWE_main/24kto48k 获取(README 指向该目录下的下载说明)。

V2Pro

  1. 显存占用略高于 v2,性能超过 v4,但保留 v2 级别的硬件成本与速度;
  2. 特性上 v1/v2 与 v2Pro 系列相近,v3/v4 相近。对平均音质的训练集,v1/v2/v2Pro 都能给出可用结果而 v3/v4 不能;v3/v4 的语调与节奏更偏向参考音频而非整个训练集。

各版本从旧环境升级的路径统一为三步:pip install -r requirements.txt 更新依赖 → 拉取最新代码 → 下载对应版本预训练文件放入 GPT_SoVITS/pretrained_models(v2 放入 gsv-v2final-pretrained 子目录,v3 含 s1v3.ckpts2Gv3.pth 与 bigvgan 目录,v4 为 gsv-v4-pretrained/s2v4.pthvocoder.pth,v2Pro 系列含 s2Dv2Pro.pths2Gv2Pro.pths2Dv2ProPlus.pths2Gv2ProPlus.pth 及 sv 模型)。

运行时的端口与进程模型

config.pywebui.py 的子进程管理看,主 WebUI 以“父进程 + 多个受管子进程”模式运行,各服务端口固定:

服务 端口
主 WebUI(训练/数据准备) 9874
UVR5 人声分离 9873
TTS 推理 WebUI 9872
SubFix 文本标注 9871
API 服务 9880

每个子任务(切分、降噪、ASR、GPT 训练、SoVITS 训练等)都有成对的 open/close 生成器函数,负责启动 Popen 子进程、等待完成、失败时打印进程信息并可通过 kill 进程树终止。Docker Compose 映射的 9871–9874、9880 五个端口正与此一致。

适用前提小结

  • GPU 与精度config.py 会按 CUDA 计算能力自动决定推理精度——SM > 6.1 的卡使用 fp16,SM 6.1(及 16 系笔记本卡)强制 fp32,显存不足 4GB 或无可用 GPU 则回落 CPU;
  • macOS:README 明确 GPU 训练质量偏低,安装脚本的 MPS 选项实际按 CPU 处理;
  • 中文 TTS 需额外放置 G2PW 模型,离线 ASR 需手动预置 tools/asr/models
  • 版本选择上,若追求当前默认体验,WebUI 默认版本即为 v2Pro(webui.py);README 中“更多细节”条目指向项目 wiki 的 v2/v3v4/v2Pro 特性说明,本仓库内可查看 docs/en/Changelog_EN.md 等分语言更新日志获取版本演进记录;
  • 远程训练/推理场景,仓库自带 Colab-WebUI.ipynbColab-Inference.ipynb 两个 Colab 脚本(对应 README Todo List 中已完成项)。

综合来看,GPT-SoVITS 把“数据集构建 → 特征提取 → 两阶段微调 → 多版本推理”完整封装在一套端口清晰、职责分明的 WebUI 与脚本体系里:数据侧靠 .list 四段式格式串联 ASR 与标注工具链,模型侧靠 s1*/s2* 配置族与六个版本的预训练权重矩阵支撑版本升级,是少样本语音克隆方向上工程完成度较高的开源方案之一。

登录后查看全文
热门项目推荐
相关项目推荐