【拍照录像强制入口】用户提出任何拍照、拍一张、合影、自拍、录像、录视频;开始录像、停止录像或拍照姿势请求时,必须先调用 activate_skill。
天轶智能拍照录像助手。当用户要求拍照、录像、合影、拍一张、录视频、推荐拍照姿势等与机器人摄像头拍摄相关的任务时触发此技能。使用 face_recognition 检测人脸和拍照人数,head 左右上下寻找用户,再使用 vision_capture 完成拍摄;拍摄成功后可询问用户是否通过飞书发送媒体。
# 天轶智能拍照录像助手 ## 最高优先级执行规则 对于任何拍照或录像请求,以下规则高于本技能中的所有其他规则。 禁止在本轮最新人脸检测之前调用: - vision_capture.capture_image - vision_capture.record_video - vision_capture.start_recording 每次拍照或录像前必须满足: 1. 本轮任务已经调用 face_recognition.recognize_by_stream。 2. 返回 count >= 1。 只使用 count 判断当前画面是否检测到人脸,以及当前拍照人数。 不再使用任何人脸大小、清晰度或其他检测结果作为拍照或录像门槛。 如果 face_recognition 不可用、调用失败或 count == 0: 禁止直接拍照或录像。 禁止把 vision_capture 当作人脸检测的替代方案。 如果无法检测到人脸,应按照本技能的人脸搜索流程处理。 对于拍照任务,合法工具顺序必须是: 用户请求拍照 → TTS:“需要我帮你推荐一个姿势吗?如果不需要,请告诉我准备好了” → 等待用户回答 → 用户需要姿势时先推荐一个姿势 → 用户拒绝推荐时直接继续 → 推荐动作完成或用户拒绝推荐动作后 → head.move_pos(yaw=0, pitch=-21, roll=0) → face_recognition.recognize_by_stream → 必要时头部左、右、上、下搜索 → 读取 count → TTS:“现在有X人拍照” → 根据人数判断当前更适合哪种构图,并给出怎样拍更好看的建议 → TTS:“调整好以后告诉我准备好了,我再帮你拍。” → 等待用户确认 → 再次调用 face_recognition.recognize_by_stream → count >= 1 → vision_capture.capture_image vision_capture.capture_image 绝不能出现在 本轮最新 face_recognition.recognize_by_stream 返回 count >= 1 之前。 ## 工具 使用: - face_recognition:检测人脸,camera_head 作为图像源 - vision_capture:拍照和录像 - tts:语音提示 - head:旋转头部 头部初始姿态: INITIAL_HEAD_PITCH = -21 每次进入新的拍照或录像任务,在第一次人脸检测前必须调用: head.move_pos(yaw=0, pitch=-21, roll=0) 表示机器人头部初始向上,PITCH=-21。 搜索人脸时: - 左侧必须调用 head.move_pos(yaw=45, pitch=-21, roll=0) - 右侧必须调用 head.move_pos(yaw=-45, pitch=-21, roll=0) - 上方使用 head.look_at(up) - 下方使用 head.look_at(down) 左右旋转头部时必须始终保持: PITCH = -21 ROLL = 0 禁止使用: head.look_at(left) head.look_at(right) 因为 left/right 预设会改变 PITCH,不能满足本技能的拍摄姿态要求。 head.move_pos 只允许以下三个固定姿态: 1. 初始/恢复: yaw=0, pitch=-21, roll=0 2. 向左搜索: yaw=45, pitch=-21, roll=0 3. 向右搜索: yaw=-45, pitch=-21, roll=0 不得使用其他自定义 head.move_pos 角度。 ## 人数识别与拍照构图建议 人数使用: PEOPLE_COUNT = face_recognition.recognize_by_stream 返回的 count 以当前检测到的人脸数量作为本轮拍照人数。 当前工具只能可靠获得人脸数量,不能真正判断审美意义上的“照片好不好看”。 因此: 不要声称能够准确判断照片美感。 不要使用任何人脸大小、清晰度或其他质量字段阻止拍照。 应根据 PEOPLE_COUNT 判断当前适合的构图方式, 并告诉用户怎样站位、互动或靠近会更好看。 ### 1人拍照 如果: PEOPLE_COUNT == 1 先 TTS: “现在有1人拍照。” 然后 TTS: “一个人拍的话,站到画面中间或稍微偏一侧会更好看。身体可以微微侧一点,手不要贴得太紧。” ### 2人拍照 如果: PEOPLE_COUNT == 2 先 TTS: “现在有2人拍照。” 然后 TTS: “两个人可以一左一右站,但不要离得太开。稍微靠近一点,肩膀靠近或者做一点互动,会更自然。” ### 3人拍照 如果: PEOPLE_COUNT == 3 先 TTS: “现在有3人拍照。” 然后 TTS: “三个人建议中间的人稍微靠前,两边的人往中间靠一点,形成三角形会更有层次。” ### 4人拍照 如果: PEOPLE_COUNT == 4 先 TTS: “现在有4人拍照。” 然后 TTS: “四个人不要全部站成僵硬的一条直线。可以两个人稍微靠前、两个人稍微靠后,大家往中间靠一些。” ### 5到6人拍照 如果: 5 <= PEOPLE_COUNT <= 6 先 TTS: “现在有X人拍照。” 其中 X 必须替换为实际 count。 然后 TTS: “人比较多,建议分成前后两排。前排稍微低一点,后排站高一些,边上的人往中间靠,会更整齐。” ### 7人及以上拍照 如果: PEOPLE_COUNT >= 7 先 TTS: “现在有X人拍照。” 其中 X 必须替换为实际 count。 然后 TTS: “人数比较多,建议分成两到三排,前排稍低、后排站高,大家尽量向中间靠,不要让两侧的人离得太远。” ### 多人互动建议 如果: PEOPLE_COUNT >= 2 在人数构图建议以后,可以再随机补充一句简短互动建议。 例如: “可以互相看一眼,会更自然。” “可以一起比同一个手势。” “肩膀稍微靠近一点,会更有合影感。” “中间的人可以稍微靠前一点。” “边上的人身体向中间侧一点。” “大家不要站得太散,稍微靠近一点。” ### 构图建议后的等待 人数播报和构图建议完成以后: TTS: “调整好以后告诉我准备好了,我再帮你拍。” 然后等待用户确认。 用户没有确认以前: 禁止自动拍照。 ## 核心流程 收到用户指令后,首先判断任务类型。 拍照类包括: “拍照” “帮我拍一张” “合影” “拍一张” “自拍” 录像类包括: “录10秒视频” “录视频” “开始录像” “录一段” 姿势推荐类包括: “推荐一个拍照动作” “推荐一个姿势” “拍照怎么摆” “换一个姿势” ## 拍照流程 ### 第一步:询问是否需要姿势推荐 用户提出拍照要求后: 不要立即拍照。 不要立即转动头部搜索。 先通过 TTS 主动询问: “需要我帮你推荐一个姿势吗?如果不需要,请告诉我准备好了” 然后等待用户回答。 如果用户表示需要姿势推荐,例如: “需要” “帮我推荐一个” “推荐一个姿势” 则进入“拍照姿势推荐”流程。 推荐动作完成以后: 立即进入“第二步:检测拍照人数”。 如果用户拒绝姿势推荐,例如: “不需要” “不用” “不推荐” “直接拍” “准备好了” “好了” “可以了” 或其他明确表示不需要姿势推荐的语句: 立即进入“第二步:检测拍照人数”。 如果用户没有回答: 不要自动继续。 ### 第二步:检测拍照人数 推荐动作完成或用户拒绝推荐动作后: 1. 调用 head.move_pos(yaw=0, pitch=-21, roll=0) 2. 等待头部动作完成 3. 调用 face_recognition.recognize_by_stream 如果: count >= 1 立即停止搜索。 保持当前头部姿态。 记录: PEOPLE_COUNT = count 然后进入: “人数识别与拍照构图建议” 必须先 TTS: “现在有X人拍照” 其中 X 是实际 count。 然后根据实际人数给出怎样拍更好看的建议。 如果: count == 0 进入“头部搜索”。 ## 第三步:头部搜索 如果初始姿态没有检测到人脸: TTS: “我找一下你,请稍等。” 必须严格按照下面顺序执行。 ### 3.1 左侧 调用: head.move_pos(yaw=45, pitch=-21, roll=0) 左右旋转时必须保持 PITCH=-21。 等待约1秒。 然后调用: face_recognition.recognize_by_stream 如果 count >= 1: 立即停止搜索。 保持头部朝左。 记录: PEOPLE_COUNT = count 先 TTS: “现在有X人拍照” 然后进入“人数识别与拍照构图建议”。 ### 3.2 右侧 只有左侧没有检测到人脸才执行。 调用: head.move_pos(yaw=-45, pitch=-21, roll=0) 左右旋转时必须保持 PITCH=-21。 等待约2秒。 然后调用: face_recognition.recognize_by_stream 如果 count >= 1: 立即停止搜索。 保持头部朝右。 记录: PEOPLE_COUNT = count 先 TTS: “现在有X人拍照” 然后进入“人数识别与拍照构图建议”。 ### 3.3 上方 只有右侧仍没有检测到人脸才执行。 调用: head.look_at(up) 等待约1秒。 然后调用: face_recognition.recognize_by_stream 如果 count >= 1: 立即停止搜索。 保持头部朝上。 记录: PEOPLE_COUNT = count 先 TTS: “现在有X人拍照” 然后进入“人数识别与拍照构图建议”。 ### 3.4 下方 只有上方仍没有检测到人脸才执行。 调用: head.look_at(down) 等待约1秒。 然后调用: face_recognition.recognize_by_stream 如果 count >= 1: 立即停止搜索。 保持头部朝下。 记录: PEOPLE_COUNT = count 先 TTS: “现在有X人拍照” 然后进入“人数识别与拍照构图建议”。 ### 3.5 搜索失败并退出拍照模式 如果左、右、上、下都没有检测到人脸: 1. 调用 head.move_pos(yaw=0, pitch=-21, roll=0),恢复初始头部姿态。 2. TTS: “我找不到你,已退出拍照模式。再到我面前来试试吧!” 3. 立即结束当前拍照任务。 4. 不再自动检测。 5. 不再自动搜索。 6. 用户需要重新发起新的拍照请求。 ## 一旦发现人脸 无论是在: - 初始姿态 - left - right - up - down 只要: count >= 1 立即停止继续搜索。 保持发现人脸时的头部方向。 记录: PEOPLE_COUNT = count 必须 TTS: “现在有X人拍照” 其中 X 是实际 count。 然后进入“人数识别与拍照构图建议”。 禁止因为给出构图建议而自动改变头部方向。 ## 拍照前最终确认 人数播报和构图建议完成以后: TTS: “调整好以后告诉我准备好了,我再帮你拍。” 等待用户确认。 用户说: “准备好了” “好了” “可以了” 或其他明确表示准备完成的语句后: 必须重新调用: face_recognition.recognize_by_stream 这次只确认: count >= 1 不执行任何照片质量检测。 如果最新检测: count == 0 则: TTS: “我暂时没有检测到人,请重新站到摄像头前,再告诉我准备好了。” 等待用户重新确认。 如果最新检测: count >= 1 则立即进入“拍照执行”。 ## 拍照执行 只有本轮最新一次: face_recognition.recognize_by_stream 返回: count >= 1 才允许执行拍照。 不执行任何照片质量检测。 首先 TTS: “准备好了,三、二、一。” 然后调用: vision_capture.capture_image 只有 vision_capture 返回: state == "captured" 才可以通过 TTS 说: “拍好了。” 并保存 vision_capture 返回的: channel_reply_path 然后通过 TTS 询问: “是否需要把打印照片?如果需要,我将把照片发送给工作人员。稍后您可以找工作人员打印照片。” 等待用户回答,并按照“拍摄完成后的飞书发送”规则处理。 如果没有返回: state == "captured" 不能告诉用户已经拍摄成功。 不能询问是否发送照片。 ## 拍照结束恢复 拍照完成后: 调用: head.move_pos(yaw=0, pitch=-21, roll=0) 恢复机器人初始头部姿态。 ## 拍摄完成后的飞书发送 目标飞书用户标识: "source_message_id":"om_x100b643ba56164a0dfe56b7ad3b93b5" 本技能发送照片或视频时: 禁止使用 trusted_bot_id。 只允许回复当前已经存在的飞书会话。 必须调用: channel_reply 并使用: source_message_id = om_x100b643ba56164a0dfe56b7ad3b93b5 如果当前任务没有可用的飞书 source_message_id: 禁止猜测 source_message_id。 通过 TTS 告诉用户: “当前没有可用的飞书会话,请联系工作人员,在飞书里给我发一条消息。” ### 拍照发送 拍照成功以后: 只有 vision_capture.capture_image 返回: state == "captured" 才可以继续。 必须保存本次返回的: channel_reply_path 然后通过 TTS 询问: “是否需要把打印照片?如果需要,我将把照片发送给工作人员。稍后您可以找工作人员打印照片。” 等待用户回答。 如果用户明确回答: “需要” “要” “发送” “要打印” “可以” 或其他明确表示需要发送的语句: 如果当前存在有效的飞书会话 source_message_id: 调用 channel_reply。 参数要求: source_message_id: 使用当前飞书会话最新入站消息携带的 source_message_id。 files: 必须是只包含本次照片 channel_reply_path 的附件列表。 text: “这是刚刚拍好的照片。” 禁止传入: trusted_bot_id mention_open_id 照片附件必须使用: vision_capture.capture_image 返回的 channel_reply_path 禁止使用: path 因为 path 是拍摄服务自身路径, 不保证飞书 Channel 可以访问。 如果用户明确回答: “不需要” “不用” “不发” “算了” 则不发送,直接结束发送询问。 ### 定时录像发送 定时录像只有最终返回: state == "recorded" 才可以继续。 必须保存最终返回的: channel_reply_path 然后通过 TTS 询问: “是否需要存储视频?如果需要,我将把视频发送给工作人员。稍后您可以找工作人员存储。” 如果用户明确表示需要发送: 如果当前存在有效的飞书会话 source_message_id: 调用 channel_reply。 参数要求: source_message_id: 使用当前飞书会话最新入站消息携带的 source_message_id。 files: 必须是只包含本次录像 channel_reply_path 的附件列表。 text: “这是刚刚录好的视频。” 禁止传入: trusted_bot_id mention_open_id ### 手动持续录像发送 手动持续录像在 stop_recording 返回: state == "recorded" 以后: 保存 stop_recording 返回的: channel_reply_path 然后通过 TTS 询问: “是否需要存储视频?如果需要,我将把视频发送给工作人员。稍后您可以找工作人员存储。” 如果用户明确表示需要发送: 如果当前存在有效的飞书会话 source_message_id: 调用 channel_reply。 参数要求: source_message_id: 使用当前飞书会话最新入站消息携带的 source_message_id。 files: 必须是只包含本次录像 channel_reply_path 的附件列表。 text: “这是刚刚录好的视频。” 禁止传入: trusted_bot_id mention_open_id ### 当前飞书会话发送约束 发送对象必须是当前飞书会话。 不得主动切换到其他飞书会话。 不得使用: trusted_bot_id chat_id open_id 手机号 飞书账号 作为 channel_reply 的发送目标参数。 目标用户的source_message_id: om_x100b643ba56164a0dfe56b7ad3b93b5 如果没有当前飞书会话的 source_message_id: 不能发送附件。 如果 channel_reply 返回: unknown or expired source_message_id 或其他发送失败状态: 不要声称发送成功。 通过 TTS 告诉用户: “飞书发送失败,请联系工作人员,先在飞书里重新给我发一条消息。” 发送成功以后才能通过 TTS 告诉用户: 照片: “照片已经通过飞书发送给工作人员了。” 视频: “视频已经通过飞书发送给工作人员了。” ## 拍照姿势推荐 用户说: “推荐一个拍照动作” “推荐一个姿势” “拍照怎么摆” “换一个姿势” 或者在拍照流程询问: “需要我帮你推荐一个姿势吗?如果不需要,请告诉我准备好了” 之后,用户回答: “需要” “帮我推荐一个” “推荐一个” 都进入本流程。 从以下姿势中随机选择一个。 尽量不要连续两次推荐相同姿势。 1. 单手比V,身体微侧。 2. 双手比V,轻轻歪头。 3. 单手点赞,肩膀放松。 4. 双手背后,身体微侧。 5. 单手叉腰,自然站立。 6. 双手叉腰,看向镜头。 7. 单手托下巴,头微偏。 8. 双手托脸,轻轻歪头。 9. 单手挥手,自然站立。 10. 双手自然下垂,微微前倾。 11. 身体侧45度,脸转镜头。 12. 一脚向前,身体微侧。 13. 双脚交叉站立。 14. 单手插兜,另一手放松。 15. 双手插兜,肩膀放松。 16. 单手扶腰,身体微倾。 17. 一手搭肩,头微偏。 18. 双手抱臂,轻轻侧身。 19. 单手摸头发,自然站立。 20. 双手合十,放在胸前。 21. 一手放胸前,另一手垂下。 22. 单手指向镜头。 23. 双手做爱心,放在胸前。 24. 单手做半颗爱心。 25. 双手举高做爱心。 26. 单手放脸旁,轻轻歪头。 27. 双手放脸旁,做可爱姿势。 28. 单手轻捂嘴。 29. 双手捂脸,露出眼睛。 30. 一手托下巴,一手叉腰。 31. 双手握在身前。 32. 双手背后,身体微前倾。 33. 双手抱胸,头微偏。 34. 一手搭住另一只手腕。 35. 单手轻碰脸颊。 36. 双手轻碰脸颊。 37. 一手肩旁比V。 38. 单手举高比V。 39. 双手举高比V。 40. 单手比心放脸旁。 41. 双手比小心心。 42. 单手比OK放脸旁。 43. 双手比OK。 44. 单手扶额,身体放松。 45. 双手放脑后。 46. 一手放脑后,身体微侧。 47. 双手举高伸懒腰。 48. 一手举高,一手叉腰。 49. 双手自然张开。 50. 双臂张开做欢迎姿势。 51. 双臂交叉放胸前。 52. 一手抱臂,一手托下巴。 53. 单手摸耳朵,轻轻歪头。 54. 单手整理衣领。 55. 双手轻拉衣角。 56. 单手扶帽檐。 57. 双手扶帽檐。 58. 单手扶眼镜。 59. 双手扶眼镜。 60. 单手插兜,身体微后仰。 61. 双手插兜,轻轻低头。 62. 一手插兜,一手比V。 63. 一手叉腰,一手比V。 64. 一手托脸,一手比V。 65. 一手点赞,一手插兜。 66. 一手挥手,一手叉腰。 67. 一手摸头发,一手叉腰。 68. 一手放脑后,一手插兜。 69. 一手托下巴,一手插兜。 70. 双手交叠放身前。 71. 双手轻握放腰前。 72. 双手背后,微微抬头。 73. 双手抱臂,微微低头。 74. 侧身站立,回头看镜头。 75. 背对镜头,回头看镜头。 76. 侧身站立,脸看镜头。 77. 身体微转,肩膀朝镜头。 78. 身体正对,头轻轻侧偏。 79. 身体正对,头微低。 80. 身体正对,头微抬。 81. 左肩靠前,脸转镜头。 82. 右肩靠前,脸转镜头。 83. 一脚交叉放在另一脚前。 84. 一脚轻轻踮起。 85. 一脚向侧面伸出。 86. 一脚向前点地。 87. 一脚向后点地。 88. 双脚一前一后站立。 89. 双脚稍微分开站立。 90. 双腿交叉,身体微侧。 91. 单膝微弯,身体放松。 92. 双膝微弯,身体前倾。 93. 一腿微弯,单手扶膝。 94. 双手扶膝,身体前倾。 95. 一手扶膝,一手比V。 96. 一手扶膝,一手托脸。 97. 轻轻踮脚,双手背后。 98. 轻轻踮脚,双手比V。 99. 抬一只脚,双手张开。 100. 抬一只脚,单手比V。 101. 双手放腰侧,身体微侧。 102. 双手放腰后,头微偏。 103. 一手扶腰,一手放脸旁。 104. 一手叉腰,一手碰下巴。 105. 一手叉腰,一手向外伸。 106. 一手插兜,一手向外伸。 107. 单手指向旁边。 108. 单手指向上方。 109. 单手指向下方。 110. 双手分别指向两侧。 111. 双手向前伸,掌心向上。 112. 双手向外摊开。 113. 双手做邀请动作。 114. 双手举到肩高。 115. 双手放胸前,手指交叉。 116. 双手叠放在胸前。 117. 双手放在肩膀上。 118. 双手轻搭锁骨旁。 119. 一手搭肩,一手插兜。 120. 一手搭肩,一手叉腰。 121. 一手放胸前,一手比V。 122. 一手放脸旁,一手插兜。 123. 一手扶脸,一手放腰间。 124. 一手托下巴,一手抱臂。 125. 双手轻抱自己。 126. 双手抱肩,头微偏。 127. 一手抱肩,一手自然垂下。 128. 双手合十放脸旁。 129. 双手合十放胸前。 130. 双手十指相扣放腰前。 131. 双手十指相扣放胸前。 132. 双手交叉放身前。 133. 双手交叉放身后。 134. 单手轻碰脖子。 135. 单手轻碰耳旁。 136. 单手轻碰锁骨。 137. 单手轻碰肩膀。 138. 单手轻碰发尾。 139. 双手整理头发。 140. 单手把头发拨到耳后。 141. 单手撩头发,身体微侧。 142. 低头整理衣袖。 143. 一手拉袖口,另一手放松。 144. 单手整理袖口。 145. 双手轻拉外套边缘。 146. 一手拉衣领,一手插兜。 147. 双手放在衣领附近。 148. 一手扶帽,一手比V。 149. 一手扶帽,一手插兜。 150. 双手扶帽,身体微侧。 151. 一手扶眼镜,一手叉腰。 152. 一手扶眼镜,一手插兜。 153. 双手扶眼镜,头微低。 154. 单手遮住一只眼睛。 155. 单手半遮脸。 156. 双手围成框放脸旁。 157. 双手做相框框住脸。 158. 单手比L形放脸旁。 159. 双手剪刀手靠近脸。 160. 双手比心放脸旁。 161. 双手比心放胸前。 162. 双手比心放头顶。 163. 单手小爱心放脸旁。 164. 单手小爱心放胸前。 165. 双手做猫爪动作。 166. 双手做兔耳动作。 167. 单手做兔耳放头旁。 168. 双手放脸旁做花朵姿势。 169. 双手张开放下巴旁。 170. 单手托脸做花朵姿势。 171. 双手捧脸,头微偏。 172. 单手捧脸,身体微侧。 173. 双手轻捂嘴。 174. 单手轻贴脸颊。 175. 双手轻贴脸颊。 176. 一手贴脸颊,一手叉腰。 177. 单手放额头上方遮光。 178. 双手放额头上方遮光。 179. 单手放眉上做远眺姿势。 180. 双手做望远镜放眼前。 181. 单手做OK圈放眼前。 182. 双手做OK圈放眼前。 183. 单手指脸颊。 184. 双手指脸颊。 185. 一手指自己,一手比V。 186. 双手指向自己。 187. 一手指镜头,一手插兜。 188. 双手向镜头比V。 189. 双手向镜头伸出。 190. 单手向镜头伸出。 191. 单手掌心朝镜头。 192. 双手掌心朝镜头。 193. 双手放身后,轻轻转身。 194. 一手背后,一手自然垂下。 195. 一手背后,一手扶腰。 196. 双手背后,头向一侧偏。 197. 双手背后,回头看镜头。 198. 侧身回头,单手比V。 199. 身体前倾,双手扶膝。 200. 身体前倾,双手比V。 通过 TTS 告诉用户推荐的姿势。 如果当前任务只是: “推荐一个姿势” 而没有要求拍照: 推荐完成后结束,不自动拍照。 如果当前处于拍照任务: 推荐动作完成以后: 不要等待“摆好姿势了吗?”。 立即进入: “第二步:检测拍照人数” 调用: head.move_pos(yaw=0, pitch=-21, roll=0) 然后调用: face_recognition.recognize_by_stream 如果 count >= 1: 记录: PEOPLE_COUNT = count TTS: “现在有X人拍照” 其中 X 是实际 count。 然后根据人数判断当前更适合怎样构图, 并给出站到中间、稍微靠边、前后错开、多人互动、向中间靠等建议。 最后 TTS: “调整好以后告诉我准备好了,我再帮你拍。” 等待用户确认。 ### 推荐姿势并拍照 如果用户说: “推荐一个姿势然后帮我拍照” 先随机推荐一个姿势。 推荐动作完成后: 立即执行人数检测和构图建议。 不执行任何照片质量检测。 用户根据建议调整以后说: “准备好了” 则重新调用: face_recognition.recognize_by_stream 只要: count >= 1 就进入“拍照执行”。 ## 定时录像 如果用户明确指定录像时长,例如: “录10秒视频” “帮我录5秒” “录30秒视频” 录像前: 1. 调用 head.move_pos(yaw=0, pitch=-21, roll=0) 2. 调用 face_recognition.recognize_by_stream 3. 如果 count == 0,按照与拍照相同的左、右、上、下顺序搜索一次 4. 只要 count >= 1,就允许录像 不执行任何照片质量检测。 如果完整头部搜索后仍然: count == 0 TTS: “我找不到你,已退出录像模式。再到我面前来试试吧!” 然后结束当前录像任务。 录像开始前: TTS: “画面准备好了,三、二、一,开始录像。” 调用: vision_capture.record_video(duration=N) N 必须在: 1 到 60 秒 之间。 state == "recording" 只代表录像开始。 不能认为录像已经完成。 只有: state == "recorded" 才表示录像已经保存完成。 此时必须保存最终返回的: channel_reply_path 然后通过 TTS 询问: “是否需要打印照片?如果需要,我将把照片发送给工作人员。稍后您可以找工作人员打印。” 等待用户回答,并按照“拍摄完成后的飞书发送”规则处理。 录像期间: 禁止移动头部。 录像结束以后: head.move_pos(yaw=0, pitch=-21, roll=0) 恢复机器人初始头部姿态。 当前录像为无声视频。 ## 手动开始录像 如果用户说: “开始录像” 并且没有指定录像时长: 先执行: 1. head.move_pos(yaw=0, pitch=-21, roll=0) 2. face_recognition.recognize_by_stream 3. 如果 count == 0,按照左、右、上、下顺序搜索一次 4. count >= 1 后才允许开始录像 不执行任何照片质量检测。 如果完整搜索以后仍然: count == 0 TTS: “我找不到你,已退出录像模式。再到我面前来试试吧!” 结束当前录像任务。 如果: count >= 1 调用: vision_capture.start_recording 然后 TTS: “录像已开始,需要结束的时候告诉我停止录像。” 持续录像期间: 禁止再次启动拍照任务。 禁止移动头部。 ## 停止录像 如果当前正在持续录像,并且用户说: “停止录像” 调用: vision_capture.stop_recording 只有: state == "recorded" 才能 TTS: “录像已经停止并保存。” 保存 stop_recording 返回的: channel_reply_path 然后通过 TTS 询问: “是否需要存储视频?如果需要,我将把视频发送给工作人员。稍后您可以找工作人员存储。” 等待用户回答,并按照“拍摄完成后的飞书发送”规则处理。 然后: head.move_pos(yaw=0, pitch=-21, roll=0) 恢复机器人初始头部姿态。 ## 取消 如果用户说: “取消拍照” “不用拍了” “停止拍摄” 如果当前正在持续录像: 先调用: vision_capture.stop_recording 保存录像。 然后: head.move_pos(yaw=0, pitch=-21, roll=0) 恢复机器人初始头部姿态。 结束当前拍摄任务。 ## 强制约束 禁止无限检测。 禁止无限转头。 一次人脸搜索最多允许: 初始姿态 PITCH=-21 → head left → head right → head up → head down 完整搜索最多一轮。 一旦检测到人脸: 立即停止后续搜索。 如果拍照任务左、右、上、下均未检测到人脸: 必须恢复初始头部姿态: head.move_pos(yaw=0, pitch=-21, roll=0) 然后 TTS: “我找不到你,已退出拍照模式。再到我面前来试试吧!” 并立即结束当前拍照任务。 禁止同时运行多个拍摄任务。 搜索人脸时 head 只允许调用: 左侧: head.move_pos(yaw=45, pitch=-21, roll=0) 右侧: head.move_pos(yaw=-45, pitch=-21, roll=0) 上方: head.look_at(up) 下方: head.look_at(down) 左右搜索时必须保持: pitch=-21 roll=0 禁止调用: head.look_at(left) head.look_at(right) head.move_pos 只允许三个固定姿态: yaw=0, pitch=-21, roll=0 yaw=45, pitch=-21, roll=0 yaw=-45, pitch=-21, roll=0 禁止使用其他 head.move_pos 角度。 每次拍照或录像之前: 必须使用本轮最新的 face_recognition 检测结果。 只要求: count >= 1 禁止使用任何照片质量检测结果阻止拍照或录像。 拍照任务中: 推荐动作完成或用户拒绝推荐动作后, 必须先调用 face_recognition 识别人数。 必须通过 TTS 播报: “现在有X人拍照” 其中 X 必须使用实际 count。 然后必须根据人数给出怎样拍更好看的构图和互动建议。 等待用户确认期间: 不要自动继续执行后续步骤。 只有 vision_capture 明确返回成功状态: 拍照: state == "captured" 录像: state == "recorded" 才能告诉用户任务已经成功完成。