7,720
社区成员
发帖
与我相关
我的任务
分享本文基于 APLUX 官方文档《流式 ASR 识别 (Linux)》的部署思路,在 Rhino Pi-X1(AidLux / Ubuntu 22.04) 上完成 AidVoice SDK + SenseVoiceSmall 语音识别环境部署,并把官方「麦克风实时识别」示例延伸为「音频文件转写」实战。
文中全部命令均在真机验证通过,识别效果与耗时数据为实测结果。
音频文件 (16kHz / 单声道 / 16bit PCM WAV)
│ asr.write(wav)
▼
AidVoice SDK(libaidvoice_speech.so)
│ QNN HTP 硬件加速
▼
SenseVoiceSmall(model_htp.bin.aidem)
│ 回调 onResult / onStop
▼
识别文本(TYPE_FINAL 为定稿结果)
| 项目 | 版本 / 型号 | 说明 |
|---|---|---|
| 设备 | Rhino Pi-X1(Qualcomm KalamaP / QCS8550) | aarch64 |
| 系统 | Ubuntu 22.04.2 LTS(AidLux) | 内核 5.15.148 |
| AidVoice SDK | 1.4.2(安装包 1.4.2.81) | C++ / Python 双接口 |
| AidLite 运行时 | 2.5.0.284 + QNN248 | aidvoice-sdk 依赖 aidlite-qnn248>=2.5.0.284 |
| 模型 | SenseVoiceSmall FP16(qcs8550, QNN2.40) | 压缩包约 439 MB |
| 工具链 | aid-pkg / mms / cmake / make / ffmpeg | 系统自带 |
支持平台参考官方说明:Rhino Pi-X1(Ubuntu 22.04 / AidLux)。
# 1) 更新软件源
sudo aid-pkg update
# 2) 确保 AidLite 依赖就绪(本机已预装 aidlite-sdk / aidlite-qnn248,未装则执行)
sudo aid-pkg install aidlite-sdk
sudo aid-pkg install aidlite-qnn248
# 3) 查看 aidvoice-sdk 的依赖要求(关键步骤,版本以这里为准)
sudo aid-pkg show aidvoice-sdk
# Version: 1.4.2
# DependsApps: aidlite-qnn248>=2.5.0.284
# 4) 安装 AidVoice SDK
# 注意:遇到 "Some dependent package will be installed, do you want to continue? [y/n]" 需确认
printf 'y\n' | sudo aid-pkg install aidvoice-sdk --without-progress
安装完成后关键路径:
| 内容 | 路径 |
|---|---|
| C++ 头文件 | /usr/local/include/aidlux/aidvoice/aidvoice_speech.hpp |
| C++ 动态库 | /usr/local/lib/libaidvoice_speech.so |
| 示例代码 | /usr/local/share/aidvoice/examples/ |
| Python 模块 | /usr/local/lib/python3.10/dist-packages/aidvoice_speech |
验证安装:
python3 -c "from aidvoice_speech import get_py_library_version, get_library_version; \
print(get_py_library_version()); print(get_library_version())"
# Aidlux_AidVoice_Python_V1.4.2.81_54e98c9_20260827
# Aidlux_AidVoice_CPP_V1.4.2.81_54e98c9_20260827
运行时会打印
the device is licensed, with license ID: ...,表示设备授权校验通过,无需干预。
注:pip 包名为pyaidvoice,但 Python 导入名是 **aidvoice_speech**。
# 查看模型广场中 SenseVoiceSmall 可用版本(精度 / 芯片 / 后端)
mms list | grep -i sensevoice
# SenseVoiceSmall FP16 qcs8550 Qualcomm QCS8550 QNN2.40
# 下载(约 439 MB)并解压
mms get -m SenseVoiceSmall -p fp16 -c qcs8550 -b qnn2.40 -d /home/aidlux/sensevoicesmall
cd /home/aidlux/sensevoicesmall && unzip SenseVoiceSmall_qcs8550_fp16.zip
最终模型目录结构:
/home/aidlux/sensevoicesmall/models/QCS8550/FP16/
├── config.json
├── model_htp.bin.aidem # QNN HTP 编译产物(NPU 推理)
└── chn_jpn_yue_eng_ko_spectok.bpe.model # 多语种分词模型
⚠️ 后端版本对齐:模型广场当前仅提供
QNN2.40后端,而 SDK 依赖 QNN2.48 运行时;实测 QNN2.40 模型在 QNN248 运行时上可正常推理。
选择原则:模型后端版本 ≤ 运行时版本,且以mms list实际可下载的版本为准。
# 拷贝示例到工作目录(便于修改与二次开发)
cp -r /usr/local/share/aidvoice/examples /home/aidlux/aidvoice
# 编译 C++ 示例
cd /home/aidlux/aidvoice/examples/asr/cpp
mkdir -p build && cd build
cmake .. && make
编译产物(4 个可执行文件):
| 可执行文件 | 用途 |
|---|---|
test_asr_nostream | 非流式识别(提交整段音频,推荐) |
test_asr_stream | 流式识别(逐字输出) |
test_asr_microphone | 麦克风实时识别 |
test_asr_vector | 音频数据(vector)输入 |
官方文档中需手工修改源码里的模型路径(如
test_stream.cpp第 62 行);
实际上示例已内置-m(模型路径)/-a(音频路径)参数,无需改代码。
cd /home/aidlux/aidvoice/examples/asr/cpp/build
./test_asr_nostream \
-m /home/aidlux/sensevoicesmall/models/QCS8550/FP16 \
-a /home/aidlux/2026_9_22_ASR/test_meeting.wav
Python 版本(二选一):
cd /home/aidlux/aidvoice/examples/asr/python
python3 test_asr_nostream.py \
-m /home/aidlux/sensevoicesmall/models/QCS8550/FP16 \
-a /home/aidlux/2026_9_22_ASR/test_meeting.wav
python3 test_asr_stream.py \
-m /home/aidlux/sensevoicesmall/models/QCS8550/FP16 \
-a /home/aidlux/2026_9_22_ASR/test_meeting.wav
回调先输出 TYPE_PARTIAL(逐字递增的中间结果),最后输出 TYPE_FINAL(整句定稿),实测输出节选:
[ASR] id=9 status=TYPE_PARTIAL text='大家好,今天我们开会讨论一下项目进度,目前整体开发已经完成80%,下周需要。'
[ASR] id=15 status=TYPE_FINAL text='大家好,今天我们开会讨论一下项目进度,目前整体开发已经完成80%,下周需要完成第一版交付,请大家注意测试进度,按时提交代码。'
尾部噪声可能触发一条短促的伪结果(如
The.,多为 PARTIAL 状态),业务侧建议以TYPE_FINAL结果为准,或对音频做尾部裁剪。
模型输入要求:单声道 / 16 kHz / 16 bit PCM(WAV)。
# 查看音频参数(确认 16000 Hz、单声道)
ffprobe -v error -show_entries stream=codec_name,sample_rate,channels -of default=nw=1 input.wav
# 任意格式转 16k 单声道 WAV(推荐 ffmpeg)
ffmpeg -i input.mp3 -ar 16000 -ac 1 -acodec pcm_s16le output.wav
# 或使用 sox(官方文档用法)
sox input.wav -r 16000 -c 1 output16k.wav
输入:test_meeting.wav(16 kHz / 单声道 / 16 bit,15.2 s 中文会议语音)
识别结果(C++ / Python 两种方式结果一致):
大家好,今天我们开会讨论一下项目进度,目前整体开发已经完成80%,下周需要完成第一版交付,请大家注意测试进度,按时提交代码。
耗时统计(C++ 非流式,QNN HTP 加速):
| 阶段 | 耗时 |
|---|---|
| 模型初始化 | 0.54 s |
| 特征提取 | 0.07 s |
| Encoder 推理 | 0.15 s |
| 主线程总耗时 | 0.34 s |
15 秒音频全流程(含初始化)不到 1 秒,RTF 远小于 1,满足实时转写需求。
aidlite-qnn236;aidvoice-sdk 1.4.2 实际依赖 **aidlite-qnn248**。安装前务必用 sudo aid-pkg show aidvoice-sdk 确认 DependsApps 字段。-b qnn2.31;当前模型广场仅提供 **QNN2.40**(mms list 可查)。实测 QNN2.40 模型 + QNN248 运行时兼容可用。aid-pkg install 检测到需安装依赖时会提示 [y/n],等待输入时表现为“卡住”。脚本化可用:printf 'y\n' | sudo aid-pkg install aidvoice-sdk --without-progress。-m / -a 参数,跳过官方文档中“改代码里的模型路径”一步。The.)。以 TYPE_FINAL 为准即可;也可先做静音/裁剪处理。pyaidvoice 包,导入时写 from aidvoice_speech import ...。rpcmem、DMA-BUF 等)属正常现象,可过滤:... 2>&1 | grep -v -E "rpcmem|DMA-BUF"。Q1:sudo 需要密码,怎么在脚本里安装?
先交互执行一次 sudo -v 缓存凭据,再执行安装命令;或直接人工执行安装步骤。
Q2:如何确认模型可用版本?mms list | grep -i <模型名> 查看「精度 / 芯片 / 后端」三要素,下载参数与之一一对应即可。
Q3:支持哪些语种?
SenseVoiceSmall 覆盖中文、英文、粤语、日语、韩语;示例自带多语种样例音频(en / zh / ja / ko / ru / es / de)。
Q4:能不能接麦克风实时识别?
可以。参考官方流程:
lsusb # 确认 USB 麦克风
arecord -D plughw:1,0 -d 5 output.wav # 录音 5 秒
sudo ./test_asr_microphone -c # 查询麦克风设备 ID
sudo ./test_asr_microphone -m <模型路径> -i <设备ID> # 实时识别
如需麦克风能力,安装依赖:sudo apt install libpulse-dev libasound2-dev。
Q5:为什么结果分成多段?
非流式模式会按分片回调多次结果(id 递增),拼接所有 TYPE_FINAL 文本即为完整转写。
Q6:识别延迟怎么样?
本机实测:初始化约 0.5 s,推理约 0.15–0.4 s(15 s 音频),可满足实时场景。
# —— 环境 ——
sudo aid-pkg update # 更新软件源
sudo aid-pkg show aidvoice-sdk # 查依赖版本
printf 'y\n' | sudo aid-pkg install aidvoice-sdk # 安装 SDK
# —— 模型 ——
mms list | grep -i sensevoice # 查模型可用版本
mms get -m SenseVoiceSmall -p fp16 -c qcs8550 -b qnn2.40 -d <目标目录> # 下载
cd <目标目录> && unzip SenseVoiceSmall_qcs8550_fp16.zip # 解压
# —— 编译 ——
cp -r /usr/local/share/aidvoice/examples ~/aidvoice
cd ~/aidvoice/examples/asr/cpp && mkdir -p build && cd build && cmake .. && make
# —— 识别 ——
./test_asr_nostream -m <模型目录> -a <音频.wav> # C++ 非流式
python3 test_asr_nostream.py -m <模型目录> -a <音频.wav> # Python 非流式
python3 test_asr_stream.py -m <模型目录> -a <音频.wav> # Python 流式(逐字)
推荐工作目录结构:
~/aidvoice/
└── examples/
└── asr/
├── cpp/ # C++ 示例(build/ 为编译目录)
└── python/ # Python 示例
~/sensevoicesmall/
└── models/QCS8550/FP16/ # SenseVoiceSmall 模型(config.json + aidem + bpe)
参考:APLUX Doc Center《流式 ASR 识别 (Linux)》—— https://rhinopi.docs.aidlux.com/software/tutorial/voice-ai-dev/stream_aidvoice_linux