viccy 342fc15f3b feat(tts,search,video): 新增OmniVoice TTS、联网搜索与多视频剪辑支持
新增OmniVoice语音合成引擎全流程支持,包含配置项、WebUI界面与服务实现
集成Tavily联网搜索能力,支持短剧剧情分析前自动检索剧情背景信息
新增多视频源剪辑支持,完善脚本校验规则并重构剪辑逻辑适配多视频路径
重构LLM剧情分析Prompt,优化输出格式适配多场景与联网检索结果
调整streamlit版本至1.56.0修复兼容性问题
新增相关单元测试与多语言翻译,更新配置示例文件
2026-06-07 01:24:32 +08:00

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