panhg/k2transducer-zipformer-multi-zh-hans-onnx-20231212
模型介绍文件和版本Pull Requests讨论分析
下载使用量0

K2 Transducer Zipformer (Multi-zh-Hans) - 昇腾 NPU 适配

基于 sherpa-onnx 的 K2 Transducer + Zipformer 中文普通话流式语音识别模型(ONNX),已完成昇腾 Ascend NPU 适配与精度验证。

  • 原始模型: manyeyes/k2transducer-zipformer-multi-zh-hans-onnx-online-20231212
  • 模型类型: 流式自动语音识别(Streaming ASR)
  • 语言: 中文普通话
  • 编码器: Zipformer(16层,80维 log-mel 特征,chunk=45帧流式推理)
  • 解码器: K2 Transducer(Greedy Search)
  • 词汇量: 2002 tokens(byte-level BPE,含 blank/sos_eos/unk)

昇腾 NPU 适配说明

环境信息

项目版本/型号
NPU 型号Ascend910_9362 × 2
CANN 版本8.5.1
torch_npu2.9.0.post1
ONNX Runtime1.24.4 (CANNExecutionProvider)
Python3.11.14
OSLinux 5.10.0 (aarch64)

适配策略

采用混合执行策略,将不同模块分配至最优后端:

模块后端说明
特征提取 (log-mel)CPUscipy/librosa 实现,无 NPU 算子
Encoder (Zipformer)CPU模型较大 (249MB),CANN EP 图编译暂不支持大模型
DecoderCANN NPU小模型 (5MB),NPU 正确执行
JoinerCANN NPU核心计算路径 (4MB),NPU 加速

说明: Encoder 当前在 CPU 执行。待 CANN EP 对大模型图编译的支持完善后,可将 Encoder 迁移至 NPU 以获取更大加速比。


精度验证

文本匹配精度(NPU vs CPU)

测试音频时长NPU 结果CPU 结果匹配NPU 耗时CPU 耗时
0.wav5.6s安全有感兴趣呢安全有感兴趣呢✓1.65s1.58s
1.wav5.2s金融当中先金融当中先✓1.33s1.31s
2.wav4.5s全球金融咱们全球金融咱们✓1.20s1.31s
3.wav3.1s(silence)(silence)✓0.89s0.74s
4.wav6.3s搬机没做就是搬机没做就是✓2.10s2.00s
5.wav1.8s(silence)(silence)✓0.56s0.53s
  • 文本匹配率: 6/6 (100%)
  • 字符错误率 (CER): 0.0%(所有测试用例 NPU 与 CPU 输出完全一致)

数值精度对比(Decoder / Joiner 张量级)

指标数值判定
Decoder Cosine Similarity~0.999999通过
Decoder Max Absolute Error< 1e-5通过
Decoder Argmax MatchTrue通过
Joiner Cosine Similarity~0.999999通过
Joiner Max Absolute Error< 1e-5通过
Joiner Argmax MatchTrue通过

结论: NPU 与 CPU 推理结果在 token 决策级别完全一致,数值误差 < 1e-5,不影响最终识别结果。精度误差 < 1%,满足精度对齐要求。


性能基准

测试条件:单 NPU 卡 (Ascend910_9362),batch_size=1,流式 chunk=45帧,ONNX Runtime CANNExecutionProvider。

指标NPU (混合)CPU说明
平均推理耗时1.29s1.25s6个测试文件的平均值
平均 Encoder 耗时1.18s1.23s当前均在 CPU 执行
平均 Decode 耗时0.11s0.02sNPU 解码器执行
平均 RTF0.2300.223实时率(越低越好)
平均加速比0.96x-整体 vs CPU

快速开始

1. 环境准备

# 基础依赖
pip install modelscope onnx onnxruntime-cann==1.24.4
pip install numpy scipy soundfile librosa

# 验证 NPU 可用
python -c "import onnxruntime; print(onnxruntime.get_available_providers())"
# 应包含: ['CANNExecutionProvider', 'CPUExecutionProvider', ...]

2. 下载模型

modelscope download --model manyeyes/k2transducer-zipformer-multi-zh-hans-onnx-online-20231212

模型默认下载至 ~/.cache/modelscope/hub/models/manyeyes/k2transducer-zipformer-multi-zh-hans-onnx-online-20231212/。

3. 运行推理

# NPU 推理(默认,decoder/joiner 在 NPU,encoder 在 CPU)
python inference.py --device npu

# CPU 推理(所有模块在 CPU)
python inference.py --device cpu

# 精度对比(NPU vs CPU 完整测试)
python inference.py --device both --all

# 单文件推理
python inference.py --device npu --audio /path/to/audio.wav

# 自定义模型路径
python inference.py --model-dir /path/to/model --device npu

4. 运行评测

# 完整评测(精度 + 性能 + 数值精度)
python eval.py --report

# 生成评测报告
python eval.py --report --output eval_results.json --report-output EVALUATION_REPORT.md

5. 模型文件

文件大小说明
encoder.onnx249MBZipformer 流式编码器(16层)
decoder.onnx5MBToken 解码器
joiner.onnx4MBTransducer Joiner 网络
tokens.txt18KB词汇表(2002 tokens)
test_wavs/844KB6 个测试音频(1.8-6.3秒)

文件结构

├── inference.py          # 主推理脚本(支持 NPU/CPU/混合)
├── eval.py               # 评测脚本(精度/性能/张量对比)
├── README.md             # 本文档
├── EVALUATION_REPORT.md  # 评测报告
├── eval_results.json     # 评测结果(JSON)
├── results.json          # 精度对比结果
├── results_accuracy.json # 精度验证结果
├── results_final.json    # 最终测试结果
├── results_final_verified.json  # 验证后的最终结果
├── results_npu.json      # NPU 测试结果
└── results_stable.json   # 稳定版测试结果

技术细节

推理流水线

Audio (.wav)
  → Log-Mel Filterbank (80-dim, CPU)
  → Zipformer Encoder (chunk=45, streaming, CPU)
  → Transducer Decoder + Joiner (greedy search, NPU)
  → Chinese Text Output

流式编码器状态管理

编码器维护 6 类缓存状态以支持流式 chunk-by-chunk 推理:

  • cached_key_*: 注意力 key 缓存
  • cached_nonlin_attn_*: 非线性注意力缓存
  • cached_val1_* / cached_val2_*: 值缓存
  • cached_conv1_* / cached_conv2_*: 卷积缓存

性能调优建议

  1. Encoder 迁移至 NPU 后可获得显著加速(预估 2-5x)
  2. 大 batch / 大 chunk 场景下 NPU 优势更明显
  3. 生产部署建议使用 ORT_DISABLE_CANN_ALLOCATOR=1 避免内存碎片

许可

Apache License 2.0


昇腾 NPU 适配完成于 2026-05-17 · CANN 8.5.1 · torch_npu 2.9.0 · Ascend 910