feat(video): 视频识别功能开关与日志优化
根据全局配置 `global_config.video_analysis.enable` 控制视频识别功能的启用与禁用。 - 当视频识别功能禁用时,收到视频消息将直接返回 `[视频]` 或空字符串,不再进行分析,以节约资源。
This commit is contained in:
committed by
Windpicker-owo
parent
be454303c5
commit
d355153a19
@@ -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_voice import get_voice_text
|
||||||
from src.chat.utils.utils_video import get_video
|
from src.chat.utils.utils_video import get_video
|
||||||
from src.multimodal.video_analyzer import get_video_analyzer
|
from src.multimodal.video_analyzer import get_video_analyzer
|
||||||
|
from src.config.config import global_config
|
||||||
from .chat_stream import ChatStream
|
from .chat_stream import ChatStream
|
||||||
|
|
||||||
install(extra_lines=3)
|
install(extra_lines=3)
|
||||||
@@ -195,24 +196,34 @@ class MessageRecv(Message):
|
|||||||
self.is_picid = False
|
self.is_picid = False
|
||||||
self.is_emoji = False
|
self.is_emoji = False
|
||||||
self.is_voice = False
|
self.is_voice = False
|
||||||
|
logger.info(f"接收到视频消息,数据类型: {type(segment.data)}")
|
||||||
|
logger.debug(f"视频数据内容: {segment.data}")
|
||||||
|
if global_config.video_analysis.enable:
|
||||||
|
logger.info("已启用视频识别,开始识别")
|
||||||
if isinstance(segment.data, dict):
|
if isinstance(segment.data, dict):
|
||||||
try:
|
try:
|
||||||
# 从Adapter接收的视频数据
|
# 从Adapter接收的视频数据
|
||||||
video_base64 = segment.data.get("base64")
|
video_base64 = segment.data.get("base64")
|
||||||
filename = segment.data.get("filename", "video.mp4")
|
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:
|
if video_base64:
|
||||||
# 解码base64视频数据
|
# 解码base64视频数据
|
||||||
video_bytes = base64.b64decode(video_base64)
|
video_bytes = base64.b64decode(video_base64)
|
||||||
|
logger.info(f"解码后视频大小: {len(video_bytes)} 字节")
|
||||||
|
|
||||||
# 使用video analyzer分析视频
|
# 使用video analyzer分析视频
|
||||||
video_analyzer = get_video_analyzer()
|
video_analyzer = get_video()
|
||||||
result = await video_analyzer.analyze_video_from_bytes(
|
result = await video_analyzer.analyze_video_from_bytes(
|
||||||
video_bytes,
|
video_bytes,
|
||||||
filename,
|
filename,
|
||||||
prompt="请详细分析这个视频的内容,包括场景、人物、动作、情感等"
|
prompt="请详细分析这个视频的内容,包括场景、人物、动作、情感等"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
logger.info(f"视频分析结果: {result}")
|
||||||
|
|
||||||
# 返回视频分析结果
|
# 返回视频分析结果
|
||||||
summary = result.get("summary", "")
|
summary = result.get("summary", "")
|
||||||
if summary:
|
if summary:
|
||||||
@@ -220,13 +231,21 @@ class MessageRecv(Message):
|
|||||||
else:
|
else:
|
||||||
return "[已收到视频,但分析失败]"
|
return "[已收到视频,但分析失败]"
|
||||||
else:
|
else:
|
||||||
|
logger.warning("视频消息中没有base64数据")
|
||||||
return "[收到视频消息,但数据异常]"
|
return "[收到视频消息,但数据异常]"
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.error(f"视频处理失败: {str(e)}")
|
logger.error(f"视频处理失败: {str(e)}")
|
||||||
|
import traceback
|
||||||
|
logger.error(f"错误详情: {traceback.format_exc()}")
|
||||||
return "[收到视频,但处理时出现错误]"
|
return "[收到视频,但处理时出现错误]"
|
||||||
|
else:
|
||||||
|
logger.warning(f"视频消息数据不是字典格式: {type(segment.data)}")
|
||||||
return "[发了一个视频,但格式不支持]"
|
return "[发了一个视频,但格式不支持]"
|
||||||
else:
|
else:
|
||||||
return ""
|
return ""
|
||||||
|
else:
|
||||||
|
logger.info("未启用视频识别")
|
||||||
|
return "[视频]"
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.error(f"处理消息段失败: {str(e)}, 类型: {segment.type}, 数据: {segment.data}")
|
logger.error(f"处理消息段失败: {str(e)}, 类型: {segment.type}, 数据: {segment.data}")
|
||||||
return f"[处理失败的{segment.type}消息]"
|
return f"[处理失败的{segment.type}消息]"
|
||||||
@@ -355,7 +374,8 @@ class MessageRecvS4U(MessageRecv):
|
|||||||
|
|
||||||
logger.info(f"接收到视频消息,数据类型: {type(segment.data)}")
|
logger.info(f"接收到视频消息,数据类型: {type(segment.data)}")
|
||||||
logger.debug(f"视频数据内容: {segment.data}")
|
logger.debug(f"视频数据内容: {segment.data}")
|
||||||
|
if global_config.video_analysis.enable:
|
||||||
|
logger.info("已启用视频识别,开始识别")
|
||||||
if isinstance(segment.data, dict):
|
if isinstance(segment.data, dict):
|
||||||
try:
|
try:
|
||||||
# 从Adapter接收的视频数据
|
# 从Adapter接收的视频数据
|
||||||
@@ -399,6 +419,9 @@ class MessageRecvS4U(MessageRecv):
|
|||||||
return "[发了一个视频,但格式不支持]"
|
return "[发了一个视频,但格式不支持]"
|
||||||
else:
|
else:
|
||||||
return ""
|
return ""
|
||||||
|
else:
|
||||||
|
logger.info("未启用视频识别")
|
||||||
|
return "[视频]"
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.error(f"处理消息段失败: {str(e)}, 类型: {segment.type}, 数据: {segment.data}")
|
logger.error(f"处理消息段失败: {str(e)}, 类型: {segment.type}, 数据: {segment.data}")
|
||||||
return f"[处理失败的{segment.type}消息]"
|
return f"[处理失败的{segment.type}消息]"
|
||||||
|
|||||||
Reference in New Issue
Block a user