news 2026/3/8 17:19:10

Ubuntu命令行部署GPT-SoVITS语音合成

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Ubuntu命令行部署GPT-SoVITS语音合成

Ubuntu命令行部署GPT-SoVITS语音合成

在远程服务器上做AI语音项目,最头疼的莫过于没有图形界面——WebUI打不开、操作全靠SSH终端。最近尝试在纯命令行环境下部署GPT-SoVITS,这个目前非常火的少样本语音克隆系统,发现虽然官方提供了Web界面,但其实它的CLI(命令行接口)和API支持已经相当成熟,完全可以脱离浏览器运行。

本文记录了从零开始,在 Ubuntu 系统中通过命令行完成 GPT-SoVITS 的完整部署流程:包括环境配置、音频预处理、ASR自动识别、TTS推理生成,以及如何用API进行集成调用。整个过程适用于远程云服务器或无GUI的Linux环境,特别适合自动化任务或嵌入式部署场景。

⚠️ 说明:本教程聚焦于基础推理链路,即“输入一段声音 → 提取文本 → 合成新语音”,不涉及模型训练与微调。如需训练,请参考官方文档进一步操作。


获取项目包并解压

为了避免手动克隆代码、逐个下载模型权重的麻烦,推荐直接使用官方发布的整合包。这些压缩包通常包含了核心代码、预训练模型和依赖说明,省去大量配置时间。

前往 GitHub - GPT-SoVITS Releases,找到最新的.7z格式整合包,例如:

GPT-SoVITS-beta0706fix1.7z

使用wget下载到服务器:

wget https://huggingface.co/lj1995/GPT-SoVITS/resolve/main/GPT-SoVITS-beta0706fix1.7z

Ubuntu 默认不支持.7z解压,需要先安装p7zip-full

sudo apt update && sudo apt install p7zip-full -y

然后执行解压:

7z x GPT-SoVITS-beta0706fix1.7z

解压后你会看到一个结构清晰的目录,关键部分如下:

├── api.py # HTTP API服务入口 ├── batch_inference.py # 批量推理脚本 ├── config.py # 全局配置文件 ├── GPT_SoVITS # 核心推理模块 ├── GPT_weights # 存放GPT模型(.ckpt) ├── SoVITS_weights # 存放SoVITS声学模型(.pth) ├── tools/ │ ├── slice_audio.py # 音频静音段切割工具 │ └── asr/funasr_asr.py # 基于FunASR的语音转文字 ├── output/ │ ├── slicer/ # 切割后的短音频片段 │ ├── asr_opt/ # ASR识别出的文字结果 │ └── result/ # 最终生成的合成语音 ├── pretrained_models/ # 公共预训练模型(建议保留) └── requirements.txt # Python依赖列表

这个结构设计得很合理:输入输出分离、功能模块独立,非常适合脚本化处理。


配置CUDA与Python环境

GPT-SoVITS 推理极度依赖 GPU 加速,尤其是 SoVITS 模型对显存要求较高。强烈建议使用 NVIDIA 显卡 + CUDA 环境。以下以CUDA 11.8 + PyTorch 2.1.1 + Python 3.9为例。

安装系统级依赖

首先确保系统具备基本多媒体处理能力:

sudo apt install ffmpeg libsox-dev -y

ffmpeg用于音频格式转换,libsox-dev支持更复杂的音频操作。

创建虚拟环境

推荐使用 Conda 管理环境,避免污染全局 Python:

conda create -n gptsovits python=3.9 -y conda activate gptsovits

安装 PyTorch(GPU版)

根据你的CUDA版本选择对应安装命令。这里假设你已正确安装NVIDIA驱动和CUDA Toolkit 11.8:

pip3 install torch==2.1.1 torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118

✅ 小贴士:如果你遇到No module named 'torch'或显卡无法识别的问题,请检查nvidia-smi是否能正常显示GPU信息,并确认PyTorch版本与CUDA匹配。

