复制成功
请遵守本站许可
REPORT
Chapter_Post // Field_Report

Post_Ref: RL-GPT-SOVI

2026.04.08

使用GPT-SoVITS训练专属语音模型

Echo HaoRan
Echo HaoRan
#技术手册
ANALYSIS

如何使用 GPT-SoVITS 训练专属语音模型#

概述#

本文介绍如何在个人电脑上,使用自己的声音数据训练一个专属的文本转语音(Text-to-Speech, TTS)模型。训练完成后,你可以通过 API 调用这个模型,让 AI Agent 使用你的声音进行对话。

核心技术栈:

  • 模型框架:GPT-SoVITS v4(专为中文少样本语音克隆设计)
  • 训练方式:零样本克隆(5 秒音频)+ 少样本微调(1 分钟以上)
  • 界面方式:WebUI 可视化界面(零代码)
  • 最低显存要求:6GB VRAM

GPT-SoVITS 核心特性:

特性说明
零样本 TTS输入 5 秒音频样本,即可体验即时语音转换
少样本 TTS仅需 1 分钟训练数据即可微调,提升音色相似度和真实感
跨语言支持支持英语、日语、韩语、粤语、中文
WebUI 工具集成伴奏分离、自动分割训练集、中文 ASR、文本标注

版本选择建议:

  • v4(推荐):修复了 v3 的金属伪影问题,原生输出 48k 音频,音色相似度更高
  • v2Pro:硬件要求和速度与 v2 相当,性能超越 v4
  • v3:直接使用时音色相似度已显著提升

硬件准备与系统选择#

设备对比#

配置项i7-8700 + GTX1080 (Windows)8845HS (Ubuntu)
GPUGTX 1080 8GB 独立显卡集成显卡(无独立 GPU)
显存8GB共享内存
CPU6 核 12 线程8 核 16 线程
训练能力支持不支持

选择:i7-8700 + GTX1080 的 Windows 主机

原因: 训练语音模型需要独立 GPU 和足够显存。8845HS 没有独立 GPU,无法有效完成训练任务。GTX 1080 的 8GB 显存可以满足 GPT-SoVITS 的训练需求。

系统方案#

推荐 Windows 独立包(推荐)或 WSL2 Ubuntu 方案:

方案适用场景优点缺点
Windows 独立包Windows 用户首选下载即用,双击启动需要手动下载
WSL2 Ubuntu熟悉 Linux 用户可用完整功能配置较复杂

环境搭建#

方案一:Windows 独立包(推荐,零代码)#

这是最简单的方式,无需配置任何环境。

下载独立包#

  1. 访问 Hugging Face 下载页面:

  2. 下载完成后,使用 7-Zip 或 Bandizip 解压到任意目录

  3. 解压后目录结构:

    PRTCL // PLAINTEXT
    GPT-SoVITS-windows-package/
    ├── go-webui.bat # 双击启动 WebUI
    ├── go-webui-v1.bat # 使用 v1 版本
    ├── go-webui-v2.bat # 使用 v2 版本
    ├── ...
  4. 安装 FFmpeg(必需):

  5. 双击 go-webui.bat,等待自动打开浏览器

启动 WebUI#

PRTCL // PLAINTEXT
# 如果双击无反应,可以右键 "go-webui.bat" -> 以管理员身份运行
# 或者使用 PowerShell
.\go-webui.bat

看到类似输出即表示启动成功:

PRTCL // PLAINTEXT
Running on local URL: http://127.0.0.1:7860

方案二:Linux/macOS 手动安装#

安装 Conda#

PRTCL // BASH
Terminal window
# 下载 Miniconda
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
bash Miniconda3-latest-Linux-x86_64.sh
# 重启终端使生效

创建环境并安装#

PRTCL // BASH
Terminal window
# 创建 Python 3.10 环境
conda create -n GPTSoVits python=3.10
conda activate GPTSoVits
# 安装依赖(Linux)
bash install.sh --device CU126 --source HF
# 或使用 ModelScope 源(国内更快)
bash install.sh --device CU126 --source ModelScope

参数说明:

参数选项说明
--deviceCU126 / CU128 / ROCM / CPU / MPS选择计算设备
--sourceHF / HF-Mirror / ModelScope下载源
--download-uvr5(可选)是否下载 UVR5 模型

安装 FFmpeg#

Ubuntu/Debian:

PRTCL // BASH
Terminal window
sudo apt install ffmpeg
sudo apt install libsox-dev

macOS:

PRTCL // BASH
Terminal window
brew install ffmpeg

下载预训练模型#

GPT-SoVITS 需要以下预训练模型:

