news 2026/8/30 9:28:58

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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-SoVITS

GPT-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" -DownloadUVR5

Device 参数只有三个合法值:CU126CU128CPU;Source 可选HFHF-MirrorModelScope

🧭 问题排查

现象:脚本跑到模型下载阶段反复超时。原因:默认 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 1660S),CU126 全部能识别;GTX 16 系列因算力限制 config.py 里会自动切到 float32 推理
  • 模型下载:pretrained_models + G2PW + nltk + JTalk 词典合计约 4GB,HF-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 主界面进入功能总控页
选底模填参考音频合成得到第一段克隆语音
# 启动 WebUI,zh_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 3060(12GB)加载全套 v2 底模后空闲显存约占 4GB,fp16 推理;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 400,40 分钟音频切出约 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 + 梯度累积 4,fp16 下 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.yaml):epochs 300、batch_size 8、gradient_accumulation 4、lr 0.01(lr_init 1e-5 起步预热 2000 步)、precision 16;3060 上实测 1 个 epoch 约 4 分钟,全量 300 轮太久,我跑到 150 轮后 loss 已走平就停了
  • S2 参数(s2.json):epochs 100、learning_rate 0.0001、batch_size 32、fp16、采样率 32000;素材少时 30~50 轮足够,第 20 轮开始每 5 轮试听一次
  • 显存实测:S1 在 12GB 卡上占 9.8GB(fp16),S2 占 7.2GB;8GB 卡建议 S1 把 batch_size 压到 2

推理导出与批量部署

🎯 场景切入

模型训好了,怎么用到自己的业务里?网页手动点不现实,要么用命令行批量推,要么走 API,要么导出 ONNX 换推理引擎提速。我最后是把 S1、S2 都导成 ONNX 后接了自己的批量任务。

⚙️ 底层逻辑

批量入口是 GPT_SoVITS/inference_cli.py,它要求显式传入 GPT 模型、SoVITS 模型、参考音频和参考文本,读目标文本文件逐条合成;服务端是 api.py(9880 端口)和 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/epoch=3-step=5000.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。原因:每个请求都持有完整的 GPT+SoVITS 上下文。解法:业务侧做队列,同一时刻只放 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 分钟素材出可用个人模型只需半天。

  1. 多语言混合合成:仓库里 GPT_SoVITS/text/ 已内置中日韩粤的分语言 phonemizer,下一步想试中英混读的少样本训练,看 25Hz 语义序列对跨语言的泛化边界
  2. 情感迁移:S2 的参考音频决定了语气风格,计划系统对比"参考文本与参考音频情感错配"的合成效果,量化风格编码(speaker embedding)的迁移能力
  3. 流式推理:仓库里已有 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),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/30 9:27:18

让Claude Code、Codex、Cursor互相通信:Concord多Agent协作指南

做技术开发的朋友,最近应该明显感觉到一个趋势:AI 编程工具不再只是“帮我补全代码”的编辑器插件,而是逐渐变成能够独立执行任务的 Agent。Claude Code、Codex、Cursor 这三个工具,分别来自 Anthropic、OpenAI 和 Anysphere&…

作者头像 李华
网站建设 2026/8/30 9:24:13

STM32CubeIDE联调实战:断点、SVD寄存器与Boot/App切换技巧

如果你手上的项目已经到了联调阶段,还一边开着 Keil 点灯、一边串口打印、再拿万用表到处试探,那这篇东西大概率能帮你把调试效率提一档。最近大半年我一直在折腾 LAT1480 这块工业数据采集板,基于 STM32F4 做的,从驱动到协议栈再…

作者头像 李华
网站建设 2026/8/30 9:22:42

智能工作流故障的定位证据

智能工作流故障的定位证据工作流失败时,只保存最后一条报错通常不够。一个“调用失败”可能来自用户输入不符合约束、提示词版本变更、模型响应无法解析、工具权限不足,或外部服务超时。排查要能回答三个问题:问题发生在哪个节点,…

作者头像 李华
网站建设 2026/8/30 9:18:48

移动端Agent实战:架构设计、部署测试与工具调用全解析

这次我们来看一个方向很明确的项目:An agent built for Mobile。简单说,这是面向移动端场景设计的 Agent 项目,目标是让 AI Agent 能跑在手机、平板这类移动设备环境中,而不是只停留在服务器或 PC 桌面。移动端承载 AI Agent&…

作者头像 李华
网站建设 2026/8/30 9:18:39

Docker 部署 Windows 完整指南:5 分钟在容器里装好一台 Windows 11

Docker 部署 Windows 完整指南:5 分钟在容器里装好一台 Windows 11 【免费下载链接】windows Windows inside a Docker container. 项目地址: https://gitcode.com/GitHub_Trending/wi/windows 你在 Linux 服务器上想用 Windows 桌面,又不想折腾传…

作者头像 李华