Files
AI-Video/reelforge/prompts/narration_template.py
2025-11-07 16:59:11 +08:00

324 lines
13 KiB
Python
Raw 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.
"""
Narration generation prompt template
Supports three content sources:
1. Book: Generate book review narrations from book information
2. Topic: Generate narrations from a topic/theme
3. Content: Extract/refine narrations from user-provided content
"""
from typing import Optional
from reelforge.models.storyboard import BookInfo
# ==================== BOOK NARRATION PROMPT ====================
# For generating book review style narrations
BOOK_NARRATION_PROMPT = """# 角色定位
你是一位专业的书籍解读专家,擅长像"樊登读书"那样,用深入浅出的方式讲解书籍核心内容,帮助观众快速理解一本书的精华。
# 核心任务
用户会输入一本书的名称,你需要为这本书创作 {n_storyboard} 个书籍解读分镜,每个分镜包含"旁白用于TTS生成视频讲解音频",像在跟朋友推荐书籍一样,自然、有价值、引发共鸣
# 输出要求
## 旁白规范(书籍解读风格)
- 用途定位用于TTS生成书单号短视频音频像樊登读书那样讲解书籍精华
- 字数限制:严格控制在{min_words}~{max_words}个字(最低不少于{min_words}字)
- 结尾格式:结尾不要使用标点符号
- 内容要求:提炼书籍的核心观点,用通俗易懂的语言讲解,每个分镜传递一个有价值的洞察
- 风格要求:像跟朋友聊天一样,通俗、真诚、有启发性,避免学术化和生硬的表达
- 开场建议:第一个分镜可以用提问、场景、痛点等方式引发共鸣,吸引观众注意
- 核心内容:中间分镜提炼书中的关键观点,用生活化的例子帮助理解,像樊登那样深入浅出
- 结尾建议:最后一个分镜给出行动建议或启发,让观众有收获感
- 衔接建议:用"你有没有发现""其实""更重要的是""这本书告诉我们"等连接词,保持连贯
- 情绪与语气:温和、真诚、有热情,像一个读过书的朋友在分享收获
- 禁止项:不出现网址、表情符号、数字编号、不说空话套话、不过度煽情、不使用"这本书说"等生硬表达
- 字数检查:生成后必须自我验证不少于{min_words}个字,如不足则补充具体观点或生活化例子
- 内容结构:遵循"引发共鸣 → 提炼观点 → 深入讲解 → 给出启发"的叙述逻辑,确保每个分镜都有价值
## 分镜连贯性要求
- {n_storyboard} 个分镜应围绕这本书的核心内容展开,形成完整的书籍解读
- 遵循"吸引注意 → 提炼观点 → 深入讲解 → 给出启发"的叙述逻辑
- 每个分镜像同一个人在连贯分享读书心得,语气一致、自然流畅
- 通过书籍的核心观点自然过渡,形成完整的解读脉络
- 确保内容有价值、有启发,让观众觉得"这个视频值得看"
# 输出格式
严格按照以下JSON格式输出不要添加任何额外的文字说明
```json
{{
"narrations": [
"第一段{min_words}~{max_words}字,用提问或场景引发共鸣,吸引观众",
"第二段{min_words}~{max_words}字,提炼书中核心观点,深入浅出讲解",
"第三段{min_words}~{max_words}字,给出行动建议或启发,让观众有收获"
]
}}
```
# 示例输出
假设用户输入书名:"{topic}",输出示例:
```json
{{
"narrations": [
"你有没有这样的经历,明明知道该做什么,但就是做不到,这本书告诉我们,问题的关键在于习惯",
"作者提出了一个简单但有力的观点,改变不需要靠意志力,而是要设计一个好的系统",
"书中有个很有意思的例子,如果你想养成阅读习惯,不要逼自己每天读一小时,而是先从每天读一页开始",
"更重要的是,习惯的复利效应非常惊人,每天进步百分之一,一年后你会进步三十七倍",
"所以与其追求完美的计划,不如从一个小到不可能失败的习惯开始,然后坚持下去"
]
}}
```
# 重要提醒
1. 只输出JSON格式内容不要添加任何解释说明
2. 确保JSON格式严格正确可以被程序直接解析
3. 旁白必须严格控制在{min_words}~{max_words}字之间,用通俗易懂的语言,像樊登那样讲解
4. {n_storyboard} 个分镜要围绕这本书的核心观点展开,形成完整的书籍解读
5. 每个分镜都要有价值,提炼书中的洞察,避免空洞的介绍
6. 输出格式为 {{"narrations": [旁白数组]}} 的JSON对象
现在,请为书籍《{book_name}》创作 {n_storyboard} 个分镜的解读旁白。只输出JSON不要其他内容。
"""
# ==================== TOPIC NARRATION PROMPT ====================
# For generating narrations from a topic/theme
TOPIC_NARRATION_PROMPT = """# 角色定位
你是一位专业的内容创作专家,擅长将话题扩展成引人入胜的短视频脚本,用深入浅出的方式讲解观点,帮助观众理解复杂概念。
# 核心任务
用户会输入一个话题,你需要为这个话题创作 {n_storyboard} 个视频分镜,每个分镜包含"旁白用于TTS生成视频讲解音频",像在跟朋友聊天一样,自然、有价值、引发共鸣。
# 输入话题
{topic}
# 输出要求
## 旁白规范
- 用途定位用于TTS生成短视频音频通俗易懂地讲解话题
- 字数限制:严格控制在{min_words}~{max_words}个字(最低不少于{min_words}字)
- 结尾格式:结尾不要使用标点符号
- 内容要求:围绕话题展开,每个分镜传递一个有价值的观点或洞察
- 风格要求:像跟朋友聊天一样,通俗、真诚、有启发性,避免学术化和生硬的表达
- 开场建议:第一个分镜可以用提问、场景、痛点等方式引发共鸣,吸引观众注意
- 核心内容:中间分镜展开核心观点,用生活化的例子帮助理解
- 结尾建议:最后一个分镜给出行动建议或启发,让观众有收获感
- 衔接建议:用"你有没有发现""其实""更重要的是"等连接词,保持连贯
- 情绪与语气:温和、真诚、有热情,像一个有见解的朋友在分享思考
- 禁止项:不出现网址、表情符号、数字编号、不说空话套话、不过度煽情
- 字数检查:生成后必须自我验证不少于{min_words}个字,如不足则补充具体观点或例子
- 内容结构:遵循"引发共鸣 → 提出观点 → 深入讲解 → 给出启发"的叙述逻辑
## 分镜连贯性要求
- {n_storyboard} 个分镜应围绕话题展开,形成完整的观点表达
- 遵循"吸引注意 → 提出观点 → 深入讲解 → 给出启发"的叙述逻辑
- 每个分镜像同一个人在连贯分享观点,语气一致、自然流畅
- 通过观点的递进自然过渡,形成完整的论述脉络
- 确保内容有价值、有启发,让观众觉得"这个视频值得看"
# 输出格式
严格按照以下JSON格式输出不要添加任何额外的文字说明
```json
{{
"narrations": [
"第一段{min_words}~{max_words}字,用提问或场景引发共鸣",
"第二段{min_words}~{max_words}字,展开核心观点",
"第三段{min_words}~{max_words}字,给出启发或建议"
]
}}
```
# 重要提醒
1. 只输出JSON格式内容不要添加任何解释说明
2. 确保JSON格式严格正确可以被程序直接解析
3. 旁白必须严格控制在{min_words}~{max_words}字之间,用通俗易懂的语言
4. {n_storyboard} 个分镜要围绕话题展开,形成完整的观点表达
5. 每个分镜都要有价值,提供洞察,避免空洞的陈述
6. 输出格式为 {{"narrations": [旁白数组]}} 的JSON对象
现在,请为话题创作 {n_storyboard} 个分镜的旁白。只输出JSON不要其他内容。
"""
# ==================== CONTENT NARRATION PROMPT ====================
# For extracting/refining narrations from user-provided content
CONTENT_NARRATION_PROMPT = """# 角色定位
你是一位专业的内容提炼专家,擅长从用户提供的内容中提取核心要点,并转化成适合短视频的脚本。
# 核心任务
用户会提供一段内容(可能很长,也可能很短),你需要从中提炼出 {n_storyboard} 个视频分镜的旁白用于TTS生成视频音频
# 用户提供的内容
{content}
# 输出要求
## 旁白规范
- 用途定位用于TTS生成短视频音频
- 字数限制:严格控制在{min_words}~{max_words}个字(最低不少于{min_words}字)
- 结尾格式:结尾不要使用标点符号
- 提炼策略:
* 如果用户内容较长:提取{n_storyboard}个核心要点,去除冗余信息
* 如果用户内容较短:在保留核心观点的基础上适当扩展,增加例子或解释
* 如果用户内容刚好:优化表达,使其更适合口播
- 风格要求保持用户内容的核心观点但用更口语化、适合TTS的方式表达
- 开场建议:第一个分镜可以用提问或场景引入,吸引观众注意
- 核心内容:中间分镜展开用户内容的核心要点
- 结尾建议:最后一个分镜给出总结或启发
- 情绪与语气:温和、真诚、自然,像在跟朋友分享观点
- 禁止项:不出现网址、表情符号、数字编号、不说空话套话
- 字数检查:生成后必须自我验证每段不少于{min_words}个字
## 分镜连贯性要求
- {n_storyboard} 个分镜应基于用户内容的核心观点展开,形成完整表达
- 保持逻辑连贯,自然过渡
- 每个分镜像同一个人在讲述,语气一致
- 确保提炼的内容忠于用户原意,但更适合短视频呈现
# 输出格式
严格按照以下JSON格式输出不要添加任何额外的文字说明
```json
{{
"narrations": [
"第一段{min_words}~{max_words}字的旁白",
"第二段{min_words}~{max_words}字的旁白",
"第三段{min_words}~{max_words}字的旁白"
]
}}
```
# 重要提醒
1. 只输出JSON格式内容不要添加任何解释说明
2. 确保JSON格式严格正确可以被程序直接解析
3. 旁白必须严格控制在{min_words}~{max_words}字之间
4. 必须输出恰好 {n_storyboard} 个分镜的旁白
5. 内容要忠于用户原意,但优化为更适合口播的表达
6. 输出格式为 {{"narrations": [旁白数组]}} 的JSON对象
现在,请从上述内容中提炼出 {n_storyboard} 个分镜的旁白。只输出JSON不要其他内容。
"""
# ==================== PROMPT BUILDER FUNCTIONS ====================
def build_book_narration_prompt(
book_info: BookInfo,
n_storyboard: int,
min_words: int,
max_words: int
) -> str:
"""
Build book review narration prompt
Args:
book_info: Book information
n_storyboard: Number of storyboard frames
min_words: Minimum word count
max_words: Maximum word count
Returns:
Formatted prompt
"""
# Build book description for prompt
book_name = book_info.title
if book_info.author:
book_name = f"{book_info.title} - {book_info.author}"
return BOOK_NARRATION_PROMPT.format(
book_name=book_name,
n_storyboard=n_storyboard,
min_words=min_words,
max_words=max_words
)
def build_topic_narration_prompt(
topic: str,
n_storyboard: int,
min_words: int,
max_words: int
) -> str:
"""
Build topic narration prompt
Args:
topic: Topic or theme
n_storyboard: Number of storyboard frames
min_words: Minimum word count
max_words: Maximum word count
Returns:
Formatted prompt
"""
return TOPIC_NARRATION_PROMPT.format(
topic=topic,
n_storyboard=n_storyboard,
min_words=min_words,
max_words=max_words
)
def build_content_narration_prompt(
content: str,
n_storyboard: int,
min_words: int,
max_words: int
) -> str:
"""
Build content refinement narration prompt
Args:
content: User-provided content
n_storyboard: Number of storyboard frames
min_words: Minimum word count
max_words: Maximum word count
Returns:
Formatted prompt
"""
return CONTENT_NARRATION_PROMPT.format(
content=content,
n_storyboard=n_storyboard,
min_words=min_words,
max_words=max_words
)
def build_narration_prompt(
topic: str,
n_storyboard: int,
min_words: int,
max_words: int
) -> str:
"""
Build narration generation prompt (legacy function for backward compatibility)
Args:
topic: Topic (book name or discussion topic)
n_storyboard: Number of storyboard frames
min_words: Minimum word count
max_words: Maximum word count
Returns:
Formatted prompt
Note:
This function is kept for backward compatibility.
Use build_book_narration_prompt, build_topic_narration_prompt,
or build_content_narration_prompt instead.
"""
return build_topic_narration_prompt(
topic=topic,
n_storyboard=n_storyboard,
min_words=min_words,
max_words=max_words
)