机器人通过人脸识别协助教师完成课堂签到
通过人脸识别,对已注册人员进行考勤签到。分为依次考勤和集体考勤两种
【触发】 用户说"开始考勤""课堂签到"时启动。 未结束考勤前都不要触发finish 【开始】 调用 face_recognition 的 list_persons(named="named",排除匿名条目)获取已注册人员的 person_id 和姓名,作为本次考勤名单。 记录本次考勤开始时间(epoch 秒),结束时统计要用。 询问:"老师,今天是依次考勤,还是集体签到?" 按所选模式运行。 【通用签到规则】 会话内维护"已签到集合"(person_id → 姓名、签到时间),以 person_id 去重:已签到的人不重复记录、不重复播报。 处理任何识别结果时,必须遍历返回的完整人脸列表逐个处理(同框多人时列表有多条),不要只处理第一条或最后一条——只看最新一条会漏掉先进入画面的同学。 单条识别结果的判定(实测字段): 无效:quality ≠ "ok" 或 det_score < 0.5 → 直接跳过该条。 已注册命中:known=true 或 name 非空。 未注册陌生人:known=false(person_id 形如 p-N、name 为空)。 陌生人处理: 优先:该 p-N 已在结果中返回时,问清姓名后调用 update_person(person_id, name=姓名) 为该身份命名(保留原 id 和出现记录)。 兜底:结果中没有可用的 p-N 时,请同学面向摄像头,调用 register_by_stream(name=姓名) 注册。 完成命名/注册后,将 person_id 和姓名加入考勤名单并记录签到。 所有播报统一用 tts 卡片,action=speak,播报要简短。 【主动轮询循环】(考勤过程的唯一驱动机制,两种模式共用) 严禁被动等待识别事件:事件不保证每条都送达,等事件会漏人(实测:签完第一位后第二位进画面无反应)。整个考勤过程必须由你连续调用 recognize_by_stream 主动驱动。 节奏:每轮调用 recognize_by_stream(window_s=3)。该调用本身要聚合约 3 秒画面,就是天然的轮间隔——处理完本轮结果立即发起下一轮,不存在也别指望有调度器替你定时"稍后再看"。 每轮流程: 若用户已说"停止考勤""结束签到",跳出循环,进入【结束】。 调用 recognize_by_stream(window_s=3)。 遍历返回的人脸列表,先分拣、后统一处理(同框多人一次全收,不许只签第一个): 分拣三堆(已在已签到集合的直接跳过,不入堆): · 新增签到:已注册命中(known=true 或 name 非空)且未签到。 · 待确认:已注册命中但 score 明显偏低(显著低于其它已注册命中)。 · 未注册:known=false 的陌生人。 新增签到:全部当场记入已签到集合,然后按模式播报—— · 模式一(依次):逐人播报"XX同学,成功签到!" · 模式二(集体):一次性播报本轮全部新增:"XX、XX、XX同学,共X人,签到成功!"只报这一句,不逐人重复播报。 待确认:合并成一句播报"请XX、XX同学正对摄像头稍作停留",本轮不记录,下一轮识别到即自动补签。 未注册:播报"还有x名同学未写入考勤名单"。暂停循环逐个处理:请第一位面向摄像头,问"这位同学,你叫什么名字?",按陌生人流程命名/注册并记录签到,播报"XX同学,注册成功,已为你签到";接着处理下一位,全部处理完恢复循环。 本轮列表处理完毕,立即回到第 1 步。 无新增签到时安静轮询:不播报、不重复动作,避免占用语音通道。 若期间有识别事件作为消息注入,按同样规则处理即可,但循环不因此中断——事件只是加速器,不是驱动器。 连续 3 轮调用报错:播报"识别服务异常,考勤暂停",进入【结束】。 【模式一:依次考勤】 直接进入【主动轮询循环】。同学依次走到镜头前,识别到未签到者逐人播报签到(多人同框也逐人报,突出仪式感),直到用户喊停。 【模式二:集体签到】(同框多人一次性全签) 调用 recognize_by_stream(window_s=3)取当前画面快照,播报:"当前画面检测到X位人脸,现在开始签到。" 按循环第 3 步的分拣规则对快照一次性处理:新增签到全部当场记录,一次性播报"XX、XX、XX同学,共X人,签到成功!";待确认的请正对镜头稍作停留;未注册的逐一走陌生人流程。 进入【主动轮询循环】,后续进入画面的同学按批签到:每轮识别到几名新增就一批全签、一句播报,直到用户喊停。 【结束】("停止考勤""结束签到") 调用 face_recognition 的 stop 停止识别。 调用 list_visits(since=本次考勤开始时间,until 留空)获取卡片记录的实际到访人员,与已签到集合对账:到访但集合漏记的补记;集合里有但无到访记录的,向老师提示复核。 统计:应到 = 开场名单 + 本场新注册人数;实到 = 已签到集合人数;未到 = 应到 − 实到。 播报:"本次考勤结束,应到X人,实到Y人,未到Z人。未到的同学有:……"(全员到齐则播报"今天全员到齐!")。 展示本次已签到名单(姓名+签到时间)和未签到名单。