feat(core): 故事板改为「一场=分镜表」+ 确认故事板按钮气泡引导

- ai/services.py: 故事板单帧提示词改为按场拆多分镜、纵向排成竖屏分镜表(不同景别/运镜),并锁人物脸/商品一致性
- pipeline.tsx: 底栏统一「确认故事板」,未生成时点击弹气泡引导先生成(不再假装跳过)
- pipeline-page.css: 配套 sb-confirm-pop 气泡样式
- 附测试截图与流程文档/perf 产物

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
zyc
2026-06-17 18:32:06 +08:00
co-authored by Claude Opus 4.8
parent 2f6d3f5823
commit d959543d43
20 changed files with 456 additions and 11 deletions
+19 -4
View File
@@ -804,15 +804,29 @@ def _scene_context(project) -> str:
def build_storyboard_frame_prompt(project, version, segment) -> str:
"""故事板提示词:风格锚点 + 本镜画面(回退旁白)+ 版本统一指令。"""
"""故事板提示词:把这一「场」拆成多个分镜,排成一张竖屏【分镜表】。
用户要的结构是「一场 = 一个故事板,内含多个分镜图(不同景别/运镜)」,而非一场一张大图。"""
visual = (segment.visual_prompt or segment.narration or "").strip()
dur = segment.duration_seconds or 15
sub = max(2, min(4, round(dur / 5))) # 按本场时长估分镜数:15s≈3 格
lines = [
_scene_context(project),
f"{segment.sort_order + 1} 镜画面:{visual}" if visual else f"{segment.sort_order + 1} ",
f"生成一张竖屏【分镜故事板表】:把{segment.sort_order + 1} 场(约 {dur} 秒)拆成 {sub} 个分镜,"
f"从上到下纵向排成 {sub} 个等宽分格,格与格之间用细线或留白分隔,每格角落标注分镜序号、景别与时长。",
]
if visual:
lines.append(f"本场画面:{visual}")
if segment.narration:
lines.append(f"台词/口播:{segment.narration.strip()}")
if segment.product_exposure:
lines.append(f"商品露出方式:{segment.product_exposure.strip()}")
lines.append(
"各分镜要体现不同景别与运镜(如 中景固定 → 特写微距 → 全景跟拍),镜头连贯,"
"同一人物保持同一张脸、同一商品保持外观与配色一致。"
)
if version.prompt:
lines.append(version.prompt.strip())
lines.append("电商竖屏分镜图,构图清晰,可直接指导视频生成")
lines.append("真实清新、生活化的电商带货分镜表,竖屏 9:16,排版工整,画面清晰,可直接指导视频生成")
return "\n".join(line for line in lines if line)
@@ -906,7 +920,8 @@ def build_storyboard_frame_prompt_refs(project, version, segment, refs: list[dic
)
return (
f"{base}\n参考图对应:{ref_lines}"
"请严格保持各参考图中角色的同一张脸、同一商品的外观与配色,按本镜画面重新构图合成为一张电商竖屏分镜图。"
"请严格保持各参考图中角色的同一张脸、同一商品的外观与配色,按本场各分镜画面重新构图,"
"合成为一张包含多个分镜格的竖屏分镜表(每格一个分镜画面)。"
)