基于 华为昇腾 Ascend NPU 的 DolphinASR 语音识别模型适配,将 ModelScope manyeyes/manyspeech-cli 中的 DolphinASR-small-int8 模型成功部署至昇腾硬件平台,实现高精度离线语音识别推理。
ManySpeech-CLI 是轻量化本地命令行语音识别工具,内置多种 ASR 模型。本项目将其中的 DolphinASR-small-int8 模型适配至华为昇腾 NPU,利用 ONNX Runtime 结合 torch_npu 实现混合推理加速。
模型架构:
支持语言: 中文、日文、英文等多语言
| 组件 | 版本 |
|---|---|
| 昇腾 NPU | Ascend910_9362 (Atlas 800 A2) |
| CANN | 8.5.1 |
| PyTorch | 2.9.0 |
| torch_npu | 2.9.0.post1 |
| ONNX Runtime | 1.26.0 |
| Python | 3.11 |
pip install modelscope
modelscope download --model manyeyes/manyspeech-cli模型文件位于:
~/.cache/modelscope/hub/models/manyeyes/DolphinAsr-small-int8-onnx/
├── encoder.onnx # E-Branchformer 编码器
├── decoder.int8.onnx # INT8 Transformer 解码器
├── tokens.txt # 词汇表 (40001 tokens)
├── bpe.model # SentencePiece BPE 模型
├── conf.yaml # 模型配置
├── configuration.json # 框架配置
└── test_wavs/ # 测试音频
├── 0.wav # 中文新闻 (17.4s)
├── 1.wav # 日文朗读 (10.0s)
└── 2.wav # 中文散文 (31.0s)pip install onnx onnxruntime soundfile scipy# CPU 推理 (基线)
python inference.py --audio test.wav --device cpu --beam-size 5
# NPU 推理 (混合加速:音频预处理 + Beam Search 在 NPU 执行)
python inference.py --audio test.wav --device npu --beam-size 5
# 多文件批量推理
python inference.py -f audio1.wav audio2.wav --device npu --format json -o results.json参数说明:
| 参数 | 简写 | 说明 | 默认值 |
|---|---|---|---|
--audio | -f | 音频文件路径 (WAV) | 必填 |
--model-dir | — | 模型目录 | DolphinAsr-small-int8-onnx |
--device | — | 推理设备 (cpu / npu) | cpu |
--beam-size | — | Beam Search 宽度 | 5 |
--output | -o | 结果输出路径 (JSON) | None |
--format | — | 输出格式 (text/json/srt) | text |
对比 CPU (ONNX Runtime) 与 NPU (torch_npu 混合加速) 的推理输出,采用字符级完全匹配比对。
| 测试文件 | 时长 | CPU 输出 | NPU 输出 | 相似度 | CPU 耗时 | NPU 耗时 |
|---|---|---|---|---|---|---|
| 0.wav (中文新闻) | 17.4s | 改革开放持续深化,最新外商投资准入负面清单... | 完全一致 | 100% | 266.7s | 286.6s |
| 1.wav (日文朗读) | 10.0s | そういう願望を持っていました昔は宇宙というよりは... | 完全一致 | 100% | 4.6s | 4.8s |
| 2.wav (中文散文) | 31.0s | 每当新年的钟声敲响的时候,我总会闭起眼睛... | 完全一致 | 100% | 25.5s | 28.5s |
结论:
python evaluate.py --beam-size 5 --output output/evaluation_results.jsonmanyspeech-npu/
├── inference.py # 推理脚本 (CPU + NPU 双后端)
├── evaluate.py # 精度/性能评测脚本
├── torch_decoder.py # PyTorch 解码器 (NPU 权重加载)
├── onnx_to_torch.py # ONNX → PyTorch 图转换器
├── README.md # 部署文档 (本文件)
├── requirements.txt # Python 依赖
├── models/ # 转换后的模型文件
│ ├── decoder_fp32.onnx # FP32 解码器 (去量化)
│ └── decoder_weights.npz # 解码器权重 (NumPy 格式)
└── output/ # 输出目录
└── evaluation_results.json # 评测结果音频输入 (WAV, 16kHz)
│
▼
音频预处理 (torch_npu / NumPy)
│ resample, normalize
▼
Encoder (ONNX Runtime)
│ speech → enc_out [1, T, 768]
▼
Beam Search Decoder
├── ONNX Decoder (per-step logits)
└── NPU Top-K + LogSoftmax (torch_npu 加速)
│
▼
S2T 解码 + 文本后处理
│
▼
识别文本输出由于 ONNX 模型使用了 INT8 动态量化算子 (DynamicQuantizeLinear, MatMulInteger),这些算子目前不被 ATC (Ascend Tensor Compiler) 和 onnx2torch 直接支持,因此采用混合推理策略:
NPU 适配路线图:
| 指标 | CPU (ONNX Runtime) | NPU (混合加速) |
|---|---|---|
| 平均推理时间 (3 files) | 98.92s | 106.61s |
| Encoder 平均耗时 | 1.28s | 7.85s |
| Decoder 平均耗时 | 97.37s | 98.68s |
| 实时率 RTF (17.4s 音频) | 15.33 | 16.47 |
| 内存占用 | ~2.5 GB | ~3.0 GB |
注: 当前 NPU 模式下的性能瓶颈在于 ONNX INT8 模型的 CPU 侧推理。后续将模型完全 FP32 化并通过 ATC 转换为 OM 格式后,预计可获得 2-5x 的纯 NPU 推理加速。
#NPU #Ascend910 #SpeechRecognition #DolphinASR #ONNX #torch_npu #CANN #ModelScope #ManySpeech #ASR
最后更新: 2026-05-18 | 昇腾 NPU 适配版本 v1.0