目录

ccf_audioevent

ccf_audioevent 是一个面向 openvela 的本地音频事件检测作品目录,核心目标是在 模拟器和 ESP32-S3-BOX-3 真机上运行 audio_event 应用,完成音频采集、特征提取、 TFLite Micro 推理和本地告警闭环。

目录结构

ccf_audioevent/
├── app/audio_event/                  # audio_event 应用源码
├── app/audio_test/                   # 麦克风 PCM 采集诊断工具
├── board/esp32s3-box-3/              # ESP32-S3-BOX-3 自定义板级适配
├── board/esp32s3-devkit/             # ESP32-S3 DevKit + INMP441 自定义板级适配
├── board/goldfish-arm64/configs/
│   └── audio_event/defconfig         # goldfish-arm64 模拟器配置源文件
├── scripts/                          # 构建、字体和 BOX-3 修复辅助脚本
└── readme.md                         # 本文档

应用源码最终需要映射到 openvela 工作区的 apps/examples/audio_event。 麦克风诊断工具最终需要映射到 apps/examples/audio_test。 模拟器配置最终需要出现在 vendor/openvela/boards/vela/configs/goldfish-audio_event。 ESP32-S3-BOX-3 板级代码最终需要映射到 vendor/espressif/boards/esp32s3/esp32s3-box-3。 ESP32-S3 DevKit + INMP441 板级代码最终需要映射到 vendor/espressif/boards/esp32s3/esp32s3-devkit

工作区软链接

在 openvela 工作区根目录执行以下命令,将 ccf_audioevent 中的源码挂到构建系统能找到 的位置。

ln -sfnT /home/arongw/openvela/ccf_audioevent/app/audio_event \
  /home/arongw/openvela/apps/examples/audio_event

ln -sfnT /home/arongw/openvela/ccf_audioevent/app/audio_test \
  /home/arongw/openvela/apps/examples/audio_test

mkdir -p /home/arongw/openvela/vendor/openvela/boards/vela/configs/goldfish-audio_event
rm -f /home/arongw/openvela/vendor/openvela/boards/vela/configs/goldfish-audio_event/defconfig
ln -sfn /home/arongw/openvela/ccf_audioevent/board/goldfish-arm64/configs/audio_event/defconfig \
  /home/arongw/openvela/vendor/openvela/boards/vela/configs/goldfish-audio_event/defconfig

ln -sfnT /home/arongw/openvela/ccf_audioevent/board/esp32s3-box-3 \
  /home/arongw/openvela/vendor/espressif/boards/esp32s3/esp32s3-box-3

ln -sfnT /home/arongw/openvela/ccf_audioevent/board/esp32s3-devkit \
  /home/arongw/openvela/vendor/espressif/boards/esp32s3/esp32s3-devkit

检查软链接:

readlink -f apps/examples/audio_event
readlink -f apps/examples/audio_test
readlink -f vendor/openvela/boards/vela/configs/goldfish-audio_event/defconfig
readlink -f vendor/espressif/boards/esp32s3/esp32s3-box-3
readlink -f vendor/espressif/boards/esp32s3/esp32s3-devkit

期望 apps/examples/audio_eventapps/examples/audio_testgoldfish-audio_event/defconfigesp32s3-box-3esp32s3-devkit 都指向 /home/arongw/openvela/ccf_audioevent/...

audio_test 是新增 example。apps/examples/Kconfig 是自动生成文件,先确保上面的 apps/examples/audio_test 软链接存在,再重新 configure 或构建,让 Kconfig 生成阶段自动 加入:

source "/home/arongw/openvela/apps/examples/audio_test/Kconfig"

如果刷新配置后仍看不到 CONFIG_EXAMPLES_AUDIO_TEST,优先检查软链接是否存在,而不是长期 手工维护 apps/examples/Kconfig

注意:goldfish-audio_event 目录本身必须保留为 vendor/openvela/boards/vela/configs/ 下的真实目录,只软链接其中的 defconfig 文件。不要把整个 goldfish-audio_event 目录软链接到 ccf_audioevent,否则非 CMake 构建会把它当成完整 board 路径,导致 File Make.defs could not be found

模拟器构建

goldfish-arm64 模拟器配置使用 openvela 的通用 vela board,因此最终配置路径放在:

