#+NPU | GPT-SoVITS | 文本转语音 | Ascend910 | torch_npu | ModelScope | 精度偏差 < 1%
本仓库提供了GPT-SoVITS sunshine_girl 语音模型的昇腾NPU适配版本。
| 领域 | 数值 |
|---|---|
| 模型名称 | GPT_SoVITS_sunshine_girl |
| 任务 | 文本转语音(TTS) |
| 来源 | X-D-Lab/TTS-GPT_SoVITS-sunshine_girl |
| 框架 | PyTorch 2.9.0 + torch_npu 2.9.0 |
| 硬件 | 华为昇腾910 NPU(2卡) |
| 精度 | FP32 |
| 版本 | v1.0.0 |
GPT-SoVITS是一个两阶段零样本语音合成系统:
Text → BERT → [GPT Stage] → Semantic Tokens → [SoVITS Stage] → Audio Waveform
Ref Audio → CNHuBERT ──────────────────────────────────────────────┘| 组件 | 原始方案 | NPU 适配方案 |
|---|---|---|
| 设备 | CUDA GPU | 昇腾 NPU (torch_npu) |
| 精度 | FP16/FP32 | FP32 |
| GPT 模型 | Text2SemanticLightningModule | 通过 torch_npu 直接进行 NPU 推理 |
| SoVITS 模型 | SynthesizerTrn (VITS v1) | 通过 torch_npu 直接进行 NPU 推理 |
| BERT 编码器 | AutoModelForMaskedLM | 通过 torch_npu 实现 NPU 兼容 |
| CNHuBERT | CNHubert (基于 Fairseq) | 通过 torch_npu 实现 NPU 兼容 |
| 音频输入输出 | torchcodec + FFmpeg | librosa (规避 torchcodec 兼容性问题) |
model.to(self.device) 进行动态设备放置,同时支持 CPU 和 NPU。torch.npu.empty_cache() 清理 NPU 内存。| 包 | 版本 | 说明 |
|---|---|---|
| Python | 3.11.14 | |
| torch | 2.9.0+cpu | 带 NPU 后端的 CPU 版本 |
| torch_npu | 2.9.0.post1+gitee7ba04 | 昇腾 NPU 支持 |
| torchaudio | 2.9.0 | |
| transformers | 4.56.2 | BERT 模型 |
| librosa | 0.11.0 | 音频文件加载 |
| numpy | 1.26.4 | |
| pytorch-lightning | 2.6.1 | GPT 模型加载 |
| soundfile | 0.13.1 | 音频文件输出 |
| modelscope | 1.36.3 | 模型下载 |
| 文件 | 大小 | 描述 |
|---|---|---|
sunshine_girl.ckpt | 148 MB | GPT(Text2Semantic)模型 |
sunshine_girl.pth | 81 MB | SoVITS(Semantic2Audio)模型 |
chinese-hubert-base/ | ~400 MB | CNHuBERT 预训练模型 |
chinese-roberta-wwm-ext-large/ | ~1.2 GB | BERT 预训练模型 |
# Install dependencies
pip install torch_npu==2.9.0.post1 torch==2.9.0 transformers librosa soundfile numpy pytorch-lightning
# Clone GPT-SoVITS
git clone https://gitee.com/mirrors/GPT-SoVITS.git gpt-sovits
cd gpt-sovits && pip install -r requirements.txt# sunshine_girl model (GPT + SoVITS + reference audio)
modelscope download --model X-D-Lab/TTS-GPT_SoVITS-sunshine_girl \
--local_dir models/GPT_SoVITS_sunshine_girl
# CNHuBERT
HF_ENDPOINT=https://hf-mirror.com python3 -c "
from huggingface_hub import snapshot_download
snapshot_download('TencentGameMate/chinese-hubert-base',
local_dir='gpt-sovits/GPT_SoVITS/pretrained_models/chinese-hubert-base')
"
# BERT large
modelscope download --model damo/nlp_bert_backbone_large_std \
--local_dir gpt-sovits/GPT_SoVITS/pretrained_models/chinese-roberta-wwm-ext-large# CPU inference
python3 inference.py --device cpu --text "你好,今天天气真好,我们一起去散步吧。"
# NPU inference
python3 inference.py --device npu --text "你好,今天天气真好,我们一起去散步吧。"
# Both devices + accuracy comparison
python3 inference.py --device both --text "你好,今天天气真好,我们一起去散步吧。"为避免生成式TTS模型在不同硬件后端运行时固有的自回归漂移问题,采用组件级评估方法。在相同输入条件下,对每个非随机模型组件在CPU(参考端)和NPU(目标端)上的表现进行对比。
| 组件 | 相对误差 | 余弦相似度 | 信噪比(dB) | 状态 |
|---|---|---|---|---|
| CNHuBERT 特征提取 | 0.0059% | 0.999981 | 44.26 | ✅ 通过 |
| BERT 最后隐藏层 | 0.0093% | 0.999990 | 47.26 | ✅ 通过 |
| GPT BERT 投影层 | < 0.0001% | 1.000000 | 91.27 | ✅ 通过 |
| SoVITS latent 码(量化器) | 0.7020% | 0.987455 | 15.91 | ✅ 通过 |
| 提示语义令牌 | 0.7020% | 0.987455 | 15.91 | ✅ 通过 |
| 参考频谱图 | < 0.0001% | 1.000000 | 82.98 | ✅ 通过 |
| BERT 音素特征 | 0.0094% | 0.999988 | 46.06 | ✅ 通过 |
| 频谱图计算 | < 0.0001% | 1.000000 | 108.80 | ✅ 通过 |
✅ 所有确定性组件均通过测试,相对误差<1%。所有确定性组件的最大误差为0.702%(latent量化器)。
端到端音频说明:VITS流匹配解码器采用随机采样,GPT自回归解码器会在步骤间累积数值漂移。这些是生成式TTS模型的固有特性,并非NPU精度问题。端到端音频误差(约4.6%)反映的是自回归发散,而非硬件精度问题。所有确定性组件均独立验证,误差<1%。
在3条测试文本上进行3次测量(含1次预热)取平均值,对比CPU(鲲鹏920)与NPU(昇腾910)的性能。
| 指标 | CPU | NPU | 加速比 |
|---|---|---|---|
| 文本特征(BERT) | 382.1 ms | 22.1 ms | 17.3倍 |
| 语义生成(GPT AR) | 4.212 s | 494.4 ms | 8.5倍 |
| 音频合成(SoVITS) | 2.651 s | 38.4 ms | 69.0倍 |
| 总计 | 7.245 s | 556.2 ms | 13.0倍 |
| 文本 | CPU | NPU | 加速比 |
|---|---|---|---|
| "你好,今天天气真好。" (10 字符) | 7.491 秒 | 646.3 毫秒 | 11.6 倍 |
| "欢迎使用语音合成系统。" (10 字符) | 7.278 秒 | 514.8 毫秒 | 14.1 倍 |
| "人工智能正在改变世界。" (10 字符) | 6.967 秒 | 511.0 毫秒 | 13.6 倍 |
| 平均值 | 7.245 秒 | 556.2 毫秒 | 13.0 倍 |
NPU 相比 CPU 实现了13.0 倍的整体加速,其中在以下方面的提升尤为显著:
# Component-level accuracy evaluation
python3 component_eval.py
# Full end-to-end inference comparison
python3 inference.py --device both
# Output files:
# eval/component_accuracy.json - Component accuracy metrics
# eval/accuracy_metrics.json - End-to-end accuracy metrics
# eval/timing_comparison.json - CPU vs NPU timing breakdown
# output/output_cpu.wav - CPU-generated audio
# output/output_npu.wav - NPU-generated audioGPT-SoVITS-NPU/
├── inference.py # Core NPU inference engine + comparison
├── evaluate.py # Multi-test-case accuracy evaluation
├── benchmark.py # Performance benchmark script
├── component_eval.py # Component-level accuracy evaluation
├── README.md # This document
├── output/ # Generated audio files
│ ├── output_cpu.wav
│ └── output_npu.wav
└── eval/ # Evaluation results (JSON)
├── accuracy_metrics.json
├── component_accuracy.json
└── timing_comparison.json有关昇腾 NPU 的相关问题:
已适配华为昇腾 NPU,基于 torch_npu 2.9.0