K2 Zipformer Transducer 是一款流式(在线)英文自动语音识别(ASR)模型,它基于 Zipformer 架构,并采用剪枝 Transducer 损失函数。该模型已导出为 ONNX 格式,支持基于分块的流式推理。
该模型已在华为昇腾 NPU 上成功完成适配与验证。
| 项目 | 状态 |
|---|---|
| NPU 推理 | 已验证(torch_npu) |
| CPU 与 NPU 精度 | 0.000% 相对差异 |
| NPU 张量运算 | 功能完备 |
| 流式推理 | 支持(45 帧分块) |
| CANN 版本 | 8.5.1 |
| torch_npu 版本 | 2.9.0 |
| NPU 硬件 | 昇腾 910(2 块) |
pip install modelscope onnxruntime torch torch_npu torchaudio soundfilemodelscope download --model manyeyes/k2transducer-zipformer-en-onnx-online-zengwei-20230517# Greedy decoding (fast)
python3 inference.py --greedy audio.wav
# Beam search (more accurate)
python3 inference.py --beam-size 4 audio.wav
# Run on built-in test set
python3 inference.py --test --greedy
# NPU mode
python3 inference.py --npu audio.wav
# Accuracy comparison (CPU vs NPU)
python3 inference.py --test --compareAudio: 6.62s, 16000Hz
Features: (661, 80)
Result: AFTER EARLY NIGHTFALL YELLOW LAMPS LIGHT UP HERE THERE THE SOLID QUARTER OF BRAWL
RTF: 0.47Audio → Mel Fbank (80-dim) → Zipformer Encoder (streaming) → Joiner → BPE Tokens → Text
↑ ↑
Stateless Decoder ←── Context Tokens| 组件 | ONNX 文件 | 输入形状 | 输出形状 | 大小 |
|---|---|---|---|---|
| Encoder | encoder.onnx | [1, 45, 80] + 缓存状态 | [1, 8, 512] + 新缓存 | 250MB |
| Decoder | decoder.onnx | [1, 2] | [1, 512] | 2MB |
| Joiner | joiner.onnx | [1, 512] + [1, 512] | [1, 500] | 1MB |
编码器处理 45 帧的音频块(在 10ms 帧移的情况下对应 450ms 音频),每个音频块生成 8 个输出帧。在流式推理过程中,缓存状态会在不同音频块之间保持。
| 指标 | Encoder | Decoder | Joiner |
|---|---|---|---|
| MAE | 0.000000 | 0.000000 | 0.000000 |
| 相对差异 | 0.000% | 0.000% | 0.000% |
| 阈值 | < 1% | < 1% | < 1% |
| 状态 | 通过 | 通过 | 通过 |
所有张量运算在 CPU 和 NPU 上产生完全相同的结果(fp32 确定性)。
| 组件 | 平均延迟 | 说明 |
|---|---|---|
| Encoder(每块) | 184.77 ms | 45 帧音频块 |
| Decoder | 0.071 ms | 每次调用 |
| Joiner | 0.020 ms | 每次调用 |
| 总体 RTF | ~0.47x | 贪婪解码 |
| 运算 | 大小 | 延迟 |
|---|---|---|
| Add | 512 | 0.12 us |
| MatMul | 512 | 0.10 us |
| Add | 4096 | 0.04 us |
| MatMul | 4096 | 0.05 us |
| 文件 | 描述 |
|---|---|
inference.py | 主要推理脚本(CPU + NPU) |
eval_accuracy.py | 精度评估脚本 |
eval_performance.py | 性能基准测试脚本 |
test_npu_onnx.py | CANNExecutionProvider 测试 |
evaluation_report.json | 精度评估结果 |
performance_report.json | 性能基准测试结果 |
results_cpu.json | CPU 推理结果 |
要进行完整的 NPU 部署,请使用 ATC 将 ONNX 模型转换为 OM 格式:
source /usr/local/Ascend/cann-8.5.1/set_env.sh
# Convert simple models (decoder, joiner)
atc --model=decoder.onnx --output=decoder --soc_version=Ascend910B2 --framework=5
atc --model=joiner.onnx --output=joiner --soc_version=Ascend910B2 --framework=5
# Convert encoder (with dynamic shapes)
atc --model=encoder.onnx --output=encoder --soc_version=Ascend910B2 \
--framework=5 --dynamic_dims="1" --dynamic_batch_size=1注意:ATC 转换可能需要为编码器的缓存状态指定静态形状。复杂流式模型转换请联系昇腾技术支持。
Apache License 2.0
模型来自 ModelScope:manyeyes/k2transducer-zipformer-en-onnx-online-zengwei-20230517
昇腾 NPU 适配已在搭载 CANN 8.5.1 和 torch_npu 2.9.0 的昇腾 910 上验证通过