模型用途下载地址
GPT-SoVITS Models核心模型Hugging Face
G2PWModel中文 TTS 专用Hugging Face
UVR5 Weights伴奏分离 / 去混响Hugging Face
Damo ASR Model中文语音识别ModelScope
Faster Whisper英文 / 日文 ASRHugging Face

模型放置位置:

PRTCL // PLAINTEXT
GPT-SoVITS/
├── GPT_SoVITS/
│ └── pretrained_models/ # 放入主模型
│ └── text/
│ └── G2PWModel/ # 放入中文 G2PW 模型
├── tools/
│ ├── uvr5/
│ │ └── uvr5_weights/ # 放入 UVR5 模型
│ └── asr/
│ └── models/ # 放入 ASR 模型

启动 WebUI#

PRTCL // BASH
Terminal window
# 进入项目目录
cd GPT-SoVITS
# 启动 WebUI(默认 v4)
python webui.py
# 或指定语言
python webui.py zh # 中文界面
python webui.py en # 英文界面

声音数据采集#

数据采集要求#

项目最低要求推荐说明
时长5 秒(零样本)10-30 分钟(少样本)越多效果越好
格式WAV / MP3WAV推荐 16bit
采样率16000Hz+16000Hz 或 44100Hz均可
环境安静安静无回音降噪处理更佳
内容任意内容多样化句子涵盖不同音素

零样本 vs 少样本对比#

模式所需数据训练时间音色相似度适用场景
零样本5 秒音频无需训练基础可用快速测试
少样本1-30 分钟5-30 分钟生产使用

推荐录音工具(零代码)#

Windows / macOS / Linux:

  • Audacity(免费开源):https://www.audacityteam.org/

    下载安装后,选择「录音」按钮即可。建议使用外置麦克风或耳机麦克风。

手机录音注意事项:

  • 手机录音声学处理较重,可能影响效果
  • 建议使用电脑或独立麦克风录音
  • 录音后用 Audacity 转换为 WAV 16kHz

录音样例文本(建议 10-30 分钟)#

PRTCL // PLAINTEXT
你好,我叫张三,今天天气真不错。
一二三四五六七八九十。
今天是 2024 年 3 月 15 日,星期三。
北京是中国的首都,上海是金融中心。
人工智能技术正在改变世界。
机器学习是人工智能的核心分支。
请帮我查询明天的天气情况。
很高兴认识你,我们做朋友吧。
床前明月光,疑是地上霜。举头望明月,低头思故乡。
人工智能助手可以帮你完成很多任务。

覆盖要求:

  • 中文全拼音覆盖(b p m f d t n l g k h j q x zh ch sh r z c s y w)
  • 数字:0-9
  • 日期:年、月、日、星期
  • 常用汉字高频词汇

录音技巧#

  1. 保持一致的距离:嘴到麦克风 15-30cm
  2. 语速均匀:不要忽快忽慢
  3. 情感稳定:保持自然中性语调
  4. 内容多样:涵盖不同词汇和句式
  5. 环境安静:关闭门窗、空调、电风扇
  6. 多次录制:每天录 5-10 分钟,分几天完成效果更好

数据预处理#

GPT-SoVITS 提供完整的 WebUI 工具,无需代码即可完成数据预处理。

步骤 1:进入 WebUI#

PRTCL // BASH
Terminal window
# Windows 独立包:双击 go-webui.bat
# 其他:运行 python webui.py

浏览器自动打开 WebUI 界面。

步骤 2:音频切片(自动分割长音频)#

在 WebUI 中找到 「3-音频切片」 标签页:

PRTCL // PLAINTEXT
操作步骤:
1. 输入原始音频路径(或文件夹路径)
2. 设置输出目录
3. 调整参数:
- 阈值(threshold):音量阈值,建议 -30 到 -40
- 最小长度(min_length):每个切片最小时长,建议 3-5 秒
- 最小间隔(min_interval):相邻切片最小间隔,建议 0.1-0.3 秒
4. 点击「开始处理」

参数说明:

参数建议值说明
阈值-30 到 -40 dB低于此音量的部分被视为静音
最小长度3-5 秒过短会影响训练效果
最小间隔0.1-0.3 秒静音间隔超过此值则分割

步骤 3:音频降噪(可选)#

如录音环境不够安静,可使用降噪功能:

  1. 进入 「UVR5」 标签页
  2. 选择模型:HP5_only vocal_detect
  3. 上传音频或选择文件夹
  4. 点击「转换」

步骤 4:ASR 自动标注(生成文本)#

进入 「1-训练」 标签页,找到 「ASR」 配置区域:

