diff --git a/app/services/prompts/short_drama_editing/plot_extraction.py b/app/services/prompts/short_drama_editing/plot_extraction.py index cce1fc8..05e3968 100644 --- a/app/services/prompts/short_drama_editing/plot_extraction.py +++ b/app/services/prompts/short_drama_editing/plot_extraction.py @@ -6,65 +6,135 @@ @File : plot_extraction.py @Author : viccy同学 @Date : 2025/1/7 -@Description: 短剧爆点提取提示词 +@Description: 短剧爆点提取提示词 - 优化版本v2.0 """ from ..base import TextPrompt, PromptMetadata, ModelType, OutputFormat class PlotExtractionPrompt(TextPrompt): - """短剧爆点提取提示词""" + """短剧爆点提取提示词 - 优化版本""" def __init__(self): metadata = PromptMetadata( name="plot_extraction", category="short_drama_editing", - version="v1.0", - description="根据剧情梗概和字幕内容,精确定位关键剧情的时间段", + version="v2.0", + description="根据剧情梗概和字幕内容,精确定位关键剧情的时间段,确保片段连贯可剪辑", model_type=ModelType.TEXT, output_format=OutputFormat.JSON, - tags=["短剧", "爆点定位", "时间戳", "剧情提取"], + tags=["短剧", "爆点定位", "时间戳", "剧情提取", "连贯性", "过渡片段"], parameters=["subtitle_content", "plot_summary", "plot_titles"] ) super().__init__(metadata) - self._system_prompt = "你是一名短剧编剧,非常擅长根据字幕中分析视频中关键剧情出现的具体时间段。" + self._system_prompt = "你是一名专业短剧剪辑师,精通视频叙事节奏和剧情连贯性,擅长选择能够流畅衔接的视频片段。" def get_template(self) -> str: - return """请仔细阅读剧情梗概和爆点内容,然后在字幕中找出每个爆点发生的具体时间段和爆点前后的详细剧情。 + return """# 短剧混剪时间段定位任务 -剧情梗概: +## 任务目标 +为每个关键情节点精确定位时间段,确保最终剪辑出的视频**剧情连贯、逻辑清晰**。 + +## 输入信息 + +### 剧情梗概 + ${plot_summary} + -需要定位的爆点内容: +### 需要定位的情节点(按剧情发展顺序) + ${plot_titles} + -字幕内容: +### 完整字幕内容 + ${subtitle_content} + -分析要求: -1. 为每个爆点找到对应的具体时间段 -2. 时间段要准确反映该爆点的完整发展过程 -3. 提供爆点前后的详细剧情描述 -4. 确保时间戳格式正确且存在于字幕中 -5. 选择最具戏剧张力的时间段 +## 时间段选择原则 -请返回一个JSON对象,包含一个名为"plot_points"的数组,数组中包含多个对象,每个对象都要包含以下字段: +### 1. 连贯性原则(最重要) +**目标:观众看完剪辑后能理解完整故事** + +- **包含必要上下文**:每个片段要包含理解该情节所需的前置信息 +- **自然的开始点**:片段开头应该是一个自然的场景切入点 +- **完整的结束点**:片段结尾应该是一个自然的收尾或转折点 +- **衔接考虑**:考虑与前后片段的衔接是否流畅 + +### 2. 时间段技术规范(绝对不能违反) + +**时间戳规则**: +- 格式必须为:`xx:xx:xx,xxx-xx:xx:xx,xxx` +- 必须与字幕中的时间戳精确匹配 +- **严禁时间段重叠**:任意两个片段的时间不能有交集 +- **严格按时间顺序**:后一个片段的开始时间必须大于前一个片段的结束时间 + +**时长控制**: +- 单个片段建议时长:10-60秒 +- 过短(<5秒):信息不完整,观众无法理解 +- 过长(>90秒):节奏拖沓,失去混剪意义 + +### 3. 内容完整性原则 + +每个片段必须包含: +- **情节的起因**:为什么会发生这件事 +- **情节的经过**:具体发生了什么 +- **情节的结果/转折**:导致了什么后果 + +### 4. 过渡片段策略 + +如果两个关键情节之间跳跃太大,需要: +- 适当延长前一个片段的结尾 +- 或适当提前后一个片段的开始 +- 确保观众能理解剧情是如何发展到下一个阶段的 + +## 输出格式 + +请严格按照以下JSON格式输出: { "plot_points": [ { - "timestamp": "时间段,格式为xx:xx:xx,xxx-xx:xx:xx,xxx", - "title": "关键剧情的主题", - "picture": "关键剧情前后的详细剧情描述,包括人物对话、动作、情感变化等" + "sequence": 1, + "timestamp": "00:01:23,456-00:02:15,789", + "title": "情节标题", + "narrative_function": "开端/发展/高潮/结局", + "picture": "详细的画面和剧情描述,包括:场景环境、人物状态、关键对话、动作行为、情感表现", + "context_before": "这个片段之前发生了什么(简述)", + "context_after": "这个片段之后会发生什么(简述)", + "transition_note": "与下一个片段的衔接说明" } - ] + ], + "editing_notes": { + "total_duration": "所有片段的总时长估算", + "pacing_suggestion": "节奏建议(如:开头可稍慢,高潮处加快)", + "potential_gaps": ["可能存在的剧情跳跃点及建议处理方式"] + } } -重要要求: -1. 请确保返回的是合法的JSON格式 -2. 时间戳必须严格按照字幕中的格式 -3. 剧情描述要详细具体,包含关键对话和动作 -4. 每个爆点的时间段要合理,不能过短或过长 -5. 严禁虚构不存在的时间戳或剧情内容 -6. 只输出JSON内容,不要添加任何说明文字""" +## 质量检查清单 + +输出前请逐项检查: + +**时间戳检查**: +- [ ] 所有时间戳都存在于原始字幕中 +- [ ] 时间段之间没有重叠 +- [ ] 时间段按顺序排列(后一个开始 > 前一个结束) + +**连贯性检查**: +- [ ] 第一个片段是否交代了必要的背景? +- [ ] 相邻片段之间的剧情跳跃是否可以理解? +- [ ] 最后一个片段是否给出了某种结局或悬念? + +**完整性检查**: +- [ ] 每个片段是否包含完整的小情节(起因-经过-结果)? +- [ ] 观众只看这些片段能否理解整个故事的主线? + +## 重要限制 + +1. **严禁虚构时间戳**:所有时间必须来自字幕 +2. **严禁时间重叠**:这会导致剪辑出现重复画面 +3. **严禁打乱顺序**:必须按剧情发展的时间线排列 +4. **只输出JSON**:不要添加任何说明文字""" diff --git a/app/services/prompts/short_drama_editing/subtitle_analysis.py b/app/services/prompts/short_drama_editing/subtitle_analysis.py index 0bf40b2..9ba087f 100644 --- a/app/services/prompts/short_drama_editing/subtitle_analysis.py +++ b/app/services/prompts/short_drama_editing/subtitle_analysis.py @@ -6,63 +6,112 @@ @File : subtitle_analysis.py @Author : viccy同学 @Date : 2025/1/7 -@Description: 短剧字幕分析提示词 +@Description: 短剧字幕分析提示词 - 优化版本v2.0 """ from ..base import TextPrompt, PromptMetadata, ModelType, OutputFormat class SubtitleAnalysisPrompt(TextPrompt): - """短剧字幕分析提示词""" + """短剧字幕分析提示词 - 优化版本""" def __init__(self): metadata = PromptMetadata( name="subtitle_analysis", category="short_drama_editing", - version="v1.0", - description="分析短剧字幕内容,提取剧情梗概和关键情节点", + version="v2.0", + description="分析短剧字幕内容,提取完整叙事结构和关键情节点,确保剧情连贯性", model_type=ModelType.TEXT, output_format=OutputFormat.JSON, - tags=["短剧", "字幕分析", "剧情梗概", "情节提取"], + tags=["短剧", "字幕分析", "剧情梗概", "情节提取", "叙事结构", "连贯性"], parameters=["subtitle_content", "custom_clips"] ) super().__init__(metadata) - self._system_prompt = "你是一名短剧编剧和内容分析师,擅长从字幕中提取剧情要点和关键情节。" + self._system_prompt = "你是一名资深短剧编剧和剪辑师,精通叙事结构和剧情节奏把控,擅长从字幕中提取能够形成完整故事线的关键情节。" def get_template(self) -> str: - return """请仔细分析以下短剧字幕内容,提取剧情梗概和关键情节点。 + return """# 短剧混剪剧情分析任务 -字幕内容: +## 任务目标 +分析短剧字幕,提取能够组成**连贯完整故事**的关键情节点。最终混剪视频必须让观众能够理解剧情发展脉络。 + +## 字幕内容 + ${subtitle_content} + -分析要求: -1. 提取整体剧情梗概,概括主要故事线和核心冲突 -2. 识别 ${custom_clips} 个最具吸引力的关键情节点(爆点) -3. 每个情节点要包含具体的时间段和详细描述 -4. 关注剧情的转折点、冲突高潮、情感爆发等关键时刻 -5. 确保选择的情节点具有强烈的戏剧张力和观看价值 +## 分析要求 -请按照以下JSON格式输出分析结果: +### 1. 叙事结构分析(必须完成) +按照经典叙事结构识别剧情阶段: +- **开端(Setup)**:人物出场、背景交代、初始状态 +- **发展(Rising Action)**:冲突引入、矛盾升级 +- **高潮(Climax)**:核心冲突爆发、情感顶点 +- **结局(Resolution)**:冲突解决、结果呈现 + +### 2. 关键情节点选择原则 +需要选择 ${custom_clips} 个情节点,必须遵循: + +**连贯性原则(最重要)**: +- 情节点必须能串联成完整故事线 +- 相邻情节点之间要有逻辑关联 +- 观众看完后能理解"发生了什么" + +**覆盖性原则**: +- 必须包含开端(至少1个):交代人物和背景 +- 必须包含发展(至少1-2个):展示冲突升级 +- 必须包含高潮(至少1个):最具张力的时刻 +- 建议包含结局(如有):给观众交代 + +**戏剧性原则**: +- 优先选择情感强烈的时刻 +- 优先选择冲突明显的场景 +- 优先选择有视觉冲击力的画面 + +### 3. 情节点排序要求 +- **严格按照剧情发展的时间顺序排列** +- 确保因果关系清晰:先有A才有B +- 避免时间线跳跃造成的理解障碍 + +## 输出格式 + +请严格按照以下JSON格式输出,不要添加任何其他文字: { - "summary": "整体剧情梗概,简要概括主要故事线、角色关系和核心冲突", + "summary": "整体剧情梗概(100-200字),包含主要人物、核心冲突、发展脉络和结局", + "narrative_structure": { + "setup": "开端阶段概述:人物和背景", + "rising_action": "发展阶段概述:冲突如何升级", + "climax": "高潮阶段概述:核心冲突点", + "resolution": "结局阶段概述:如何收尾(如有)" + }, "plot_titles": [ - "情节点1标题", - "情节点2标题", - "情节点3标题" + "[开端] 情节点1标题 - 简要说明其叙事功能", + "[发展] 情节点2标题 - 简要说明其叙事功能", + "[高潮] 情节点3标题 - 简要说明其叙事功能" + ], + "plot_connections": [ + "情节1→情节2的逻辑关联说明", + "情节2→情节3的逻辑关联说明" ], "analysis_details": { - "main_characters": ["主要角色1", "主要角色2"], + "main_characters": ["主要角色1(身份/特点)", "主要角色2(身份/特点)"], + "core_conflict": "核心冲突是什么", "story_theme": "故事主题", - "conflict_type": "冲突类型(如:爱情、复仇、家庭等)", - "emotional_peaks": ["情感高潮点1", "情感高潮点2"] + "emotional_arc": "情感变化曲线(如:平静→震惊→愤怒→释然)" } } -重要要求: -1. 必须输出有效的JSON格式,不能包含注释或其他文字 -2. 剧情梗概要简洁明了,突出核心看点 -3. 情节点标题要吸引人,体现戏剧冲突 -4. 严禁虚构不存在的剧情内容 -5. 分析要客观准确,基于字幕实际内容""" +## 质量检查清单 +输出前请自检: +1. ✓ 情节点是否覆盖了故事的起承转合? +2. ✓ 相邻情节点之间是否有明确的逻辑关联? +3. ✓ 观众只看这些片段能否理解整个故事? +4. ✓ 情节点是否按时间顺序排列? +5. ✓ 是否避免了孤立的"爆点"而忽略上下文? + +## 重要限制 +1. 严禁虚构不存在的剧情内容 +2. 必须基于字幕实际内容分析 +3. 只输出JSON,不要任何说明文字""" diff --git a/config.example.toml b/config.example.toml index 373d3eb..d347629 100644 --- a/config.example.toml +++ b/config.example.toml @@ -1,5 +1,5 @@ [app] - project_version="0.7.5" + project_version="0.7.6" # LLM API 超时配置(秒) llm_vision_timeout = 120 # 视觉模型基础超时时间 diff --git a/project_version b/project_version index da2ac9c..4d01880 100644 --- a/project_version +++ b/project_version @@ -1 +1 @@ -0.7.5 \ No newline at end of file +0.7.6 \ No newline at end of file