如何使用QNN Htp后端部署SenseVoice模型实现实时语音识别

SenseVoiceASR-QNN 项目文档

项目简介

SenseVoiceASR-QNN 是一个基于高通QNN SDK 2.37.0.250724版本的手动编译语音识别项目,该项目将SenseVoice预编译的QNN ONNX模型使用HTP后端进行部署,实现了高效的语音识别功能。项目支持实时语音检测和识别,适用于边缘计算和嵌入式设备场景。

功能特点

  • QNN加速: 基于高通QNN SDK 2.37.0.250724版本编译,支持HTP后端加速
  • 多语言支持: 支持中文(zh)、英文(en)、粤语(yue)、日语(ja)、韩语(ko)等多种语言
  • 实时语音检测: 集成VAD(语音活动检测)功能,能够实时检测语音段
  • 流式处理: 支持实时音频流处理,适用于对话场景
  • 文本规范化: 支持带ITN(withitn)和不带ITN(woitn)的文本规范化选项
  • 高性能: 使用量化模型,在边缘设备上实现低延迟推理

环境要求

硬件要求

  • 支持高通HTP加速的处理器
  • 音频输入设备

软件要求

  • 操作系统
PRETTY_NAME="Ubuntu 22.04.2 LTS"
NAME="Ubuntu"
VERSION_ID="22.04"
VERSION="22.04.2 LTS (Jammy Jellyfish)"
VERSION_CODENAME=jammy
ID=ubuntu
ID_LIKE=debian
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
UBUNTU_CODENAME=jammy
  • Python 3.10+
  • 高通QNN SDK 2.37.0.250724
  • 手动编译的onnxruntime-qnn

依赖库

项目依赖的主要Python库如下(完整列表见req.info文件):

onnxruntime-qnn==1.22.1
funasr==1.2.6
librosa==0.11.0
sounddevice==0.5.2
numpy==1.26.4
torch==2.8.0
torchaudio==2.8.0
transformers==4.55.0
sentencepiece==0.2.1

项目结构

SenseVoiceASR-QNN/
├── configs/                 # 配置文件目录
│   └── cfg.ini            # VAD参数配置
├── models/                 # 模型文件目录
│   ├── ASR/               # ASR模型
│   │   └── sensevoice-small-qnn-onnx/
│   │       ├── quant_model/    # 量化模型
│   │       ├── config.yaml     # 模型配置
│   │       ├── am.mvn          # CMVN参数
│   │       └── chn_jpn_yue_eng_ko_spectok.bpe.model
│   └── VAD/               # VAD模型
│       └── fsmn-vad/
├── funasr_onnx/           # FunASR ONNX实现
├── model_utils/           # 模型工具
├── model_infos/           # 模型信息
├── logs/                  # 日志文件
├── run.py                 # 主程序入口
└── req.info              # 依赖库列表

安装步骤

1. 环境准备

# 安装Python依赖
pip install -r req.info

# 设置QNN SDK环境变量, 编辑~/.bashrc, 添加如下内容
source /opt/qcom/qairt/2.37.0.250724/bin/envsetup.sh
export ADSP_LIBRARY_PATH=/usr/lib/rfsa/adsp:/opt/qcom/qairt/2.37.0.250724/lib/aarch64-oe-linux-gcc11.2
export QAIRT_SDK_ROOT=/opt/qcom/qairt/2.37.0.250724

2. 模型准备

确保以下模型文件存在:

  • ASR模型: ./models/ASR/sensevoice-small-qnn-onnx/quant_model/model.onnx
  • VAD模型: ./models/VAD/fsmn-vad/

3. 配置文件

编辑configs/cfg.ini文件,调整VAD参数:

[VAD_PARAMS]
decibel_thres=-100          # 分贝阈值
speech_noise_thres=0.6      # 噪声阈值
max_end_silence_time=800    # 最大结束静默时间
max_start_silence_time=3000 # 最大开始静默时间
speech_2_noise_ratio=1.0    # 语音与噪声比
speech_noise_thresh_low=-0.1 # 低噪声阈值
speech_noise_thresh_high=0.3 # 高噪声阈值

