SenseVoice-QNN-ONNX模型C++部署

SenseVoiceASR-QNN C++实现

项目概述

SenseVoiceASR-QNN是一个基于C++实现的实时语音识别系统,使用SenseVoice模型和ONNX Runtime进行推理,支持Qualcomm QNN加速。该系统实现了完整的语音活动检测(VAD)和自动语音识别(ASR)流程,可从音频设备实时采集音频并进行识别。

功能模块

1. 配置文件读取

  • 支持从configs/cfg.ini读取配置参数
  • 支持不同节的配置读取
  • 支持多种数据类型(字符串、整数、浮点数、布尔值)
  • 实现了默认值机制,提高代码健壮性

2. SenseVoiceASR-QNN模型

  • 支持ONNX Runtime推理
  • 支持Qualcomm QNN加速
  • 实现了完整的模型加载和初始化
  • 支持多种语言和文本规范化选项
  • 实现了特征提取和CTC解码

3. VAD功能

  • 实现了VAD模型封装
  • 支持基于配置文件的参数初始化
  • 实现了语音活动检测
  • 支持有效语音段管理
  • 实现了VAD状态跟踪和超时处理

4. 音频处理

  • 基于PortAudio的音频输入流
  • 支持指定设备ID的音频采集
  • 支持WAV文件加载(多种格式)
  • 支持音频重采样
  • 支持特征提取和分贝计算

项目结构

SenseVoiceASR-QNN-CPP/
├── include/                    # 头文件目录
│   ├── config_reader.h         # 配置文件读取
│   ├── sensevoice_asr.h        # ASR模型
│   ├── vad.h                   # VAD功能
│   └── audio_processing.h      # 音频处理(PortAudio集成)
├── src/                        # 源文件目录
│   ├── config_reader.cpp       # 配置文件读取实现
│   ├── sensevoice_asr.cpp      # ASR模型实现
│   ├── vad.cpp                 # VAD功能实现
│   └── audio_processing.cpp    # 音频处理实现
├── main.cpp                    # 主程序入口
├── CMakeLists.txt              # CMake构建文件
├── onnxruntime                 # onnxruntime库目录 --> 基于QNN SDK 2.38.0版本
├── kaldi-native-fbank          # kaldi-native-fbank库目录
├── models                      # 模型目录
│   ├── ASR                     # ASR模型
│   └── VAD                     # VAD模型
├── configs/                    # 配置文件目录
│   └── cfg.ini                 # 系统配置
└── README_C.md                 # C++实现说明文档

如何获取源码?

kaldi-native-fbank重编, 目前该库是X86_64版本, 其他版本请根据实际情况修改

cd kaldi-native-fbank
cd build
make clean
cmake ..
make -j$(nproc)

依赖库

必需依赖

库名版本要求用途获取方式
C++17C++17或更高语言标准编译器支持
CMake3.28.3或更高构建工具CMake官网
PortAudioportaudio-2.0音频输入PortAudio官网

必选依赖

库名版本要求用途获取方式
Qualcomm QNN SDK2.38.0或更高QNN加速Qualcomm开发者网站

编译步骤

1. 安装依赖

Windows
# 使用vcpkg安装PortAudio
vcpkg install portaudio

# 下载并安装ONNX Runtime
# 从官网下载Windows版本并解压
Linux
# 安装PortAudio
sudo apt-get install libportaudio2 portaudio19-dev

# 下载并安装ONNX Runtime
# 从官网下载Linux版本并解压

2. 配置CMake

编辑CMakeLists.txt文件,根据实际情况配置依赖库路径:

# 配置ONNXRuntime(如果系统未自动找到)
target_include_directories(sensevoice_asr PRIVATE /path/to/onnxruntime/include)
target_link_libraries(sensevoice_asr PRIVATE /path/to/onnxruntime/lib/onnxruntime.lib)

# 配置PortAudio(如果系统未自动找到)
target_include_directories(sensevoice_asr PRIVATE /path/to/portaudio/include)
target_link_libraries(sensevoice_asr PRIVATE /path/to/portaudio/lib/portaudio.lib)

3. 编译项目

cd build
./auto_build.sh

运行程序

1. 配置环境变量

如果使用QNN加速,需要设置QNN SDK根目录:

Windows
set QNN_SDK_ROOT=C:\path\to\qnn_sdk
Linux
source /opt/qcom/qairt/2.38.0.250901/bin/envsetup.sh

2. 运行程序

# 在build目录下运行
cd build
cp -rf ../configs ./
cp -rf ../models ./
./sensevoice_asr