vendor/openvela/boards/vela/configs/goldfish-audio_event/

推荐使用 CMake 构建:

./build.sh vendor/openvela/boards/vela/configs/goldfish-audio_event/ --cmake -j8

CMake 构建后,输出目录为:

cmake_out/vela_goldfish-audio_event/

运行模拟器:

./emulator.sh cmake_out/vela_goldfish-audio_event/

也可以使用 make 构建:

./build.sh vendor/openvela/boards/vela/configs/goldfish-audio_event/ -j8

make 构建后,产物主要在 nuttx/ 下;如果要用 emulator.sh,需要手动整理一个 out 目录:

mkdir -p cmake_out/vela_goldfish-audio_event
cp nuttx/.config cmake_out/vela_goldfish-audio_event/
cp nuttx/vela_*.bin cmake_out/vela_goldfish-audio_event/
cp ccf_audioevent/board/goldfish-arm64/configs/audio_event/config.ini \
  cmake_out/vela_goldfish-audio_event/
rm -f cmake_out/vela_goldfish-audio_event/nuttx
ln -s ../../nuttx/nuttx cmake_out/vela_goldfish-audio_event/nuttx

./emulator.sh cmake_out/vela_goldfish-audio_event/

config.ini 将 goldfish 显示固定为 320x240 横向模式,用于对齐 ESP32-S3-BOX-3 的小屏 UI。若之前已经启动过模拟器并生成了旧的 hardware-qemu.ini,需要重新启动模拟器;必要时删除旧的 cmake_out/vela_goldfish-audio_event/hardware-qemu.ini 后再启动。

进入 NSH 后可先验证应用是否注册:

nsh> help | grep audio_event
nsh> audio_event --model-smoke

模拟器更适合做模型加载、文件输入和 UI 基础验证。默认采集设备配置为 /dev/audio/pcm0c,如设备节点不存在,可优先使用文件模式:

nsh> audio_event --file /data/res/audio/cough_2.wav --repeat 100

真机构建

ESP32-S3-BOX-3 使用自定义 board:

vendor/espressif/boards/esp32s3/esp32s3-box-3/configs/audio_event/

构建命令:

./build.sh vendor/espressif/boards/esp32s3/esp32s3-box-3/configs/audio_event/ --cmake -j8

烧录并打开串口监视:

cd nuttx && make flash ESPTOOL_PORT=/dev/ttyACM0 ESPTOOL_BAUD=921600 && cd ..
picocom -b 115200 /dev/ttyACM0

如果开发板枚举为其他串口设备,请将 /dev/ttyACM0 替换为实际端口。

该配置启用 ES7210 麦克风初始化,并将 I2S1 RX 注册为:

/dev/audio/pcm_in1

烧录启动后可验证:

nsh> help | grep audio_event
nsh> audio_event --model-smoke
nsh> audio_event --device /dev/audio/pcm_in1 --audio-stats --once
nsh> audio_event --device /dev/audio/pcm_in1

ESP32-S3 DevKit + INMP441 构建

ESP32-S3-N16R8 开发板可以外接 INMP441 数字麦克风,使用独立的 custom board:

vendor/espressif/boards/esp32s3/esp32s3-devkit/configs/audio_event/

当前默认接线:

INMP441 ESP32-S3 GPIO 配置项
SCK / BCLK GPIO18 CONFIG_ESP32S3_I2S1_BCLKPIN=18
WS / LRCK GPIO17 CONFIG_ESP32S3_I2S1_WSPIN=17
SD / DOUT GPIO15 CONFIG_ESP32S3_I2S1_DINPIN=15

该配置启用 I2S1 RX,并将采集设备注册为:

/dev/audio/pcm_in1

构建命令:

./build.sh vendor/espressif/boards/esp32s3/esp32s3-devkit/configs/audio_event/ -j8

烧录并打开串口监视:

cd nuttx && make flash ESPTOOL_PORT=/dev/ttyACM0 ESPTOOL_BAUD=921600 && cd ..
picocom -b 115200 /dev/ttyACM0

启动后先验证命令是否注册:

nsh> help | grep audio
nsh> audio_test --device /dev/audio/pcm_in1 --channels 2 --seconds 5
nsh> audio_event --model-smoke
nsh> audio_event --device /dev/audio/pcm_in1 --audio-stats

