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.7zUbuntu 默认不支持.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 -yffmpeg用于音频格式转换,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_model | GPT模型路径(.ckpt 文件) |
--sovits_model | SoVITS模型路径(.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" )该方式更适合批量任务或定时生成场景,配合cron或Celery可实现全自动语音播报系统。
常见问题与优化建议
❌ 报错:KeyError: ‘-’ 或 KeyError: ‘(‘
这是由于英文G2P词典未收录特殊符号导致的经典问题,常见于混合文本中含有连字符、括号等情况。
错误堆栈节选:
File "GPT_SoVITS/text/english.py", line 328, in qryword phones.extend(self.cmu[w][0]) KeyError: '-'解决方案:
- 临时规避:在输入前清洗文本,替换非法字符为空格:
python text = text.replace('-', ' ').replace('(', ' ').replace(')', ' ')
- 永久修复:升级至最新代码版本。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),仅供参考