PRTCL // PLAINTEXT
操作步骤:
1. 选择语言:中文 -> FunASR;英文 / 日文 -> Faster Whisper
2. 输入处理后的音频目录路径
3. 设置输出目录
4. 点击「开始运行」

ASR 工具对比:

工具支持语言准确度速度
FunASR中文
Faster Whisper英文 / 日文等慢(GPU 快)

步骤 5:人工校正标注#

ASR 自动识别可能存在误差,需要人工校正:

  1. ASR 完成后,在输出目录会生成 .list 文件
  2. 打开文件,每行格式为:
    PRTCL // PLAINTEXT
    音频路径|说话人|语言|文本
  3. 逐一检查文本是否正确,修正错误内容

示例:

PRTCL // PLAINTEXT
D:\GPT-SoVITS\dataset\processed\audio_001.wav|myvoice|zh|你好,我叫张三,今天天气真不错。
D:\GPT-SoVITS\dataset\processed\audio_002.wav|myvoice|zh|一二三四五六七八九十。

注意:

  • 路径建议使用绝对路径
  • 语言代码:zh= 中文,en= 英文,ja= 日文,ko= 韩文,yue= 粤语
  • 文本中不要包含特殊字符(| 除外)

模型训练(WebUI 可视化)#

进入训练界面#

在 WebUI 中切换到 「1-GPT-SoVITS-TTS」 标签页,然后选择 「1A-微调」 子标签页。

配置训练参数#

基础配置#

PRTCL // PLAINTEXT
# 训练数据目录
训练数据集路径:dataset/processed/
# 实验 / 模型名称(自定义)
实验名称:my-voice-v4
# 音频设置
采样率:16000

SoVITS 训练参数#

参数GTX 1080 (8GB) 建议值说明
batch_size4-6显存不足时降低
grad_accumulation2梯度累积步数
epochs50-100训练轮数
learning_rate0.0001学习率

GPT 训练参数#

参数GTX 1080 (8GB) 建议值说明
batch_size2-4GPT 模型较大,适当降低
grad_accumulation2-4梯度累积步数
epochs50-100训练轮数
learning_rate0.00005GPT 学习率较低

开始训练#

PRTCL // PLAINTEXT
操作步骤:
1. 确认参数配置无误
2. 点击「开始训练 SoVITS」按钮
3. 等待 SoVITS 训练完成(约 10-20 分钟)
4. SoVITS 训练完成后,点击「开始训练 GPT」按钮
5. 等待 GPT 训练完成(约 10-30 分钟)
6. 训练完成后,模型自动保存在输出目录

训练输出#

训练完成后,模型保存在:

PRTCL // PLAINTEXT
GPT-SoVITS/
├── output/
│ └── my-voice-v4/
│ ├── SoVITS/
│ │ └── s1v4_e100_*.pth # SoVITS 模型
│ └── GPT/
│ └── s2v4_e100_*.pth # GPT 模型

常见训练问题#

问题原因解决方案
CUDA OOM显存不足降低 batch_size 到 2
训练 loss 不下降学习率不合适降低学习率
音色不像本人数据量不足增加 10 分钟以上数据
音频有杂音录音环境问题降噪处理或重新录音

推理使用(WebUI 可视化)#

进入推理界面#

在 WebUI 中切换到 「1-GPT-SoVITS-TTS」 标签页,然后选择 「1C-推理」 子标签页。

加载模型#

