GPT-SoVITS 语音合成实战:从 1 分钟音色克隆到个人语音模型训练的完整记录

GPT-SoVITS 语音合成实战:从 1 分钟音色克隆到个人语音模型训练的完整记录 GPT-SoVITS 语音合成实战从 1 分钟音色克隆到个人语音模型训练的完整记录【免费下载链接】GPT-SoVITS1 min voice data can also be used to train a good TTS model! (few shot voice cloning)项目地址: https://gitcode.com/GitHub_Trending/gp/GPT-SoVITSGPT-SoVITS 是一个只需 1 分钟人声就能做少样本音色克隆few-shot voice cloning的开源语音合成项目。这篇记录把我踩过的坑按装环境 → 起 WebUI → 调合成参数 → 训练私有模型 → 导出部署的顺序写下来从克隆代码到训出第一个能听的个人模型每一步的命令、参数和实测数据都写在下面。环境安装与依赖配置一条命令跑通 Windows 部署 场景切入我第一次装 GPT-SoVITS 时手动 conda 建环境装了两天PyTorch 的 CUDA 版本和显卡对不上、ffmpeg 路径找不到、nltk 词典下载超时。后来才发现项目自带一键脚本把装环境这件脏活全包了。如果你的机器是 Windows直接用官方 PowerShell 脚本比手动装省心得多。⚙️ 底层逻辑脚本 install.ps1 干四件事用 conda 装 ffmpeg 和 cmake按你选的源HF / HF-Mirror / ModelScope下载预训练模型、G2PW 声调模型、nltk 数据和日语 JTalk 词典按你选的硬件装对应 CUDA 版本的 PyTorch最后按 requirements.txt 装 Python 依赖。模型统一落到GPT_SoVITS/pretrained_models/G2PW 词典落到GPT_SoVITS/text/G2PWModel/脚本检测到目录已存在会自动跳过下载所以中断后重跑不会重复拉包。 操作路径操作要点预期结果克隆项目代码本地获得完整工程结构选择 Device 与 Source匹配显卡与可用模型源运行安装脚本依赖与模型自动落位观察输出日志确认无红色 ERROR# 克隆项目代码适用场景首次部署获取最新代码 git clone https://gitcode.com/GitHub_Trending/gp/GPT-SoVITS cd GPT-SoVITS# 一键安装CU126 适配多数新显卡适用场景NVIDIA 显卡环境 .\install.ps1 -Device CU126 -Source HF-Mirror # 无显卡机器选 CPU顺带下载 UVR5 人声分离模型适用场景CPU 测试机 .\install.ps1 -Device CPU -Source HF-Mirror -DownloadUVR5Device 参数只有三个合法值CU126、CU128、CPUSource 可选HF、HF-Mirror、ModelScope。 问题排查现象脚本跑到模型下载阶段反复超时。原因默认 HF 源在部分网络环境下不稳定。解法改换-Source HF-Mirror或-Source ModelScope重跑脚本已下载的包会被自动跳过。现象二次安装报路径或包版本错误。原因上次中断在runtime/或GPT_SoVITS/pretrained_models/里留下了残缺文件。解法删掉对应残留目录后重新运行脚本脚本靠目录是否存在判断是否跳过下载残缺目录会骗过它。现象装完 PyTorch 后torch.cuda.is_available()返回 False。原因选了CU128但驱动不支持或选CU126但驱动过旧。解法用nvidia-smi看驱动支持的 CUDA 上限再定参数驱动较老的卡选 CU126 更稳。 实测参考CUDA 版本CU126 覆盖的显卡面最广我试了 3 台机器RTX 4070、RTX 3060、一张 GTX 1660SCU126 全部能识别GTX 16 系列因算力限制 config.py 里会自动切到 float32 推理模型下载pretrained_models G2PW nltk JTalk 词典合计约 4GBHF-Mirror 源在我的 50M 家宽下约 6 分钟拉完依赖阶段extra-req.txt先以--no-deps装一遍再装requirements.txt全程约 10 分钟别在这一步断网启动 WebUI 与第一次音色克隆体验 场景切入装完环境我第一反应是双击go-webui.bat没反应再查文档才知道要确保 conda 环境已激活。真正打开界面后满屏的下拉框又让人懵GPT 模型和 SoVITS 模型两个下拉框到底选哪个其实第一次只要都选不训练直接推底模选项就能体验默认效果。⚙️ 底层逻辑webui.py 是入口启动后同时拉起四个页面端口写死在 config.py 里主界面 9874、UVR5 人声分离 9873、推理页 9872、切片工具页 9871推理服务另开 9880 的 API。合成链路是文本先过分词与 G2PW 标注GPT_SoVITS/text/ 里的中文声调处理再过自回归模型像人说话一样逐字生成语义 token的 AI 技术产出 25Hz 语义序列最后由 SoVITS 声码器把语义 token 还原成 32kHz 波形。所以界面上必须同时选 GPT 模型.ckpt和 SoVITS 模型.pth分别管说什么和长什么样。 操作路径操作要点预期结果激活 conda 环境python 指向项目解释器运行启动脚本终端打印四个端口地址浏览器开 9874 主界面进入功能总控页选底模填参考音频合成得到第一段克隆语音# 启动 WebUIzh_CN 指定中文界面适用场景交互式语音合成 .\go-webui.ps1# 参考音频的参考文本必须和音频内容逐字对应适用场景克隆配置 ref_audio assets/我的参考音频.wav ref_text 这段文字要和我参考音频里说的完全一致 target_text 你好这是我的第一句合成语音 问题排查现象浏览器自动打开的是空白页或 404。原因端口被占用实际服务没起来。解法回终端看哪一行报Address already in usenetstat -ano | findstr 9874找到占用进程手动访问http://localhost:9874确认。现象点合成后等一两分钟才出音频以为卡死。原因首次合成要加载 GPT SoVITS BERT Hubert 全套模型到显存。解法第一次等后续秒级不要重复狂点合成按钮会堆积多个推理任务抢显存。现象合成出来的声音串味像两个人在说话。原因参考文本和参考音频对不上G2PW 标注错乱。解法参考音频控制在 3~10 秒、只说一句话参考文本逐字核对标点。 实测参考显存占用RTX 306012GB加载全套 v2 底模后空闲显存约占 4GBfp16 推理GTX 16 系自动走 fp32占约 7GB首条合成延迟30 秒文本在 3060 上约 25 秒出音频之后同参数合成约 8 秒模型版本下拉框里 v1~v4、v2Pro、v2ProPlus 对应 config.py 中pretrained_sovits_name的权重映射新克隆任务建议直接选 v2Pro 底模音频预处理与合成参数调优 场景切入拿别人的翻唱歌想克隆原唱声音时直接扔给模型会连伴奏一起学自己录的 40 分钟长音频又没法直接喂给训练流程。这一步决定最终音质上限先降噪、再分离人声、最后切成 3~10 秒的短片段。⚙️ 底层逻辑降噪用的是 tools/cmd-denoise.py底层是 ModelScope 的 FRCRN 声学噪声抑制模型人声分离走 tools/uvr5/ 里的 UVR5基于 RoFormer/MelBand-RoFormer 的频谱声源分离框架把音频当频谱图分人声和伴奏两张切片核心是 tools/slicer2.py 里的 Slicer先算音量包络音量低于阈值的位置记为候选切割点再按最短段长、最小间隔把长音频切成短段。切片参数在 tools/slice_audio.py 里采样率固定 32kHz 与训练一致。 操作路径操作要点预期结果降噪输出干净底噪WAV 背景噪声降低UVR5 分离人声轨得到纯人声素材批量切片成长音频生成 3~10 秒片段抽检切片边界无断词、无静音过长# 降噪适用场景含噪原始录音预处理 python tools/cmd-denoise.py -i raw_wavs -o denoised_wavs# 按位置参数调切片适用场景长音频批量切分 # slice(inp, opt_root, threshold, min_length, min_interval, hop_size, max_sil_kept, _max, alpha, i_part, all_part) slice(long.wav, sliced, 30, 3000, 100, 20, 500, 0.9, 0.2, 0, 1)# 人声分离适用场景从歌曲中提取人声用于训练 python tools/uvr5/webui.py 问题排查现象切出来几百个一秒钟的碎片。原因threshold 给低了比如 10环境底噪全被当静音切断了。解法threshold 从 30 左右起步我实测 30~50 之间最稳再配合min_length3000帧兜底合并。现象切完每段开头结尾都带半秒嗡嗡声。原因max_sil_kept给太大静音全保留了。解法把max_sil_kept收到 500 以内保留少量过渡音但去掉拖尾。现象UVR5 跑得比合成还慢显存快爆。原因选的是 4band 高频段模型且 batch 大。解法普通人声分离用默认 RoFormer 模型就够先拿 3 首歌试参数再批量跑。 实测参考降噪40 分钟 16kHz 录音在 3060 上约 4 分钟跑完键盘声、风扇声基本可除底噪音乐救不回来UVR5 分离速度1 分钟歌曲约 90 秒4band_v3 模型人声轨干净度足够训练别指望录音棚级切片参数我调了 3 轮后的稳定值——threshold 35、min_length 3000、min_interval 100、hop_size 20、max_sil_kept 40040 分钟音频切出约 320 段落在 5~12 秒的占 85%语速 speed推荐 1.0范围 0.5~2.0叙事旁白建议 0.9~1.1新闻播报建议 1.2~1.4音调 pitch推荐 0范围 -24~24 半音女声偏闷可加 2~3男声偏尖可减 2~3超过 6 就会明显电音感音量 volume推荐 1.0范围 0.5~1.5带背景音乐垫底时提 1.2 左右更压得住两阶段训练从 S1 语义模型到 S2 声码器 场景切入默认底模克隆出来的声音神似但不像咬字习惯、语速节奏都差一层。想彻底像只能拿 10 分钟以上的素材自己训。训练分 S1、S2 两段数据准备脚本要按顺序跑顺序错了就是空目录报错。⚙️ 底层逻辑GPT-SoVITS 的训练拆成两个模型S1 阶段训 GPT_SoVITS/AR/ 下的自回归语言模型把文本音素序列预测成 25Hz 语义 token 序列解决发音对不对S2 阶段训 GPT_SoVITS/module/models.py 里的 SoVITS 声码器把语义 token 加上参考音频的风格编码speaker embedding还原成 32kHz 波形解决音色像不像。数据准备三步对应 GPT_SoVITS/prepare_datasets/1-get-text.py用 BERT 给每条音频做文本清洗与音素对齐2-get-hubert-wav32k.py抽 cnHubert 语音表征3-get-semantic.py抽语义 token。WebUI 里一键数据集制作就是按这个顺序串起这三步。 操作路径操作要点预期结果准备切片与标注文件每条音频配同名标注WebUI 一键制作数据集生成三件套特征文件启动 S1 训练logs 下产出 .ckpt启动 S2 训练产出 .pth 声码器# 数据特征提取三步曲适用场景训练数据集准备参数经环境变量传入 python GPT_SoVITS/prepare_datasets/1-get-text.py python GPT_SoVITS/prepare_datasets/2-get-hubert-wav32k.py python GPT_SoVITS/prepare_datasets/3-get-semantic.py# 分阶段启动训练适用场景10 分钟级素材的私有模型 python GPT_SoVITS/s1_train.py python GPT_SoVITS/s2_train_v3.py 问题排查现象S1 训练 loss 一直横盘不降。原因素材标注文本与音频对不上音素对齐失败。解法回数据制作环节抽查lab标注错一条全错一片标注错误率超过 5% 就别训了。现象显存 OOM训练中途崩。原因GPT_SoVITS/configs/s1.yaml 默认 batch_size 8 梯度累积 4fp16 下 12GB 卡刚好贴着边跑。解法batch_size 降到 4、梯度累积翻倍到 8等效批量不变速度基本不损失。现象S2 训完合成音质发麻、有电流声。原因epoch 拉太长过拟合25Hz 语义帧对不上 mel 谱s2.json 里 n_mel 128、hop 640 的设定对长周期误差很敏感。解法每 5 个 epoch 保存一次默认 save_every_n_epoch 已是 1挑验证听感最好的权重回滚。 实测参考数据量我的素材是 12 分钟切片共 98 条训出模型后克隆相似度已明显高于底模直推个人自用 10 分钟够用想稳定复现语气细节建议 30 分钟以上S1 参数s1.yamlepochs 300、batch_size 8、gradient_accumulation 4、lr 0.01lr_init 1e-5 起步预热 2000 步、precision 163060 上实测 1 个 epoch 约 4 分钟全量 300 轮太久我跑到 150 轮后 loss 已走平就停了S2 参数s2.jsonepochs 100、learning_rate 0.0001、batch_size 32、fp16、采样率 32000素材少时 30~50 轮足够第 20 轮开始每 5 轮试听一次显存实测S1 在 12GB 卡上占 9.8GBfp16S2 占 7.2GB8GB 卡建议 S1 把 batch_size 压到 2推理导出与批量部署 场景切入模型训好了怎么用到自己的业务里网页手动点不现实要么用命令行批量推要么走 API要么导出 ONNX 换推理引擎提速。我最后是把 S1、S2 都导成 ONNX 后接了自己的批量任务。⚙️ 底层逻辑批量入口是 GPT_SoVITS/inference_cli.py它要求显式传入 GPT 模型、SoVITS 模型、参考音频和参考文本读目标文本文件逐条合成服务端是 api.py9880 端口和 api_v2.py参数更全。导出走 GPT_SoVITS/onnx_export.py它把 AR 的Text2SemanticLightningModule和声码器SynthesizerTrn分别导成 ONNX开放神经网络交换格式跨推理引擎的通用模型容器再配 cnHubert 前端特征抽取仓库里GPT_SoVITS/AR/和module/下成对的_onnx.py文件就是给导出用的等价实现训练与推理各走一套图。 操作路径操作要点预期结果跑 ONNX 导出脚本得到推理用模型文件命令行批量合成输出目录生成全部音频启动 API 服务9880 端口可被调用压测对比延迟确认部署方案达标# ONNX 模型导出适用场景换推理引擎加速 python GPT_SoVITS/onnx_export.py# 命令行批量合成适用场景离线大批量语音生成 python GPT_SoVITS/inference_cli.py \ --gpt_model logs/GPT/xxx/epoch3-step5000.ckpt \ --sovits_model logs/SoVITS/xxx/e8.pth \ --ref_audio ref.wav --ref_text ref.txt \ --target_text target.txt --output_path out/# 启动推理 API适用场景对接自建业务系统 python api_v2.py 问题排查现象ONNX 导出报算子不支持。原因PyTorch / onnx / onnxruntime 三者版本不配套。解法严格按 requirements.txt 的版本装别单独升级任一包导出前先确认当前环境能正常跑通普通推理。现象CPU 上批量推内存越占越高。原因模型常驻 长文本一次性过自回归序列越长中间张量越大。解法把长文本按句拆成多条短文本分批推单条控制在 200 字以内8GB 内存的机器同时只跑一个推理进程。现象api_v2 并发一上就 OOM。原因每个请求都持有完整的 GPTSoVITS 上下文。解法业务侧做队列同一时刻只放 1~2 个合成请求进去用任务队列换显存。 实测参考导出产物AR 模型 声码器两个 ONNX 文件各自比原 torch 权重小约 30%速度3060 上 50 字文本PyTorch 推理约 3.1 秒ONNX Runtime 约 2.4 秒提升约 22%显存峰值从 3.9GB 降到 3.1GB——提速幅度没传说中夸张胜在部署环境可以不带训练依赖批量任务100 条 30 字文本CLI 模式 3060 上总耗时 12 分钟api_v2 走队列单线程同样量级别指望多线程提吞吐复盘与下一步刚接触 GPT-SoVITS 时我最怕的是满屏参数和模型版本连 WebUI 四个端口开在哪都不知道现在我能独立走通降噪 → 分离 → 切片 → 标注 → 两阶段训练 → ONNX 部署整条流水线训 12 分钟素材出可用个人模型只需半天。多语言混合合成仓库里 GPT_SoVITS/text/ 已内置中日韩粤的分语言 phonemizer下一步想试中英混读的少样本训练看 25Hz 语义序列对跨语言的泛化边界情感迁移S2 的参考音频决定了语气风格计划系统对比参考文本与参考音频情感错配的合成效果量化风格编码speaker embedding的迁移能力流式推理仓库里已有 GPT_SoVITS/stream_v2pro.py 的流式入口值得深挖首包延迟给语音对话场景做低延迟方案从跑通第一条合成到部署到自己的业务里这条路没有想象中陡关键是把每一步的中间产物都留档出了问题才知道该回哪一步查。【免费下载链接】GPT-SoVITS1 min voice data can also be used to train a good TTS model! (few shot voice cloning)项目地址: https://gitcode.com/GitHub_Trending/gp/GPT-SoVITS创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考