feat: 标题生成提示词区分视频画面与封面场景
后端: - GenerateTitleRequest 新增 usage 字段(video/cover) - 根据 usage 渲染不同的场景描述、风格要求、创作注意 - title_system.txt / title.txt 增加 等变量 前端: - scriptApi.generateTitle 新增 usage 参数 - SubtitleBurning 传 usage: 'video'(视频画面标题) - CoverDesign 传 usage: 'cover'(封面标题)
This commit is contained in:
@@ -1,14 +1,14 @@
|
||||
请根据以下脚本内容,创作一个${title_type_desc}。
|
||||
|
||||
使用场景:${usage_desc}
|
||||
脚本内容:
|
||||
${script_content}
|
||||
|
||||
标题类型:${title_type_desc}
|
||||
字数限制:严格控制在 ${max_length} 个字以内(含标点)
|
||||
风格要求:短视频平台风格,口语化,避免生僻字
|
||||
风格要求:${style_requirement}
|
||||
|
||||
注意:
|
||||
- 如果创作的是主标题,请聚焦核心卖点,用最抓眼球的方式表达
|
||||
- 如果创作的是副标题,请补充说明或制造悬念,让观众想看下去
|
||||
${usage_note}
|
||||
|
||||
直接返回标题文字,不要加引号、书名号或任何额外说明。
|
||||
@@ -1,8 +1,11 @@
|
||||
你是一位专业的短视频标题创作专家,擅长为口播类短视频创作吸引眼球的标题。
|
||||
|
||||
【当前任务场景】
|
||||
${usage_desc}
|
||||
|
||||
【主标题(大标题)与副标题(小标题)的区别】
|
||||
- 主标题:视频最核心的卖点/钩子,必须极度吸睛,让观众一眼就想点进去。要求简短有力,善用数字、疑问、痛点、冲突等手法。
|
||||
- 副标题:对主标题的补充说明或延伸,承担"解释原因""制造悬念""补充细节"的作用,让观众知道点进去能看到什么具体内容。
|
||||
- 主标题:视频最核心的卖点/钩子,必须极度吸睛。要求简短有力,善用数字、疑问、痛点、冲突等手法。
|
||||
- 副标题:对主标题的补充说明或延伸,承担"解释原因""制造悬念""补充细节"的作用。
|
||||
|
||||
创作原则:
|
||||
1. 标题要紧扣脚本核心内容,提炼最有吸引力的点
|
||||
|
||||
@@ -228,6 +228,16 @@ async def generate_title(request: GenerateTitleRequest):
|
||||
data=None,
|
||||
)
|
||||
|
||||
# 根据使用场景确定描述
|
||||
if request.usage == "cover":
|
||||
usage_desc = "视频封面标题——用于封面图设计,是决定用户是否点击的第一要素"
|
||||
style_requirement = "极具冲击力、抓眼球,适合静态封面大图展示,善用爆款句式"
|
||||
usage_note = "- 封面主标题必须极度吸睛,让用户一眼就想点进去,善用数字、疑问、痛点、冲突\n- 封面副标题要补充悬念或细节,激发点击欲望"
|
||||
else:
|
||||
usage_desc = "视频画面标题——直接叠加在视频画面上,与动态视频内容共存"
|
||||
style_requirement = "口语化、精炼有力,适合视频内展示,避免遮挡画面主体"
|
||||
usage_note = "- 视频画面上的标题需要精炼,聚焦核心关键词\n- 副标题与主标题形成呼应,补充说明但不喧宾夺主"
|
||||
|
||||
# 渲染用户提示词
|
||||
title_type_desc = "大标题(主标题,提炼核心卖点,吸睛)" if request.title_type == "main" else "小标题(副标题,补充说明或制造悬念)"
|
||||
user_prompt = render_template(
|
||||
@@ -236,6 +246,10 @@ async def generate_title(request: GenerateTitleRequest):
|
||||
title_type_desc=title_type_desc,
|
||||
script_content=request.script_content,
|
||||
max_length=request.max_length,
|
||||
usage=request.usage,
|
||||
usage_desc=usage_desc,
|
||||
style_requirement=style_requirement,
|
||||
usage_note=usage_note,
|
||||
)
|
||||
|
||||
try:
|
||||
|
||||
@@ -117,6 +117,7 @@ class GenerateTitleRequest(BaseModel):
|
||||
script_content: str = Field(..., description="脚本内容(utterances 文本拼接)", min_length=1)
|
||||
title_type: str = Field(..., description="标题类型:main(大标题) / sub(小标题)")
|
||||
max_length: int = Field(default=8, ge=1, le=100, description="最大字数限制")
|
||||
usage: str = Field(default="video", description="使用场景:video(视频画面标题) / cover(封面标题)")
|
||||
|
||||
|
||||
class GenerateTitleResponse(BaseModel):
|
||||
|
||||
@@ -72,6 +72,7 @@ export interface GenerateTitleParams {
|
||||
scriptContent: string;
|
||||
titleType: 'main' | 'sub';
|
||||
maxLength?: number;
|
||||
usage?: 'video' | 'cover';
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -202,6 +203,7 @@ export const scriptApi = {
|
||||
script_content: params.scriptContent,
|
||||
title_type: params.titleType,
|
||||
max_length: params.maxLength,
|
||||
usage: params.usage ?? 'video',
|
||||
});
|
||||
},
|
||||
|
||||
|
||||
@@ -98,6 +98,7 @@ export default function CoverDesign() {
|
||||
scriptContent,
|
||||
titleType,
|
||||
maxLength,
|
||||
usage: 'cover',
|
||||
});
|
||||
setConfig((prev) => ({
|
||||
...prev,
|
||||
|
||||
@@ -135,6 +135,7 @@ export default function SubtitleBurning() {
|
||||
scriptContent,
|
||||
titleType,
|
||||
maxLength,
|
||||
usage: 'video',
|
||||
});
|
||||
if (titleType === 'main') {
|
||||
setMainTitle(res.title);
|
||||
|
||||
Reference in New Issue
Block a user