PRTCL // PLAINTEXT
操作步骤:
1. 在「模型路径」区域:
- SoVITS 模型:选择 output/my-voice-v4/SoVITS/*.pth
- GPT 模型:选择 output/my-voice-v4/GPT/*.pth
2. 点击「加载模型」按钮
3. 等待模型加载完成

生成语音#

PRTCL // PLAINTEXT
操作步骤:
1. 上传参考音频:
- 点击「上传参考音频」按钮
- 选择一个包含你声音的音频文件(3-10 秒最佳)
2. 输入要生成的文本:
你好,这是使用我的声音生成的语音。
3. 调整参数:
- top_k:5-15(控制生成多样性)
- top_p:0.8-1.0
- temperature:0.8-1.2(控制随机性)
- 语速:1.0(标准)
4. 点击「开始生成」按钮
5. 等待生成完成,播放或下载音频

参数说明#

参数建议值说明
top_k5-15考虑前 k 个最可能的 token,越小越保守
top_p0.8-1.0核采样,越小越保守
temperature0.8-1.2温度参数,越高越随机
语速0.8-1.2语速倍率,1.0 为标准

API 服务部署#

虽然 GPT-SoVITS 主要通过 WebUI 使用,但你可以将其部署为 API 服务供 AI Agent 调用。

方式一:使用 VALL-E API(非官方)#

GPT-SoVITS 本身没有官方 API,但你可以使用类似的 TTS API 框架。以下提供一个基于 Flask 的简易 API 部署方案。

部署简易 API 服务#

创建 api_server.py

PRTCL // PYTHON
#!/usr/bin/env python3
"""
GPT-SoVITS TTS API 服务
将语音模型部署为 HTTP API,供 AI Agent 调用
注意:此脚本需要 GPT-SoVITS 的推理能力支持
完整实现需要参考 GPT-SoVITS 源码进行适配
"""
import io
import base64
import tempfile
import torch
import soundfile as sf
from flask import Flask, request, send_file, jsonify
from pathlib import Path
# ========== 配置区 ==========
HOST = "0.0.0.0"
PORT = 5002
SAMPLE_RATE = 24000 # GPT-SoVITS 输出采样率
# ============================
app = Flask(__name__)
# 导入 GPT-SoVITS 推理模块
try:
import sys
sys.path.insert(0, ".")
from GPT_SoVITS.inference_webui import GPTSoVITS
MODEL_LOADED = True
except Exception as e:
print(f"警告:无法加载 GPT-SoVITS 推理模块: {e}")
MODEL_LOADED = False
gpt_sovits = None
def init_model():
"""初始化模型"""
global gpt_sovits
if not MODEL_LOADED:
return
print("加载 GPT-SoVITS 模型...")
try:
# 加载训练好的模型
gpt_sovits = GPTSoVITS(
device="cuda" if torch.cuda.is_available() else "cpu"
)
print("模型加载完成")
except Exception as e:
print(f"模型加载失败: {e}")
@app.route("/health", methods=["GET"])
def health_check():
"""健康检查"""
return jsonify({
"status": "ok" if MODEL_LOADED else "model_not_loaded",
"model_loaded": MODEL_LOADED,
"cuda_available": torch.cuda.is_available()
})
@app.route("/tts", methods=["POST"])
def text_to_speech():
"""
文本转语音接口
请求参数 (JSON):
text: str - 要转换的文本
reference_audio: str - 参考音频路径(可选)
"""
try:
if not MODEL_LOADED or gpt_sovits is None:
return jsonify({"error": "模型未加载"}), 500
data = request.get_json()
if not data or "text" not in data:
return jsonify({"error": "缺少 text 参数"}), 400
text = data["text"]
reference_audio = data.get("reference_audio")
print(f"生成语音: {text[:50]}...")
# 生成语音
# 注意:具体 API 调用需要参考 GPT-SoVITS 源码
# audio = gpt_sovits.generate(
# text=text,
# reference_audio=reference_audio
# )
# 临时返回错误,实际使用时需要正确实现
return jsonify({"error": "请使用 WebUI 进行推理"}), 501
except Exception as e:
import traceback
traceback.print_exc()
return jsonify({"error": str(e)}), 500
@app.route("/tts_base64", methods=["POST"])
def text_to_speech_base64():
"""返回 Base64 编码的音频"""
try:
data = request.get_json()
if not data or "text" not in data:
return jsonify({"error": "缺少 text 参数"}), 400
text = data["text"]
# 实际使用时需要调用模型生成
# 这里返回示例结构
return jsonify({
"error": "请使用 WebUI 进行推理"
}), 501
except Exception as e:
return jsonify({"error": str(e)}), 500
def main():
"""启动服务"""
init_model()
print(f"\n{'='*50}")
print(f"GPT-SoVITS API 服务")
print(f"注意:建议直接使用 WebUI 进行推理")
print(f"地址: http://{HOST}:{PORT}")
print(f"{'='*50}\n")
app.run(host=HOST, port=PORT, debug=False, threaded=True)
if __name__ == "__main__":
main()

方式二:启动 GPT-SoVITS 内置 API 服务#

GPT-SoVITS v4 内置了 API 服务功能,可以直接启用:

PRTCL // BASH
Terminal window
# 在 GPT-SoVITS 目录运行
python GPT_SoVITS/api.py

或使用 WebUI 内置的 API 模式:

PRTCL // BASH
Terminal window
# 启动时添加 --api 参数
python webui.py --api

启动后 API 地址为 http://localhost:9876

可用接口:

接口方法参数说明
/ttsPOSTtext, ref_audio_path, prompt_text, prompt_lang, text_lang基础 TTS
/tts_streamPOST同上流式输出
/cut_dialoguePOST音频文件音频切片

调用示例:

PRTCL // PYTHON
import requests
import io
import soundfile as sf
# 先调用 TTS 接口
response = requests.post(
"http://localhost:9876/tts",
json={
"text": "你好,这是使用我的声音生成的语音。",
"ref_audio_path": "dataset/processed/ref.wav",
"prompt_text": "你好,这是参考音频。",
"prompt_lang": "zh",
"text_lang": "zh"
}
)
# 保存音频
if response.status_code == 200:
audio_data = response.content
# 音频为 24kHz WAV 格式
with open("output.wav", "wb") as f:
f.write(audio_data)

方式三:对接现有 TTS API#

如果需要 API 功能,建议同时安装一个支持 API 的 TTS 框架作为补充:

框架特点API 支持
Coqui TTS开源、支持模型微调良好
ESPnet学术框架、功能全需配置
VITS轻量、快速需额外开发

API 调用示例#

虽然 GPT-SoVITS 主要通过 WebUI 使用,但你可以通过以下方式间接调用:

方式 1:使用命令行推理

PRTCL // BASH
Terminal window
# 批量推理(使用项目自带的命令行工具)
python GPT_SoVITS/inference_main.py \
--model_path output/my-voice-v4/GPT/s2v4_e100_*.pth \
--sovits_path output/my-voice-v4/SoVITS/s1v4_e100_*.pth \
--ref_audio dataset/processed/ref.wav \
--text "你好,这是测试语音。"

方式 2:通过外部程序调用 WebUI

你可以编写脚本控制浏览器或调用 WebUI 的内部 API:

PRTCL // PYTHON
import requests
# 调用本地 WebUI(如果 WebUI 开启了 API 功能)
response = requests.post(
"http://localhost:7860/api/v1/tts",
json={
"text": "你好,这是测试语音",
"reference_audio": "path/to/ref.wav"
}
)

AI Agent 集成#

架构概述#

PRTCL // PLAINTEXT
┌─────────────┐ HTTP ┌─────────────┐ 音频流 ┌─────────────┐
│ AI Agent │ ────────────> │ TTS API │ ─────────────> │ 用户播放 │
│ ( 任意平台 ) │ JSON 请求 │ (GPT-SoVITS)│ │ │
└─────────────┘ └─────────────┘ └─────────────┘

集成方案对比#

方案复杂度效果推荐场景
WebUI 手动推理最低最佳个人使用、快速测试
内置 API 服务最佳推荐日常使用
API 转发服务取决于模型需要自动化的场景
直接集成模型可优化深度定制开发

方案一:使用内置 API(推荐)#

GPT-SoVITS 提供内置 API 服务,启动后其他 Agent 可直接调用:

PRTCL // BASH
Terminal window
# 启动 API 服务(默认端口 9876)
python GPT_SoVITS/api.py

服务启动后,通过 HTTP 请求即可生成语音:

PRTCL // PYTHON
import requests
import base64
def tts_generate(text, ref_audio, api_url="http://localhost:9876"):
"""调用 GPT-SoVITS API 生成语音"""
response = requests.post(
f"{api_url}/tts",
json={
"text": text,
"ref_audio_path": ref_audio,
"prompt_text": "你好。", # 参考音频对应的文本
"prompt_lang": "zh",
"text_lang": "zh"
}
)
return response.content # 返回 WAV 音频数据
# AI Agent 中调用
audio_bytes = tts_generate(
text="今天天气真不错,我们出去散步吧。",
ref_audio="dataset/processed/ref.wav"
)

方案二:完整 AI Agent 集成示例#

以下是一个完整的 AI Agent 集成方案,支持流式输出和实时播放:

启动 TTS API 服务#

创建并运行 start_tts_api.py

PRTCL // PYTHON
#!/usr/bin/env python3
"""启动 GPT-SoVITS TTS API 服务"""
import subprocess
import sys
import os
# 设置工作目录
os.chdir(os.path.dirname(os.path.abspath(__file__)))
# 启动 API 服务
print("启动 GPT-SoVITS API 服务...")
print("API 地址: http://localhost:9876")
print("按 Ctrl+C 停止服务\n")
subprocess.run([
sys.executable, "GPT_SoVITS/api.py"
])

TTS 客户端封装#

创建 tts_client.py,供 AI Agent 调用:

PRTCL // PYTHON
#!/usr/bin/env python3
"""GPT-SoVITS TTS 客户端封装"""
import requests
import base64
import io
import soundfile as sf
from typing import Optional
class GPTSoVITSClient:
def __init__(self, api_url: str = "http://localhost:9876"):
self.api_url = api_url
self.ref_audio = None
self.prompt_text = None
def set_reference(self, ref_audio_path: str, prompt_text: str):
"""设置参考音频和对应文本"""
self.ref_audio = ref_audio_path
self.prompt_text = prompt_text
def generate(self, text: str, language: str = "zh") -> bytes:
"""生成语音"""
if not self.ref_audio:
raise ValueError("请先设置参考音频 (set_reference)")
response = requests.post(
f"{self.api_url}/tts",
json={
"text": text,
"ref_audio_path": self.ref_audio,
"prompt_text": self.prompt_text,
"prompt_lang": language,
"text_lang": language
},
timeout=60
)
if response.status_code != 200:
raise Exception(f"TTS 生成失败: {response.text}")
return response.content
def generate_to_file(self, text: str, output_path: str, language: str = "zh"):
"""生成语音并保存到文件"""
audio_data = self.generate(text, language)
with open(output_path, "wb") as f:
f.write(audio_data)
return output_path
# ========== 独立使用示例 ==========
if __name__ == "__main__":
client = GPTSoVITSClient()
# 设置参考音频
client.set_reference(
ref_audio_path="dataset/processed/ref.wav",
prompt_text="你好,这是参考音频。"
)
# 生成语音
print("生成语音...")
audio = client.generate("你好,今天我们来进行一个简单的对话。")
print(f"生成成功,音频大小: {len(audio)} bytes")
# 保存到文件
client.generate_to_file(
"今天天气真不错。",
"output.wav"
)
print("已保存到 output.wav")

AI Agent 集成#

在 AI Agent 中集成 TTS 功能:

PRTCL // PYTHON
#!/usr/bin/env python3
"""AI Agent + GPT-SoVITS 集成示例"""
from tts_client import GPTSoVITSClient
import asyncio
class VoiceAgent:
def __init__(self):
self.tts = GPTSoVITSClient()
# 初始化时设置声音
self.tts.set_reference(
ref_audio_path="dataset/processed/ref.wav",
prompt_text="你好,我是你的语音助手。"
)
def chat(self, user_input: str) -> str:
"""处理用户输入并返回文本回复"""
# 这里接入你的 AI 对话逻辑
# 例如:Claude API、ChatGPT、本地模型等
ai_response = f"你说了: {user_input},这是 AI 的回复。"
return ai_response
def voice_chat(self, user_input: str) -> bytes:
"""语音对话:输入文本,返回语音"""
# 1. AI 生成回复
response_text = self.chat(user_input)
# 2. TTS 转换
audio = self.tts.generate(response_text)
return audio
# ========== 使用示例 ==========
if __name__ == "__main__":
agent = VoiceAgent()
# 文字对话
response = agent.chat("今天天气怎么样?")
print(f"AI: {response}")
# 语音对话
audio = agent.voice_chat("今天天气怎么样?")
print(f"语音已生成,音频大小: {len(audio)} bytes")

支持流式输出的 Agent#

对于需要流式语音生成的场景:

PRTCL // PYTHON
#!/usr/bin/env python3
"""流式语音生成 Agent"""
import requests
import io
import soundfile as sf
from tts_client import GPTSoVITSClient
class StreamingVoiceAgent:
def __init__(self):
self.tts = GPTSoVITSClient()
self.tts.set_reference(
ref_audio_path="dataset/processed/ref.wav",
prompt_text="你好。"
)
def stream_voice(self, text_segments: list):
"""流式生成语音(分段处理)"""
for segment in text_segments:
print(f"处理: {segment}")
audio = self.tts.generate(segment)
yield audio
# 此处可添加实时播放逻辑
# 使用方式
agent = StreamingVoiceAgent()
# 分段处理长文本
long_text = "今天天气真不错。我们出去散步吧。首先去公园,然后去超市买点东西。"
segments = long_text.split("。") # 按句子分割
for i, audio_chunk in enumerate(agent.stream_voice(segments)):
print(f"第 {i+1} 段音频生成完成")
# 可以实时播放或保存

方案三:WebSocket 实时语音(高级)#

如需实现实时语音交互,可使用 WebSocket 方案:

PRTCL // PYTHON
#!/usr/bin/env python3
"""WebSocket TTS 服务(需要额外配置)"""
# 注意:GPT-SoVITS 原生不支持 WebSocket
# 如需此功能,可通过以下方式实现:
# 使用 Flask-SocketIO 或 FastAPI WebSocket
# 在前端使用 Audio API 实时播放
# 示例架构:
# 前端 --WebSocket--> Agent Server --HTTP--> GPT-SoVITS API ---> 音频流

常用 AI Agent 平台集成#

对接 Claude / ChatGPT#

PRTCL // PYTHON
import openai # 或 anthropic
def ai_agent_voice(user_text, voice_client):
"""调用大模型后用 TTS 生成语音"""
# 1. 调用大模型获取回复
response = openai.ChatCompletion.create(
model="gpt-4",
messages=[{"role": "user", "content": user_text}]
)
reply = response.choices[0].message.content
# 2. 调用 TTS 生成语音
audio = voice_client.generate(reply)
return audio, reply

对接本地 RAG 知识库#

PRTCL // PYTHON
def rag_voice_agent(user_query, knowledge_base, voice_client):
"""基于知识库的语音问答"""
# 1. 知识库检索
context = knowledge_base.search(user_query)
# 2. 构建提示
prompt = f"基于以下信息回答:\n{context}\n\n 问题:{user_query}"
# 3. 调用大模型
response = llm.generate(prompt)
# 4. TTS 生成
audio = voice_client.generate(response)
return audio, response

常见集成问题#

问题原因解决方案
API 连接失败服务未启动确认 python GPT_SoVITS/api.py 已运行
生成超时文本过长减少单次生成字数或提高 timeout
音色不一致参考音频不匹配确保 ref_audio 与训练数据一致
音频播放延迟网络 / 生成速度使用流式输出或预生成部分内容

推荐工作流#

对于 AI Agent 集成,建议采用以下方案:

  1. 日常使用:直接打开 WebUI,手动输入文本生成语音
  2. Agent 集成
    • Agent 输出文本 → 写入文件
    • 监听文件变化 → 调用 TTS 生成音频
    • 播放音频

文件监听方案#

创建一个简单的文件监听脚本 watch_and_speak.py

PRTCL // PYTHON
#!/usr/bin/env python3
"""
文件监听 TTS 方案
监听指定文件,当文件内容变化时自动生成语音并播放
适用于:
- AI Agent 输出文本后自动朗读
- 无人值守的语音播报场景
"""
import time
import os
import subprocess
from pathlib import Path
# ========== 配置区 ==========
# 监听的文件路径(AI Agent 向此文件写入文本)
WATCH_FILE = "agent_output.txt"
# 参考音频路径
REFERENCE_AUDIO = "dataset/processed/ref.wav"
# WebUI 是否运行
WEBUI_URL = "http://localhost:7860"
# 检查间隔(秒)
CHECK_INTERVAL = 1.0
# ============================
def get_last_text():
"""读取文件内容"""
try:
with open(WATCH_FILE, "r", encoding="utf-8") as f:
return f.read().strip()
except:
return ""
def generate_speech(text):
"""生成语音"""
if not text:
return
print(f"生成语音: {text[:50]}...")
# 方式 1:调用 WebUI API(如可用)
try:
import requests
response = requests.post(
f"{WEBUI_URL}/api/v1/tts",
json={
"text": text,
"reference_audio": REFERENCE_AUDIO
},
timeout=30
)
if response.status_code == 200:
print("生成成功")
return
except:
pass
# 方式 2:打开 WebUI 手动处理
print("请在 WebUI 中手动生成语音")
print(f"文本: {text}")
def play_audio():
"""播放音频"""
# 查找最新生成的音频文件
output_dir = Path("output/audio")
if not output_dir.exists():
return
audio_files = list(output_dir.glob("*.wav"))
if not audio_files:
return
latest = max(audio_files, key=lambda p: p.stat().st_mtime)
# 播放
try:
# Windows
subprocess.run(["start", str(latest)], shell=True)
except:
try:
# Linux
subprocess.run(["aplay", str(latest)])
except:
print(f"请手动播放: {latest}")
def main():
"""主函数"""
print(f"监听文件: {WATCH_FILE}")
print(f"检查间隔: {CHECK_INTERVAL} 秒")
print("按 Ctrl+C 退出\n")
last_content = ""
while True:
current_content = get_last_text()
if current_content and current_content != last_content:
print(f"\n 检测到新内容: {current_content[:50]}...")
generate_speech(current_content)
last_content = current_content
time.sleep(CHECK_INTERVAL)
if __name__ == "__main__":
main()

命令行工具参考#

GPT-SoVITS 提供命令行工具,适合高级用户或批量处理。

音频切片#

PRTCL // BASH
Terminal window
python audio_slicer.py \
--input_path "path/to/audio.wav" \
--output_root "dataset/processed" \
--threshold -40 \
--min_length 3 \
--min_interval 0.2 \
--hop_size 128

参数说明:

参数说明建议值
--input_path输入音频路径-
--output_root输出目录-
--threshold音量阈值 (dB)-30 到 -40
--min_length最小切片时长 ( 秒 )3-5
--min_interval最小间隔 ( 秒 )0.1-0.3
--hop_size音量计算步长128

中文 ASR#

PRTCL // BASH
Terminal window
python tools/asr/funasr_asr.py \
-i "dataset/processed" \
-o "dataset/asr_output"

英文 / 日文 ASR(Faster Whisper)#

PRTCL // BASH
Terminal window
python tools/asr/fasterwhisper_asr.py \
-i "dataset/processed" \
-o "dataset/asr_output" \
-l "en" \
-p "fp16"

参数说明:

参数说明选项
-i输入目录-
-o输出目录-
-l语言en, ja, ko, zh
-p精度fp16 (GPU), fp32 (CPU)

UVR5 人声分离#

PRTCL // BASH
Terminal window
python tools/uvr5/webui.py "cuda" "true" 8888

然后在浏览器中打开 http://localhost:8888 进行操作。


常见问题#

Q1: 显存不足 (CUDA OOM)#

症状: RuntimeError: CUDA out of memory

解决方案:

  1. WebUI 中降低 batch_size:

    • SoVITS: 4 → 2
    • GPT: 2 → 1
  2. 启用半精度(WebUI 中通常有开关)

  3. 关闭其他占用显存的程序

Q2: 训练后音色不像本人#

原因解决方案
数据量太少增加到 10-30 分钟
录音环境噪音降噪处理或重新录音
音频格式不对转换为 16kHz WAV
训练轮数不够增加 epochs 到 100+
参考音频质量差使用清晰、无噪音的音频

Q3: 音频有杂音或失真#

可能原因及解决方案:

  1. 录音环境问题:在安静环境重新录音
  2. 降噪过度:避免多次降噪
  3. 采样率不匹配:确保所有音频为 16kHz

Q4: WebUI 无法打开#

排查步骤:

  1. 检查是否端口被占用:

    PRTCL // BASH
    Terminal window
    netstat -ano | findstr "7860"
  2. 重新启动:

    PRTCL // BASH
    Terminal window
    # 关闭所有 python 进程
    taskkill /f /im python.exe
    # 重新启动
    .\go-webui.bat
  3. 检查依赖:

    PRTCL // BASH
    Terminal window
    pip install -r requirements.txt

Q5: 中文发音不准确#

解决方案:

  1. 确保使用 v4 版本(中文支持最好)
  2. 检查标注文件 .list 中的文本是否正确
  3. 确保 G2PWModel 已正确安装
  4. 尝试使用拼音输入(高级用户)

Q6: 推理速度太慢#

优化建议:

方法效果说明
使用 GPU显著加速RTX 4090 RTF 可达 0.014
降低文本长度加速减少单次生成字数
调整参数略有加速降低 top_k 值

Q7: 模型文件太大#

v4 版本的模型文件较大属于正常现象。如需减小体积:

  1. 只保存最终模型(删除 checkpoints)
  2. 使用模型压缩工具(可能影响质量)

总结#

完成本教程后,你将拥有:

  1. ✅ 专属语音模型(基于你的声音)
  2. ✅ WebUI 可视化训练和推理界面
  3. ✅ 可手动或半自动生成语音

GPT-SoVITS 与其他方案对比:

特性GPT-SoVITSCoqui XTTS商业 TTS
费用免费开源免费开源付费
中文支持优秀一般优秀
少样本能力中等
WebUI
社区活跃度-

后续优化方向:

  • 增加训练数据量(1 小时 +)提升音色相似度
  • 尝试 v4 最新版本获得最佳效果
  • 探索不同参数组合找到最佳效果
  • 对接更多 Agent 平台

参考资源#

资源链接
官方仓库https://github.com/RVC-Boss/GPT-SoVITS
官方文档https://rentry.co/GPT-SoVITS-guide
中文文档https://www.yuque.com/baicaigongchang1145haoyuangong/ib3g1e
Windows 集成包https://huggingface.co/lj1995/GPT-SoVITS-windows-package
预训练模型https://huggingface.co/lj1995/GPT-SoVITS
在线体验https://lj1995-gpt-sovits-proplus.hf.space/
R P
Rhine Lab Pioneer Division
Auth_Verified: 2026.04.08
// END OF POST

订阅

通过 RSS 订阅本站,新文章发布时第一时间收到通知。

Follow
Classified
Chapter_06
Protocol_Ref: CC-BY-NC-SA-4.0

使用GPT-SoVITS训练专属语音模型

Author: CHONGXIReleased: 2026.04.08

Licensed under CC BY-NC-SA 4.0

评论

© 2025-2026 EchoSpace
Powered by Astro & echohaoran Non-Collaborative_Entity // Protocol_V.4.21