如果 audio_testaudio_event --audio-stats 已经显示非零数据,说明 INMP441 到 ESP32-S3 I2S RX 的硬件链路基本打通。若统计长期接近满幅,例如 min=-32768max 接近 32767rms 长期在 13000 以上,同时模型稳定输出 background,通常不是模型问题,而是应用仍按 16-bit mono PCM 解释了 INMP441 的 32-bit I2S slot。

当前 devkit 配置保留:

CONFIG_ESP32S3_I2S1_DATA_BIT_WIDTH_32BIT=y

后续需要在 app/audio_event 的采集层增加格式转换:按 32-bit slot 读取 INMP441 数据,选取有效声道并右移/缩放为模型需要的 16 kHz mono PCM16,再送入 ring buffer、 特征提取和 TFLite Micro 推理。

麦克风诊断

audio_test 是独立的 PCM 采集诊断命令,不加载模型、不初始化 LVGL,只验证 /dev/audio/pcm_in1 是否能输出有效的 16-bit PCM。它每秒打印一次每个声道的 min/max/mean/rms/zero/clip

nsh> audio_test --device /dev/audio/pcm_in1 --channels 1 --seconds 5
nsh> audio_test --device /dev/audio/pcm_in1 --channels 2 --seconds 5

如果怀疑 ES7210 初始化早于 I2S 时钟启动,可以使用启动后重初始化诊断:

nsh> audio_test --device /dev/audio/pcm_in1 --channels 2 --seconds 10 --es7210

该选项会在 audio_test 启动采集后等待 50 ms,再重新执行一次 BOX-3 ES7210 初始化序列。如果重初始化后的后续秒数从全零变为非零,说明根因高度指向 ES7210 初始化时 I2S MCLK/BCLK/LRCK 尚未稳定。

结果判断:

  • rms 长期接近 0 且 zero 接近总采样数:驱动链路可能没有收到麦克风数据。
  • 单声道全零、双声道某一路有 rms:重点检查 I2S slot/channel 配置。
  • clip 持续增加:输入增益过高或格式解释错误。
  • 对着麦克风敲击或说话时 rms 明显升高:采集链路基本可用,再回到 audio_event 做模型和阈值验证。

关键配置

board/goldfish-arm64/configs/audio_event/defconfig 主要启用:

  • CONFIG_EXAMPLES_AUDIO_EVENT=y
  • CONFIG_EXAMPLES_AUDIO_EVENT_DEVPATH="/dev/audio/pcm0c"
  • CONFIG_EXAMPLES_AUDIO_EVENT_UI=y
  • CONFIG_TFLITEMICRO=y
  • CONFIG_MATH_KISSFFT=y
  • CONFIG_SYSTEM_FLATBUFFERS=y

该配置已经移除与 audio_event 无关的重型模拟器组件,避免引入不必要的构建依赖:

  • Android Binder / ServiceManager
  • QuickApp / Feature Framework
  • Media server / media tool
  • curl command line

board/esp32s3-box-3/configs/audio_event/defconfig 主要启用:

  • CONFIG_EXAMPLES_AUDIO_EVENT=y
  • CONFIG_EXAMPLES_AUDIO_EVENT_DEVPATH="/dev/audio/pcm_in1"
  • CONFIG_EXAMPLES_AUDIO_TEST=y
  • CONFIG_EXAMPLES_AUDIO_TEST_DEVPATH="/dev/audio/pcm_in1"
  • CONFIG_ESP32S3_BOX_AUDIO=y
  • CONFIG_ESP32S3_I2S1_DINPIN=16
  • CONFIG_ESP32S3_I2S1_TX 未启用,麦克风验证阶段只保留 RX
  • CONFIG_ESP32S3_BOX_LCD=y
  • CONFIG_ESP32S3_BOARD_TOUCHSCREEN=y
  • CONFIG_TFLITEMICRO=y
  • CONFIG_MATH_KISSFFT=y

