Add LICENSE
ccf_audioevent 是一个面向 openvela 的本地音频事件检测作品目录,核心目标是在 模拟器和 ESP32-S3-BOX-3 真机上运行 audio_event 应用,完成音频采集、特征提取、 TFLite Micro 推理和本地告警闭环。
ccf_audioevent
audio_event
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。
apps/examples/audio_event
apps/examples/audio_test
vendor/openvela/boards/vela/configs/goldfish-audio_event
vendor/espressif/boards/esp32s3/esp32s3-box-3
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_event、apps/examples/audio_test、 goldfish-audio_event/defconfig 和 esp32s3-box-3、esp32s3-devkit 都指向 /home/arongw/openvela/ccf_audioevent/...。
goldfish-audio_event/defconfig
esp32s3-box-3
esp32s3-devkit
/home/arongw/openvela/ccf_audioevent/...
audio_test 是新增 example。apps/examples/Kconfig 是自动生成文件,先确保上面的 apps/examples/audio_test 软链接存在,再重新 configure 或构建,让 Kconfig 生成阶段自动 加入:
audio_test
apps/examples/Kconfig
source "/home/arongw/openvela/apps/examples/audio_test/Kconfig"
如果刷新配置后仍看不到 CONFIG_EXAMPLES_AUDIO_TEST,优先检查软链接是否存在,而不是长期 手工维护 apps/examples/Kconfig。
CONFIG_EXAMPLES_AUDIO_TEST
注意:goldfish-audio_event 目录本身必须保留为 vendor/openvela/boards/vela/configs/ 下的真实目录,只软链接其中的 defconfig 文件。不要把整个 goldfish-audio_event 目录软链接到 ccf_audioevent,否则非 CMake 构建会把它当成完整 board 路径,导致 File Make.defs could not be found。
goldfish-audio_event
vendor/openvela/boards/vela/configs/
defconfig
File Make.defs could not be found
goldfish-arm64 模拟器配置使用 openvela 的通用 vela board,因此最终配置路径放在:
vela
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 目录:
nuttx/
emulator.sh
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 后再启动。
config.ini
320x240
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,如设备节点不存在,可优先使用文件模式:
/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 替换为实际端口。
/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-N16R8 开发板可以外接 INMP441 数字麦克风,使用独立的 custom board:
vendor/espressif/boards/esp32s3/esp32s3-devkit/configs/audio_event/
当前默认接线:
CONFIG_ESP32S3_I2S1_BCLKPIN=18
CONFIG_ESP32S3_I2S1_WSPIN=17
CONFIG_ESP32S3_I2S1_DINPIN=15
该配置启用 I2S1 RX,并将采集设备注册为:
./build.sh vendor/espressif/boards/esp32s3/esp32s3-devkit/configs/audio_event/ -j8
启动后先验证命令是否注册:
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_test 或 audio_event --audio-stats 已经显示非零数据,说明 INMP441 到 ESP32-S3 I2S RX 的硬件链路基本打通。若统计长期接近满幅,例如 min=-32768、max 接近 32767、rms 长期在 13000 以上,同时模型稳定输出 background,通常不是模型问题,而是应用仍按 16-bit mono PCM 解释了 INMP441 的 32-bit I2S slot。
audio_event --audio-stats
min=-32768
max
32767
rms
13000
background
当前 devkit 配置保留:
CONFIG_ESP32S3_I2S1_DATA_BIT_WIDTH_32BIT=y
后续需要在 app/audio_event 的采集层增加格式转换:按 32-bit slot 读取 INMP441 数据,选取有效声道并右移/缩放为模型需要的 16 kHz mono PCM16,再送入 ring buffer、 特征提取和 TFLite Micro 推理。
app/audio_event
audio_test 是独立的 PCM 采集诊断命令,不加载模型、不初始化 LVGL,只验证 /dev/audio/pcm_in1 是否能输出有效的 16-bit PCM。它每秒打印一次每个声道的 min/max/mean/rms/zero/clip:
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 尚未稳定。
MCLK/BCLK/LRCK
结果判断:
zero
clip
board/goldfish-arm64/configs/audio_event/defconfig 主要启用:
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 无关的重型模拟器组件,避免引入不必要的构建依赖:
board/esp32s3-box-3/configs/audio_event/defconfig 主要启用:
board/esp32s3-box-3/configs/audio_event/defconfig
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
CONFIG_ESP32S3_BOX_LCD=y
CONFIG_ESP32S3_BOARD_TOUCHSCREEN=y
board/esp32s3-devkit/configs/audio_event/defconfig 主要启用:
board/esp32s3-devkit/configs/audio_event/defconfig
CONFIG_EXAMPLES_AUDIO_TEST_CHANNELS=2
CONFIG_ESP32S3_DEVKIT_INMP441=y
CONFIG_LIBCXX=y
CONFIG_TLS_NELEM=4
CONFIG_TLS_TASK_NELEM=4
如果后续把 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
vendor/openvela/boards/vela
ccf_audioevent/board/goldfish-arm64/configs/audio_event/
build.sh
.config
vela_*.bin
nuttx
--model-smoke
--file
通常是把整个 vendor/openvela/boards/vela/configs/goldfish-audio_event 目录软链接到了 ccf_audioevent/board/goldfish-arm64/configs/audio_event。修复方式是删除该目录软链, 创建真实目录,并只软链接 defconfig 文件。
ccf_audioevent/board/goldfish-arm64/configs/audio_event
如果出现 android_binder_IServiceManager target 重复,说明配置里仍启用了 Android Binder。audio_event 不依赖 Binder,应确认 defconfig 中没有 CONFIG_ANDROID_BINDER=y、CONFIG_ANDROID_SERVICEMANAGER=y、CONFIG_BINDER_EXAMPLES=y 和 CONFIG_DRIVERS_BINDER=y。
android_binder_IServiceManager
CONFIG_ANDROID_BINDER=y
CONFIG_ANDROID_SERVICEMANAGER=y
CONFIG_BINDER_EXAMPLES=y
CONFIG_DRIVERS_BINDER=y
如果 feature/audio_impl.c 报 CONFIG_HAP_APP_PATH 未定义,说明配置仍拉入了 QuickApp / Feature Framework / Media server。audio_event 模拟器配置不需要这些框架, 应确认 defconfig 中没有 CONFIG_QUICKAPP=y、CONFIG_FEATURE_FRAMEWORK=y、 CONFIG_MEDIA_SERVER=y 和 CONFIG_MEDIA_TOOL=y。
feature/audio_impl.c
CONFIG_HAP_APP_PATH
CONFIG_QUICKAPP=y
CONFIG_FEATURE_FRAMEWORK=y
CONFIG_MEDIA_SERVER=y
CONFIG_MEDIA_TOOL=y
版权所有:中国计算机学会技术支持:开源发展技术委员会 京ICP备13000930号-9 京公网安备 11010802047560号
ccf_audioevent
ccf_audioevent是一个面向 openvela 的本地音频事件检测作品目录,核心目标是在 模拟器和 ESP32-S3-BOX-3 真机上运行audio_event应用,完成音频采集、特征提取、 TFLite Micro 推理和本地告警闭环。目录结构
应用源码最终需要映射到 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中的源码挂到构建系统能找到 的位置。检查软链接:
期望
apps/examples/audio_event、apps/examples/audio_test、goldfish-audio_event/defconfig和esp32s3-box-3、esp32s3-devkit都指向/home/arongw/openvela/ccf_audioevent/...。audio_test是新增 example。apps/examples/Kconfig是自动生成文件,先确保上面的apps/examples/audio_test软链接存在,再重新 configure 或构建,让 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 的通用
velaboard,因此最终配置路径放在:推荐使用 CMake 构建:
CMake 构建后,输出目录为:
运行模拟器:
也可以使用 make 构建:
make 构建后,产物主要在
nuttx/下;如果要用emulator.sh,需要手动整理一个 out 目录:config.ini将 goldfish 显示固定为320x240横向模式,用于对齐 ESP32-S3-BOX-3 的小屏 UI。若之前已经启动过模拟器并生成了旧的hardware-qemu.ini,需要重新启动模拟器;必要时删除旧的cmake_out/vela_goldfish-audio_event/hardware-qemu.ini后再启动。进入 NSH 后可先验证应用是否注册:
模拟器更适合做模型加载、文件输入和 UI 基础验证。默认采集设备配置为
/dev/audio/pcm0c,如设备节点不存在,可优先使用文件模式:真机构建
ESP32-S3-BOX-3 使用自定义 board:
构建命令:
烧录并打开串口监视:
如果开发板枚举为其他串口设备,请将
/dev/ttyACM0替换为实际端口。该配置启用 ES7210 麦克风初始化,并将 I2S1 RX 注册为:
烧录启动后可验证:
ESP32-S3 DevKit + INMP441 构建
ESP32-S3-N16R8 开发板可以外接 INMP441 数字麦克风,使用独立的 custom board:
当前默认接线:
CONFIG_ESP32S3_I2S1_BCLKPIN=18CONFIG_ESP32S3_I2S1_WSPIN=17CONFIG_ESP32S3_I2S1_DINPIN=15该配置启用 I2S1 RX,并将采集设备注册为:
构建命令:
烧录并打开串口监视:
启动后先验证命令是否注册:
如果
audio_test或audio_event --audio-stats已经显示非零数据,说明 INMP441 到 ESP32-S3 I2S RX 的硬件链路基本打通。若统计长期接近满幅,例如min=-32768、max接近32767、rms长期在13000以上,同时模型稳定输出background,通常不是模型问题,而是应用仍按 16-bit mono PCM 解释了 INMP441 的 32-bit I2S slot。当前 devkit 配置保留:
后续需要在
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:如果怀疑 ES7210 初始化早于 I2S 时钟启动,可以使用启动后重初始化诊断:
该选项会在
audio_test启动采集后等待 50 ms,再重新执行一次 BOX-3 ES7210 初始化序列。如果重初始化后的后续秒数从全零变为非零,说明根因高度指向 ES7210 初始化时 I2SMCLK/BCLK/LRCK尚未稳定。结果判断:
rms长期接近 0 且zero接近总采样数:驱动链路可能没有收到麦克风数据。rms:重点检查 I2S slot/channel 配置。clip持续增加:输入增益过高或格式解释错误。rms明显升高:采集链路基本可用,再回到audio_event做模型和阈值验证。关键配置
board/goldfish-arm64/configs/audio_event/defconfig主要启用:CONFIG_EXAMPLES_AUDIO_EVENT=yCONFIG_EXAMPLES_AUDIO_EVENT_DEVPATH="/dev/audio/pcm0c"CONFIG_EXAMPLES_AUDIO_EVENT_UI=yCONFIG_TFLITEMICRO=yCONFIG_MATH_KISSFFT=yCONFIG_SYSTEM_FLATBUFFERS=y该配置已经移除与
audio_event无关的重型模拟器组件,避免引入不必要的构建依赖:board/esp32s3-box-3/configs/audio_event/defconfig主要启用:CONFIG_EXAMPLES_AUDIO_EVENT=yCONFIG_EXAMPLES_AUDIO_EVENT_DEVPATH="/dev/audio/pcm_in1"CONFIG_EXAMPLES_AUDIO_TEST=yCONFIG_EXAMPLES_AUDIO_TEST_DEVPATH="/dev/audio/pcm_in1"CONFIG_ESP32S3_BOX_AUDIO=yCONFIG_ESP32S3_I2S1_DINPIN=16CONFIG_ESP32S3_I2S1_TX未启用,麦克风验证阶段只保留 RXCONFIG_ESP32S3_BOX_LCD=yCONFIG_ESP32S3_BOARD_TOUCHSCREEN=yCONFIG_TFLITEMICRO=yCONFIG_MATH_KISSFFT=yboard/esp32s3-devkit/configs/audio_event/defconfig主要启用:CONFIG_EXAMPLES_AUDIO_EVENT=yCONFIG_EXAMPLES_AUDIO_EVENT_DEVPATH="/dev/audio/pcm_in1"CONFIG_EXAMPLES_AUDIO_TEST=yCONFIG_EXAMPLES_AUDIO_TEST_CHANNELS=2CONFIG_ESP32S3_DEVKIT_INMP441=yCONFIG_ESP32S3_I2S1_BCLKPIN=18CONFIG_ESP32S3_I2S1_WSPIN=17CONFIG_ESP32S3_I2S1_DINPIN=15CONFIG_ESP32S3_I2S1_DATA_BIT_WIDTH_32BIT=yCONFIG_LIBCXX=yCONFIG_TLS_NELEM=4CONFIG_TLS_TASK_NELEM=4CONFIG_TFLITEMICRO=yCONFIG_MATH_KISSFFT=yManifest 建议
如果后续把
ccf_audioevent作为独立参赛仓复现,建议在 manifest 中加入:这样评委或其他开发者同步仓库后,不需要手工复制文件,只要使用对应的构建路径即可。
注意事项
ccf_audioevent/app/audio_event/.git已清理,避免应用目录成为嵌套 Git 仓库。vendor/openvela/boards/vela的一个 config,因此不要直接用ccf_audioevent/board/goldfish-arm64/configs/audio_event/作为build.sh路径。cmake_out/vela_goldfish-audio_event/,运行模拟器前需要 手动复制.config、vela_*.bin并链接nuttx。/dev/audio/pcm_in1,模拟器默认路径是/dev/audio/pcm0c。audio_event仍需要把 INMP441 的 32-bit I2S slot 转成模型输入所需的 16-bit mono PCM。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_IServiceManagertarget 重复,说明配置里仍启用了 Android Binder。audio_event不依赖 Binder,应确认 defconfig 中没有CONFIG_ANDROID_BINDER=y、CONFIG_ANDROID_SERVICEMANAGER=y、CONFIG_BINDER_EXAMPLES=y和CONFIG_DRIVERS_BINDER=y。CONFIG_HAP_APP_PATH 未定义
如果
feature/audio_impl.c报CONFIG_HAP_APP_PATH未定义,说明配置仍拉入了 QuickApp / Feature Framework / Media server。audio_event模拟器配置不需要这些框架, 应确认 defconfig 中没有CONFIG_QUICKAPP=y、CONFIG_FEATURE_FRAMEWORK=y、CONFIG_MEDIA_SERVER=y和CONFIG_MEDIA_TOOL=y。