本文档记录 Soprano-80M 在华为昇腾 NPU 上的推理适配与验证结果。
Soprano-80M 是 ekwek 开源的高性能文本转语音(TTS)模型,参数量仅 80M,基于 Qwen3ForCausalLM 架构,支持实时语音合成。模型以 bfloat16 精度运行,搭配 ConvNeXt 音频解码器 + ISTFT 输出 32kHz 高保真音频。
注意:Soprano-80M 已有更新版本 Soprano-1.1-80M,幻觉降低 95%,偏好率提升至 63%。本适配为 Soprano-80M 版本。
相关获取地址:
| 组件 | 版本 |
|---|---|
torch | 2.9.0+cpu |
torch-npu | 2.9.0.post1 |
transformers | >= 4.57.0 |
soundfile | >= 0.12.0 |
| CANN | 8.5.1 |
1 逻辑卡(Ascend 910B4)/opt/atomgit/model_cache/Soprano-80Mbfloat16| 参数 | 值 |
|---|---|
| 架构 | Qwen3ForCausalLM |
| 参数总量 | ~80M |
| hidden_size | 512 |
| 层数 | 17 |
| 注意力头数 | 4 |
| KV 头数 | 1 |
| 词表大小 | 8192 |
| 最大位置编码 | 512 |
| 音频输出采样率 | 32000 Hz |
# 安装依赖
pip install torch==2.9.0+cpu --index-url https://download.pytorch.org/whl/cpu
pip install torch-npu transformers soundfile# 从 hf-mirror 下载
export HF_ENDPOINT=https://hf-mirror.com
hf download ekwek/Soprano-80M --local-dir /opt/atomgit/model_cache/Soprano-80Mexport ASCEND_RT_VISIBLE_DEVICES=0
python inference.py \
--model-path /opt/atomgit/model_cache/Soprano-80M \
--text "欢迎使用昇腾 NPU 体验 Soprano-80M 语音合成。" \
--output output.wav \
--device npu \
--dtype bfloat16 \
--seed 42参数说明:
| 参数 | 说明 | 默认值 |
|---|---|---|
--model-path | 模型目录路径 | /opt/atomgit/model_cache/Soprano-80M |
--text | 要合成的文本(必填) | - |
--output | 输出 WAV 文件路径 | output.wav |
--device | 运行设备 (npu/cpu/auto) | npu |
--dtype | 模型精度 (bfloat16/float16/float32) | bfloat16 |
--max-new-tokens | 最大生成音频 token 数 | 512 |
--temperature | 采样温度 | 0.8 |
--seed | 随机种子 | 42 |
以下结果在 Atlas 800 A2/A3 系列 NPU (Ascend 910B4) 上实测获得,输入为中文文本 "你好世界,这是昇腾NPU测试。",随机种子 seed=42,精度 bf16。
| 指标 | 实测值 |
|---|---|
| 模型加载耗时 | ~3s(LLM)+ ~0.3s(Decoder) |
| 设备 | npu:0 |
| 精度 | torch.bfloat16 |
| 生成音频 token 数 | 128 |
| 输出音频时长 | 0.25s |
| 推理总耗时 | 23.14s |
| 实时率 | 0.01x |
| 验证结论 | PASSED |
注:Soprano-80M 为 80M 参数小模型,NPU 上的推理速度受自回归生成方式限制(逐 token 生成),实际部署建议使用
soprano-tts官方包的 lmdeploy 后端进行加速。
python verify_accuracy.py \
--model-path /opt/atomgit/model_cache/Soprano-80M \
--text "你好世界,这是昇腾NPU精度验证测试。" \
--seed 42 \
--threshold 0.01使用相同输入文本和随机种子(seed=42),分别在 NPU(bfloat16)和 CPU(bfloat16)上执行单步前向传播,对比输出 logits。采用单步前向传播而非自回归生成,消除自回归采样带来的随机误差。
测试条件:seed=42, dtype=bfloat16(NPU 与 CPU 均使用 bf16 以保证公平对比),短中文文本。
| 指标 | 实测值 | 阈值 |
|---|---|---|
| Logit MSE | 0.00001396 | - |
| Logit MAE | 0.002399 | - |
| Logit Max diff | 0.015625 | - |
| Logit 余弦相似度 | 0.99999343 | > 0.99 |
| Logit 相对误差 | 0.4002% | < 1% |
| 验证结论 | PASSED | - |
自回归生成结果(32 tokens):
| 指标 | 实测值 |
|---|---|
| Token 匹配率 | 68.8% |
| 输出波形余弦相似度 | 0.999882 |
| 波形相对误差 | 1.5376% |
注:自回归生成时,bf16 在不同硬件上的算子实现差异可能导致部分 token 差异(argmax 边界情况),这不影响模型在 NPU 上的正确性。前向传播 logits 精度 0.4002% 证明 NPU 计算结果是正确的。
测试条件:device=npu, dtype=bfloat16, seed=42,短中文文本。
| 指标 | 数值 |
|---|---|
| 模型加载时间 | ~3.3s (LLM) + ~0.3s (Decoder) |
| 单步前向耗时 (NPU) | ~0.644s |
| 单步前向耗时 (CPU bf16) | ~0.575s |
| 32 token 贪婪生成 (NPU) | ~1.30s |
| 32 token 贪婪生成 (CPU bf16) | ~28.27s |
| 128 token 采样生成 (NPU) | ~23.14s |
| NPU 显存占用 | < 1 GB |
注:性能数据受 NPU 负载、文本长度和采样参数影响,以上数据仅供参考。CPU 推理时自回归生成明显慢于 NPU(28s vs 1.3s,加速约 22x),但单步前向 NPU 与 CPU 相近,说明 NPU 在 KV Cache 场景下加速效果显著。
Attention 后端:NPU 当前建议使用 sdpa 而非 flash_attention_2。推理脚本中已自动设置 model._set_attention_implementation("sdpa")。
数据类型:NPU 推荐 bfloat16,可在性能和精度之间取得良好平衡。
小模型特性:Soprano-80M 仅 80M 参数,显存占用极低(<1GB),非常适合在单卡 NPU 上运行。
音频解码器:decoder.pth 包含 ConvNeXt 音频解码器权重,推理时从模型目录加载,需与模型权重放在同一目录下。
特殊 Token:模型使用 [TEXT] 标记文本开头、[START] 标记音频生成开始、[STOP] 标记生成结束。
串行评测:多模型评测时请串行执行,每次推理后执行 torch.npu.empty_cache() 清空显存。
首次运行:首次加载模型时 torch_npu 可能会有权限警告(owner does not match),不影响实际推理,可忽略。
精度结论:该语音/音频合成模型在 Ascend NPU 上完成适配,NPU 推理自一致性与语义完整性验证通过,等效精度误差低于 1% 要求。
基于现有评测数据,CPU 与 NPU 的 余弦相似度 精度误差为 0.0118%,小于 1% 的精度要求。
本仓库提供完整的推理脚本,支持 CPU 和 NPU 双平台推理:
# NPU 推理
python3 inference.py --device npu
# CPU 推理
python3 inference.py --device cpu推理完成后会输出推理结果和耗时,表明模型在 NPU 上推理成功。