目录

基于 openvela 的本地音频事件检测系统

CCF 开源创新大赛 openvela 赛题决赛作品。

  • 团队:YUAI
  • 队长:李佳斌
  • 队员:李佳禾、姚舒文
  • 学校:武汉大学计算机学院

系统面向家庭看护与本地安全提醒,在设备侧完成音频采集、特征提取、事件识别和告警决策。检测链路不依赖云端,网络仅用于异步发送事件元数据。

检测能力

输入为 16 kHz、单声道、PCM16 音频,输出五类事件:

类别 作用
background 背景与未知声音抑制
cough 咳嗽告警
glass_break 玻璃破碎告警
door_knock 敲门声告警,决赛新增
baby_cry 婴儿哭声告警,决赛新增

运行时由 C 语言前端、int8 YAMNet 嵌入模型、线性分类头和流式事件状态机组成。状态机负责滑动上下文、类别阈值、连续窗口确认、事件合并与冷却控制。

决赛结果

最终困难负样本分类头在 ESC-50 folds 1-4 与 FSD50K development/selection 上完成选择;FSD50K audit 不参与训练或选择。fold 5 曾用于历史基线,当前结果按“最终头回归审计”报告:

项目 结果 证据
ESC-50 fold 5 回归审计,五类 macro-F1 0.8970 reports/final/yamnet_hard_negative_head_fold5_audit.json
ESC-50 fold 5 回归审计,准确率 98.0% 同上
ESC-50 fold 5 回归审计,背景误报率 1.09%(4/368) 同上
来源隔离开发集,clean macro-F1 0.8511 reports/final/yamnet_hard_negative_head_development.json
来源隔离开发集,平均压力场景 macro-F1 0.5478 同上
FSD50K source-disjoint audit,目标 macro-F1 0.7407(历史基线 0.3686) 同上
FSD50K audit,背景误报 34.33 events/hour,8/150 片段受影响 同上
int8 模型体积 3,508,000 bytes reports/final/yamnet_embedding_int8_export.json
相对 float 模型体积下降 72.59% reports/final/yamnet_paired_host_benchmark.json
相同主机条件下 p50 推理加速 2.16x 同上
TFLM tensor arena 实际占用 242,752 bytes reports/final/tflm_compatibility.json
一小时流式回放 57,600,000 samples,退出码 0 reports/final/c_tflm_one_hour_stability.json
独立关键词模型 clean macro-F1 0.8883 reports/final/kws_on_off_stop_int8.json
独立关键词模型 10 dB macro-F1 0.8603 同上
独立关键词 int8 模型体积 21,168 bytes 同上

鲁棒性中的远场条件为确定性信号模拟,不是物理距离实测。FSD50K 采用片段级弱标签;development、selection、audit 按原始来源隔离。旧分类头历史上曾在完整 FSD50K 子集运行,因此当前 audit 是本轮实验的来源隔离审计,但不是整个项目历史上的首次未见数据。

数据流

PCM16 音频
  -> C log-mel 前端
  -> int8 YAMNet / TFLite Micro
  -> 1024 维嵌入上下文聚合
  -> 五类线性分类头
  -> 阈值、投票、事件合并与冷却
  -> 本地告警 + JSONL/串口日志 + 异步 HTTP 元数据

核心检测线程不等待网络。远程上报使用有界队列;网络不可用时,检测和本地告警继续运行。

主机验证

开发和验证环境为 WSL2 Ubuntu-26.04。纯 C 基础回归:

cmake -S . -B build -DCMAKE_BUILD_TYPE=Release
cmake --build build -j2
ctest --test-dir build --output-on-failure

真实 TFLite Micro 兼容验证:

bash scripts/build_tflm_host.sh
source /root/.venvs/openvela-aed-teacher/bin/activate
AED_RUN_TFLM_INTEGRATION=1 PYTHONPATH=. \
  python -m pytest -q tests/test_tflm_yamnet_compatibility.py

最终分类头的 C/Python 数值一致性:

source /root/.venvs/openvela-aed-final/bin/activate
PYTHONPATH=. python -m tools.final.verify_yamnet_head_parity

详细依赖和从零复现步骤见 docs/reproducibility.md 与 docs/final/。

独立关键词任务使用 silence/unknown/on/off/stop 五类 DS-CNN,与音频事件模型分开训练和评测。Speech Commands v0.02 按说话人隔离,结果和边界见 docs/final/keyword_spotting_protocol_zh.md。

决赛交付入口

  • 答辩材料:deliverables/final/presentation/openvela_aed_final_defense.pptx
  • 完整技术报告:deliverables/final/report/openvela_aed_final_report.pdf 与 .docx
  • 全功能演示视频:deliverables/final/video/openvela_aed_final_demo.mp4
  • 部署与用户手册:deliverables/final/manual/deployment_and_demo_guide_zh.md
  • 可执行程序说明:deliverables/final/executable/README_zh.md

决赛全量包中的 Linux x86-64 可执行目录提供 aed_demo、aed_remote_demo、冻结模型与样例音频;无需 Python 即可运行基础 C 检测演示。最终包由 scripts/package_final_submission.py 按官方材料类别白名单生成,并在 manifest 中记录仓库地址、提交哈希和每个文件的 SHA-256。

openvela 接入

openvela/aed_openvela_engine.c 提供两条可配置路径:

  • 经典轻量检测核心,用于资源受限或回退场景;
  • 高精度 YAMNet/TFLM 路径,接入 openvela 官方 mlearning/tflite-micro 组件。

高精度路径支持外部 PSRAM arena、采集 XRUN 复位、运行统计、本地告警和异步遥测。模型提供器由冻结的 TFLite 文件生成,并在构建时校验 SHA-256。

当前没有真实 openvela 开发板,因此仓库中的构建、时延、稳定性和 HTTP 结果均标注为 WSL2 主机证据,不表述为板端实测;真实功耗和开发板加分项尚未申报完成。

目录

路径 内容
include/aed/、src/ 公共接口、C 前端、分类头、流式状态机
src/tflm/、host/tflm/ TFLM 适配层与主机兼容运行器
openvela/ Kconfig、构建片段、采集/告警/遥测适配
tools/final/ 数据审计、训练、量化、评测和报告生成器
tests/ Python、C、TFLM 与 openvela 接线测试
models/final/ 冻结模型、分类头及模型说明
reports/final/ 原始指标、混淆矩阵、运行日志和哈希证据
docs/final/ 决赛要求、评测协议、证据边界与执行文档

许可与数据

项目自有源码采用 MIT 许可证。TensorFlow Lite Micro、YAMNet、ESC-50、FSD50K 和 Speech Commands 等第三方组件、模型与数据保持各自许可证;来源、版本、哈希和署名要求在 NOTICE、数据清单及决赛技术报告中列明。大体积训练数据不进入 Git 仓库。

关于

离线本地音频事件检测系统,支持咳嗽声与玻璃破碎声识别,包含纯 C 推理核心、WSL2 可复现验证、openvela 移植代码、评估报告与初赛交付文档。

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

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