基于华为昇腾 NPU (Ascend910) 适配的 FunASR-Nano 语音识别模型。原模型来自 FunAudioLLM/Fun-ASR-Nano-2512,ONNX 格式由 wuyangwang/funasr-nano 提供,sherpa-onnx 推理格式。
FunASR-Nano 是阿里达摩院 FunAudioLLM 团队发布的轻量级多语言语音识别模型,基于 SenseVoice 架构,支持 31 种语言 识别,并针对远场高噪声、中文方言、音乐背景等复杂场景进行了深度优化。
| 组件 | 版本 |
|---|---|
| CANN | 8.5.1 |
| PyTorch | 2.9.0 |
| torch_npu | - |
| Python | 3.11 |
| NPU 驱动 | 25.5.2 |
| NPU 型号 | Ascend910 (2x) |
| 项目 | 详情 |
|---|---|
| 模型架构 | SenseVoice CTC |
| 输入 | Fbank 特征 (80维) + LFR (m=7, n=6) → 560维 |
| 输出 | CTC logits (60515 tokens) |
| 模型格式 | ONNX (IR v7, Opset 13) |
| 参数量 | ~100M (Nano 版本) |
| 采样率 | 16kHz |
pip install modelscope onnxruntime onnx2torch torch_npu funasr soundfilemodelscope download --model wuyangwang/funasr-nano# CPU 推理 (onnxruntime)
python inference.py --audio input.wav
# 完整基准测试 (CPU + NPU)
python inference.py --audio input.wav --benchmark --num-runs 10
# 生成测试音频并基准测试
python inference.py --generate-test --benchmark在 Ascend910 NPU 上进行模型推理精度验证,以 CPU (onnxruntime) 推理结果为基线。
| 指标 | 结果 | 要求 | 状态 |
|---|---|---|---|
| 平均绝对误差 (MAE) | 0.000111 | - | - |
| 最大绝对误差 | 0.005329 | - | - |
| 相对误差 | 0.0033% | < 1% | ✅ |
| 余弦相似度 | 0.99999976 | > 0.999 | ✅ |
| Top-1 Token 一致性 | 100.00% | > 99% | ✅ |
测试音频:5秒 16kHz 单声道 WAV,fbank 特征 83 帧,输入 shape [1, 83, 560]。
| 后端 | 平均延迟 | 最小延迟 | 最大延迟 | 标准差 |
|---|---|---|---|---|
| CPU (onnxruntime) | 1050.18 ms | 818.99 ms | 1292.54 ms | 153.98 ms |
| NPU (Ascend910) | 794.15 ms | 775.75 ms | 831.63 ms | 23.13 ms |
NPU 加速比:1.32x
NPU 推理不仅速度更快,且性能波动更小(标准差从 154ms 降至 23ms)。
Audio (.wav)
│
▼
[1] 音频加载 (16kHz, mono)
│
▼
[2] Fbank 特征提取 (80维, 帧长25ms, 帧移10ms)
│
▼
[3] LFR 帧堆叠 (m=7, n=6) → 560维
│
▼
[4] ONNX 模型推理 (CTC Encoder)
│ ├── CPU: onnxruntime
│ └── NPU: onnx2torch → torch_npu
▼
[5] CTC 贪婪解码
│
▼
识别文本本模型采用 onnx2torch 将 ONNX 模型转换为 PyTorch 模型,然后通过 torch_npu 在昇腾 NPU 上执行推理。
from onnx2torch import convert as onnx2torch_convert
import onnx
import torch
import torch_npu
# 加载 ONNX 模型
onnx_model = onnx.load("model.onnx")
torch_model = onnx2torch_convert(onnx_model)
# 移至 NPU
torch_model = torch_model.to("npu:0")
torch_model.eval()
# 推理
with torch.no_grad():
output = torch_model(input_tensor.to("npu:0"))funasr-nano/
├── inference.py # 主推理脚本 (CPU + NPU)
├── README.md # 本文档
├── output/
│ ├── benchmark_results.json # 基准测试结果
│ └── test_audio.wav # 测试音频
└── logs/ # 推理日志@misc{FunAudioLLM-Fun-ASR-Nano-2512,
title={Fun-ASR-Nano-2512},
author={FunAudioLLM Team, Alibaba DAMO Academy},
year={2025},
url={https://huggingface.co/FunAudioLLM/Fun-ASR-Nano-2512}
}本项目基于 Apache License 2.0 开源。
Model adapted for Huawei Ascend NPU. NPU tags verified on Ascend910 hardware.