安装项目依赖

进入项目根目录,安装其余依赖:

pip install -r requirements.txt

可能会遇到ffmpeg-python冲突问题,尤其是在Conda环境中。如果报错提示找不到av模块或编解码失败,可以补装:

conda install -c conda-forge 'ffmpeg<7' -y

这样能保证底层FFmpeg库兼容性更好。


准备参考音频

要克隆某个音色,你需要一段高质量的“参考音频”(reference audio)。这是整个流程的基础,质量直接影响最终效果。

推荐标准:

  • 时长:5~10秒为佳(太短难建模,太长需切割)
  • 格式:WAV,PCM 16-bit,单声道(mono),采样率 16kHz 或 32kHz
  • 内容:朗读一句完整中文语句,尽量无背景噪音、口水音、呼吸杂音
  • 命名示例ref.wav

上传至项目目录,比如:

/home/ubuntu/gpt-sovits/ref.wav

如果原始音频是MP3或其他格式,可用ffmpeg转换:

ffmpeg -i ref.mp3 -f wav -ar 16000 -ac 1 -acodec pcm_s16le ref.wav

这会将音频转为16kHz单声道WAV,符合大多数语音模型输入要求。


步骤一:音频切割(slice_audio.py)

如果你的参考音频超过30秒,或者包含长时间静音,建议先进行切片处理。tools/slice_audio.py使用滑动窗口检测音量曲线,自动按静音段落分割成多个短片段。

查看帮助文档了解参数含义:

python tools/slice_audio.py -h

主要参数解释:

参数含义
inp输入音频路径
opt_root输出目录
threshold分贝阈值(低于此值视为静音,默认 -34 dBFS)
min_length每段最小长度(毫秒)
min_interval最小切割间隔
hop_size计算音量步长(越小越精确)
max_sil_kept切割后保留的最大静音长度

执行切割命令:

python tools/slice_audio.py \ /home/ubuntu/gpt-sovits/ref.wav \ /home/ubuntu/gpt-sovits/output/slicer \ -34 5000 300 10 200 1.0 0.8 0 1

输出文件将保存在output/slicer/目录下,形如:

ref.wav_0000000000_0000220480.wav

你可以播放这些片段确认是否清晰可辨。一般选其中一段作为后续参考即可。


步骤二:语音识别(ASR)提取文本

有了音频片段后,下一步是获取其对应的文本内容。GPT-SoVITS 提供了基于FunASR的自动语音识别脚本,支持中/英/日三语。

运行帮助命令查看选项:

python tools/asr/funasr_asr.py -h

常用参数:

  • -i,--input_folder: 输入音频文件夹(即上一步的slicer目录)
  • -o,--output_folder: 输出文本路径
  • -l,--language: 指定语言"zh"/"en"/"ja"

开始识别:

python tools/asr/funasr_asr.py \ -i /home/ubuntu/gpt-sovits/output/slicer \ -o /home/ubuntu/gpt-sovits/output/asr_opt \ -l zh

成功后会在asr_opt目录生成一个.list文件,例如slicer.list,格式如下:

<音频路径>|<说话人名称>|<语言>|<识别文本>

示例内容:

/home/ubuntu/gpt-sovits/output/slicer/ref.wav_0000000000_0000220480.wav|ref|ZH|你好,欢迎使用GPT-SoVITS语音合成系统。

⚠️ 注意事项:
- 如果识别错误,可以直接编辑.list文件修正文本。
- 文本必须与音频内容严格对应,否则会影响音色还原度。
- 若参考音频本身就是人工标注的,也可以跳过ASR,手动生成.list文件。


步骤三:TTS推理生成语音

终于到了最关键的一步:使用参考音频+文本,结合目标文本,合成新的语音。

查看推理脚本参数

python GPT_SoVITS/inference_cli.py -h

核心参数说明:

参数说明
--gpt_modelGPT模型路径(.ckpt 文件)
--sovits_modelSoVITS模型路径(.pth 文件)
--ref_audio参考音频路径(建议来自切割后的片段)
--ref_text参考音频对应文本文件路径
--ref_language参考语言:”中文”/”英文”/”日文”
--target_text待合成的目标文本文件路径
--target_language目标语言:”中文”/”中英混合”/”多语种混合”等
--output_path输出音频保存路径

准备输入文件

创建目标文本文件:

echo "这是一个由GPT-SoVITS生成的语音示例,支持中英文混合输入。" > /home/ubuntu/gpt-sovits/output/target_text.txt

创建参考文本文件(与ASR识别一致):

echo "你好,欢迎使用GPT-SoVITS语音合成系统。" > /home/ubuntu/gpt-sovits/output/ref_text.txt

执行推理命令

python GPT_SoVITS/inference_cli.py \ --gpt_model /home/ubuntu/gpt-sovits/GPT_SoVITS/pretrained_models/s1bert25hz-2kh-longer-epoch=68e-step=50232.ckpt \ --sovits_model /home/ubuntu/gpt-sovits/GPT_SoVITS/pretrained_models/s2G488k.pth \ --ref_audio /home/ubuntu/gpt-sovits/output/slicer/ref.wav_0000000000_0000220480.wav \ --ref_text /home/ubuntu/gpt-sovits/output/ref_text.txt \ --ref_language "中文" \ --target_text /home/ubuntu/gpt-sovits/output/target_text.txt \ --target_language "中英混合" \ --output_path /home/ubuntu/gpt-sovits/output/result

等待几秒到十几秒(取决于GPU性能),将在output/result目录生成类似output.wav的合成音频。

💡 经验分享:初次运行建议用较短的目标文本(<50字),避免因内存不足导致崩溃。A10/A100显卡通常可处理百字级别句子。


方式二:通过API服务调用

除了命令行脚本,GPT-SoVITS 还内置了一个轻量级HTTP API服务,非常适合集成进其他系统(如聊天机器人、语音播报平台)。

启动API服务

python api.py

默认监听地址为http://127.0.0.1:9880,可通过浏览器访问查看接口文档(Swagger UI)。

🔐 安全提醒:若在公网服务器运行,请务必限制访问IP或启用认证机制,防止被滥用。

修改默认配置(可选)

编辑config.py可设置全局参数,例如指定默认模型路径:

gpt_path = "/home/ubuntu/gpt-sovits/GPT_weights/s1bert25hz-2kh-longer-epoch=68e-step=50232.ckpt" sovits_path = "/home/ubuntu/gpt-sovits/SoVITS_weights/s2G488k.pth"

还可以设定设备类型(CPU/GPU)、是否启用半精度等。

发送POST请求生成语音

