viccy d10c2ff7c5 feat(prompts, webui, llm): 新增影视解说功能及配套更新
- 新增影视解说专属提示词模块,覆盖剧情分析、文案生成、片段规划、脚本匹配与修复全流程
- 注册影视解说模块到全局提示词系统,更新初始化加载逻辑
- 重构Tavily搜索服务,拆分通用搜索函数适配短剧和影视两类作品
- 更新WebUI界面,新增影视解说配置项、多语言翻译与版本号展示
- 升级项目版本号从0.7.9到0.8.1
- 调整LLM服务与适配器逻辑,支持自定义prompt分类适配不同解说类型
- 完善相关工具类与单元测试,覆盖影视解说场景调用流程
2026-06-08 00:30:37 +08:00

100 lines
5.6 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
"""
@Project: 影视解说-剧情分析
@File : plot_analysis.py
@Description: 影视剧情分析提示词
"""
from ..base import TextPrompt, PromptMetadata, ModelType, OutputFormat
class PlotAnalysisPrompt(TextPrompt):
"""影视剧情分析提示词"""
def __init__(self):
metadata = PromptMetadata(
name="plot_analysis",
category="film_tv_narration",
version="v1.0",
description="结合字幕和可选联网检索上下文,输出适合影视解说脚本生成的结构化剧情理解",
model_type=ModelType.TEXT,
output_format=OutputFormat.TEXT,
tags=["影视", "电影", "电视剧", "剧情分析", "字幕解析", "解说脚本素材"],
parameters=["subtitle_content"],
)
super().__init__(metadata)
self._system_prompt = (
"你是一位专业的影视解说策划和剧作分析师。请输出克制、结构化、"
"可直接供下游影视解说脚本生成使用的剧情理解材料。"
)
def get_template(self) -> str:
return """# 角色
你是一位专业的影视解说策划和剧作分析师。你的输出不是给观众看的成片文案,而是给下游“影视解说脚本生成器”使用的结构化剧情理解材料。
# 输入说明
下面的输入可能只包含一个视频的原始字幕,也可能包含多个视频文件的字幕;也可能同时包含联网检索结果和原始字幕。
- 联网检索结果只能用于辅助识别作品名称、人物关系、时代背景、公开剧情梗概。
- 原始字幕是唯一可信的当前片段事实来源。
- 如果联网检索结果与字幕冲突,必须以字幕为准。
- 如果联网检索结果包含当前字幕尚未出现的后续剧情,只能放在“字幕未覆盖/需谨慎信息”中,不能写进当前剧情事实。
- 多个视频字幕会以“视频 1: 文件名”“视频 2: 文件名”等标题分隔。时间戳均为对应视频内部时间,不是拼接后的累计时间。
# 核心任务
请基于输入完成剧情理解,目标是帮助后续生成高质量影视解说脚本:
1. 识别作品名称、当前字幕范围、视频来源、联网检索辅助信息和字幕事实边界。
2. 统一人物称呼,梳理人物关系、动机和当前场景中的立场变化。
3. 用 120-220 字概括当前字幕覆盖的剧情,不提前剧透字幕未出现的内容。
4. 按视频来源和字幕时间顺序拆分关键剧情段落,并为每段标注准确 video_id / video_name / 时间戳。
5. 提炼解说创作可用的开场钩子、人物困境、情绪转折、信息反转、名场面和建议保留原声片段。
# 强制输出规则
1. 禁止输出寒暄、解释身份或“好的,我将……”等聊天式开场。
2. 禁止编造字幕中没有的具体事件、对白、关系进展或结局。
3. 时间戳必须直接来自对应视频字幕;无法确定时写“字幕未明确”,不要猜测。
4. 多视频场景下必须明确每段来自哪个视频文件,禁止把不同视频的同名时间戳混在一起。
5. 人名必须统一:优先采用联网检索中的正式名称;如果字幕写法不同,在人物表中保留“字幕称呼”。
6. 内容要简洁、客观、可复用,避免散文化长段落。
7. 必须严格按照下面的 Markdown 格式输出,不要添加额外章节。
# 输出格式
## 一、基础识别
- 作品名称:[如输入可判断则填写,否则写“未知”]
- 当前字幕范围:[开始时间戳] --> [结束时间戳];无法确定则写“字幕未明确”
- 视频来源:[列出视频编号、文件名和各自字幕时间范围;单视频也要写]
- 联网检索确认:[仅写可辅助理解的公开信息;没有联网结果则写“未启用/未提供”]
- 字幕内实际出现:[列出当前字幕真实出现的关键事实2-5 条]
- 字幕未覆盖/需谨慎信息:[列出联网结果提到但当前字幕未发生的内容;没有则写“无”]
## 二、人物与关系
| 统一称呼 | 字幕称呼 | 身份/关系 | 当前动机/立场 | 确定性 |
|---|---|---|---|---|
| [人物名] | [字幕原文称呼] | [身份或关系] | [在当前片段中的目标、压力或转变] | 字幕明确/联网辅助/合理推断 |
## 三、整体剧情概括
[120-220 字,只概括当前字幕覆盖的剧情。必须包含核心冲突、人物动机、场景推进和当前悬念。]
## 四、分段剧情解析
| 视频 | 时间戳 | 段落主题 | 剧情事件 | 叙事功能 |
|---|---|---|---|---|
| [video_id + video_name] | [开始] --> [结束] | [简短主题] | [当前段落发生了什么] | [铺垫/冲突升级/人物塑造/反转/悬念/情绪爆发/名场面等] |
## 五、解说创作重点
- 开场钩子:[用一句话指出最适合开场抓人的冲突、谜题或人物困境]
- 核心冲突:[当前片段最主要的矛盾]
- 情绪转折/信息反转:[列 1-3 条,没有则写“无明显”]
- 名场面/高光对白:[列 1-3 条,没有则写“无明显”]
- 悬念点:[当前片段留下的疑问或后续期待]
- 建议保留原声片段:
1. [video_id + video_name + 时间戳][保留理由;如果没有合适原声,写“无明显”]
## 六、联网信息校验
- 可用于辅助理解的信息:[联网结果中可帮助理解当前字幕的信息;没有则写“无”]
- 与字幕不一致或字幕未覆盖的信息:[必须列出,不要混入当前剧情事实;没有则写“无”]
# 输入内容
${subtitle_content}"""