基于 FunASR Paraformer-large 中文语音识别模型在华为昇腾 NPU (Ascend 910) 上的适配、推理与评测。
| 项目 | 说明 |
|---|---|
| 模型名称 | Paraformer-large (Chinese ASR) |
| 基础模型 | iic/speech_paraformer-large_asr_nat-zh-cn-16k-common-vocab8404-pytorch |
| 模型类型 | BiCifParaformer (端到端非自回归语音识别) |
| 应用场景 | 中文语音识别 (ASR) |
| 输入 | 16kHz 单声道 WAV 音频 |
| 输出 | 中文文本(无标点) |
| 词表大小 | 8404 tokens |
| 参数量 | ~220M |
| 模型大小 | 840MB (FP32) |
| 框架 | FunASR 1.3.1 + PyTorch 2.9.0 |
| 组件 | 版本 |
|---|---|
| OS | Linux (openEuler / Ubuntu) aarch64 |
| Python | 3.11.14 |
| CANN (Ascend Toolkit) | 8.5.1 |
| torch | 2.9.0 |
| torch_npu | 2.9.0.post1 |
| funasr | 1.3.1 |
| onnxruntime | 1.26.0 |
| soundfile | 0.12+ |
| numpy | 1.26+ |
| 硬件 | 规格 |
|---|---|
| NPU | 华为 Ascend 910 (Atlas 800 A2) |
| 显存 | ≥ 8GB HBM (推荐 16GB+) |
| 内存 | ≥ 16GB |
# 安装依赖
pip install torch torch_npu funasr modelscope soundfile numpy onnxruntime
# 下载模型
python3 -c "
from modelscope import snapshot_download
snapshot_download('iic/speech_paraformer-large_asr_nat-zh-cn-16k-common-vocab8404-pytorch')
snapshot_download('manyeyes/paraformer-seaco-large-zh-timestamp-onnx-offline')
"标准 Paraformer (PyTorch + NPU 推理):
~/.cache/modelscope/hub/models/iic/speech_paraformer-large_asr_nat-zh-cn-16k-common-vocab8404-pytorch/SeacoParaformer (ONNX + CPU 推理):
~/.cache/modelscope/hub/models/manyeyes/paraformer-seaco-large-zh-timestamp-onnx-offline/本项目支持两种推理路径:
| 路径 | 引擎 | 设备 | 说明 |
|---|---|---|---|
| NPU 推理 | FunASR + torch_npu | Ascend 910 | 推荐,性能最优 |
| CPU 推理 | ONNX Runtime / FunASR CPU | CPU | 基准/对比 |
python3 inference.py --audio <audio.wav> --model <model_dir> --device npupython3 inference.py --audio <audio.wav> --model <model_dir> --device cpupython3 inference.py \
--audio sample_chinese.wav \
--model ~/.cache/modelscope/hub/models/iic/speech_paraformer-large_asr_nat-zh-cn-16k-common-vocab8404-pytorch \
--device npu输出示例:
Device: npu
Audio: 4.523s
Text: 欢迎大家来到么哒社区进行体验
Token count: 15
Total: 0.471s
RTF: 0.104from funasr.auto.auto_model import AutoModel
import soundfile as sf
# 加载模型
model = AutoModel(
model="iic/speech_paraformer-large_asr_nat-zh-cn-16k-common-vocab8404-pytorch",
device="npu:0",
)
# 加载音频
audio, sr = sf.read("audio.wav", dtype="float32")
# 推理
result = model.generate(input=audio)
print(result[0]["text"])使用同一 FunASR Paraformer 模型,分别在 CPU 和 NPU 上运行推理,对比输出文本的字符错误率 (Character Error Rate, CER)。
| 指标 | CPU (x86) | NPU (Ascend 910) | 结果 |
|---|---|---|---|
| 识别文本 | 欢迎大家来到么哒社区进行体验 | 欢迎大家来到么哒社区进行体验 | 一致 |
| CER | - | 0.000000 | ✅ PASS < 1% |
| 文本匹配 | - | 100% | ✅ 完全一致 |
结论: NPU 推理与 CPU 推理输出完全一致,精度误差为 0%,满足 < 1% 的精度要求。
| 指标 | CPU | NPU (Ascend 910) | 提升 |
|---|---|---|---|
| 平均延迟 (s) | 0.9981 | 0.4724 | 2.11x |
| 标准差 (s) | 0.0052 | 0.0018 | 2.89x 更稳定 |
| 最小延迟 (s) | 0.9891 | 0.4707 | 2.10x |
| 最大延迟 (s) | 1.0074 | 0.4763 | 2.11x |
| RTF | 0.2207 | 0.1044 | 2.11x |
| 吞吐量 (inf/s) | 1.00 | 2.12 | 2.12x |
onnxruntime 1.26.0 包含 CANNExecutionProvider (CANN EP),但在当前模型上存在兼容性问题:
| 模式 | 状态 | 错误 |
|---|---|---|
| Graph 模式 | ❌ | aclgrphParseONNXFromMem 解析失败 |
| Single-op 模式 | ❌ | aclopCompileAndExecute(BroadcastToD) GE 失败 |
解决方案: 使用 FunASR + torch_npu 作为 NPU 推理路径,经测试精度一致、性能更优。
| 文件 | 说明 |
|---|---|
inference.py | 推理脚本 (支持 CPU/ONNX/NPU 多后端) |
README.md | 部署文档与评测报告 (本文件) |
accuracy_results.json | 精度评测数据 |
benchmark_results.json | 性能评测数据 |
sample_chinese.wav | 测试音频样本 |
@inproceedings{gao2023funasr,
title={FunASR: A Fundamental End-to-End Speech Recognition Toolkit},
author={Gao, Zhifu and Zhang, Shiliang and others},
booktitle={INTERSPEECH},
year={2023}
}
@article{gao2020paraformer,
title={Paraformer: Fast and Accurate Parallel Transformer for Non-autoregressive End-to-End Speech Recognition},
author={Gao, Zhifu and Zhang, Shiliang and others},
journal={arXiv:2006.01713},
year={2020}
}