Python客户端示例
import requests def get_tts_wav(text, filename): url = "http://127.0.0.1:9880" data = { "text": text, "text_language": "mix", # 支持 "zh", "en", "ja", "mix" "cut_punc": ",。!?." # 按标点自动分句,提升长文本合成质量 } response = requests.post(url, json=data) if response.status_code == 200: with open(filename, 'wb') as f: f.write(response.content) print(f"✅ 音频已保存为 {filename}") else: print("❌ 请求失败:", response.json()) # 测试调用 get_tts_wav( "Hello world! 这是通过API生成的语音,支持中英文混合播报。", "api_output.wav" )

该方式更适合批量任务或定时生成场景,配合cronCelery可实现全自动语音播报系统。


常见问题与优化建议

❌ 报错:KeyError: ‘-’ 或 KeyError: ‘(‘

这是由于英文G2P词典未收录特殊符号导致的经典问题,常见于混合文本中含有连字符、括号等情况。

错误堆栈节选:
File "GPT_SoVITS/text/english.py", line 328, in qryword phones.extend(self.cmu[w][0]) KeyError: '-'
解决方案:
  1. 临时规避:在输入前清洗文本,替换非法字符为空格:

python text = text.replace('-', ' ').replace('(', ' ').replace(')', ' ')

  1. 永久修复:升级至最新代码版本。GitHub PR #1454 已修复该问题:

bash git clone https://github.com/RVC-Boss/GPT-SoVITS.git cd GPT-SoVITS git pull origin main

再重新安装依赖即可。


⚠️ 音频格式不兼容?

请确保所有输入音频为单声道WAV(PCM 16-bit),采样率建议为16kHz 或 32kHz

使用ffmpeg转换任意格式:

ffmpeg -i input.mp3 -f wav -ar 16000 -ac 1 -acodec pcm_s16le output.wav

🧩 如何提高合成质量?

这是我实践中总结的一些实用技巧:

  • 参考音频去噪:使用tools/uvr5对原始音频进行人声增强与背景降噪。
  • 文本一致性:参考文本的语言风格应尽量接近目标文本(例如都用口语化表达)。
  • 控制句子长度:单次合成建议不超过80字,过长易出现断句不当或音色漂移。
  • 启用自动切分:在API调用时添加cut_punc=",。!?"参数,让系统按标点智能分句。
  • 选择合适模型:不同.ckpt.pth模型针对不同语种优化,注意匹配使用。

这种高度集成且支持CLI/API的设计思路,正推动着语音合成技术向更高效、更易部署的方向演进。对于开发者而言,掌握这套命令行工作流,意味着可以在任何资源受限或无人值守的环境中,灵活构建属于自己的个性化语音引擎。

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

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

5分钟学会Bypass Paywalls Clean:终极免费阅读指南

你是否曾经因为付费墙而无法阅读知名媒体的深度报道&#xff1f;在信息爆炸的时代&#xff0c;Bypass Paywalls Clean正是你需要的解决方案&#xff0c;这款神奇工具能够轻松突破全球100多家主流媒体的付费限制&#xff0c;让你畅享免费阅读体验。 【免费下载链接】bypass-payw…

作者头像 李华
网站建设 2026/3/8 3:45:11

什么是“本地永久云手机”,真正独享的云端体验!

你可能听说过“云手机”&#xff0c;也能想象到它是一个能在云端运行的“虚拟手机”&#xff0c;不用耗自己手机的电和内存&#xff0c;适合挂游戏、多开应用。但最近挺火的的这个VMOS Edge本地永久云手机又是什么&#xff1f;不是说“云手机”在云端运行吗&#xff1f;怎么又到…

作者头像 李华
网站建设 2026/3/8 7:04:53

VMOS Edge与魔云腾Q1对比评测:谁才是本地永久云手机最优选?

从按月付费的云端服务变成可以买回家的硬件&#xff0c;“云手机”火爆的同时“本地云手机”也慢慢进入了更多消费者的视野。但面对不同的品牌和型号&#xff0c;消费者们往往困惑&#xff1a;这些“本地云手机”看起来性能相似&#xff0c;差别到底在哪里呢&#xff1f;谁才更…

作者头像 李华
网站建设 2026/3/8 2:13:37

HC32L130 MCU 片内 OPA(运算放大器)全解析与应用指南

目录 一、OPA 核心电气特性&#xff08;基础必知&#xff09; 二、OPA 硬件架构与管脚映射 1. 硬件框图&#xff08;核心逻辑&#xff09; 2. 管脚复用&#xff08;关键&#xff01;需查手册确认&#xff09; 三、OPA 软件配置通用流程&#xff08;基于标准库&#xff09;…

作者头像 李华
网站建设 2026/3/8 2:33:20

leetcode 763. Partition Labels 划分字母区间-耗时100%

Problem: 763. Partition Labels 划分字母区间 解题过程 耗时100%&#xff0c;首先统计每个字母的最小最大索引&#xff0c;然后合并所有字母的区间&#xff0c;可以合并的全部合并起来&#xff0c;不能合并的就放在那里&#xff0c;得到合并以后的区间&#xff0c;最后根据最小…

作者头像 李华