shiro_voice 是基于 SoVITS-SVC 架构的歌声/语音转换模型,本仓库提供 华为昇腾 Ascend910 NPU 适配版本,支持在昇腾硬件上高效推理。
shiro_voice 是一个基于 SoVITS-SVC (Singing Voice Conversion via VITS) 架构的语音转换模型,参数规模 45.1M,支持将任意输入语音转换为目标音色。
| 项目 | 版本/信息 |
|---|---|
| NPU 型号 | Ascend910_9362 |
| CANN 版本 | 25.5.2 |
| PyTorch | 2.9.0 |
| torch_npu | 2.9.0.post1 |
| 精度 | float32 |
| 模型参数 | 45.1M |
torch.npu)torch.npu.synchronize() 确保正确计时| 组件 | 说明 |
|---|---|
Synthesizer | 主模型,包含编码器、流模型和解码器 |
PitchEncoder | 音高编码器,含 F0 Embedding 和 Conformer |
ConformerEncoder | 基于相对位置注意力的编码器 (2 heads, 6 layers) |
ResidualCouplingBlock | 4 层仿射耦合流 (Affine Coupling Flow) |
HiFiGANGenerator | 5 级上采样 HiFi-GAN 声码器 |
F0Decoder | 基频解码器,含 SimpleAttention |
WN | WaveNet 扩张卷积模块 |
pip install torch==2.9.0
pip install torch_npu==2.9.0.post1
pip install librosa
pip install pyworld
pip install soundfile# 通过 ModelScope 下载
pip install modelscope
python -c "from modelscope import snapshot_download; snapshot_download('Y39c5bb/shiro_voice', local_dir='./models/Y39c5bb/shiro_voice')"import torch
import torch_npu
from sovits_model import Synthesizer
DEVICE = "npu:0" if torch.npu.is_available() else "cpu"
# 加载模型
checkpoint = torch.load("models/Y39c5bb/shiro_voice/sovits/G_0.pth",
map_location="cpu", weights_only=False)
model = Synthesizer()
model.load_state_dict(checkpoint["model"], strict=True)
model = model.to(DEVICE)
model.eval()
# 准备输入 (Content features, F0, UV)
c = torch.randn(1, 256, 100) # 语音内容特征
f0 = torch.rand(1, 1, 100) # 基频 (F0)
uv = torch.zeros(1, 100, dtype=torch.long) # 有声/无声标记
g = torch.randn(1, 256, 1) # 说话人嵌入
with torch.no_grad():
audio, _ = model(c, f0, uv, g=g, noise_scale=0.667)
print(f"生成音频: {audio.shape}") # [1, 1, N*512]也可直接运行推理脚本:
# 测试推理 (随机输入)
python inference_npu.py --test-only
# 语音转换
python inference_npu.py --input input.wav --output output.wav
# CPU 基线
python inference_npu.py --cpu --test-only在 NPU 和 CPU 上分别加载相同权重,使用完全相同的输入 (noise_scale=1.0 消除随机性差异),对比输出音频的各项指标。
| 指标 | NPU vs CPU | 判定 |
|---|---|---|
| Pearson 相关系数 (均值) | > 0.99999 | ✅ PASS |
| 信噪比 SNR (均值) | > 55 dB | ✅ PASS |
| 归一化平均误差 | < 0.02% | ✅ PASS |
| 正弦扫频 Pearson 相关 | > 0.99999 | ✅ PASS |
| 正弦扫频 SNR | > 47 dB | ✅ PASS |
| 综合判定 | 误差 < 1% | ✅ PASS |
| 序列长度 | Pearson 相关 | SNR (dB) | 归一化最大误差 |
|---|---|---|---|
| 50 | 1.000000 | 52.64 | 0.357% |
| 100 | 1.000000 | 57.42 | 0.099% |
| 200 | 0.999994 | 57.40 | 0.161% |
| 500 | 1.000000 | 56.09 | 0.221% |
运行精度评测:
python evaluate_accuracy.py| 序列长度 | 推理时间 (ms) | 生成音频时长 (s) | RTF | NPU vs CPU 加速比 |
|---|---|---|---|---|
| 50 | 23.45 | 0.64 | 0.037 | 40.8× |
| 100 | 23.80 | 1.28 | 0.019 | 80.0× |
| 200 | 24.64 | 2.56 | 0.010 | 159.1× |
| 500 | 30.69 | 6.40 | 0.005 | 324.9× |
| 1000 | 49.46 | 12.80 | 0.004 | - |
RTF (Real-Time Factor) = 推理时间 / 生成音频时长,RTF < 1 表示推理速度快于实时播放。所有测试场景下 NPU RTF 均远小于 1。
| 指标 | 占用 |
|---|---|
| 模型加载后 | ~0.43 GB |
| 推理峰值 | ~0.63 GB |
| 推理增量 | ~0.20 GB |
运行性能评测:
python benchmark_perf.py| 文件 | 说明 |
|---|---|
inference_npu.py | NPU 推理脚本 (语音转换 + 测试模式) |
sovits_model.py | SoVITS-SVC 模型架构定义 (从权重逆向构建) |
evaluate_accuracy.py | 精度评测脚本 (NPU vs CPU) |
benchmark_perf.py | 性能评测脚本 (延迟/吞吐/显存) |
models/ | 模型权重目录 |
evaluation_results/ | 评测结果输出目录 |
Synthesizer
├── pre: Conv1d(256→192)
├── emb_uv: Embedding(2→192)
├── enc_p (PitchEncoder)
│ ├── f0_emb: Embedding(256→192)
│ ├── enc_ (ConformerEncoder ×6)
│ │ ├── RelativeAttention (2 heads, window=4)
│ │ └── FFN (192→768→192)
│ └── proj: Conv1d(192→384)
├── flow (ResidualCouplingBlock ×4)
│ └── WN (WaveNet, dilation=1)
├── f0_decoder
│ ├── SimpleAttention (2 heads, 6 layers)
│ └── proj: Conv1d(192→1)
└── dec (HiFiGANGenerator)
├── ConvTranspose1d ×5 (upsample: 8,8,2,2,2)
├── ResBlock ×15 (kernels: 3,7,11)
└── conv_post: Conv1d(512→1)本模型基于 SoVITS-SVC 架构,通过 Y39c5bb/shiro_voice 权重适配昇腾 NPU。
@misc{sovits-svc,
author = {SoVITS Community},
title = {SoVITS-SVC: Singing Voice Conversion},
year = {2024},
}Apache 2.0