From 86ef54fb75574532448a35e1cb284fad69d82cd4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9C=B1=E6=BD=AE?= Date: Sun, 31 Aug 2025 00:58:29 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E9=9F=B3=E9=A2=91=E5=88=86?= =?UTF-8?q?=E6=AE=B5=E5=A4=84=E7=90=86=E4=B8=BA=E9=BB=98=E8=AE=A4=E6=96=87?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 移除实际音频处理逻辑 - 改为生成默认演示文本 - 根据文件类型生成合适的演示内容 - 支持音频、视频和其他媒体文件 - 保留完整的元数据和时间信息 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --- .../handle/impl/media/media_split_handle.py | 207 ++++++++++-------- 1 file changed, 120 insertions(+), 87 deletions(-) diff --git a/apps/common/handle/impl/media/media_split_handle.py b/apps/common/handle/impl/media/media_split_handle.py index 0805358a..b1c28a78 100644 --- a/apps/common/handle/impl/media/media_split_handle.py +++ b/apps/common/handle/impl/media/media_split_handle.py @@ -28,104 +28,137 @@ class MediaSplitHandle(BaseSplitHandle): def handle(self, file, pattern_list: List, with_filter: bool, limit: int, get_buffer, save_image, **kwargs): - """处理音视频文件""" + """处理音视频文件 - 使用默认文本""" maxkb_logger.info(f"MediaSplitHandle.handle called with file: {file.name}") - maxkb_logger.info(f"kwargs received: {kwargs}") + maxkb_logger.info(f"Using default text for media processing (no actual audio processing)") - # 初始化适配器 - if not self.adapter: - from .media_adapter import MediaAdapter - from .media_adapter.logger import MediaLogger - logger_wrapper = MediaLogger(maxkb_logger) - self.adapter = MediaAdapter(logger=logger_wrapper) + # 获取文件名和类型 + file_name = file.name + file_ext = file_name.lower().split('.')[-1] - # 获取文件内容 - buffer = get_buffer(file) + # 判断媒体类型 + audio_exts = {'mp3', 'wav', 'm4a', 'flac', 'aac', 'ogg', 'wma'} + video_exts = {'mp4', 'avi', 'mov', 'mkv', 'webm', 'flv', 'wmv'} - # 获取模型ID和工作空间ID - stt_model_id = kwargs.get('stt_model_id') - llm_model_id = kwargs.get('llm_model_id') - workspace_id = kwargs.get('workspace_id') + if file_ext in audio_exts: + media_type = "音频" + default_segments = self._get_audio_default_segments(file_name) + elif file_ext in video_exts: + media_type = "视频" + default_segments = self._get_video_default_segments(file_name) + else: + media_type = "媒体" + default_segments = self._get_media_default_segments(file_name) - maxkb_logger.info(f"Extracted from kwargs - stt_model_id: {stt_model_id}, llm_model_id: {llm_model_id}, workspace_id: {workspace_id}") + maxkb_logger.info(f"Processing {media_type} file: {file_name}") + maxkb_logger.info(f"Generating {len(default_segments)} default segments") - # 处理选项 - options = { - 'language': kwargs.get('language', 'auto'), - 'segment_duration': kwargs.get('segment_duration', 300), - 'enable_punctuation': kwargs.get('enable_punctuation', True), - 'enable_summary': kwargs.get('enable_summary', False), - 'extract_keyframes': kwargs.get('extract_keyframes', False) + # 转换为MaxKB段落格式 + paragraphs = [] + for i, segment_data in enumerate(default_segments): + paragraph = { + 'content': segment_data['content'], + 'title': segment_data['title'], + 'metadata': { + 'start_time': segment_data.get('start_time'), + 'end_time': segment_data.get('end_time'), + 'index': i, + 'is_demo': True, + 'media_type': media_type, + 'file_name': file_name + } + } + paragraphs.append(paragraph) + + # 应用限制 + if limit > 0: + paragraphs = paragraphs[:limit] + + # 添加处理元数据 + metadata = { + 'media_processing_status': 'success', + 'media_type': media_type, + 'is_demo_content': True, + 'processing_mode': 'default_text' } - try: - # 调用适配器处理 - result = self.adapter.process_media( - file_content=buffer, - file_name=file.name, - stt_model_id=stt_model_id, - llm_model_id=llm_model_id, - workspace_id=workspace_id, - options=options - ) - - # 转换为MaxKB段落格式 - paragraphs = [] - for segment in result.get('segments', []): - # 使用优化后的文本(如果有) - text = segment.get('enhanced_text', segment.get('text', '')) - - # 添加时间戳信息 - if segment.get('start_time') is not None: - time_info = f"[{self._format_time(segment['start_time'])} - {self._format_time(segment['end_time'])}]" - text = f"{time_info}\n{text}" - - # 添加摘要(如果有) - if segment.get('summary'): - text = f"{text}\n【摘要】{segment['summary']}" - - paragraph = { - 'content': text, - 'title': f"段落 {segment.get('index', 0) + 1}", - 'metadata': { - 'start_time': segment.get('start_time'), - 'end_time': segment.get('end_time'), - 'index': segment.get('index') - } - } - - # 如果有关键帧,添加到段落中 - if 'keyframes' in result and segment.get('index', 0) < len(result['keyframes']): - paragraph['images'] = [result['keyframes'][segment['index']]] - - paragraphs.append(paragraph) - - # 应用限制 - if limit > 0: - paragraphs = paragraphs[:limit] - - # 添加成功处理的标记 - metadata = result.get('metadata', {}) - metadata['media_processing_status'] = 'success' - - return { - 'name': file.name, - 'content': paragraphs, - 'metadata': metadata + maxkb_logger.info(f"Successfully created {len(paragraphs)} default paragraphs for {file_name}") + + return { + 'name': file.name, + 'content': paragraphs, + 'metadata': metadata + } + + def _get_audio_default_segments(self, file_name: str) -> List[dict]: + """生成音频文件的默认段落""" + base_name = file_name.split('.')[0] + + return [ + { + 'title': '开场介绍', + 'content': f'这是音频文件 "{base_name}" 的第一段内容演示。本段包含了会议的开场介绍和主要议题的说明。\n\n主要内容:\n- 会议目的和议程说明\n- 参会人员介绍\n- 会议背景和重要性\n- 预期成果和目标设定', + 'start_time': 0, + 'end_time': 180 + }, + { + 'title': '主要内容讨论', + 'content': f'这是音频文件 "{base_name}" 的第二段内容演示。本段详细讨论了项目的进展情况和下一步的工作计划。\n\n主要内容:\n- 项目当前进展汇报\n- 关键问题和挑战分析\n- 解决方案讨论\n- 资源需求和分配', + 'start_time': 180, + 'end_time': 360 + }, + { + 'title': '总结与行动项', + 'content': f'这是音频文件 "{base_name}" 的第三段内容演示。本段总结了会议的主要结论和行动项,明确了责任人和时间节点。\n\n主要内容:\n- 会议要点总结\n- 行动项和责任分配\n- 时间节点和里程碑\n- 后续跟进计划', + 'start_time': 360, + 'end_time': 540 } - - except Exception as e: - maxkb_logger.error(f"处理音视频文件失败: {str(e)}") - # 返回错误信息 - return { - 'name': file.name, - 'content': [{ - 'content': f'处理失败: {str(e)}', - 'title': '错误' - }], - 'metadata': {'error': str(e)} + ] + + def _get_video_default_segments(self, file_name: str) -> List[dict]: + """生成视频文件的默认段落""" + base_name = file_name.split('.')[0] + + return [ + { + 'title': '开场介绍', + 'content': f'这是视频文件 "{base_name}" 的第一段内容演示。本段包含了视频的开场介绍和主要内容概述。\n\n主要内容:\n- 产品/服务介绍\n- 功能特性概述\n- 目标用户群体\n- 使用场景说明', + 'start_time': 0, + 'end_time': 120 + }, + { + 'title': '功能演示', + 'content': f'这是视频文件 "{base_name}" 的第二段内容演示。本段详细展示了产品的功能特性和使用方法。\n\n主要内容:\n- 核心功能演示\n- 操作步骤说明\n- 使用技巧和注意事项\n- 常见问题解答', + 'start_time': 120, + 'end_time': 300 + }, + { + 'title': '总结与联系方式', + 'content': f'这是视频文件 "{base_name}" 的第三段内容演示。本段总结了产品的主要优势和适用场景,提供了联系方式。\n\n主要内容:\n- 产品优势总结\n- 价格和套餐信息\n- 适用场景和行业\n- 联系方式和售后服务', + 'start_time': 300, + 'end_time': 420 } + ] + + def _get_media_default_segments(self, file_name: str) -> List[dict]: + """生成其他媒体文件的默认段落""" + base_name = file_name.split('.')[0] + + return [ + { + 'title': '文件概述', + 'content': f'这是媒体文件 "{base_name}" 的第一段内容演示。本段包含了文件的基本信息和主要内容概述。\n\n主要内容:\n- 文件基本信息\n- 内容类型说明\n- 主要用途和价值\n- 处理建议和注意事项', + 'start_time': 0, + 'end_time': 120 + }, + { + 'title': '详细内容', + 'content': f'这是媒体文件 "{base_name}" 的第二段内容演示。本段详细介绍了文件的核心内容和关键信息。\n\n主要内容:\n- 核心内容分析\n- 关键信息提取\n- 重要要点总结\n- 后续处理建议', + 'start_time': 120, + 'end_time': 240 + } + ] def get_content(self, file, save_image): """获取文件内容(用于预览)"""