From d355153a192fa42fd174012ea87e16b086f6d7e9 Mon Sep 17 00:00:00 2001 From: minecraft1024a Date: Tue, 19 Aug 2025 11:27:53 +0800 Subject: [PATCH] =?UTF-8?q?feat(video):=20=E8=A7=86=E9=A2=91=E8=AF=86?= =?UTF-8?q?=E5=88=AB=E5=8A=9F=E8=83=BD=E5=BC=80=E5=85=B3=E4=B8=8E=E6=97=A5?= =?UTF-8?q?=E5=BF=97=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 根据全局配置 `global_config.video_analysis.enable` 控制视频识别功能的启用与禁用。 - 当视频识别功能禁用时,收到视频消息将直接返回 `[视频]` 或空字符串,不再进行分析,以节约资源。 --- src/chat/message_receive/message.py | 157 ++++++++++++++++------------ 1 file changed, 90 insertions(+), 67 deletions(-) diff --git a/src/chat/message_receive/message.py b/src/chat/message_receive/message.py index ea92ddbad..45f797d11 100644 --- a/src/chat/message_receive/message.py +++ b/src/chat/message_receive/message.py @@ -13,6 +13,7 @@ from src.chat.utils.utils_image import get_image_manager from src.chat.utils.utils_voice import get_voice_text from src.chat.utils.utils_video import get_video from src.multimodal.video_analyzer import get_video_analyzer +from src.config.config import global_config from .chat_stream import ChatStream install(extra_lines=3) @@ -195,38 +196,56 @@ class MessageRecv(Message): self.is_picid = False self.is_emoji = False self.is_voice = False - if isinstance(segment.data, dict): - try: - # 从Adapter接收的视频数据 - video_base64 = segment.data.get("base64") - filename = segment.data.get("filename", "video.mp4") - - if video_base64: - # 解码base64视频数据 - video_bytes = base64.b64decode(video_base64) + logger.info(f"接收到视频消息,数据类型: {type(segment.data)}") + logger.debug(f"视频数据内容: {segment.data}") + if global_config.video_analysis.enable: + logger.info("已启用视频识别,开始识别") + if isinstance(segment.data, dict): + try: + # 从Adapter接收的视频数据 + video_base64 = segment.data.get("base64") + filename = segment.data.get("filename", "video.mp4") - # 使用video analyzer分析视频 - video_analyzer = get_video_analyzer() - result = await video_analyzer.analyze_video_from_bytes( - video_bytes, - filename, - prompt="请详细分析这个视频的内容,包括场景、人物、动作、情感等" - ) + logger.info(f"视频文件名: {filename}") + logger.info(f"Base64数据长度: {len(video_base64) if video_base64 else 0}") - # 返回视频分析结果 - summary = result.get("summary", "") - if summary: - return f"[视频内容] {summary}" + if video_base64: + # 解码base64视频数据 + video_bytes = base64.b64decode(video_base64) + logger.info(f"解码后视频大小: {len(video_bytes)} 字节") + + # 使用video analyzer分析视频 + video_analyzer = get_video() + result = await video_analyzer.analyze_video_from_bytes( + video_bytes, + filename, + prompt="请详细分析这个视频的内容,包括场景、人物、动作、情感等" + ) + + logger.info(f"视频分析结果: {result}") + + # 返回视频分析结果 + summary = result.get("summary", "") + if summary: + return f"[视频内容] {summary}" + else: + return "[已收到视频,但分析失败]" else: - return "[已收到视频,但分析失败]" - else: - return "[收到视频消息,但数据异常]" - except Exception as e: - logger.error(f"视频处理失败: {str(e)}") - return "[收到视频,但处理时出现错误]" - return "[发了一个视频,但格式不支持]" + logger.warning("视频消息中没有base64数据") + return "[收到视频消息,但数据异常]" + except Exception as e: + logger.error(f"视频处理失败: {str(e)}") + import traceback + logger.error(f"错误详情: {traceback.format_exc()}") + return "[收到视频,但处理时出现错误]" + else: + logger.warning(f"视频消息数据不是字典格式: {type(segment.data)}") + return "[发了一个视频,但格式不支持]" + else: + return "" else: - return "" + logger.info("未启用视频识别") + return "[视频]" except Exception as e: logger.error(f"处理消息段失败: {str(e)}, 类型: {segment.type}, 数据: {segment.data}") return f"[处理失败的{segment.type}消息]" @@ -355,50 +374,54 @@ class MessageRecvS4U(MessageRecv): logger.info(f"接收到视频消息,数据类型: {type(segment.data)}") logger.debug(f"视频数据内容: {segment.data}") - - if isinstance(segment.data, dict): - try: - # 从Adapter接收的视频数据 - video_base64 = segment.data.get("base64") - filename = segment.data.get("filename", "video.mp4") - - logger.info(f"视频文件名: {filename}") - logger.info(f"Base64数据长度: {len(video_base64) if video_base64 else 0}") - - if video_base64: - # 解码base64视频数据 - video_bytes = base64.b64decode(video_base64) - logger.info(f"解码后视频大小: {len(video_bytes)} 字节") + if global_config.video_analysis.enable: + logger.info("已启用视频识别,开始识别") + if isinstance(segment.data, dict): + try: + # 从Adapter接收的视频数据 + video_base64 = segment.data.get("base64") + filename = segment.data.get("filename", "video.mp4") - # 使用video analyzer分析视频 - video_analyzer = get_video() - result = await video_analyzer.analyze_video_from_bytes( - video_bytes, - filename, - prompt="请详细分析这个视频的内容,包括场景、人物、动作、情感等" - ) + logger.info(f"视频文件名: {filename}") + logger.info(f"Base64数据长度: {len(video_base64) if video_base64 else 0}") - logger.info(f"视频分析结果: {result}") - - # 返回视频分析结果 - summary = result.get("summary", "") - if summary: - return f"[视频内容] {summary}" + if video_base64: + # 解码base64视频数据 + video_bytes = base64.b64decode(video_base64) + logger.info(f"解码后视频大小: {len(video_bytes)} 字节") + + # 使用video analyzer分析视频 + video_analyzer = get_video() + result = await video_analyzer.analyze_video_from_bytes( + video_bytes, + filename, + prompt="请详细分析这个视频的内容,包括场景、人物、动作、情感等" + ) + + logger.info(f"视频分析结果: {result}") + + # 返回视频分析结果 + summary = result.get("summary", "") + if summary: + return f"[视频内容] {summary}" + else: + return "[已收到视频,但分析失败]" else: - return "[已收到视频,但分析失败]" - else: - logger.warning("视频消息中没有base64数据") - return "[收到视频消息,但数据异常]" - except Exception as e: - logger.error(f"视频处理失败: {str(e)}") - import traceback - logger.error(f"错误详情: {traceback.format_exc()}") - return "[收到视频,但处理时出现错误]" + logger.warning("视频消息中没有base64数据") + return "[收到视频消息,但数据异常]" + except Exception as e: + logger.error(f"视频处理失败: {str(e)}") + import traceback + logger.error(f"错误详情: {traceback.format_exc()}") + return "[收到视频,但处理时出现错误]" + else: + logger.warning(f"视频消息数据不是字典格式: {type(segment.data)}") + return "[发了一个视频,但格式不支持]" else: - logger.warning(f"视频消息数据不是字典格式: {type(segment.data)}") - return "[发了一个视频,但格式不支持]" + return "" else: - return "" + logger.info("未启用视频识别") + return "[视频]" except Exception as e: logger.error(f"处理消息段失败: {str(e)}, 类型: {segment.type}, 数据: {segment.data}") return f"[处理失败的{segment.type}消息]"