标签: #NPU #Ascend #ASR #语音识别 #UniASR
UniASR 是阿里巴巴达摩院推出的离线流式一体化端到端语音识别模型。该模型同时具有高精度和低延迟的特点,通过共享编码器结构,统一了流式与离线语音识别系统架构。
| 模式 | 说明 |
|---|---|
fast | 单遍解码,低延迟实时出字 |
normal | 两遍解码,实时出字 + 3~6s 后刷新修正 |
offline | 单遍解码,高精度离线模式 |
| 组件 | 版本 |
|---|---|
| 操作系统 | Linux (openEuler / CentOS / Ubuntu) |
| Python | 3.11+ |
| 昇腾硬件 | Ascend 910 / 910B (Atlas 800 A2/A3) |
| CANN | 8.5.1+ |
| torch | 2.9.0 |
| torch_npu | 2.9.0 |
| funasr | 1.3.1 |
| modelscope | 1.35.3 |
pip install torch==2.9.0 torch_npu==2.9.0
pip install funasr==1.3.1 modelscope
pip install soundfile pyyaml numpypython3 -c "from modelscope import snapshot_download; snapshot_download('iic/speech_UniASR_asr_2pass-zh-cn-16k-common-vocab8358-tensorflow1-offline', cache_dir='./')"python3 inference.py [audio.wav]from inference import UniASRNPU
# 初始化模型 (自动检测 NPU,不可用时回退 CPU)
model = UniASRNPU()
# 语音识别
result = model.transcribe("audio.wav")
print(result['text']) # 识别文本
print(result['rtf']) # 实时率
print(result['time_seconds']) # 推理时间python3 inference.py iic/speech_UniASR_asr_2pass-zh-cn-16k-common-vocab8358-tensorflow1-offline/example/asr_example.wav输出示例:
============================================================
UniASR NPU Inference Result
============================================================
Text: 欢迎大家来体验达摩院推出的语音识别模型
Time: 1.353s
Audio: 5.6s
RTF: 0.2425
Device: npu:0
============================================================该模型原始为 TensorFlow 1.x frozen graph (model.pb),实际文件是 ZIP 压缩的 PyTorch 权重 (已由达摩院预转换)。适配方案:
| 步骤 | 内容 |
|---|---|
| 1. 组件名映射 | 将 config.yaml 中的旧组件名映射到 funasr 1.3.1 注册名 |
| 2. 模型构建 | 使用 funasr UniASR PyTorch 类构建模型 |
| 3. 权重加载 | 1103/1103 键 100% 匹配,零丢失 |
| 4. NPU 部署 | 通过 torch_npu 将模型迁移至 Ascend NPU |
| config.yaml | funasr 注册名 |
|---|---|
sanm_chunk_opt | SANMEncoderChunkOpt |
fsmn_scama_opt | FsmnDecoderSCAMAOpt |
cif_predictor_v2 | CifPredictorV2 |
specaug_lfr | SpecAugLFR |
以 CPU (ARM64) 推理结果为基线,对比 NPU 推理结果与基线的偏差。评测维度:
| 维度 | 方法 | 要求 |
|---|---|---|
| 编码器输出一致性 | 余弦相似度 (Cosine Similarity) | ≥ 0.9999 |
| 编码器输出误差 | 平均绝对误差 (MAE) + 相对误差 | 相对误差 < 1% |
| 最终 ASR 文本 | 字符级完全匹配 | 100% 一致 |
| 解码路径 | 对数概率一致性 | NPU vs CPU 一致 |
| 项目 | 基线设备 (CPU) | 适配设备 (NPU) |
|---|---|---|
| 硬件 | ARM64 CPU | Ascend 910 (npu:0) |
| 框架 | PyTorch 2.9.0 | torch_npu 2.9.0 |
| CANN | - | 8.5.1 |
| 精度 | float32 | float32 |
| 测试音频 | asr_example.wav (5.6s, 16kHz) | 同基线 |
| 解码模式 | offline (2-pass) | 同基线 |
| 指标 | CPU 基线 | NPU 输出 | 偏差 | 判定 |
|---|---|---|---|---|
| Encoder1 余弦相似度 | 1.00000000 | 1.00000060 | +6.0e-7 | PASS |
| Encoder2 余弦相似度 | 1.00000000 | 1.00000060 | +6.0e-7 | PASS |
| Encoder1 MAE | 0 | 3.03e-04 | - | PASS |
| Encoder2 MAE | 0 | 1.52e-05 | - | PASS |
| Encoder1 相对误差 | - | 0.023% | 0.023% | PASS (<1%) |
| Encoder2 相对误差 | - | 0.029% | 0.029% | PASS (<1%) |
| ASR 输出文本 | 与基线一致 | 与基线一致 | 0字符差异 | PASS |
| 文本匹配率 | - | 100% | 0% CER | PASS |
NPU 推理精度与 CPU 基线完全一致 (文本匹配 100%,特征余弦相似度 > 0.999999,相对误差 < 0.03%),远优于 1% 的适配精度要求。
运行精度评测:
python3 eval/accuracy_test.py [audio.wav]| 指标 | 值 |
|---|---|
| 设备 | Ascend 910 (npu:0) |
| 模型参数 | 104,652,032 |
| 测试音频时长 | 5.6s |
| 平均推理时间 | 1.353s |
| 平均 RTF | 0.243 |
| 最小 RTF | 0.241 |
| 推理加速比 (vs CPU) | ~1.5x |
RTF (Real-Time Factor) = 推理时间 / 音频时长,值越小性能越好。RTF < 1.0 表示可实时处理。
运行性能评测:
python3 eval/performance_test.py├── inference.py # 推理脚本 (Python API + CLI)
├── README.md # 本文档
├── eval/ # 评测材料
│ ├── accuracy_test.py # 精度评测 (NPU vs CPU)
│ ├── performance_test.py # 性能评测 (RTF/延迟/吞吐)
│ ├── accuracy_results.json # 精度评测结果 (自动生成)
│ └── performance_results.json # 性能评测结果 (自动生成)
└── iic/ # 模型文件 (从 ModelScope 下载)
└── speech_UniASR_.../模型遵循 Apache License 2.0。原始模型版权归阿里巴巴达摩院所有。
@inproceedings{gao2020universal,
title={Universal ASR: Unifying Streaming and Non-Streaming ASR Using a Single Encoder-Decoder Model},
author={Gao, Zhifu and Zhang, Shiliang and Lei, Ming and McLoughlin, Ian},
booktitle={arXiv preprint arXiv:2010.14099},
year={2020}
}