Rhino Pi-X1 部署 AidVoice SDK + SenseVoiceSmall(附音频文件转写)

azouyana 2026-09-22 11:05:26

本文基于 APLUX 官方文档《流式 ASR 识别 (Linux)》的部署思路,在 Rhino Pi-X1(AidLux / Ubuntu 22.04) 上完成 AidVoice SDK + SenseVoiceSmall 语音识别环境部署,并把官方「麦克风实时识别」示例延伸为「音频文件转写」实战。
文中全部命令均在真机验证通过,识别效果与耗时数据为实测结果。


1. 背景与目标

  • 目标:在边缘设备上跑通语音识别(ASR),把一段 16 kHz 单声道录音转写为文字。
  • 方案:
    • AidVoice SDK —— APLUX 自研的端侧语音推理 SDK(ASR / TTS),提供 C++ 与 Python 两套接口;
    • SenseVoiceSmall —— 多语种语音识别模型(中、英、粤、日、韩),经 QNN 量化编译后端侧 NPU(HTP)推理。
  • 整体链路:
 音频文件 (16kHz / 单声道 / 16bit PCM WAV)
        │  asr.write(wav)
        ▼
 AidVoice SDK(libaidvoice_speech.so)
        │  QNN HTP 硬件加速
        ▼
 SenseVoiceSmall(model_htp.bin.aidem)
        │  回调 onResult / onStop
        ▼
 识别文本(TYPE_FINAL 为定稿结果)

2. 环境与版本

项目版本 / 型号说明
设备Rhino Pi-X1(Qualcomm KalamaP / QCS8550)aarch64
系统Ubuntu 22.04.2 LTS(AidLux)内核 5.15.148
AidVoice SDK1.4.2(安装包 1.4.2.81)C++ / Python 双接口
AidLite 运行时2.5.0.284 + QNN248aidvoice-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)。


3. 部署步骤

3.1 安装 AidVoice SDK

# 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**。

3.2 下载 SenseVoiceSmall 模型

# 查看模型广场中 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 实际可下载的版本为准。

3.3 拷贝并编译示例代码

# 拷贝示例到工作目录(便于修改与二次开发)
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(音频路径)参数,无需改代码。

3.4 识别音频文件(非流式,推荐)

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

3.5 流式识别(逐字输出)

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 结果为准,或对音频做尾部裁剪。


4. 音频格式要求与转换

模型输入要求:单声道 / 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

5. 实测结果

输入: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,满足实时转写需求。


6. 与官方文档的差异 & 踩坑记录

  1. 依赖包版本不同:官方文档安装 aidlite-qnn236;aidvoice-sdk 1.4.2 实际依赖 **aidlite-qnn248**。安装前务必用 sudo aid-pkg show aidvoice-sdk 确认 DependsApps 字段。
  2. 模型后端版本更新:文档使用 -b qnn2.31;当前模型广场仅提供 **QNN2.40**(mms list 可查)。实测 QNN2.40 模型 + QNN248 运行时兼容可用。
  3. 安装交互确认:aid-pkg install 检测到需安装依赖时会提示 [y/n],等待输入时表现为“卡住”。脚本化可用:
    printf 'y\n' | sudo aid-pkg install aidvoice-sdk --without-progress。
  4. 无需修改源码路径:示例支持 -m / -a 参数,跳过官方文档中“改代码里的模型路径”一步。
  5. 尾部噪声伪输出:音频尾部带噪时,回调会多出一条短结果(如 The.)。以 TYPE_FINAL 为准即可;也可先做静音/裁剪处理。
  6. Python 导入名坑:安装的是 pyaidvoice 包,导入时写 from aidvoice_speech import ...。
  7. 日志过滤:运行输出夹杂底层日志(rpcmem、DMA-BUF 等)属正常现象,可过滤:
    ... 2>&1 | grep -v -E "rpcmem|DMA-BUF"。

7. FAQ

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 音频),可满足实时场景。


8. 附录:命令速查

# —— 环境 ——
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

test_meeting.wav 475.96K

...全文
63 回复 打赏 收藏 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

7,720

社区成员

发帖
与我相关
我的任务
社区描述
本论坛以AI、IoT、PC 、XR、Auto等核心板块组成,为开发者提供便捷及高效的学习和交流平台。 高通开发者专区主页:https://qualcomm.csdn.net/
物联网人工智能开源 企业社区 北京·东城区
社区管理员
  • csdnsqst0050
  • chipseeker
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