更新README
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
模块定位:多模态实时事件提取模块,是大型系统中的中间层组件,专注于感知和事件解析。
部署架构:
数据流向:
输入:终端设备(摄像头/麦克风)→ [蓝牙/WiFi] → 边缘服务器 处理:三个管道(视觉/音频/飞书)→ AI 推理 → 事件提取 输出:结构化 A 层事件(JSON)→ 下游模块(云端服务/手机 App/其他系统)
核心功能:实时监控摄像头、录音机、飞书等多路输入,将感知信息解析为结构化的 A 层事件(JSON 格式),供下游模块消费。
实现进度:
性能指标(边缘服务器 GPU 模式):
国创赛/ ├── src/ │ ├── __init__.py │ ├── core/ # 核心模块 │ │ ├── __init__.py │ │ ├── config.py # 全局配置(阈值、路径、设备等) │ │ ├── schemas.py # 事件数据模型(BaseEvent 及各子类) │ │ ├── utils.py # 工具函数(日志、ID 生成、bbox 操作) │ │ └── event_generator.py # 事件生成(EventGenerator)和输出(EventSink,线程安全) │ ├── vision/ # 视觉管道模块 │ │ ├── __init__.py │ │ ├── face_analyzer.py # 人脸检测 + embedding(insightface) │ │ ├── scene_classifier.py # 场景描述生成(Florence-2) │ │ └── vision_pipeline.py # 视觉管道核心(VisionPipeline、TrackStateManager、SceneStateTracker) │ ├── audio/ # 音频管道模块 │ │ ├── __init__.py │ │ ├── audio_vad.py # 人声检测(Silero-VAD,SpeechSegment 数据类) │ │ ├── audio_asr.py # 语音识别(FunASR SenseVoice,支持 ITN 标点与逆文本正则化) │ │ ├── audio_embedder.py # 声纹 embedding(WeSpeaker ResNet34 ONNX,256 维) │ │ └── audio_pipeline.py # 音频管道核心(AudioPipeline) │ └── feishu/ # 飞书管道模块 │ ├── __init__.py │ ├── feishu_client.py # 飞书 API 客户端(WebSocket/Webhook 连接、事件监听) │ └── feishu_pipeline.py # 飞书管道核心(FeishuPipeline) ├── run_vision_pipeline.py # 视觉管道入口脚本 ├── run_audio_pipeline.py # 音频管道入口脚本 ├── run_feishu_pipeline.py # 飞书管道入口脚本 ├── run_integration.py # 串行集成测试(视觉 → 音频,顺序执行) ├── run_parallel.py # 并行集成测试(视觉 + 音频,时间轴对齐) ├── models/ │ ├── AI-ModelScope/ │ │ └── Florence-2-base/ # Florence-2 模型权重(本地) │ └── wespeaker/ │ └── wespeaker-cnceleb-resnet34-LM/ # WeSpeaker 声纹模型(ONNX) ├── data/ # 测试视频目录 ├── outputs/ # 输出目录(自动创建) │ ├── events.jsonl # 事件输出(JSONL,每行一个事件) │ ├── vision_pipeline.log # 视觉管道日志 │ ├── audio_pipeline.log # 音频管道日志 │ └── feishu_pipeline.log # 飞书管道日志 ├── botsort_custom.yaml # BoTSort 追踪器配置 ├── yolo12n.pt # YOLOv8-Nano 模型权重 ├── requirements.txt # 依赖列表 ├── 事件规范格式.md # A 层事件 schema 规范 └── 技术路线.md # 项目技术路线
每帧按顺序执行三个步骤:
1. 人体检测与追踪(快线路)
track_id
self._scene_objects
2. 人脸分析(全帧检测 + 追踪关联)
match_faces_to_tracks
face_detection
person_track
注意:必须在完整帧上做人脸检测,裁剪图像分辨率太低会导致检测失败。
3. 场景描述(两级触发)
scene_label
时间戳:并行模式下使用视频时间 start_time + frame_idx / video_fps,与音频时间戳对齐。
start_time + frame_idx / video_fps
流程: 提取音轨(ffmpeg)→ VAD(Silero-VAD)→ ASR + 声纹 embedding(并行推理)→ SpeechSegmentEvent
1. 音轨提取
ffmpeg
2. VAD 人声检测(Silero-VAD)
3. ASR(FunASR SenseVoice)
use_itn=True
~/.cache/modelscope/
<|zh|><|NEUTRAL|><|Speech|>
4. 声纹 Embedding(WeSpeaker ResNet34 ONNX)
models/wespeaker/wespeaker-cnceleb-resnet34-LM/cnceleb_resnet34_LM.onnx
流程: 飞书事件监听(WebSocket/Webhook)→ 事件解析 → A 层事件转换 → EventSink
连接模式:
支持的飞书事件类型:
1. 消息事件(im.message.receive_v1)→ notification_event
notification_event
message_notification
2. Bot 加入群聊(im.chat.member.bot.added_v1)→ ui_state_change
ui_state_change
chat_thread_opened
3. 群聊更新(im.chat.updated_v6)→ ui_state_change
group_updated
4. 日历事件(calendar.calendar.event.created_v6)→ notification_event
calendar_reminder
时间戳:所有飞书事件使用接收时的系统时间 datetime.now()
datetime.now()
run_parallel.py 使用 threading 同时运行两个管道:
run_parallel.py
threading
shared_start_time = datetime.now() # 两管道共用时间基准 # 视觉管道:event_ts = shared_start_time + frame_idx / video_fps # 音频管道:event_ts = shared_start_time + segment.start_sec
EventSink
threading.Lock
_owns_sink=False
source linux_env/bin/activate # 视觉管道(单独) python run_vision_pipeline.py --video data/xxx.mp4 --max-frames 750 # 音频管道(单独) python run_audio_pipeline.py --output outputs/audio_events.jsonl # 飞书管道(单独,需配置 FEISHU_APP_ID 和 FEISHU_APP_SECRET) python run_feishu_pipeline.py # 串行集成测试 python run_integration.py --max-frames 750 # 并行集成测试(推荐,时间轴对齐) python run_parallel.py --max-frames 750
DEVICE
"cuda"
YOLO_CONF_THRESHOLD
0.5
MIN_FACE_QUALITY
0.3
MIN_TRACK_AGE
5
FACE_REEMBED_INTERVAL
15
ENABLE_SCENE_CLASSIFICATION
True
FLORENCE2_MODEL_DIR
models/AI-ModelScope/Florence-2-base
SCENE_CHANGE_THRESHOLD
0.85
SCENE_CHANGE_COOLDOWN_SEC
3.0
AUDIO_SAMPLE_RATE
16000
AUDIO_CHUNK_SAMPLES
512
VAD_ONSET_THRESHOLD
VAD_OFFSET_THRESHOLD
0.35
ASR_MODEL
"iic/SenseVoiceSmall"
VOICE_EMBEDDER_MODEL_PATH
models/wespeaker/.../cnceleb_resnet34_LM.onnx
FEISHU_APP_ID
""
FEISHU_APP_SECRET
FEISHU_BOT_MODE
"websocket"
FEISHU_WEBHOOK_PORT
8080
FEISHU_VERIFICATION_TOKEN
FEISHU_ENCRYPT_KEY
EVENT_OUTPUT_FILE
outputs/events.jsonl
~/.insightface/
models/AI-ModelScope/Florence-2-base/
modelscope.AutoModelForCausalLM
trust_remote_code=True
einops
timm
models/wespeaker/wespeaker-cnceleb-resnet34-LM/
git clone <repository-url> cd 国创赛
# Ubuntu/Debian sudo apt-get update sudo apt-get install -y libgl1 ffmpeg # macOS brew install ffmpeg
# 创建虚拟环境(Python 3.10) python3.10 -m venv linux_env # 激活虚拟环境 source linux_env/bin/activate # Linux/macOS # 或 linux_env\Scripts\activate # Windows # 安装依赖 pip install -r requirements.txt
YOLOv8 模型:
yolo12n.pt
Florence-2 模型:
WeSpeaker 声纹模型:
# 从 HuggingFace 下载(确保下载真实文件,非 LFS 指针) mkdir -p models/wespeaker/wespeaker-cnceleb-resnet34-LM # 下载 cnceleb_resnet34_LM.onnx 到上述目录
insightface 模型:
FunASR 模型:
./linux_env/
libgl1
sudo apt-get install -y libgl1
重要:Florence-2 需要 transformers==4.40.0,不能升级到 5.x(会导致 Florence2LanguageConfig 兼容性错误)。
transformers==4.40.0
Florence2LanguageConfig
重要:AUDIO_CHUNK_SAMPLES 固定为 512,Silero-VAD 硬性要求,不可修改。
输出文件 outputs/events.jsonl,每行一个 JSON 事件。
face_detection:每帧每个合格人脸输出,含 bbox、face_quality、512 维 face_embedding
person_track:追踪结束时输出,含 track_id、face_event_ids、representative_embedding
scene_detection:场景切换时输出,含 scene_label(Florence-2 描述)、objects、subtype=”generated_description”
speech_segment:每段语音结束时输出,payload 含:
text
language
"zh"
turn_index
audio_features
{volume, speech_rate}
voice_embedding
{model, vector(256维), vector_dim, norm="l2"}
ui_state_change(飞书管道):UI 状态变化事件,payload 含:
subtype
"chat_thread_opened"
"group_updated"
app_name
"Feishu"
page_type
"group_chat"
thread_id
feishu_{chat_id}
notification_event(飞书管道):通知事件,payload 含:
"message_notification"
"calendar_reminder"
notification_type
"dm_message"
"group_message"
"calendar_event"
title
preview_text
priority_hint
"unknown"
"normal"
duplicated model: w600k_r50.onnx
trust_remote_code: False
pip install wespeaker
--max-frames 750
版权所有:中国计算机学会技术支持:开源发展技术委员会 京ICP备13000930号-9 京公网安备 11010802032778号
CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
Project Overview
模块定位:多模态实时事件提取模块,是大型系统中的中间层组件,专注于感知和事件解析。
部署架构:
数据流向:
核心功能:实时监控摄像头、录音机、飞书等多路输入,将感知信息解析为结构化的 A 层事件(JSON 格式),供下游模块消费。
实现进度:
性能指标(边缘服务器 GPU 模式):
项目结构
视觉管道架构
每帧按顺序执行三个步骤:
1. 人体检测与追踪(快线路)
track_idself._scene_objects,供场景事件 payload 使用2. 人脸分析(全帧检测 + 追踪关联)
match_faces_to_tracks)face_detection事件(含 512 维 L2 归一化 embedding)person_track事件(含代表性 embedding)3. 场景描述(两级触发)
scene_label字段存放 Florence-2 生成的自然语言描述时间戳:并行模式下使用视频时间
start_time + frame_idx / video_fps,与音频时间戳对齐。音频管道架构
流程: 提取音轨(ffmpeg)→ VAD(Silero-VAD)→ ASR + 声纹 embedding(并行推理)→ SpeechSegmentEvent
1. 音轨提取
ffmpegsubprocess 提取视频音轨为 16kHz 单声道 float32 PCM2. VAD 人声检测(Silero-VAD)
3. ASR(FunASR SenseVoice)
use_itn=True,输出含标点和逆文本正则化(ITN)~/.cache/modelscope/<|zh|><|NEUTRAL|><|Speech|>),text 字段为纯汉字4. 声纹 Embedding(WeSpeaker ResNet34 ONNX)
models/wespeaker/wespeaker-cnceleb-resnet34-LM/cnceleb_resnet34_LM.onnx飞书管道架构
流程: 飞书事件监听(WebSocket/Webhook)→ 事件解析 → A 层事件转换 → EventSink
连接模式:
支持的飞书事件类型:
1. 消息事件(im.message.receive_v1)→ notification_event
notification_event,subtype 为message_notification2. Bot 加入群聊(im.chat.member.bot.added_v1)→ ui_state_change
ui_state_change,subtype 为chat_thread_opened3. 群聊更新(im.chat.updated_v6)→ ui_state_change
ui_state_change,subtype 为group_updated4. 日历事件(calendar.calendar.event.created_v6)→ notification_event
notification_event,subtype 为calendar_reminder时间戳:所有飞书事件使用接收时的系统时间
datetime.now()并行处理与时间轴对齐
run_parallel.py使用threading同时运行两个管道:EventSink加了threading.Lock,两个线程安全并发写入同一文件EventSink时不自动关闭(_owns_sink=False)运行方式
关键配置(src/config.py)
DEVICE"cuda"YOLO_CONF_THRESHOLD0.5MIN_FACE_QUALITY0.3MIN_TRACK_AGE5person_track事件FACE_REEMBED_INTERVAL15ENABLE_SCENE_CLASSIFICATIONTrueFLORENCE2_MODEL_DIRmodels/AI-ModelScope/Florence-2-baseSCENE_CHANGE_THRESHOLD0.85SCENE_CHANGE_COOLDOWN_SEC3.0AUDIO_SAMPLE_RATE16000AUDIO_CHUNK_SAMPLES512VAD_ONSET_THRESHOLD0.5VAD_OFFSET_THRESHOLD0.35ASR_MODEL"iic/SenseVoiceSmall"VOICE_EMBEDDER_MODEL_PATHmodels/wespeaker/.../cnceleb_resnet34_LM.onnxFEISHU_APP_ID""FEISHU_APP_SECRET""FEISHU_BOT_MODE"websocket"FEISHU_WEBHOOK_PORT8080FEISHU_VERIFICATION_TOKEN""FEISHU_ENCRYPT_KEY""EVENT_OUTPUT_FILEoutputs/events.jsonl模型依赖
~/.insightface/models/AI-ModelScope/Florence-2-base/modelscope.AutoModelForCausalLM加载,需trust_remote_code=Trueeinops、timm依赖~/.cache/modelscope/models/wespeaker/wespeaker-cnceleb-resnet34-LM/安装方法
1. 克隆仓库
2. 安装系统依赖
3. 创建虚拟环境并安装 Python 依赖
4. 下载模型文件
YOLOv8 模型:
yolo12n.pt到项目根目录Florence-2 模型:
models/AI-ModelScope/Florence-2-base/WeSpeaker 声纹模型:
insightface 模型:
~/.insightface/FunASR 模型:
~/.cache/modelscope/环境与依赖
./linux_env/libgl1(sudo apt-get install -y libgl1)、ffmpeg(手动安装)性能指标(CPU,1080p 视频)
事件输出格式
输出文件
outputs/events.jsonl,每行一个 JSON 事件。face_detection:每帧每个合格人脸输出,含 bbox、face_quality、512 维 face_embedding
person_track:追踪结束时输出,含 track_id、face_event_ids、representative_embedding
scene_detection:场景切换时输出,含 scene_label(Florence-2 描述)、objects、subtype=”generated_description”
speech_segment:每段语音结束时输出,payload 含:
text:ASR 识别文本(纯汉字,含标点,已 ITN 处理)language:"zh"turn_index:本次会话第几段话audio_features:{volume, speech_rate}voice_embedding:{model, vector(256维), vector_dim, norm="l2"}ui_state_change(飞书管道):UI 状态变化事件,payload 含:
subtype:"chat_thread_opened"或"group_updated"app_name:"Feishu"page_type:"group_chat"thread_id:飞书聊天 ID(格式:feishu_{chat_id})notification_event(飞书管道):通知事件,payload 含:
subtype:"message_notification"或"calendar_reminder"app_name:"Feishu"notification_type:"dm_message"/"group_message"/"calendar_event"title:发送者或日程标题preview_text:消息预览文本(截断至 200 字符)thread_id:关联的聊天或日历 IDpriority_hint:优先级提示("unknown"/"normal")已知问题与注意事项
duplicated model: w600k_r50.onnx)属正常现象trust_remote_code: False属正常现象(SenseVoice 默认关闭 remote_code)pip install wespeaker有 s3prl/torchaudio 兼容性问题),直接 ONNX 推理26MB ONNX,34MB pt),非 Git LFS 指针--max-frames 750限制帧数,音频管道处理全视频(前段无人声由 VAD 过滤)