#+NPU
本文档记录 mms-tts-uzbek-qiz-ovozi_v2 在华为昇腾 NPU 环境的适配与验证结果。该模型是基于 VITS(Variational Inference with adversarial learning for end-to-end Text-to-Speech)架构的乌兹别克语语音合成模型,支持西里尔字母输入,输出 16kHz 采样率的 WAV 音频。
适配过程中发现 VITS 模型的相对位置注意力机制(Relative Position Attention)在 Ascend NPU 上存在 constant_pad_nd 算子兼容性问题,通过 CPU fallback 策略解决。
相关获取地址:
参考文档:
| 组件 | 版本 |
|---|---|
torch | 2.9.0+cpu |
torch-npu | 2.9.0.post1+gitee7ba04 |
transformers | 5.0.0.dev0 |
CANN | 8.5.1 |
Python | 3.11.14 |
1 张 Ascend 910B4./model_filespip install torch torch_npu transformers scipy方式一:使用 model_files/ 目录中的 split parts(需先执行 reassemble.py):
python3 model_files/reassemble.py方式二:通过 HuggingFace 镜像下载:
HF_ENDPOINT=https://hf-mirror.com python3 -c "
from huggingface_hub import snapshot_download
snapshot_download(
'MuzaffarSharofitdinov/mms-tts-uzbek-qiz-ovozi_v2',
local_dir='./model_files'
)
"# 单句推理
python inference.py --text "Салом дунё" --output output.wav
# 从文件批量推理
python inference.py --input input.txt --output output_dir/
# 指定设备和语速
python inference.py --text "Салом дунё" --device npu:0 --speaking_rate 1.2 --output output.wav# 精度评测(12 句乌兹别克语测试)
python accuracy_run.py
# 性能基准测试
python accuracy_run_perf.py
# 质量检查
python check_accuracy_run_perf.py输入文本必须为乌兹别克语西里尔字母。模型词汇表包含以下字符:
а б в г д е ж з и й к л м н о п р с т у ф х ч ш ъ ь э ю я ё ў ғ қ ҳ 0-6 – —使用 5 组测试用例验证基础功能:
| 测试用例 | 输入文本 | 结果 | 音频时长 | 推理耗时 |
|---|---|---|---|---|
| basic_greeting | Салом дунё | PASS | 3.07s | 45.9s |
| uzbek_special_chars | Ўзбекистон — бизнинг ватанимиз | PASS | 4.67s | 0.13s |
| longer_sentence | Бугун кунон яхши кун | PASS | 2.88s | 0.10s |
| single_char | Қ | PASS | 1.68s | 0.09s |
| numbers | 1 2 3 4 5 | PASS | 2.67s | 0.10s |
验证结果:5/5 全部通过。
说明:basic_greeting 首次推理耗时较长(45.9s),包含模型加载和 NPU 算子编译的开销。后续推理均在 0.15s 以内完成。
测试条件:5 组乌兹别克语文本,每组预热 3 次后连续测试 10 次。
| 指标 | 数值 |
|---|---|
| Mean latency | 0.0463 s |
| Median latency (P50) | 0.0440 s |
| P90 latency | 0.0473 s |
| P99 latency | 0.0571 s |
| Mean RTF | 0.0086 |
| Throughput | 20.46 samples/s |
各文本长度性能:
| 文本长度(字符) | 平均延迟 | 平均音频时长 | RTF |
|---|---|---|---|
| 短文本 (5-10) | 0.0405s | 3.09s | 0.0133 |
| 中文本 (20-50) | 0.0442s | 5.10s | 0.0087 |
| 长文本 (100+) | 0.0542s | 14.00s | 0.0039 |
吞吐量(30s 压力测试):
| 场景 | 吞吐量 (samples/s) | 音频生成倍率 |
|---|---|---|
| 短文本 | 25.21 句/秒 | 75× 实时 |
| 中文本 | 20.24 句/秒 | 106× 实时 |
| 长文本 | 15.94 句/秒 | 229× 实时 |
VITS 模型的相对位置注意力机制在 Ascend NPU 上存在已知兼容性问题。具体表现为 nn.functional.pad 在处理某些形状的张量时会报错:
RuntimeError: constant_pad_nd: NPU function error: call aclnnConstantPadNd failed解决方案:在推理前对 VitsAttention 类的 _relative_position_to_absolute_position 和 _absolute_position_to_relative_position 方法进行 monkey-patch,将 pad 操作移至 CPU 执行后转回 NPU。详见 inference.py 中的 apply_npu_vits_patch() 函数。
NPU 推理验证:
| 指标 | 数值 |
|---|---|
| 测试用例数 | 12 |
| 精度结论 | --- |
精度评测源代码和日志详见 eval/ 目录。