3. 配置音频设备

程序会自动列出可用音频设备,默认使用设备ID 0。可以在main.cpp中修改device_id变量来指定使用的设备:

const int device_id = 0;  // 修改为所需设备ID

配置文件说明

配置文件位于configs/cfg.ini,主要包含VAD相关参数:

参数名类型默认值说明
decibel_thresfloat-100.0分贝阈值
speech_noise_thresfloat0.6噪声阈值
max_end_silence_timefloat800.0最大结束静默时间(ms)
max_start_silence_timefloat3000.0最大开始静默时间(ms)
speech_2_noise_ratiofloat1.0语音与噪声比
speech_noise_thresh_lowfloat-0.1低噪声阈值
speech_noise_thresh_highfloat0.3高噪声阈值

使用示例

1. 实时音频识别

// 初始化PortAudio
if (!AudioProcessing::initialize_portaudio()) {
   std::cerr << "PortAudio初始化失败,程序退出" << std::endl;
   return 1;
}

// 创建音频输入流
AudioInputStream audio_stream(device_id, sample_rate, 1, chunk_size * chunk_slider);

// 开始音频流
if (!audio_stream.start()) {
   std::cerr << "音频流启动失败,程序退出" << std::endl;
   AudioProcessing::terminate_portaudio();
   return 1;
}

// 持续读取和处理音频
while (true) {
    std::vector<float> audio_data;
    int frames_read = audio_stream.read(audio_data);
    
    if (frames_read > 0) {
        // 处理音频数据(重采样、VAD、ASR等)
        // ...
    }
}

// 清理资源
audio_stream.stop();
AudioProcessing::terminate_portaudio();

2. 加载WAV文件

// 加载WAV文件
int sample_rate;
std::vector<float> waveform = AudioProcessing::load_wav("test.wav", sample_rate);

// 进行ASR识别
std::string result = asr_model.recognize_wav(waveform, "auto", "woitn");
std::cout << "识别结果: " << result << std::endl;

注意事项

  1. PortAudio配置

    • 确保PortAudio库已正确安装或配置
    • 在Windows上可能需要安装ASIO驱动以获得更好的性能
  2. ONNX Runtime配置

    • 确保使用与模型兼容的ONNX Runtime版本
    • 对于QNN加速,需要使用支持QNN的ONNX Runtime版本
  3. 模型文件

    • 确保模型文件路径正确
    • 模型文件应包含:quant_model/model.onnx、config.yaml、am.mvn、tokenizer文件
  4. 音频设备权限

    • 在Linux上可能需要添加用户到audio组
    • 在Windows上可能需要管理员权限
  5. 性能优化

    • 可以调整chunk_sizechunk_slider参数来平衡延迟和性能
    • 对于资源受限设备,可以减少线程数或降低采样率

故障排除

1. PortAudio初始化失败

  • 检查PortAudio库是否正确安装
  • 检查音频设备是否被其他程序占用
  • 尝试使用不同的音频设备ID

2. 模型加载失败

  • 检查模型文件路径是否正确
  • 检查ONNX Runtime版本是否与模型兼容
  • 检查模型文件是否完整

3. 识别结果为空

  • 检查音频输入是否正常
  • 调整VAD参数,降低decibel_thres或调整speech_noise_thres
  • 检查音频设备音量是否合适

4. 程序崩溃

  • 检查是否存在内存泄漏
  • 检查是否有无效指针访问
  • 检查是否有数组越界

扩展建议

  1. 添加更多音频输入支持

    • 支持更多音频格式
    • 支持网络音频流
    • 支持音频文件录制
  2. 优化识别性能

    • 实现更高效的特征提取
    • 优化CTC解码算法
    • 实现批处理推理
  3. 添加更多功能

    • 支持实时字幕显示
    • 支持音频文件批量处理
    • 支持多语言识别切换
    • 支持文本后处理和格式化
  4. 改进用户界面

    • 添加图形化界面
    • 支持配置参数实时调整
    • 添加识别结果可视化

许可证

本项目基于MIT许可证开源,详情请参考项目根目录下的LICENSE文件。

联系方式

如有问题或建议,请通过以下方式联系:

源码获取

  • 公众号回复"sensevoiceqnncpp"获取源码

更新日志

v1.0.3

  • 初始版本
  • 实现了完整的语音识别流程
  • 支持PortAudio音频输入
  • 支持ONNX Runtime推理
  • 支持VAD检测和ASR识别
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值