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++17 | C++17或更高 | 语言标准 | 编译器支持 |
| CMake | 3.28.3或更高 | 构建工具 | CMake官网 |
| PortAudio | portaudio-2.0 | 音频输入 | PortAudio官网 |
必选依赖
| 库名 | 版本要求 | 用途 | 获取方式 |
|---|---|---|---|
| Qualcomm QNN SDK | 2.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_thres | float | -100.0 | 分贝阈值 |
| speech_noise_thres | float | 0.6 | 噪声阈值 |
| max_end_silence_time | float | 800.0 | 最大结束静默时间(ms) |
| max_start_silence_time | float | 3000.0 | 最大开始静默时间(ms) |
| speech_2_noise_ratio | float | 1.0 | 语音与噪声比 |
| speech_noise_thresh_low | float | -0.1 | 低噪声阈值 |
| speech_noise_thresh_high | float | 0.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;
注意事项
-
PortAudio配置
- 确保PortAudio库已正确安装或配置
- 在Windows上可能需要安装ASIO驱动以获得更好的性能
-
ONNX Runtime配置
- 确保使用与模型兼容的ONNX Runtime版本
- 对于QNN加速,需要使用支持QNN的ONNX Runtime版本
-
模型文件
- 确保模型文件路径正确
- 模型文件应包含:quant_model/model.onnx、config.yaml、am.mvn、tokenizer文件
-
音频设备权限
- 在Linux上可能需要添加用户到audio组
- 在Windows上可能需要管理员权限
-
性能优化
- 可以调整
chunk_size和chunk_slider参数来平衡延迟和性能 - 对于资源受限设备,可以减少线程数或降低采样率
- 可以调整
故障排除
1. PortAudio初始化失败
- 检查PortAudio库是否正确安装
- 检查音频设备是否被其他程序占用
- 尝试使用不同的音频设备ID
2. 模型加载失败
- 检查模型文件路径是否正确
- 检查ONNX Runtime版本是否与模型兼容
- 检查模型文件是否完整
3. 识别结果为空
- 检查音频输入是否正常
- 调整VAD参数,降低
decibel_thres或调整speech_noise_thres - 检查音频设备音量是否合适
4. 程序崩溃
- 检查是否存在内存泄漏
- 检查是否有无效指针访问
- 检查是否有数组越界
扩展建议
-
添加更多音频输入支持
- 支持更多音频格式
- 支持网络音频流
- 支持音频文件录制
-
优化识别性能
- 实现更高效的特征提取
- 优化CTC解码算法
- 实现批处理推理
-
添加更多功能
- 支持实时字幕显示
- 支持音频文件批量处理
- 支持多语言识别切换
- 支持文本后处理和格式化
-
改进用户界面
- 添加图形化界面
- 支持配置参数实时调整
- 添加识别结果可视化
许可证
本项目基于MIT许可证开源,详情请参考项目根目录下的LICENSE文件。
联系方式
如有问题或建议,请通过以下方式联系:
- 公众号: “CrazyNET”
- 邮箱:1145570610@qq.com
源码获取
- 公众号回复"sensevoiceqnncpp"获取源码
更新日志
v1.0.3
- 初始版本
- 实现了完整的语音识别流程
- 支持PortAudio音频输入
- 支持ONNX Runtime推理
- 支持VAD检测和ASR识别

被折叠的 条评论
为什么被折叠?



