panhg/speech_sanm_kws_phone-xiaoyun-commands-offline
模型介绍文件和版本Pull Requests讨论分析
下载使用量0

SANM KWS(关键词识别)- 昇腾NPU适配

模型概述

本模型是iic/speech_sanm_kws_phone-xiaoyun-commands-offline的NPU适配版本,这是一款基于FunASR项目的SANM(带记忆的自注意力网络)架构开发的移动端级中文关键词识别模型。

该模型支持38个中文命令关键词,涵盖多种场景(唤醒词、音乐、导航、智能家居和通用命令),并已在华为昇腾NPU上验证通过,准确率与CPU参考值相差在1%以内。

关键规格

项目数值
模型架构SANM(6层编码器 + CTC)
参数数量3.28M
输入16kHz单声道WAV
特征40维Fbank + LFR(m=7,n=6)
输出2602-token CTC对数概率
解码方式CTC贪婪解码
支持关键词38个(唤醒词 + 多场景命令)

支持的关键词

  • 唤醒词:小云小云, 你好小云, 你好问问, 嗨小问
  • 音乐:播放音乐, 增大音量, 减小音量, 继续播放, 暂停播放, 上一首, 下一首, 单曲循环, 随机模式, 列表循环
  • 导航:取消导航, 退出导航, 放大地图, 查看全程, 缩小地图, 不走高速, 躲避拥堵, 避免收费, 高速优先
  • 智能家居:返回桌面, 睡眠模式, 蓝牙模式, 打开灯光, 关闭灯光, 打开空调, 关闭空调, 拍照拍照, 我要拍照
  • 通用:上一页, 下一页, 上一个, 下一个, 换一批, 打开录音, 关闭录音

昇腾NPU适配

环境

组件版本
CANN8.5.1
PyTorch2.9.0+cpu
torch_npu2.9.0.post1
FunASR1.3.1
Python3.11
NPU设备Ascend910_9362(Atlas 800 A2)

适配策略

该模型是标准的PyTorch模型(FunASR SanmKWS)。NPU适配通过torch_npu将计算迁移至昇腾设备:

  1. 模型加载:通过FunASR AutoModel在CPU上加载SANM KWS模型
  2. NPU迁移:调用model.to("npu:0")将所有参数和缓冲区迁移至昇腾NPU
  3. 特征提取:音频前端(Fbank + LFR + CMVN)在CPU上运行
  4. 推理:编码器 + CTC分类器在NPU上执行,并使用torch.npu.synchronize()进行计时
  5. 解码:将对数概率传输回CPU后,在CPU上进行CTC贪婪解码

无需自定义算子或修改计算图——通过torch_npu的PyTorch算子映射,模型可直接在昇腾NPU上运行。


精度验证

方法

通过以下指标将 CPU 参考推理与 NPU 推理进行比较:

  • 解码文本匹配:CTC 贪婪解码文本是否完全一致
  • 关键词检测匹配:关键词存在检测结果是否一致
  • 余弦相似度:输出张量的方向相似度
  • 角度误差:1 - cosine_similarity 的百分比(阈值 <0.01%)
  • 平均相对误差:逐元素的相对差异

结果(测试音频:"小云小云" 唤醒词)

指标数值状态
解码文本 CPU你好我小云小云-
解码文本 NPU你好我小云小云-
解码文本匹配TruePASS
关键词匹配True (小云小云)PASS
CTC 余弦相似度0.99998474PASS
CTC 角度误差0.0015%PASS (<0.01%)
编码器余弦相似度0.99952179-
编码器角度误差0.0478%-

总体精度:PASS(CTC 角度误差 0.0015% < 0.01% 阈值)


性能基准测试

基准测试配置:5 次预热运行 + 100 次计时运行,测量编码器+CTC 推理。

指标CPUNPU加速比
平均延迟17.58 ms6.42 ms2.74x
标准差0.17 ms0.05 ms-
最小延迟17.31 ms6.34 ms2.73x
最大延迟18.21 ms6.54 ms2.78x

快速开始

安装

# Install dependencies
pip install torch torch_npu funasr modelscope soundfile scipy

# The model will be auto-downloaded from ModelScope on first use

推理

# Basic NPU inference
python inference.py --audio test_audio.wav --keywords "小云小云" --device npu

# With benchmark
python inference.py --audio test_audio.wav --keywords "小云小云,你好小云" --device npu --benchmark

# CPU mode
python inference.py --audio test_audio.wav --keywords "小云小云" --device cpu

准确率评估

# Compare NPU vs CPU accuracy + benchmark
python evaluate.py --audio test_audio.wav --keywords "小云小云" --benchmark

Python API

from inference import KWSInference

# Initialize on NPU
engine = KWSInference(keywords="小云小云,播放音乐", device="npu")

# Run inference
result = engine.infer("audio.wav")
print(result["decoded_text"])       # "你好我小云小云"
print(result["keyword_matches"])    # {"小云小云": True, "播放音乐": False}

文件

文件描述
inference.py基于 Python API 的 NPU 推理脚本
evaluate.py精度评估(CPU 与 NPU 对比)及性能基准测试
outputs/evaluation_result.json精度对比结果
outputs/benchmark_result.json性能基准测试结果
logs/运行日志目录
test_audio.wav示例音频(“小云小云”唤醒词,时长 4.53 秒)

局限性

  • SANM 编码器采用分组卷积(深度卷积)和多头注意力机制,尽管通过 torch_npu 能在昇腾 NPU 上正确运行,但中间激活值与 CPU 相比可能存在浮点差异(编码器角度误差为 0.05%)。CTC 输出层将这些差异压缩至可忽略的水平(角度误差 0.0015%)。
  • 特征提取(Fbank + LFR + CMVN)在 CPU 上运行,因为 kaldi-native-fbank 后端尚无 NPU 实现。
  • 已在单个音频文件上进行测试,未对批量推理吞吐量进行基准测试。

引用

@inproceedings{Gao2020SANMME,
  title={SAN-M: Memory Equipped Self-Attention for End-to-End Speech Recognition},
  author={Zhifu Gao and Shiliang Zhang and Ming Lei and Ian Mcloughlin},
  booktitle={Interspeech},
  year={2020},
}