Thinker 鼾声检测示例

功能说明

本示例在 ARCS AP Core 上运行 Thinker 鼾声二分类模型,读取一个预量化的 int8 [1, 1, 64, 64] 测试张量,输出 no_snoringsnoring。 示例直接链接 Thinker 与 Luna,不依赖网络或 Host 侧 Python 环境。

硬件连接

无需外部连接,Thinker、Luna、PSRAM 和外部 NOR Flash 均为开发板资源。默认 测试数据已经完成音频特征提取和量化,本示例不包含麦克风采集或音频预处理。

示例步骤

  1. 从外部 Flash 将 snoring_net_64x64_quant_arcs.bin 复制到 PSRAM。

  2. 初始化 Luna、Thinker、DMA copy 和模型运行内存计划。

  3. 从外部 Flash 读取 input_thinker.bin,设置 int8 [1, 1, 64, 64] 输入张量。

  4. 调用 tForward() 执行推理,并从 int8 [1, 2] 输出中选择最高分标签。

  5. 输出两个类别的量化分数、推理耗时和最终检测结果。

资源布局

资源

Flash 偏移

默认 XIP 地址

大小

lnn_thinker_snoring_net.bin

0x000000

0x30000000

不超过 1 MiB

snoring_net_64x64_quant_arcs.bin

0x100000

0x30100000

0xD48C0

input_thinker.bin

0x200000

0x30200000

0x1000

编译

重要提示:编译前需要先确认当前示例支持的目标板型,然后将板型标识传给 -DBOARD。请按以下方式选择:

  1. 确认示例限制:查看当前示例 README 中的硬件连接和注意事项,确认是否限定板型。

  2. 参考示例配置:查看相关示例目录下的 sample.yaml,确认支持的板型。

  3. 填写板型标识:SDK 内置板型的标识为 boards/ 下的目录名。例如实际使用的板型目录为 boards/<板型名称>/,则编译参数填写为 -DBOARD=<板型名称>

在 SDK 根目录执行编译,并将命令中的 <示例路径><板型名称> 替换为实际值。

Linux 使用 build.sh

# 通用命令
./build.sh -C -S samples/<示例路径> -DBOARD=<板型名称>

# 示例:使用 arcs_evb 开发板
./build.sh -C -S samples/<示例路径> -DBOARD=arcs_evb

Windows PowerShell 使用 build.ps1

# 通用命令
.\build.ps1 -C -S samples/<示例路径> -DBOARD=<板型名称>

# 示例:使用 arcs_evb 开发板
.\build.ps1 -C -S samples/<示例路径> -DBOARD=arcs_evb

Note

确保已安装对应平台的工具链和 ListenAI 开发工具包。Windows 环境请先执行 .\env.ps1 或直接使用 .\build.ps1 自动加载环境。

注意事项-DBOARD 填写的是板型标识,不是芯片系列名称。如果示例有板型专用配置或额外编译参数,以示例 README 中的说明为准。

烧录

构建时 CMake 会将模型和测试输入复制到 build/,使用以下命令一次烧录三个镜像:

./tools/burn/cskburn -C arcs -s /dev/ttyACM0 -b 3000000 \
  0x0 build/lnn_thinker_snoring_net.bin \
  0x100000 build/snoring_net_64x64_quant_arcs.bin \
  0x200000 build/input_thinker.bin

烧录完成后设备自动复位;日志串口波特率为 921600。

预期输出

[I][snoring_net] Thinker version: 3.0.10
[I][snoring_net] memory plan: entries=... psram=... share=369152
[I][snoring_net] model ready: inputs=1 outputs=1
[I][snoring_net] scores: no_snoring=127 snoring=-128
[I][thinker_snoring] snoring result: label=no_snoring score=127

核心 API

API

说明

tGetMemoryPlan()

获取模型运行所需的 PSRAM 和 SHARE_MEM 内存计划。

tModelInit()

从 PSRAM 中的模型资源创建 Thinker 模型。

tCreateExecutor()

创建模型推理执行器。

tGetInputInfo()

获取并校验输入张量类型和形状。

tSetInput()

设置预量化的鼾声特征张量。

tForward()

执行一次鼾声分类推理。

tGetOutput()

获取两个类别的量化输出分数。

配置说明

CONFIG_THINKER_SNORING_NET_MODEL_ADDR=0x30100000
CONFIG_THINKER_SNORING_NET_MODEL_SIZE=0xD48C0
CONFIG_THINKER_SNORING_NET_INPUT_ADDR=0x30200000
CONFIG_THINKER_SNORING_NET_INPUT_SIZE=0x1000
CONFIG_THINKER_SNORING_NET_PSRAM_POOL_SIZE=0x10000
CONFIG_THINKER_SNORING_NET_SHARE_POOL_SIZE=0x5A200

注意事项

  1. 输入格式:模型只接受预量化 int8 [1, 1, 64, 64] 张量,不能直接输入 PCM 或 WAV 数据。

  2. 类别顺序:输出索引 0 为 no_snoring,索引 1 为 snoring

  3. 资源配套:模型与测试输入必须来自同一量化流程,替换资源后应重新确认输入 scale 和预期输出。

  4. Flash 布局:应用、模型和输入分别烧录,修改地址时必须同步更新 prj.conf 和烧录命令。

  5. 共享内存:模型需要 369152 字节 APRAM,减小 CONFIG_THINKER_SNORING_NET_SHARE_POOL_SIZE 会导致初始化失败。

  6. DMA channel:示例固定使用算法 DMA channel,和其他业务组合时需要重新评估 DMA 占用。