使用方法

1. 实时语音识别

运行主程序进行实时语音识别:

python run.py

程序将:
1.初始化音频设备
2.加载ASR和VAD模型
3.开始实时语音检测
4.对检测到的语音段进行识别
5.输出识别结果

2. 音频文件识别

使用SenseVoiceASR类识别音频文件:

from run import SenseVoiceASR
import logging

# 初始化模型
logger = logging.getLogger(__name__)
asr_model = SenseVoiceASR(logger, "./models/ASR/sensevoice-small-qnn-onnx/")

# 识别音频文件
result = asr_model.recognize_wav_file("test.wav", language="zh", textnorm="woitn")
print(f"识别结果: {result}")

3. 编程接口

SenseVoiceASR类
主要方法:

  • init(logger, model_dir, device=“qnn”, provider_options=[{}]): 初始化模型
  • recognize_wav_file(wav_path, language=“auto”, textnorm=“woitn”): 识别音频文件
  • recognize_wav(waveform, language=“auto”, textnorm=“woitn”): 识别音频数据
  • infer(feats, feats_len, language=“auto”, textnorm=“woitn”): 特征推理

支持的语言选项

  • auto: 自动检测语言
  • zh: 中文
  • en: 英文
  • yue: 粤语
  • ja: 日语
  • ko: 韩语
  • nospeech: 无语音

文本规范化选项

  • withitn: 带ITN(逆文本规范化)
  • woitn: 不带ITN

模型信息

ASR模型

  • 模型名称: SenseVoice Small
  • 输入形状: [1, 300, 560]
  • 输出形状: [1, 304, 25055]
  • 特征维度: 560
  • 序列长度: 300
  • 词汇表大小: 25055
  • 量化: INT8量化

输入输出

输入:

  • speech: [1, 300, 560] - 音频特征
  • speech_lengths: [1] - 特征长度
  • language: [1] - 语言ID
  • textnorm: [1] - 文本规范化ID

输出:

  • ctc_logits: [1, 304, 25055] - CTC输出
  • encoder_out_lens: [1] - 编码器输出长度

VAD模型

  • 模型: FSMN-VAD
  • 版本: v2.0.4
  • 设备: CPU

性能优化

1. QNN加速

项目使用高通QNN SDK进行加速:

provider_options = [
    {
        'backend_path': f'{os.environ["QNN_SDK_ROOT"]}/lib/aarch64-oe-linux-gcc11.2/libQnnHtp.so',
    }
]
asr_model = SenseVoiceASR(logger, model_path, device="qnn", provider_options=provider_options)

2. 音频处理优化

  • 重采样: 自动将音频重采样到16kHz
  • 特征提取: 使用FBank特征 + LFR + CMVN
  • 流式处理: 支持实时音频流处理

运行日志

程序运行日志保存在logs/run.log文件中,包含:

  • 设备信息
  • 模型加载状态
  • 语音检测结果
  • ASR识别结果
  • 错误信息
2025-09-08 07:24:52,094 - __main__ - INFO - 静态模型加载成功: models/ASR/sensevoice-small-qnn-onnx/quant_model/model.onnx
2025-09-08 07:24:52,094 - __main__ - INFO - 模型输入形状: [batch_size, seq_len, feat_dim] = [1, 300, 560]
2025-09-08 07:24:52,125 - __main__ - INFO - ▶开始语音检测...
2025-09-08 07:25:03,446 - __main__ - INFO - ASR Result: 喂你好

运行结果

在这里插入图片描述

故障排除

常见问题

1. QNN SDK路径错误
export QNN_SDK_ROOT=/opt/qcom/qairt/2.37.0.250724
2. 音频设备不可用
  • 检查音频设备连接
  • 确认设备权限
3. 模型文件缺失
  • 确认模型文件路径正确
  • 检查模型文件完整性

调试模式

启用详细日志:

import logging
logging.basicConfig(level=logging.DEBUG)

贡献

本项目需付费使用,欢迎在公众号“CrazyNET”留言

联系方式

源码获取

公众号回复“sensevoice-qnn”

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值