如何使用 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) |
|---|---|---|
| GPU | GTX 1080 8GB 独立显卡 | 集成显卡(无独立 GPU) |
| 显存 | 8GB | 共享内存 |
| CPU | 6 核 12 线程 | 8 核 16 线程 |
| 训练能力 | 支持 | 不支持 |
选择:i7-8700 + GTX1080 的 Windows 主机
原因: 训练语音模型需要独立 GPU 和足够显存。8845HS 没有独立 GPU,无法有效完成训练任务。GTX 1080 的 8GB 显存可以满足 GPT-SoVITS 的训练需求。
系统方案
推荐 Windows 独立包(推荐)或 WSL2 Ubuntu 方案:
| 方案 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| Windows 独立包 | Windows 用户首选 | 下载即用,双击启动 | 需要手动下载 |
| WSL2 Ubuntu | 熟悉 Linux 用户 | 可用完整功能 | 配置较复杂 |
环境搭建
方案一:Windows 独立包(推荐,零代码)
这是最简单的方式,无需配置任何环境。
下载独立包
访问 Hugging Face 下载页面:
- Hugging Face 下载地址
- 国内用户建议从语雀地址下载
下载完成后,使用 7-Zip 或 Bandizip 解压到任意目录
解压后目录结构:
PRTCL // PLAINTEXTGPT-SoVITS-windows-package/├── go-webui.bat # 双击启动 WebUI├── go-webui-v1.bat # 使用 v1 版本├── go-webui-v2.bat # 使用 v2 版本├── ...安装 FFmpeg(必需):
- 从 Hugging Face 下载
ffmpeg.exe - 从 Hugging Face 下载
ffprobe.exe - 将这两个文件放入 GPT-SoVITS 根目录
- 从 Hugging Face 下载
双击
go-webui.bat,等待自动打开浏览器
启动 WebUI
# 如果双击无反应,可以右键 "go-webui.bat" -> 以管理员身份运行
# 或者使用 PowerShell.\go-webui.bat看到类似输出即表示启动成功:
Running on local URL: http://127.0.0.1:7860方案二:Linux/macOS 手动安装
安装 Conda
# 下载 Minicondawget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.shbash Miniconda3-latest-Linux-x86_64.sh
# 重启终端使生效创建环境并安装
# 创建 Python 3.10 环境conda create -n GPTSoVits python=3.10conda activate GPTSoVits
# 安装依赖(Linux)bash install.sh --device CU126 --source HF# 或使用 ModelScope 源(国内更快)bash install.sh --device CU126 --source ModelScope参数说明:
| 参数 | 选项 | 说明 |
|---|---|---|
--device | CU126 / CU128 / ROCM / CPU / MPS | 选择计算设备 |
--source | HF / HF-Mirror / ModelScope | 下载源 |
--download-uvr5 | (可选) | 是否下载 UVR5 模型 |
安装 FFmpeg
Ubuntu/Debian:
sudo apt install ffmpegsudo apt install libsox-devmacOS:
brew install ffmpeg下载预训练模型
GPT-SoVITS 需要以下预训练模型:
| 模型 | 用途 | 下载地址 |
|---|---|---|
| GPT-SoVITS Models | 核心模型 | Hugging Face |
| G2PWModel | 中文 TTS 专用 | Hugging Face |
| UVR5 Weights | 伴奏分离 / 去混响 | Hugging Face |
| Damo ASR Model | 中文语音识别 | ModelScope |
| Faster Whisper | 英文 / 日文 ASR | Hugging Face |
模型放置位置:
GPT-SoVITS/├── GPT_SoVITS/│ └── pretrained_models/ # 放入主模型│ └── text/│ └── G2PWModel/ # 放入中文 G2PW 模型├── tools/│ ├── uvr5/│ │ └── uvr5_weights/ # 放入 UVR5 模型│ └── asr/│ └── models/ # 放入 ASR 模型启动 WebUI
# 进入项目目录cd GPT-SoVITS
# 启动 WebUI(默认 v4)python webui.py
# 或指定语言python webui.py zh # 中文界面python webui.py en # 英文界面声音数据采集
数据采集要求
| 项目 | 最低要求 | 推荐 | 说明 |
|---|---|---|---|
| 时长 | 5 秒(零样本) | 10-30 分钟(少样本) | 越多效果越好 |
| 格式 | WAV / MP3 | WAV | 推荐 16bit |
| 采样率 | 16000Hz+ | 16000Hz 或 44100Hz | 均可 |
| 环境 | 安静 | 安静无回音 | 降噪处理更佳 |
| 内容 | 任意内容 | 多样化句子 | 涵盖不同音素 |
零样本 vs 少样本对比
| 模式 | 所需数据 | 训练时间 | 音色相似度 | 适用场景 |
|---|---|---|---|---|
| 零样本 | 5 秒音频 | 无需训练 | 基础可用 | 快速测试 |
| 少样本 | 1-30 分钟 | 5-30 分钟 | 高 | 生产使用 |
推荐录音工具(零代码)
Windows / macOS / Linux:
Audacity(免费开源):https://www.audacityteam.org/
下载安装后,选择「录音」按钮即可。建议使用外置麦克风或耳机麦克风。
手机录音注意事项:
- 手机录音声学处理较重,可能影响效果
- 建议使用电脑或独立麦克风录音
- 录音后用 Audacity 转换为 WAV 16kHz
录音样例文本(建议 10-30 分钟)
你好,我叫张三,今天天气真不错。一二三四五六七八九十。今天是 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
- 日期:年、月、日、星期
- 常用汉字高频词汇
录音技巧
- 保持一致的距离:嘴到麦克风 15-30cm
- 语速均匀:不要忽快忽慢
- 情感稳定:保持自然中性语调
- 内容多样:涵盖不同词汇和句式
- 环境安静:关闭门窗、空调、电风扇
- 多次录制:每天录 5-10 分钟,分几天完成效果更好
数据预处理
GPT-SoVITS 提供完整的 WebUI 工具,无需代码即可完成数据预处理。
步骤 1:进入 WebUI
# Windows 独立包:双击 go-webui.bat# 其他:运行 python webui.py浏览器自动打开 WebUI 界面。
步骤 2:音频切片(自动分割长音频)
在 WebUI 中找到 「3-音频切片」 标签页:
操作步骤: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:音频降噪(可选)
如录音环境不够安静,可使用降噪功能:
- 进入 「UVR5」 标签页
- 选择模型:
HP5_only vocal_detect - 上传音频或选择文件夹
- 点击「转换」
步骤 4:ASR 自动标注(生成文本)
进入 「1-训练」 标签页,找到 「ASR」 配置区域:
操作步骤:1. 选择语言:中文 -> FunASR;英文 / 日文 -> Faster Whisper2. 输入处理后的音频目录路径3. 设置输出目录4. 点击「开始运行」ASR 工具对比:
| 工具 | 支持语言 | 准确度 | 速度 |
|---|---|---|---|
| FunASR | 中文 | 高 | 中 |
| Faster Whisper | 英文 / 日文等 | 高 | 慢(GPU 快) |
步骤 5:人工校正标注
ASR 自动识别可能存在误差,需要人工校正:
- ASR 完成后,在输出目录会生成
.list文件 - 打开文件,每行格式为: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-微调」 子标签页。
配置训练参数
基础配置
# 训练数据目录训练数据集路径:dataset/processed/
# 实验 / 模型名称(自定义)实验名称:my-voice-v4
# 音频设置采样率:16000SoVITS 训练参数
| 参数 | GTX 1080 (8GB) 建议值 | 说明 |
|---|---|---|
| batch_size | 4-6 | 显存不足时降低 |
| grad_accumulation | 2 | 梯度累积步数 |
| epochs | 50-100 | 训练轮数 |
| learning_rate | 0.0001 | 学习率 |
GPT 训练参数
| 参数 | GTX 1080 (8GB) 建议值 | 说明 |
|---|---|---|
| batch_size | 2-4 | GPT 模型较大,适当降低 |
| grad_accumulation | 2-4 | 梯度累积步数 |
| epochs | 50-100 | 训练轮数 |
| learning_rate | 0.00005 | GPT 学习率较低 |
开始训练
操作步骤:1. 确认参数配置无误2. 点击「开始训练 SoVITS」按钮3. 等待 SoVITS 训练完成(约 10-20 分钟)4. SoVITS 训练完成后,点击「开始训练 GPT」按钮5. 等待 GPT 训练完成(约 10-30 分钟)6. 训练完成后,模型自动保存在输出目录训练输出
训练完成后,模型保存在:
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-推理」 子标签页。
加载模型
操作步骤:1. 在「模型路径」区域: - SoVITS 模型:选择 output/my-voice-v4/SoVITS/*.pth - GPT 模型:选择 output/my-voice-v4/GPT/*.pth2. 点击「加载模型」按钮3. 等待模型加载完成生成语音
操作步骤: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_k | 5-15 | 考虑前 k 个最可能的 token,越小越保守 |
| top_p | 0.8-1.0 | 核采样,越小越保守 |
| temperature | 0.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:
#!/usr/bin/env python3"""GPT-SoVITS TTS API 服务将语音模型部署为 HTTP API,供 AI Agent 调用
注意:此脚本需要 GPT-SoVITS 的推理能力支持完整实现需要参考 GPT-SoVITS 源码进行适配"""
import ioimport base64import tempfileimport torchimport soundfile as sffrom flask import Flask, request, send_file, jsonifyfrom pathlib import Path
# ========== 配置区 ==========HOST = "0.0.0.0"PORT = 5002SAMPLE_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 = Trueexcept 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 服务功能,可以直接启用:
# 在 GPT-SoVITS 目录运行python GPT_SoVITS/api.py或使用 WebUI 内置的 API 模式:
# 启动时添加 --api 参数python webui.py --api启动后 API 地址为 http://localhost:9876
可用接口:
| 接口 | 方法 | 参数 | 说明 |
|---|---|---|---|
/tts | POST | text, ref_audio_path, prompt_text, prompt_lang, text_lang | 基础 TTS |
/tts_stream | POST | 同上 | 流式输出 |
/cut_dialogue | POST | 音频文件 | 音频切片 |
调用示例:
import requestsimport ioimport 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:使用命令行推理
# 批量推理(使用项目自带的命令行工具)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:
import requests
# 调用本地 WebUI(如果 WebUI 开启了 API 功能)response = requests.post( "http://localhost:7860/api/v1/tts", json={ "text": "你好,这是测试语音", "reference_audio": "path/to/ref.wav" })AI Agent 集成
架构概述
┌─────────────┐ HTTP ┌─────────────┐ 音频流 ┌─────────────┐│ AI Agent │ ────────────> │ TTS API │ ─────────────> │ 用户播放 ││ ( 任意平台 ) │ JSON 请求 │ (GPT-SoVITS)│ │ │└─────────────┘ └─────────────┘ └─────────────┘集成方案对比
| 方案 | 复杂度 | 效果 | 推荐场景 |
|---|---|---|---|
| WebUI 手动推理 | 最低 | 最佳 | 个人使用、快速测试 |
| 内置 API 服务 | 低 | 最佳 | 推荐日常使用 |
| API 转发服务 | 中 | 取决于模型 | 需要自动化的场景 |
| 直接集成模型 | 高 | 可优化 | 深度定制开发 |
方案一:使用内置 API(推荐)
GPT-SoVITS 提供内置 API 服务,启动后其他 Agent 可直接调用:
# 启动 API 服务(默认端口 9876)python GPT_SoVITS/api.py服务启动后,通过 HTTP 请求即可生成语音:
import requestsimport 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:
#!/usr/bin/env python3"""启动 GPT-SoVITS TTS API 服务"""import subprocessimport sysimport 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 调用:
#!/usr/bin/env python3"""GPT-SoVITS TTS 客户端封装"""import requestsimport base64import ioimport soundfile as sffrom 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 功能:
#!/usr/bin/env python3"""AI Agent + GPT-SoVITS 集成示例"""from tts_client import GPTSoVITSClientimport 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
对于需要流式语音生成的场景:
#!/usr/bin/env python3"""流式语音生成 Agent"""import requestsimport ioimport soundfile as sffrom 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 方案:
#!/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
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 知识库
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 集成,建议采用以下方案:
- 日常使用:直接打开 WebUI,手动输入文本生成语音
- Agent 集成:
- Agent 输出文本 → 写入文件
- 监听文件变化 → 调用 TTS 生成音频
- 播放音频
文件监听方案
创建一个简单的文件监听脚本 watch_and_speak.py:
#!/usr/bin/env python3"""文件监听 TTS 方案监听指定文件,当文件内容变化时自动生成语音并播放
适用于:- AI Agent 输出文本后自动朗读- 无人值守的语音播报场景"""
import timeimport osimport subprocessfrom 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 提供命令行工具,适合高级用户或批量处理。
音频切片
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
python tools/asr/funasr_asr.py \ -i "dataset/processed" \ -o "dataset/asr_output"英文 / 日文 ASR(Faster Whisper)
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 人声分离
python tools/uvr5/webui.py "cuda" "true" 8888然后在浏览器中打开 http://localhost:8888 进行操作。
常见问题
Q1: 显存不足 (CUDA OOM)
症状: RuntimeError: CUDA out of memory
解决方案:
WebUI 中降低 batch_size:
- SoVITS: 4 → 2
- GPT: 2 → 1
启用半精度(WebUI 中通常有开关)
关闭其他占用显存的程序
Q2: 训练后音色不像本人
| 原因 | 解决方案 |
|---|---|
| 数据量太少 | 增加到 10-30 分钟 |
| 录音环境噪音 | 降噪处理或重新录音 |
| 音频格式不对 | 转换为 16kHz WAV |
| 训练轮数不够 | 增加 epochs 到 100+ |
| 参考音频质量差 | 使用清晰、无噪音的音频 |
Q3: 音频有杂音或失真
可能原因及解决方案:
- 录音环境问题:在安静环境重新录音
- 降噪过度:避免多次降噪
- 采样率不匹配:确保所有音频为 16kHz
Q4: WebUI 无法打开
排查步骤:
检查是否端口被占用:
PRTCL // BASHTerminal window netstat -ano | findstr "7860"重新启动:
PRTCL // BASHTerminal window # 关闭所有 python 进程taskkill /f /im python.exe# 重新启动.\go-webui.bat检查依赖:
PRTCL // BASHTerminal window pip install -r requirements.txt
Q5: 中文发音不准确
解决方案:
- 确保使用 v4 版本(中文支持最好)
- 检查标注文件
.list中的文本是否正确 - 确保 G2PWModel 已正确安装
- 尝试使用拼音输入(高级用户)
Q6: 推理速度太慢
优化建议:
| 方法 | 效果 | 说明 |
|---|---|---|
| 使用 GPU | 显著加速 | RTX 4090 RTF 可达 0.014 |
| 降低文本长度 | 加速 | 减少单次生成字数 |
| 调整参数 | 略有加速 | 降低 top_k 值 |
Q7: 模型文件太大
v4 版本的模型文件较大属于正常现象。如需减小体积:
- 只保存最终模型(删除 checkpoints)
- 使用模型压缩工具(可能影响质量)
总结
完成本教程后,你将拥有:
- ✅ 专属语音模型(基于你的声音)
- ✅ WebUI 可视化训练和推理界面
- ✅ 可手动或半自动生成语音
GPT-SoVITS 与其他方案对比:
| 特性 | GPT-SoVITS | Coqui XTTS | 商业 TTS |
|---|---|---|---|
| 费用 | 免费开源 | 免费开源 | 付费 |
| 中文支持 | 优秀 | 一般 | 优秀 |
| 少样本能力 | 强 | 中等 | 强 |
| WebUI | 有 | 有 | 无 |
| 社区活跃度 | 高 | 中 | - |
后续优化方向:
- 增加训练数据量(1 小时 +)提升音色相似度
- 尝试 v4 最新版本获得最佳效果
- 探索不同参数组合找到最佳效果
- 对接更多 Agent 平台
参考资源
Auth_Verified: 2026.04.08