board/esp32s3-devkit/configs/audio_event/defconfig 主要启用:

  • CONFIG_EXAMPLES_AUDIO_EVENT=y
  • CONFIG_EXAMPLES_AUDIO_EVENT_DEVPATH="/dev/audio/pcm_in1"
  • CONFIG_EXAMPLES_AUDIO_TEST=y
  • CONFIG_EXAMPLES_AUDIO_TEST_CHANNELS=2
  • CONFIG_ESP32S3_DEVKIT_INMP441=y
  • CONFIG_ESP32S3_I2S1_BCLKPIN=18
  • CONFIG_ESP32S3_I2S1_WSPIN=17
  • CONFIG_ESP32S3_I2S1_DINPIN=15
  • CONFIG_ESP32S3_I2S1_DATA_BIT_WIDTH_32BIT=y
  • CONFIG_LIBCXX=y
  • CONFIG_TLS_NELEM=4
  • CONFIG_TLS_TASK_NELEM=4
  • CONFIG_TFLITEMICRO=y
  • CONFIG_MATH_KISSFFT=y

Manifest 建议

如果后续把 ccf_audioevent 作为独立参赛仓复现,建议在 manifest 中加入:

<linkfile src="app/audio_event"
          dest="apps/examples/audio_event"/>
<linkfile src="app/audio_test"
          dest="apps/examples/audio_test"/>
<linkfile src="board/goldfish-arm64/configs/audio_event/defconfig"
          dest="vendor/openvela/boards/vela/configs/goldfish-audio_event/defconfig"/>
<linkfile src="board/goldfish-arm64/configs/audio_event/config.ini"
          dest="vendor/openvela/boards/vela/configs/goldfish-audio_event/config.ini"/>
<linkfile src="board/esp32s3-box-3"
          dest="vendor/espressif/boards/esp32s3/esp32s3-box-3"/>
<linkfile src="board/esp32s3-devkit"
          dest="vendor/espressif/boards/esp32s3/esp32s3-devkit"/>

这样评委或其他开发者同步仓库后,不需要手工复制文件,只要使用对应的构建路径即可。

注意事项

  • ccf_audioevent/app/audio_event/.git 已清理,避免应用目录成为嵌套 Git 仓库。
  • goldfish-arm64 的配置不是完整 board,只是 vendor/openvela/boards/vela 的一个 config,因此不要直接用 ccf_audioevent/board/goldfish-arm64/configs/audio_event/ 作为 build.sh 路径。
  • 非 CMake 构建不会自动准备 cmake_out/vela_goldfish-audio_event/,运行模拟器前需要 手动复制 .configvela_*.bin 并链接 nuttx
  • 真机音频采集路径是 /dev/audio/pcm_in1,模拟器默认路径是 /dev/audio/pcm0c
  • ESP32-S3 DevKit + INMP441 当前硬件链路可通过非零采样验证,但 audio_event 仍需要把 INMP441 的 32-bit I2S slot 转成模型输入所需的 16-bit mono PCM。
  • 若 UI 初始化失败,audio_event 会继续运行,可先用 --model-smoke--file 模式确认推理链路。

常见问题

File Make.defs could not be found

通常是把整个 vendor/openvela/boards/vela/configs/goldfish-audio_event 目录软链接到了 ccf_audioevent/board/goldfish-arm64/configs/audio_event。修复方式是删除该目录软链, 创建真实目录,并只软链接 defconfig 文件。

Binder AIDL target 重复

如果出现 android_binder_IServiceManager target 重复,说明配置里仍启用了 Android Binder。audio_event 不依赖 Binder,应确认 defconfig 中没有 CONFIG_ANDROID_BINDER=yCONFIG_ANDROID_SERVICEMANAGER=yCONFIG_BINDER_EXAMPLES=yCONFIG_DRIVERS_BINDER=y

CONFIG_HAP_APP_PATH 未定义

如果 feature/audio_impl.cCONFIG_HAP_APP_PATH 未定义,说明配置仍拉入了 QuickApp / Feature Framework / Media server。audio_event 模拟器配置不需要这些框架, 应确认 defconfig 中没有 CONFIG_QUICKAPP=yCONFIG_FEATURE_FRAMEWORK=yCONFIG_MEDIA_SERVER=yCONFIG_MEDIA_TOOL=y

关于
290.0 KB
邀请码
    Gitlink(确实开源)
  • 加入我们
  • 官网邮箱:gitlink@ccf.org.cn
  • QQ群
  • QQ群
  • 公众号
  • 公众号

版权所有:中国计算机学会技术支持:开源发展技术委员会
京ICP备13000930号-9 京公网安备 11010802047560号