GPT-SoVITS 实战指南:环境搭建、预训练模型、数据集标注与 Few-shot 微调全流程解析
本文以 GPT-SoVITS 主 README 为主线,覆盖零样本/少样本语音克隆的能力边界、Windows/Linux/macOS/Docker 四类部署方式、五类预训练依赖模型的落盘位置,以及从数据集 .list 标注格式、ASR 后端选型到 GPT 与 SoVITS 两阶段微调的完整工作流。读完本篇,你可以独立完成 GPT-SoVITS 的环境搭建,并基于约 1 分钟目标说话人音频跑通“切分—降噪—ASR—标注—训练—推理”全流程。
项目定位与核心能力
GPT-SoVITS 的定位是“强力 Few-shot 语音转换与文本转语音 WebUI”,核心卖点是极少数据即可训练出高质量 TTS 模型。README 中声明的四大能力:
- Zero-shot TTS:输入 5 秒目标人声音频即可即时语音合成;
- Few-shot TTS:仅用约 1 分钟训练数据微调,即可获得更高音色相似度与真实感;
- 跨语言合成:推理语言可以与训练集语言不同,当前支持中文(zh)、日语(ja)、英语(en)、韩语(ko)、粤语(yue)五种语言;
- 一体化 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.yaml 等 s1* 系列),GPT_SoVITS/s2_train.py 训练负责把语义 token 还原为波形的 SoVITS 模块(对应 GPT_SoVITS/configs/s2.json 等 s2* 系列)。数据准备脚本的命名 1-get-text.py、2-get-hubert-wav32k.py、2-get-sv.py、3-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”的说明相互印证;模型源支持 HF、HF-Mirror、ModelScope 三选一。脚本自带错误回溯(trap ERR 打印失败行号与调用栈),并依赖 conda 已安装(command -v conda 检查)。
手动安装
若不走一键脚本,手动安装的依赖顺序是(见 README 与 requirements.txt、extra-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/Debian:
sudo apt install ffmpeg && sudo apt install libsox-dev - Windows:将
ffmpeg.exe与ffprobe.exe放到 GPT-SoVITS 根目录,并安装 Visual Studio 2017 运行库 - macOS:
brew install ffmpeg
Docker 部署
仓库提供了 Dockerfile、docker-compose.yaml 与 docker_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-CU126、GPT-SoVITS-CU128(完整版)与对应 -Lite 版(精简依赖与功能),均映射端口 9871–9874 与 9880,配置 is_half=true 与 shm_size: "16g"。Lite 服务额外把宿主机 tools/asr/models 与 tools/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 项。完整的预训练依赖清单及落盘位置:
- GPT-SoVITS 主模型:从 Hugging Face 的
lj1995/GPT-SoVITS仓库下载,放入GPT_SoVITS/pretrained_models; - G2PW 中文多音字模型(仅中文 TTS 需要):下载
G2PWModel.zip,解压重命名为G2PWModel,放入GPT_SoVITS/text; - UVR5 人声分离权重:放入
tools/uvr5/uvr5_weights。若使用bs_roformer或mel_band_roformer,模型文件与同名配置文件必须成对放置(仅后缀不同),且文件名必须包含roformer字样才会被识别为 roformer 类模型;README 建议直接在模型名与配置名中写明类型,如mel_mand_roformer、bs_roformer,否则将依据配置文件内特征比对来判定类型。例如bs_roformer_ep_368_sdr_12.9628.ckpt与bs_roformer_ep_368_sdr_12.9628.yaml是一对; - FunASR 模型:首次使用时自动下载。WebUI 提供 Fun-ASR-Nano(多语种与方言)、SenseVoice(极速转写)、经典 Paraformer/UniASR(中文与粤语)。若需离线使用经典中文模型,需手动下载 ASR 模型、VAD 模型与标点模型三份文件到
tools/asr/models; - 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 的进程管理函数,每一步背后对应的实际子进程是:
- 切分(open_slice):调用
tools/slice_audio.py,参数含阈值、最小时长、最短间隔、hop_size 等,支持按 GPU 卡数多进程切分; - 降噪(open_denoise):调用 tools/cmd-denoise.py,精度跟随
is_half(float16/float32); - ASR(open_asr):按所选模型拼接
tools/asr/{funasr_asr.py|fasterwhisper_asr.py}命令行并等待完成,输出{输入目录名}.list; - 文本校对(change_label):调用 tools/subfix_webui.py 打开 SubFix 标注界面。
ASR 后端一览(来自 tools/asr/config.py 的 asr_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.py(webui.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/--precision(float16/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.py 的 if "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_file。open1Ba() 的 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_size、epochs、text_low_lr_rate、save_every_epoch、lora_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.0001、batch_size: 32、fp16_run: true、segment_size: 20480、text_low_lr_rate: 0.4(文本嵌入层使用更低的相对学习率)、grad_ckpt(梯度检查点开关),数据侧 sampling_rate: 32000、hop_length: 640、n_speakers: 300,模型侧 semantic_frame_rate: "25hz"(25Hz 语义帧率)、content_module: "cnhubert"(以 CNHuBERT 作为内容编码模块)、freeze_quantizer: true。这些配置项解释了 WebUI 界面上各训练滑块的实际作用对象。
训练产物与推理
训练权重按版本落盘到独立目录(见 config.py):SoVITS_weights、SoVITS_weights_v2 … SoVITS_weights_v2ProPlus 存放 .pth,GPT_weights、GPT_weights_v2 … GPT_weights_v2ProPlus 存放 .ckpt。训练完成后 get_weights_names() 会自动扫描这些目录刷新 WebUI 下拉框,推理页即可加载对应权重。底模路径(如“不训练直接推 v2Pro 底模”)也在 config.py 中集中定义。
版本演进:v2 / v3 / v4 / v2Pro 有何不同
README 的 Release Notes 各版本要点:
V2(2k 小时 → 5k 小时预训练):
- 支持韩语与粤语;
- 优化的文本前端;
- 预训练数据从 2k 小时扩充到 5k 小时;
- 低质量参考音频下的合成质量改善。
V3:
- 音色相似度更高,直接不微调使用底模时相似度已显著提升,逼近目标说话人所需训练数据更少;
- GPT 模型更稳定,重复、漏读更少,更容易合成情感更丰富的语音。
V4:
- 修复 v3 因非整数倍上采样导致的金属感伪影,原生输出 48k 音频(v3 仅原生 24k,48k 下 v3 会发闷)。作者视 v4 为 v3 的直接替代;
- 音频超分模型可从
tools/AP_BWE_main/24kto48k获取(README 指向该目录下的下载说明)。
V2Pro:
- 显存占用略高于 v2,性能超过 v4,但保留 v2 级别的硬件成本与速度;
- 特性上 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.ckpt、s2Gv3.pth 与 bigvgan 目录,v4 为 gsv-v4-pretrained/s2v4.pth 与 vocoder.pth,v2Pro 系列含 s2Dv2Pro.pth、s2Gv2Pro.pth、s2Dv2ProPlus.pth、s2Gv2ProPlus.pth 及 sv 模型)。
运行时的端口与进程模型
从 config.py 与 webui.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.ipynb 与 Colab-Inference.ipynb 两个 Colab 脚本(对应 README Todo List 中已完成项)。
综合来看,GPT-SoVITS 把“数据集构建 → 特征提取 → 两阶段微调 → 多版本推理”完整封装在一套端口清晰、职责分明的 WebUI 与脚本体系里:数据侧靠 .list 四段式格式串联 ASR 与标注工具链,模型侧靠 s1*/s2* 配置族与六个版本的预训练权重矩阵支撑版本升级,是少样本语音克隆方向上工程完成度较高的开源方案之一。
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0623
Hy4-previewHy4 preview 是由腾讯混元团队研发的新一代混合专家(MoE)旗舰模型。模型总参数量 770B,每个 token 激活 49B,主干共包含78层,第一层采用标准 FFN,其余 77 层均为 MoE 结构,每层包含 256 个路由专家与 1 个共享专家,每个 token 激活 top-8 路由专家及共享专家。主干之外原生内置 1 层 MTP(总参数量 10B,激活 0.7B)以支持投机解码。Python00
GLM-5.3GLM-5.3 与 GLM-5.2 使用相同的基座模型——所有提升均来自后训练。与 GLM-5.2 相比,它在复杂编程和长程任务上的表现显著提升。Jinja00
GLM-5.3-FlashGLM-5.3-Flash (320B-A18B),是GLM-5系列的首个原生多模态模型。320B总参数,能力超过GLM-5.2Jinja00
Spark-X2.5-4BSpark-X2.5-4B 旨在让强大的 AI 更实用、更高效、更易获得。在广泛日常任务中表现强劲,涵盖对话、写作、翻译、推理、编码、工具调用以及智能体工作流,并在同等规模的开源模型中取得领先成绩。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00
Spark-X2.5-1.7BSpark-X2.5-1.7B 旨在让强大的 AI 更加实用、高效且易于获取。这些模型在广泛的日常任务中表现出色,涵盖对话、写作、翻译、推理、编程、工具调用和智能体工作流,并在同等规模的开源模型中取得领先结果。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00