全能创作:定妆/台词/换款与剧情方向硬约束,资源可下载

修角色定妆修改不重出图、角色图混入商品、宠物旁白腔、换款同点复读、剧情反转方向漂移,并补会话资源下载与外观/空消息闸门。
This commit is contained in:
Azmat@qq.com
2026-09-20 14:52:51 +08:00
parent f2e8a5f3c1
commit fb3b2904ae
10 changed files with 1149 additions and 142 deletions
+89 -20
View File
@@ -11,8 +11,9 @@ from __future__ import annotations
CLICK_SWAP_PRESETS = frozenset({"点击换款", "点触换款", "多色商品换款"})
_CLICK_SWAP_FINGER_GUIDANCE = (
"形态:只出手指出镜。固定机位的商品点击换款短片。必须先确认要展示的颜色/款式/SKU 及顺序,"
"画面只围绕同一件商品的逐款切换:商品始终居中、大小与角度不变,背景、灯光、机位不变。"
"每次画面中的手指点击/轻触商品后,下一款在原位立即完成干净的 match cut 切换。"
"画面只围绕同一件商品的逐款切换:机位、背景与灯光稳定,商品构图稳定。"
"用手指点击/轻触触发换款,接触后以干净 match cut 切到下一款。"
"撰写分镜时不要反复写「每次点击同一位置 / 点同一点」;点击动作点到为止,重点写款式变化与节奏。"
"禁止完整人物出镜、禁止生成角色定妆图、禁止改成口播/剧情/使用教程;最后才用同一构图做全款式收束。"
)
_CLICK_SWAP_CHARACTER_GUIDANCE = (
@@ -61,7 +62,8 @@ VIDEO_PRESETS: dict[str, str] = {
),
"鱼眼换装": (
"鱼眼/广角近距离透视,连续换装节奏。**人物面部和身形必须全程一致**,"
"只有服装在变。每次换装用一个明确动作触发。"
"只有服装在变。人物从第一镜起就已经穿着当前套装;换装用甩头、抬手、转身等触发瞬间切换到已穿好的下一套,"
"禁止拍穿衣服、套袖、拉拉链等穿戴过程。"
),
"点击换款": _CLICK_SWAP_GUIDANCE,
"多色商品换款": _CLICK_SWAP_GUIDANCE,
@@ -82,6 +84,8 @@ VIDEO_PRESETS: dict[str, str] = {
"AI 宠物拟人": (
"先确定宠物的外观、性格和可执行动作,再设计一段轻巧剧情。宠物与商品互动要符合商品真实结构和正常操作方式;"
"趣味来自角色反应和剧情,不把商品改造成不真实的玩具或凭空增加能力。"
"有台词时必须是宠物第一人称开口(像这只宠物在说话),口语、性格化、短句;"
"禁止旁白解说、达人口播腔、画外音旁白或第三人称讲述。"
),
"人物与音色替换": (
"先理解原视频的镜头、人物、动作、台词、画外音、字幕、场景和节奏。只替换用户指定的人物、声音或两者;"
@@ -182,6 +186,64 @@ def apply_plot_twist_story_contract(name: str, story_depth: str, prompt: str) ->
return base
return f"{base}\n\n{contract}"
def format_plot_twist_direction_contract(
*,
title: str = "",
conflict: str = "",
product_role: str = "",
reversal: str = "",
tone: str = "",
detail: str = "",
) -> str:
"""把用户选定的剧情方向写成出片/方案硬约束。"""
title = str(title or "").strip()
conflict = str(conflict or "").strip()
product_role = str(product_role or "").strip()
reversal = str(reversal or "").strip()
tone = str(tone or "").strip()
detail = str(detail or "").strip()
if not title and not detail and not any((conflict, product_role, reversal)):
return ""
lines = ["【剧情反转方向·强制执行·最高优先级】"]
if title:
lines.append(f"已选方向标题:{title}")
if conflict:
lines.append(f"开场冲突必须是:{conflict}")
if product_role:
lines.append(f"商品在剧情中的作用必须是:{product_role}")
if reversal:
lines.append(f"最终反转必须是:{reversal}")
if tone:
lines.append(f"情绪调性:{tone}")
if detail and not any((conflict, product_role, reversal)):
lines.append(f"方向细节:{detail}")
lines.append(
"策略、方案时间轴和 video_prompt 必须严格沿用上述冲突→商品作用→反转;"
"禁止改成另一套常见带货故事(例如擅自换成「出门忘了喂宠/忘记带东西」等默认桥段),"
"除非用户所选方向本身就是该桥段。"
)
return "\n".join(lines)
def apply_plot_twist_direction_contract(prompt: str, *, title: str = "", conflict: str = "", product_role: str = "", reversal: str = "", tone: str = "", detail: str = "") -> str:
"""确定性把已选剧情方向写入方案/出片 prompt,避免模型另起炉灶。"""
base = str(prompt or "").strip()
contract = format_plot_twist_direction_contract(
title=title,
conflict=conflict,
product_role=product_role,
reversal=reversal,
tone=tone,
detail=detail,
)
if not base or not contract:
return base
if "【剧情反转方向·强制执行·最高优先级】" in base:
return base
return f"{base}\n\n{contract}"
# 预设除了决定最终 Prompt,也决定 Agent 在素材整理、追问与生成前检查时的工作重点。
# 这段进入系统提示词,避免把预设退化成一句风格修饰词。
VIDEO_PRESET_WORKFLOWS: dict[str, str] = {
@@ -191,14 +253,14 @@ VIDEO_PRESET_WORKFLOWS: dict[str, str] = {
"商品拟人广告": "先确认商品外观和性格表达方式;默认无脸拟人,商品保持真实完整,台词用画外声。",
"达人口播种草": "优先确认人物、多人出镜关系、真实体验和主卖点;生成前核对口播字数能在时长内说完,每个卖点都有画面证明。",
"商品图一键成片": "优先从商品参考图锁定外观;自动补场景和动作,但不替换或改变用户商品图里的结构、颜色和包装。",
"鱼眼换装": "优先确认人物参考、服装套数和展示顺序;生成前核对脸、身形、场景稳定,只有服装随动作切换。",
"点击换款": "先让用户确认颜色/款式/SKU 和切换顺序;脚本只能是固定机位下手指逐次点击、商品原位换款,禁止转成剧情或口播。",
"多色商品换款": "先让用户确认颜色/款式/SKU 和切换顺序;脚本只能是固定机位下手指逐次点击、商品原位换款,禁止转成剧情或口播。",
"点触换款": "先让用户确认颜色/款式/SKU 和切换顺序;脚本只能是固定机位下手指逐次点击、商品原位换款,禁止转成剧情或口播。",
"鱼眼换装": "优先确认人物参考、服装套数和展示顺序;生成前核对脸、身形、场景稳定,只有服装瞬间切换;人物始终已穿好当前套,不写穿衣过程。",
"点击换款": "先让用户确认颜色/款式/SKU 和切换顺序;脚本只能是固定机位 + 手指点击触发换款;分镜不要反复写「每次点击同一位置」,禁止转成剧情或口播。",
"多色商品换款": "先让用户确认颜色/款式/SKU 和切换顺序;脚本只能是固定机位 + 手指点击触发换款;分镜不要反复写「每次点击同一位置」,禁止转成剧情或口播。",
"点触换款": "先让用户确认颜色/款式/SKU 和切换顺序;脚本只能是固定机位 + 手指点击触发换款;分镜不要反复写「每次点击同一位置」,禁止转成剧情或口播。",
"探店漫游": "优先确认门店动线与主推项目;用连续移动串联入口、环境、细节和服务,不做碎片化硬切。",
"品牌质感大片": "优先确认品牌气质、材质和商品主卖点;由 Agent 决定光线和镜头,不把专业选择反复抛给用户。",
"前后对比实测": "优先确认同一对象的前、中、后素材或可比较条件;生成前核对对比不夸大且没有缺失关键阶段。",
"AI 宠物拟人": "优先确认宠物角色参考、性格和商品互动方式;生成前核对宠物、商品结构和使用动作前后一致。",
"AI 宠物拟人": "优先确认宠物角色参考、性格和商品互动方式;台词必须是宠物自己说的第一人称,禁止旁白/口播/画外音感;生成前核对宠物、商品结构和使用动作前后一致。",
"人物与音色替换": "先确认原视频、替换对象和替换范围;未经要求不得改变原视频的构图、动作、商品、场景或节奏。",
}
@@ -235,26 +297,30 @@ VIDEO_PRESET_DELIVERY_CONTRACTS: dict[str, str] = {
),
"鱼眼换装": (
"【预设执行层·鱼眼换装】使用近距离鱼眼/广角透视和稳定的同一机位;人物脸、身形、发型、场景、光线连续一致。"
"每一套服装由一个清晰的身体动作触发切换,按用户提供顺序完整展示;镜头的变化来自动作和节奏,不额外编复杂营销剧情。"
"人物始终已穿着当前套装;每一套由甩头、抬手、转身等动作触发瞬间切换到已穿好的下一套,按用户提供顺序完整展示。"
"禁止穿衣、套袖、扣扣、拉拉链等穿戴过程镜头;镜头变化来自触发动作与节奏,不额外编复杂营销剧情。"
),
"点击换款": (
"【预设执行层·点击换款·强制】这不是口播片、剧情片或普通商品展示片。"
"使用单一固定机位和同一背景,商品全程处于完全相同的中心位置、尺寸、角度与透视。"
"每个切换节点都必须清楚拍到一根手指轻触/点击商品,接触瞬间通过原位 match cut 换成下一款;"
"使用单一固定机位和同一背景,商品构图、尺寸与角度保持稳定。"
"换款由手指轻触/点击触发,接触后以干净 match cut 切到下一款;"
"分镜不要反复写「每次点击同一位置 / 点同一点」,点击动作点到为止,重点写款式变化。"
"不改场景、不改机位、不运镜、不说话、不出现完整人物、不演剧情、不演示使用步骤。"
"各款必须按用户确认的顺序逐一出现,不自行发明颜色或款式;结尾停在干净的全款式总览。"
),
"多色商品换款": (
"【预设执行层·点击换款·强制】这不是口播片、剧情片或普通商品展示片。"
"使用单一固定机位和同一背景,商品全程处于完全相同的中心位置、尺寸、角度与透视。"
"每个切换节点都必须清楚拍到一根手指轻触/点击商品,接触瞬间通过原位 match cut 换成下一款;"
"使用单一固定机位和同一背景,商品构图、尺寸与角度保持稳定。"
"换款由手指轻触/点击触发,接触后以干净 match cut 切到下一款;"
"分镜不要反复写「每次点击同一位置 / 点同一点」,点击动作点到为止,重点写款式变化。"
"不改场景、不改机位、不运镜、不说话、不出现完整人物、不演剧情、不演示使用步骤。"
"各款必须按用户确认的顺序逐一出现,不自行发明颜色或款式;结尾停在干净的全款式总览。"
),
"点触换款": (
"【预设执行层·点击换款·强制】这不是口播片、剧情片或普通商品展示片。"
"使用单一固定机位和同一背景,商品全程处于完全相同的中心位置、尺寸、角度与透视。"
"每个切换节点都必须清楚拍到一根手指轻触/点击商品,接触瞬间通过原位 match cut 换成下一款;"
"使用单一固定机位和同一背景,商品构图、尺寸与角度保持稳定。"
"换款由手指轻触/点击触发,接触后以干净 match cut 切到下一款;"
"分镜不要反复写「每次点击同一位置 / 点同一点」,点击动作点到为止,重点写款式变化。"
"不改场景、不改机位、不运镜、不说话、不出现完整人物、不演剧情、不演示使用步骤。"
"各款必须按用户确认的顺序逐一出现,不自行发明颜色或款式;结尾停在干净的全款式总览。"
),
@@ -273,6 +339,8 @@ VIDEO_PRESET_DELIVERY_CONTRACTS: dict[str, str] = {
"AI 宠物拟人": (
"【预设执行层·AI 宠物拟人】宠物外观、体型、毛色和性格前后一致;趣味来自拟人动作与真实反应。"
"宠物和商品的互动必须符合商品真实结构与正常用法,商品不变成玩具或获得不存在的能力;剧情里至少有一个可见卖点证据。"
"人声必须是宠物角色第一人称台词(我/本汪/本喵等贴合物种的口吻),像宠物对着镜头或商品说话;"
"禁止写成旁白解说、达人口播、画外音讲述或「今天给大家介绍…」类带货腔。"
),
"人物与音色替换": (
"【预设执行层·人物与音色替换】严格保留原视频的构图、镜头顺序、动作、节奏、商品、场景和剪辑;"
@@ -316,8 +384,9 @@ def preset_workflow_guidance(name: str) -> str:
_CLICK_SWAP_FINGER_CONTRACT = (
"【预设执行层·点击换款·只出手】这不是口播片、剧情片或普通商品展示片。"
"使用单一固定机位和同一背景,商品全程处于完全相同的中心位置、尺寸、角度与透视。"
"每个切换节点都必须清楚拍到一根手指轻触/点击商品,接触瞬间通过原位 match cut 换成下一款;"
"使用单一固定机位和同一背景,商品构图、尺寸与角度保持稳定。"
"换款由手指轻触/点击触发,接触后以干净 match cut 切到下一款;"
"分镜不要反复写「每次点击同一位置 / 点同一点」,点击动作点到为止,重点写款式变化。"
"不改场景、不改机位、不运镜、不说话、不出现完整人物、不演剧情、不演示使用步骤、不生成角色定妆图。"
"各款必须按用户确认的顺序逐一出现,不自行发明颜色或款式;结尾停在干净的全款式总览。"
)
@@ -367,10 +436,10 @@ def apply_video_preset_prompt(name: str, prompt: str, *, click_swap_mode: str =
return (
f"{marker}\n{contract}\n\n"
"【原始商品与 SKU 信息】仅提取下文中的商品外观、颜色、款式和顺序事实;"
"下文任何与「固定机位、手指点击、商品原位换款」冲突的拍法一律忽略。\n"
"下文任何与「固定机位、手指点击触发换款、构图稳定」冲突的拍法一律忽略。\n"
f"{base}\n\n"
"【最终执行检查】每一次换款都必须由画面内手指的一次清晰点击触发,"
"切换前后商品中心点、尺寸、角度、背景、光线和机位不变;不出现完整人物、不生成角色图。"
"【最终执行检查】换款由手指点击触发,机位、背景、光线与商品构图保持稳定;"
"分镜禁止反复写「每次点击同一位置 / 点同一点」;不出现完整人物、不生成角色图。"
)
return f"{base}\n\n{marker}\n{contract}"