Thinker 按键录音降噪对比示例

功能说明

本示例在 arcs_evb 的 ARCS AP Core 上运行完整音频降噪链路。按下开发板 KEY1 后,设备录制 3 秒 48 kHz 单声道 PCM16 音频,逐个 480 点帧提取 42 维音频特征并调用 Thinker 量化模型生成 22 个频带增益,随后依次播放原始 录音和降噪结果,便于直接试听比较。

模型输入为 int8 [1, 42],输入量化采用 floor(feature * 4 + 0.5);模型输出为 int8 [1, 22],按 16 反量化后执行 Sigmoid。两项 scale 均来自当前模型资源,不能替换为其他模型的 固定值。

硬件连接

本示例仅支持 arcs_evb,需要连接以下板载资源:

  • KEY1GPIOB_06,通过 ADC_CH4 检测按键电压;

  • 麦克风:使用 MIC0 差分输入;

  • 扬声器:连接开发板扬声器接口;

  • 烧录和日志:连接开发板烧录 Type-C 接口。

GPIOB_06 的 ADC 复用使用 AON 功能索引 3。按键判定阈值为 600 mV, 软件连续采样 3 次进行消抖。

处理流程

  1. 初始化 LISA Audio、LISA ADC、Luna、Thinker 和模型运行内存。

  2. 等待 KEY1 按下,录制 3 秒 48 kHz 单声道 PCM16 音频。

  3. 将录音按 480 点(10 ms)分帧,执行特征提取、Thinker 推理和频谱增益处理。

  4. 播放原始录音。

  5. 间隔 500 ms 后播放降噪录音。

  6. 等待按键释放并重新进入可触发状态。

资源布局

应用和模型资源需要分别烧录:

资源

Flash 偏移

默认 XIP 地址

大小

lnn_thinker_audio_denoise.bin

0x000000

0x30000000

不超过 1 MiB

denoise_arcs.bin

0x100000

0x30100000

0x14750 (83,792 字节)

编译

重要提示:编译前需要先确认当前示例支持的目标板型,然后将板型标识传给 -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 会把模型复制到构建目录。使用以下命令同时烧录应用和模型:

./tools/burn/cskburn -C arcs -s /dev/ttyACM0 -b 3000000 \
  0x0 build/lnn_thinker_audio_denoise.bin \
  0x100000 build/denoise_arcs.bin

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

操作方法

  1. 确认麦克风和扬声器已连接,扬声器音量处于安全范围。

  2. 启动设备并等待 ready; press KEY1 日志。

  3. 按下 KEY1 后对麦克风说话,录音持续 3 秒。

  4. 等待降噪进度完成,先试听原始录音,再试听降噪录音。

  5. 释放并再次按下 KEY1 可重复完整链路。

预期输出

[I][denoise_model] model ready: input=int8[1,42] output=int8[1,22]
[I][audio_denoise] ready; press KEY1 (PB06) to record 3 seconds
[I][audio_denoise] KEY1 pressed: ... mV
[I][audio_denoise] step 1/4: recording 3 seconds at 48000 Hz
[I][audio_denoise] recording complete: samples=...
[I][audio_denoise] step 2/4: denoising ... frames
[I][audio_denoise] denoise progress: .../... frames
[I][audio_denoise] step 3/4: original audio
[I][audio_denoise] original audio playback complete
[I][audio_denoise] step 4/4: denoised audio
[I][audio_denoise] denoised audio playback complete
[I][audio_denoise] comparison complete; press KEY1 to run again

核心 API

API

说明

lisa_adc_read()

读取 KEY1 的 ADC 电压并判断按下状态。

lisa_audio_record_start() / lisa_audio_record_stop()

启动和停止固定时长录音。

rnnoise_process_frame()

对一个 480 点 PCM 帧执行特征提取、频带增益和波形重建。

tForward()

对 42 维量化特征执行一次 Thinker 模型推理。

lisa_audio_play_write() / lisa_audio_play_flush()

写入并等待原始或降噪 PCM 播放完成。

配置说明

CONFIG_THINKER_AUDIO_DENOISE_MODEL_ADDR=0x30100000
CONFIG_THINKER_AUDIO_DENOISE_MODEL_SIZE=0x14750
CONFIG_THINKER_AUDIO_DENOISE_PSRAM_POOL_SIZE=0x18000
CONFIG_THINKER_AUDIO_DENOISE_SHARE_POOL_SIZE=0x1000
CONFIG_PSRAM_HEAP_SIZE=0x140000

两段 3 秒 PCM 缓冲区共占 576,000 字节 PSRAM。DSP 工作区和音频驱动缓冲区 同样使用 PSRAM;降噪任务的大栈也放在 PSRAM,避免占满片上 SRAM。

效果验收

本示例的现场录音没有与之严格时间对齐的无噪 clean 真值,因此主要用于完整 链路和主观试听验收,不能仅凭两次播放计算 PESQ、STOI 或 SI-SDR。

验收时至少确认:

  1. 每次按键只触发一次完整链路,录音、推理和两次播放均无异常日志。

  2. 原始与降噪播放长度一致,无明显断裂、溢出、削波或异常静音。

  3. 在稳定噪声场景中,第二段播放的背景噪声应减弱,同时语音保持可懂。

  4. 连续触发多轮后无内存分配失败、设备忙或音频 DMA 错误。

注意事项

  1. 按键专用:本示例按 arcs_evbKEY1 电阻网络设置阈值,其他板型需要重新核对原理图和 soc/arcs/pinmux.yaml

  2. 固定采样率:DSP 帧长 480 对应 48 kHz 下的 10 ms,不能只修改录音采样率而不修改整套特征流程。

  3. 模型配套:替换 denoise_arcs.bin 时必须同步更新模型尺寸、输入/输出形状和量化 scale。

  4. 非实时链路:示例先完成整段录音和离线降噪,再执行对比播放,不是边录边播的实时降噪实现。

  5. 增益安全:首次试听应从较低扬声器音量开始,避免近距离麦克风与扬声器产生啸叫。