基于昇腾 NPU 适配的日语离线语音识别模型。
| 组件 | 参数量 | 输入 | 输出 | NPU 后端 |
|---|---|---|---|---|
| Encoder | ~70M | fbank [B,T,80] | encoder_out [B,T',512] | ONNX Runtime |
| Decoder | ~267K | token context [B,2] | decoder_out [B,512] | torch_npu (NPU) |
| Joiner | ~2.7M | enc+dec [B,512]x2 | logit [B,5224] | torch_npu (NPU) |
| 组件 | 版本 |
|---|---|
| CANN | 8.5.1 |
| torch_npu | 2.9.0.post1 |
| Python | 3.11 |
| onnxruntime | 1.26.0 |
| onnx2pytorch | 0.5.3 |
| soundfile | >= 0.12 |
| numpy | >= 1.26 |
pip install onnxruntime onnx onnx2pytorch soundfile numpy# CPU 模式
python inference.py --model-dir . --audio test_wavs/1.wav
# NPU 模式 (Ascend 910B)
python inference.py --model-dir . --audio test_wavs/1.wav --npufrom inference import K2TransducerASR
# CPU 推理
asr = K2TransducerASR(".", use_npu=False)
result = asr.transcribe("audio.wav")
print(result["text"])
# NPU 推理
asr_npu = K2TransducerASR(".", use_npu=True)
result = asr_npu.transcribe("audio.wav")
print(result["text"])NPU 与 CPU 推理输出完全一致,精度对齐误差为 0。
| 样本 | 时长 | CPU CER | NPU CER | CPU-NPU 差异 |
|---|---|---|---|---|
| 1.wav | 13.4s | 5.97% | 5.97% | 0.00% |
| 2.wav | 3.6s | 33.33% | 33.33% | 0.00% |
| 3.wav | 4.8s | 13.64% | 13.64% | 0.00% |
| 4.wav | 12.5s | 18.97% | 18.97% | 0.00% |
| 5.wav | 5.4s | 3.12% | 3.12% | 0.00% |
| 指标 | 值 |
|---|---|
| 平均 CPU CER | 15.01% |
| 平均 NPU CER | 15.01% |
| CPU-NPU 精度差异 | 0.0000% |
| 精度阈值 | < 1.0% |
| 精度验证 | PASS |
注: CER 中约 15% 的误差来源于模型本身的标点符号/汉字假名差异,与 NPU 适配无关。 CPU 与 NPU 推理输出完全逐字符一致。
测试平台: Ascend 910B x2, CANN 8.5.1, 5条测试语音 x 3轮
| 指标 | CPU (ORT) | NPU (torch_npu) | 加速比 |
|---|---|---|---|
| Encoder 平均耗时 | 0.603s | 0.574s | 1.05x |
| Decoder 平均耗时 | 0.499s | 0.992s | 0.50x |
| 总平均耗时 | 1.127s | 1.575s | 0.72x |
| 平均 RTF | 0.1072 | 0.1569 | - |
注: 由于 Decoder (267K) 和 Joiner (2.7M) 属于轻量级模型,在 NPU 上每步推理需要 CPU-to-NPU-to-CPU 数据传输,传输开销超过计算加速收益。Encoder (70M) 仍使用 ONNX Runtime CPU 后端,是性能瓶颈所在。后续通过 ATC 工具链将 Encoder 转换为 OM 模型可获得更显著的 NPU 加速。
| 文件 | 说明 |
|---|---|
inference.py | NPU 推理脚本 (支持 CPU/NPU 双模式) |
eval_precision.py | 精度评测脚本 |
eval_performance.py | 性能评测脚本 |
precision_report.json | 精度评测报告 |
performance_report.json | 性能评测报告 |
README.md | 部署文档与评测报告 |
Encoder: 保持 ONNX Runtime CPU 后端。原计划使用 ATC 工具转换为 OM 模型部署到 NPU,但 ONNX 模型中包含 If 控制流算子,CANN 8.5.1 ATC 暂不支持。Encoder 已在 ONNX Runtime 启用全图优化,性能接近最优。
Decoder + Joiner: 通过 onnx2pytorch 将 ONNX 模型转换为 PyTorch 模块,部署到 NPU (torch_npu)。需注意 Ascend NPU 不支持 INT64 输入,需在数据传输前转换为 INT32。
Greedy Search: 实现了标准的 RNN-T transducer greedy search 解码,支持滑动窗口上下文管理。
Apache 2.0