weixin_43499674/UniASR-NPU
模型介绍文件和版本Pull Requests讨论分析
下载使用量0

UniASR 语音识别模型 - 昇腾 NPU 适配

ModelScope Ascend CANN Python License

标签: #NPU #Ascend #ASR #语音识别 #UniASR


模型介绍

UniASR 是阿里巴巴达摩院推出的离线流式一体化端到端语音识别模型。该模型同时具有高精度和低延迟的特点,通过共享编码器结构,统一了流式与离线语音识别系统架构。

模型架构

  • 模型类型: Two-pass (两遍解码) 端到端语音识别
  • 编码器: SAN-M (Memory Equipped Self-Attention),35层
  • 解码器: SCAMA (Streaming Chunk-Aware Multihead Attention),12层
  • 参数量: 104,652,032 (~1.05亿)
  • 词汇量: 8,358 中文字符
  • 采样率: 16kHz
  • 原始框架: TensorFlow 1.x (已转为 PyTorch 权重)

解码模式

模式说明
fast单遍解码,低延迟实时出字
normal两遍解码,实时出字 + 3~6s 后刷新修正
offline单遍解码,高精度离线模式

环境要求

组件版本
操作系统Linux (openEuler / CentOS / Ubuntu)
Python3.11+
昇腾硬件Ascend 910 / 910B (Atlas 800 A2/A3)
CANN8.5.1+
torch2.9.0
torch_npu2.9.0
funasr1.3.1
modelscope1.35.3

安装依赖

pip install torch==2.9.0 torch_npu==2.9.0
pip install funasr==1.3.1 modelscope
pip install soundfile pyyaml numpy

下载模型

python3 -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]

Python API

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.yamlfunasr 注册名
sanm_chunk_optSANMEncoderChunkOpt
fsmn_scama_optFsmnDecoderSCAMAOpt
cif_predictor_v2CifPredictorV2
specaug_lfrSpecAugLFR

精度评测

评测方法

以 CPU (ARM64) 推理结果为基线,对比 NPU 推理结果与基线的偏差。评测维度:

维度方法要求
编码器输出一致性余弦相似度 (Cosine Similarity)≥ 0.9999
编码器输出误差平均绝对误差 (MAE) + 相对误差相对误差 < 1%
最终 ASR 文本字符级完全匹配100% 一致
解码路径对数概率一致性NPU vs CPU 一致

测试环境

项目基线设备 (CPU)适配设备 (NPU)
硬件ARM64 CPUAscend 910 (npu:0)
框架PyTorch 2.9.0torch_npu 2.9.0
CANN-8.5.1
精度float32float32
测试音频asr_example.wav (5.6s, 16kHz)同基线
解码模式offline (2-pass)同基线

精度对比结果

指标CPU 基线NPU 输出偏差判定
Encoder1 余弦相似度1.000000001.00000060+6.0e-7PASS
Encoder2 余弦相似度1.000000001.00000060+6.0e-7PASS
Encoder1 MAE03.03e-04-PASS
Encoder2 MAE01.52e-05-PASS
Encoder1 相对误差-0.023%0.023%PASS (<1%)
Encoder2 相对误差-0.029%0.029%PASS (<1%)
ASR 输出文本与基线一致与基线一致0字符差异PASS
文本匹配率-100%0% CERPASS

结论

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
平均 RTF0.243
最小 RTF0.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}
}