panhg/k2transducer-zipformer-ja-onnx-offline-reazonspeech-20240801
模型介绍文件和版本Pull Requests讨论分析
下载使用量0

K2Transducer Zipformer Japanese ASR (NPU Adapted)

基于昇腾 NPU 适配的日语离线语音识别模型。

  • 原模型: manyeyes/k2transducer-zipformer-ja-onnx-offline-reazonspeech-20240801
  • 架构: K2 Zipformer Transducer (Encoder + Stateless Decoder + Joiner)
  • 任务: 日语离线语音识别 (Automatic Speech Recognition)
  • NPU 适配: Ascend 910B (CANN 8.5.1 + torch_npu 2.9.0)

模型架构

组件参数量输入输出NPU 后端
Encoder~70Mfbank [B,T,80]encoder_out [B,T',512]ONNX Runtime
Decoder~267Ktoken context [B,2]decoder_out [B,512]torch_npu (NPU)
Joiner~2.7Menc+dec [B,512]x2logit [B,5224]torch_npu (NPU)

环境要求

组件版本
CANN8.5.1
torch_npu2.9.0.post1
Python3.11
onnxruntime1.26.0
onnx2pytorch0.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 --npu

Python API

from 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。

评测数据 (5条日语语音)

样本时长CPU CERNPU CERCPU-NPU 差异
1.wav13.4s5.97%5.97%0.00%
2.wav3.6s33.33%33.33%0.00%
3.wav4.8s13.64%13.64%0.00%
4.wav12.5s18.97%18.97%0.00%
5.wav5.4s3.12%3.12%0.00%

汇总

指标值
平均 CPU CER15.01%
平均 NPU CER15.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.603s0.574s1.05x
Decoder 平均耗时0.499s0.992s0.50x
总平均耗时1.127s1.575s0.72x
平均 RTF0.10720.1569-

注: 由于 Decoder (267K) 和 Joiner (2.7M) 属于轻量级模型,在 NPU 上每步推理需要 CPU-to-NPU-to-CPU 数据传输,传输开销超过计算加速收益。Encoder (70M) 仍使用 ONNX Runtime CPU 后端,是性能瓶颈所在。后续通过 ATC 工具链将 Encoder 转换为 OM 模型可获得更显著的 NPU 加速。


交付件清单

文件说明
inference.pyNPU 推理脚本 (支持 CPU/NPU 双模式)
eval_precision.py精度评测脚本
eval_performance.py性能评测脚本
precision_report.json精度评测报告
performance_report.json性能评测报告
README.md部署文档与评测报告

NPU 适配方案说明

  1. Encoder: 保持 ONNX Runtime CPU 后端。原计划使用 ATC 工具转换为 OM 模型部署到 NPU,但 ONNX 模型中包含 If 控制流算子,CANN 8.5.1 ATC 暂不支持。Encoder 已在 ONNX Runtime 启用全图优化,性能接近最优。

  2. Decoder + Joiner: 通过 onnx2pytorch 将 ONNX 模型转换为 PyTorch 模块,部署到 NPU (torch_npu)。需注意 Ascend NPU 不支持 INT64 输入,需在数据传输前转换为 INT32。

  3. Greedy Search: 实现了标准的 RNN-T transducer greedy search 解码,支持滑动窗口上下文管理。

已知限制

  • Encoder (70M 参数) 当前运行在 CPU,是整个流水线的性能瓶颈
  • Decoder/Joiner 在 NPU 上因传输开销,实际慢于 CPU 推理
  • 模型输出不包含标点符号和特殊格式字符

后续优化方向

  • 将 Encoder ONNX 通过算子适配后使用 ATC 转换为 OM 模型部署到 NPU
  • 对 Decoder/Joiner 进行算子融合优化减少 NPU kernel launch 次数
  • 批处理 (batching) 多个解码步骤以减少 CPU-NPU 传输次数

致谢

  • k2-fsa/sherpa-onnx - 推理框架参考
  • reazonspeech - 训练数据
  • 华为昇腾 NPU 团队 - CANN 工具链与硬件支持

License

Apache 2.0