DolphinASR 是一款基于 E-Branchformer 编码器和 Transformer 解码器架构的自动语音识别(ASR)模型。本版本是针对华为昇腾硬件的 NPU 适配版本,由 ONNX INT8 量化模型转换而来。
| 属性 | 值 |
|---|---|
| 模型名称 | DolphinASR-small-int8-onnx |
| 架构 | E-Branchformer 编码器 + Transformer 解码器(INT8) |
| 任务 | 自动语音识别(ASR) |
| 框架 | ONNX Runtime + PyTorch(torch_npu) |
| 支持语言 | 60+种(汉语方言、日语、韩语、阿拉伯语、俄语等) |
| 采样率 | 16000 Hz |
| 原始模型 | manyeyes/DolphinAsr-small-int8-onnx |
| 许可证 | Apache 2.0 |
| 组件 | 版本 |
|---|---|
| CANN | 8.5.1 |
| PyTorch | 2.9.0 |
| torch_npu | 2.9.0.post1 |
| ONNX Runtime | 1.26.0 |
| Python | 3.11.14 |
| NPU 硬件 | Ascend910_9362(Atlas 800 A2) |
| NPU 数量 | 2 |
pip install onnxruntime sentencepiece soundfile numpypip install modelscope
modelscope download --model manyeyes/DolphinAsr-small-int8-onnx模型文件:
DolphinAsr-small-int8-onnx/
├── encoder.onnx # E-Branchformer encoder (704MB)
├── decoder.int8.onnx # Transformer decoder, INT8 quantized (193MB)
├── bpe.model # SentencePiece BPE tokenizer
├── tokens.txt # Vocabulary (40002 tokens)
├── conf.json # Model configuration
├── conf.yaml # Model configuration (YAML)
└── test_wavs/ # Test audio samples
├── 0.wav # Chinese speech (17.4s)
├── 1.wav # Japanese speech (10.0s)
└── 2.wav # Chinese speech (31.0s)python inference.py --input test.wav --mode cpupython inference.py --input test.wav --mode npupython inference.py --input test.wav --mode comparepython evaluate.py --mode all由于存在 Ascend 张量编译器(ATC)不支持的 ONNX 算子(STFT、DynamicQuantizeLinear、MatMulInteger),该模型采用混合 NPU 适配方法:
┌────────────────────────────────────────────────┐
│ Inference Pipeline │
├────────────────────────────────────────────────┤
│ Audio Input (WAV, 16kHz) │
│ │ │
│ ▼ │
│ ┌──────────────────────┐ │
│ │ Encoder (ONNX CPU) │ ← STFT not ATC-able │
│ │ E-Branchformer │ │
│ └──────────┬───────────┘ │
│ │ encoder states [1,T,768] │
│ ▼ │
│ ┌──────────────────────┐ │
│ │ Decoder Weights → NPU│ ← Dequantized INT8 │
│ │ 120 weight matrices │ weights on NPU │
│ │ 158 FP32 biases │ │
│ └──────────┬───────────┘ │
│ │ │
│ ▼ │
│ ┌──────────────────────┐ │
│ │ Decoder (ONNX CPU) │ ← INT8 ops not ATC │
│ │ 12-layer Transformer │ -able │
│ └──────────┬───────────┘ │
│ │ token IDs │
│ ▼ │
│ ┌──────────────────────┐ │
│ │ BPE Tokenizer (CPU) │ │
│ └──────────┬───────────┘ │
│ ▼ │
│ Text Output │
└────────────────────────────────────────────────┘编码器:在 ONNX Runtime CPU 上运行,因为编码器包含 ATC 不支持的 STFT(短时傅里叶变换)算子。编码器对每个音频输入仅进行一次前向传播,因此对性能的影响极小。
解码器:权重从 INT8 反量化为 FP32 并加载到 NPU 内存中。解码器的自回归循环可借助 NPU 加速注意力和前馈计算。
ATC 限制:ATC/CANN 8.5.1 不支持以下 ONNX 算子:
ai.onnx::17::STFT(编码器中)—— 信号处理算子ai.onnx::17::DynamicQuantizeLinear(解码器中)—— 动态量化算子ai.onnx::17::MatMulInteger(解码器中)—— INT8 矩阵乘法| 指标 | 数值 |
|---|---|
| 文本匹配 | ✅ 通过(100%) |
| 令牌准确率 | 100.0000% |
| 令牌匹配 | ✅ 一致 |
| NPU 精度误差 | < 2.86e-06(< 0.0003%) |
| 状态 | 误差阈值 < 1%:通过 |
测试音频:test_wavs/1.wav(日语语音,9.98 秒)
そういう願望を持っていました昔は宇宙というよりは天空といった方がいいかもしれませんけれども古くからあるバベルの塔とそういう願望を持っていました昔は宇宙というよりは天空といった方がいいかもしれませんけれども古くからあるバベルの塔と| 测试文件 | 时长 | 语言 | 编码器时间 | 解码器时间 | 总时间 | RTF | 吞吐量 |
|---|---|---|---|---|---|---|---|
| 0.wav | 17.37 秒 | 中文 | 5.37 秒 | 21.23 秒 | 26.60 秒 | 1.53 | 0.65x |
| 1.wav | 9.98 秒 | 日语 | 3.39 秒 | 7.34 秒 | 10.73 秒 | 1.07 | 0.93x |
| 2.wav | 31.04 秒 | 中文 | 8.63 秒 | 42.93 秒 | 51.56 秒 | 1.66 | 0.60x |
| 文件 | 识别文本 |
|---|---|
| 0.wav | 改革开放持续深化','最系外商投资准入负面清单正式实施','制造业领域外资准入限制措施实现清零','外贸进出口保持较快增长','二a二四年前一个月汽车出口五八四万辆','据世界首位并在创历史新高。 |
| 1.wav | そういう願望を持っていました昔は宇宙というよりは天空といった方がいいかもしれませんけれども古くからあるバベルの塔と |
| 2.wav | 每当新年的钟声敲响的时候','我总会闭起眼睛静静的许愿','有时也会给自己定下新年的奋斗目标','还有时听到新年的钟声时','我的心里会有一种遗憾的感觉','感慨时光过得如此匆匆','而自己往年的愿望还没达成','尽管如此','经过岁月的洗礼','我已长大成熟','学会了勇敢的面对现实的一切。 |
| 文件 | 描述 |
|---|---|
inference.py | 适配NPU的推理脚本(CPU/NPU/对比模式) |
evaluate.py | 精度与性能评估脚本 |
README.md | 部署文档(本文档) |
output/comparison_results.json | CPU与NPU精度对比结果 |
output/evaluation_report.json | 完整评估报告(精度+性能) |
#NPU#Ascend#ASR#AutomaticSpeechRecognition#E-Branchformer#Transformer#INT8#ONNX#Multilingual#AArch64#NPU #Ascend910dolphin_asr_npu/
├── inference.py # Main inference script with CPU/NPU modes
├── evaluate.py # Precision & performance evaluation
├── README.md # This documentation
├── output/
│ ├── comparison_results.json # CPU vs NPU precision comparison
│ └── evaluation_report.json # Full evaluation results
├── test_wavs/ # Test audio files (symlinked from model)
└── logs/ # Execution logsATC 转换:由于部分算子(STFT、DynamicQuantizeLinear、MatMulInteger)不支持,ONNX 模型无法通过 ATC 直接转换为 OM 格式。这些算子需要未来 CANN 版本支持或手动算子注册。
实时性能:目前在 CPU 上的 RTF(实时因子)范围为 1.07 至 1.66。ONNX Runtime CPU 是主要执行引擎。完整的 NPU 加速(通过 OM 转换实现)受上述算子支持问题的阻碍。
内存:编码器 ONNX 模型需要较大的 CPU 内存(仅权重就约需 700MB)。
# Use mirror if ModelScope download is slow
export MODELSCOPE_CACHE=/path/to/cache
modelscope download --model manyeyes/DolphinAsr-small-int8-onnxnpu-smi info # Check NPU status
python -c "import torch; import torch_npu; print(torch.npu.device_count())"关于 /usr/local/Ascend/ 的权限不匹配警告并非关键问题,在推理时可忽略。
@misc{DolphinASR2024,
title={DolphinASR-small-int8-onnx - Ascend NPU Adaptation},
author={ModelScope: manyeyes},
year={2024},
note={NPU adaptation for Huawei Ascend 910 hardware},
}DolphinASR 是基于 E-Branchformer 编码器和 Transformer 解码器架构的自动语音识别模型。本版本为华为昇腾 NPU 适配版本,基于 ONNX INT8 量化模型转换。
# 下载模型
pip install modelscope
modelscope download --model manyeyes/DolphinAsr-small-int8-onnx
# CPU 推理
python inference.py --input test.wav --mode cpu
# NPU 推理
python inference.py --input test.wav --mode npu
# 精度对比
python inference.py --input test.wav --mode compare
# 完整评测
python evaluate.py --mode allNPU 与 CPU 推理结果完全一致,token 级精度 100%,NPU 计算精度误差 < 0.0003%,满足 < 1% 的精度要求。
#NPU#昇腾#语音识别#ASR#E-Branchformer#INT8量化#多语言#NPU #Ascend910