@@ -569,12 +569,12 @@
< section id = "pipeline" data-search >
< h2 > 业务管线< / h2 >
< p > 当前产品方向收敛为“信息流广告快速复刻分镜生产板”:主界面左侧是素材输入列,右侧是单一分镜生产板块。每个分镜卡片从上到下对应音频分镜文案、该分镜关键元素 / 抽帧生成、该分镜视频生成, 用户可以继续追加草稿分镜并在绑定关键帧后保存和生成候选 视频。它不再保留单独的右侧空白画布,也不再把音频、元素和合成拆成多列。< / p >
< p > 当前产品方向收敛为“信息流广告快速复刻分镜生产板”:主界面左侧是素材输入列,右侧是单一分镜生产板块。用户粘贴链接或上传素材后点击“开始”,系统自动下载、抽帧、解析音频、扫描关键元素并生成分镜初稿; 每个分镜卡片从上到下对应音频分镜文案、该分镜关键元素 / 抽帧生成、该分镜视频生成。 用户在关键元素候选里选择后生成元素提取图和 6 视图,审核分镜规划后可单条生成或“生成全部 视频” 。它不再保留单独的右侧空白画布,也不再把音频、元素和合成拆成多列。< / p >
< div class = "pipeline" >
< div class = "step" > < div class = "num" > 1< / div > < h3 > 素材输入列 < / h3 > < p > TK / 信息流视频链接或本地上传;每个素材就是一个文件任务,可在列内切换 。< / p > < / div >
< div class = "step" > < div class = "num" > 2< / div > < h3 > 分镜文案 < / h3 > < p > 解析音频后结合产品内容填写新剧情、产品融入、动作 / 镜头;分镜卡片从上到下无限追加 。< / p > < / div >
< div class = "step" > < div class = "num" > 3< / div > < h3 > 关键 元素< / h3 > < p > 在同一 张分镜卡内绑定或使用关键帧,直接查看识别元素、提取元素图和生成图 。< / p > < / div >
< div class = "step" > < div class = "num" > 4< / div > < h3 > 视频 生成< / h3 > < p > 在同一张分镜卡底部选择模型并生成本分镜候选片段;完整 mp4 合成接口当前仍是占位 。< / p > < / div >
< div class = "step" > < div class = "num" > 1< / div > < h3 > 开始生产 < / h3 > < p > TK / 信息流视频链接或本地上传;点击“开始”后创建任务,下载完成后自动进入抽帧和音频处理 。< / p > < / div >
< div class = "step" > < div class = "num" > 2< / div > < h3 > 自动规划 < / h3 > < p > 抽帧后逐帧 Vision 扫描关键元素,同时音频按原时长、语速和停顿生成 SKG 英文产品口播与配音 。< / p > < / div >
< div class = "step" > < div class = "num" > 3< / div > < h3 > 人工选择 元素< / h3 > < p > 每 张分镜卡展示候选元素;用户选择后生成独立提取图和 6 视图,作为后续产品融合/视频生成参考 。< / p > < / div >
< div class = "step" > < div class = "num" > 4< / div > < h3 > 单条 / 全量 生成< / h3 > < p > 审核分镜文案后,可在单张分镜内生成视频,也可点击“生成全部视频”;生成时默认带入四张 SKG 产品角度图 。< / p > < / div >
< / div >
< / section >
@@ -587,8 +587,8 @@
< tbody >
< tr > < td > < code > web/next.config.mjs< / code > < / td > < td > Next.js 构建配置:静态导出、图片不走优化、禁用开发环境左下角 Next Dev Indicator, 并移除 Next 16 已不支持的 < code > eslint< / code > 顶层配置,避免本地 dev 出现配置 Issue 提示。< / td > < / tr >
< tr > < td > < code > web/app/globals.css< / code > < / td > < td > 全局主题变量、登录页视觉样式、ReactFlow 样式引用,以及本地开发态 < code > nextjs-portal< / code > 遮挡隐藏规则。< / td > < / tr >
< tr > < td > < code > web/app/page.tsx< / code > < / td > < td > 产品工作台主状态: jobs、activeJobId、按 job 隔离的 selectedFrames/音频条/生成任务状态;主渲染为全屏素材输入列 + 分镜生产板块。< / td > < / tr >
< tr > < td > < code > web/components/ad-recreation-board.tsx< / code > < / td > < td > 信息流广告分镜生产板:左侧素材输入;右侧按分镜纵向排列,每张分镜卡内部依次承载音频分镜文案、关键元素 / 抽帧生成、视频生成候选;追加草稿分镜可绑定关键帧后保存 。< / td > < / tr >
< tr > < td > < code > web/app/page.tsx< / code > < / td > < td > 产品工作台主状态: jobs、activeJobId、按 job 隔离的 selectedFrames/音频条/生成任务状态;主渲染为全屏素材输入列 + 分镜生产板块;新增“开始生产”编排状态,负责下载完成后自动触发抽帧、音频处理、逐帧 Vision 扫描和分镜初稿保存;视频生成时默认复制四张 SKG 产品角度图作为参考 。< / td > < / tr >
< tr > < td > < code > web/components/ad-recreation-board.tsx< / code > < / td > < td > 信息流广告分镜生产板:左侧素材输入;右侧按分镜纵向排列,每张分镜卡内部依次承载音频分镜文案、关键元素 / 抽帧生成、视频生成候选;关键元素候选可点击生成提取图 + 6 视图;支持单条生成和“生成全部视频” 。< / td > < / tr >
< tr > < td > < code > web/app/login/page.tsx< / code > < / td > < td > 生产登录页:访问账号/访问密钥表单、保持登录、错误/成功状态;当前只在原版 Digital Oasis 动态背景上叠加一个组合登录框,桌面端左侧是动态角色,右侧是图标化登录表单;面板左上角展示官网 SKG 字标和中文“营销内容工作台”系统标识。< / td > < / tr >
< tr > < td > < code > web/app/login/layout.tsx< / code > < / td > < td > 登录路由专属 layout: 覆盖全站默认网页标题和描述为空, 避免 < code > /login< / code > 继承工作台 metadata 后在页面源码里继续出现登录界面文字以外的文案。< / td > < / tr >
< tr > < td > < code > web/components/login/oasis-canvas.tsx< / code > < / td > < td > 登录页全屏动态视觉层:用 iframe 直接承载下载包 < code > web/public/oasis-source/index.html< / code > 的原 WebGPU / Three.js 草场源码;父级登录页只覆盖自己的文案和表单,并在捕获阶段把全局鼠标坐标同时用原生事件和 < code > postMessage< / code > 转发给 iframe, 避免登录面板或输入框遮挡时草地失去鼠标响应。< / td > < / tr >
@@ -624,8 +624,9 @@
< pre > 前端主链路:
web/app/page.tsx
-> 分镜生产板: web/components/ad-recreation-board.tsx
-> 开始生产:创建/激活 job → 自动抽帧 → 自动音频处理 → 自动 Vision 扫描 → 自动写入分镜初稿
-> 左侧素材输入列 + 右侧分镜卡片列表
-> 每张分镜卡:音频分镜文案 → 关键元素 / 抽帧生成 → 视频生成候选
-> 每张分镜卡:音频分镜文案 → 候选元素选择 / 提取图 / 6 视图 → 单条或全部 视频生成
-> 底部音频条: web/components/audio-strip.tsx( 原音频播放 / 指针 / 英文 / 中文 / 波形 / 英文改写稿)
-> 旧节点/深度素材面板: web/components/nodes/index.tsx、web/components/lightbox.tsx、web/components/storyboard-workbench.tsx( 底层保留, 当前不作为主入口)
-> API 契约: web/lib/api.ts
@@ -643,11 +644,11 @@ api/main.py
< div class = "flow-row" >
< div > < strong > 你看到的区域< / strong > < span > 信息流广告分镜生产板< / span > < / div >
< div > < strong > 主要源码< / strong > < span > < code > AdRecreationBoard< / code > in < code > web/components/ad-recreation-board.tsx< / code > ;状态、轮询和接口回写仍在 < code > web/app/page.tsx< / code > 。< / span > < / div >
< div > < strong > 适合怎么描述< / strong > < span > “素材输入列、分镜生产板块、分镜卡片的文案/元素/视频生成层要如何调整”。< / span > < / div >
< div > < strong > 适合怎么描述< / strong > < span > “开始生产后哪些步骤自动跑、 素材输入列、分镜生产板块、分镜卡片的文案/元素/视频生成层要如何调整”。< / span > < / div >
< / div >
< div class = "flow-row" >
< div > < strong > 你看到的区域< / strong > < span > 单个分镜卡片< / span > < / div >
< div > < strong > 主要源码< / strong > < span > < code > StoryboardSegmentCard< / code > 和 < code > DraftSegmentCard< / code > in < code > web/components/ad-recreation-board.tsx< / code > ;复用 < code > updateStoryboard< / code > 、< code > addElement< / code > 、< code > cutoutElement< / code > 、< code > generateStoryboardVideo< / code > 等接口。< / span > < / div >
< div > < strong > 主要源码< / strong > < span > < code > StoryboardSegmentCard< / code > 和 < code > DraftSegmentCard< / code > in < code > web/components/ad-recreation-board.tsx< / code > ;复用 < code > updateStoryboard< / code > 、< code > addElement< / code > 、< code > cutoutElement< / code > 、< code > generateSubjectAssets< / code > 、< code > generateStoryboardVideo< / code > 等接口。< / span > < / div >
< div > < strong > 适合怎么描述< / strong > < span > “每个分镜内部音频文案、关键元素和视频生成候选从上到下应该怎么对应”。< / span > < / div >
< / div >
< div class = "flow-row" >
@@ -730,6 +731,8 @@ api/main.py
source_text,
source_zh,
rewritten_text,
speaker_profile,
rhythm_profile,
product_brief,
rewrite_model,
voice_provider: minimax,
@@ -815,7 +818,7 @@ SubjectAsset {
< tr > < td > 上传视频< / td > < td > < code > POST /jobs/upload< / code > < / td > < td > < code > uploadJob< / code > < / td > < td > 保存 source.mp4, 然后同样进入下载完成状态。< / td > < / tr >
< tr > < td > 删除输入视频< / td > < td > < code > DELETE /jobs/{id}< / code > < / td > < td > < code > deleteJob< / code > < / td > < td > 从任务队列、URL 和磁盘 < code > jobs/< id> < / code > 目录移除整个 job, 包括源视频、关键帧、元素提取图和生成视频。< / td > < / tr >
< tr > < td > 解析视频< / td > < td > < code > POST /jobs/{id}/analyze?frames=& target=& mode=& quality=< / code > < / td > < td > < code > analyzeJob< / code > < / td > < td > 拆轨 + 目标化抽关键帧。默认 < code > frames=12< / code > ; < code > target< / code > 支持透明骨架人、综合、清晰主体、转场变化、表情瞬间、动作峰值;当前 UI 默认 < code > transparent_human< / code > 。透明骨架人目标现在只走本地清晰度、中心主体、对比度、画面变化和 pHash 去重,不在抽帧阶段逐帧调用 Vision; < code > mode=append< / code > 追加新关键帧;< code > quality=auto< / code > 为展示友好档,最高只自动选择精细,不会自动上极准;极准保留为手动选择。抽帧开始时同步拆出 < code > audio.wav< / code > 并启动音频处理线程。多个抽帧请求进入后端队列顺序处理。< / td > < / tr >
< tr > < td > 音频文案轨< / td > < td > < code > POST /jobs/{id}/transcribe< / code > < / td > < td > < code > triggerTranscribe< / code > < / td > < td > 若尚未拆轨,先从 < code > source.mp4< / code > 提取 < code > audio.wav< / code > 并回填 < code > source_audio_url< / code > ;随后用原音频实际秒数估算英文词数,按 < code > AUDIO_PRODUCT_BRIEF< / code > 生成有趣、自然的 SKG 英文产品介绍 < code > audio_script.rewritten_text< / code > 。ASR/翻译结果保留为改前对照和节奏参考 ;如果 ASR 不可用,也会用原音频时长继续生成产品口播。配置 < code > MINIMAX_API_KEY< / code > 后调用 MiniMax T2A, 并从 < code > MINIMAX_TTS_VOICE_POOL< / code > 随机选择男声、女声或成熟声生成 < code > audio_script.voice_url< / code > 。< / td > < / tr >
< tr > < td > 音频文案轨< / td > < td > < code > POST /jobs/{id}/transcribe< / code > < / td > < td > < code > triggerTranscribe< / code > < / td > < td > 若尚未拆轨,先从 < code > source.mp4< / code > 提取 < code > audio.wav< / code > 并回填 < code > source_audio_url< / code > ;随后用原音频实际秒数估算英文词数,按 < code > AUDIO_PRODUCT_BRIEF< / code > 生成有趣、自然的 SKG 英文产品介绍 < code > audio_script.rewritten_text< / code > ,并写入 < code > speaker_profile< / code > 与 < code > rhythm_profile< / code > 作为讲话人 / 节奏参考 。ASR/翻译结果保留为改前对照;如果 ASR 不可用,也会用原音频时长继续生成产品口播。配置 < code > MINIMAX_API_KEY< / code > 后调用 MiniMax T2A, 并从 < code > MINIMAX_TTS_VOICE_POOL< / code > 随机选择男声、女声或成熟声生成 < code > audio_script.voice_url< / code > 。< / td > < / tr >
< tr > < td > 原始音频文件< / td > < td > < code > GET /jobs/{id}/audio.wav< / code > < / td > < td > < code > sourceAudioUrl< / code > < / td > < td > 返回拆轨得到的 wav; 底部 < code > AudioStrip< / code > 拉取该文件,用 Web Audio API 解码并计算波形峰值。原音频播放器驱动时间轴,播放时全局指针和当前字幕节点内指针同步移动。< / td > < / tr >
< tr > < td > 改写配音文件< / td > < td > < code > GET /jobs/{id}/audio-script.mp3< / code > < / td > < td > < code > apiAssetUrl(job.audio_script.voice_url)< / code > < / td > < td > 返回 MiniMax T2A 生成的英文 mp3。没有配置 MiniMax 或生成失败时该文件不存在,但英文改写文案仍会保存在 < code > audio_script.rewritten_text< / code > 。< / td > < / tr >
< tr > < td > 手动加帧< / td > < td > < code > POST /jobs/{id}/frames?t=< / code > < / td > < td > < code > addManualFrame< / code > < / td > < td > 按视频时间戳抽一帧, index 递增但 frames 按 timestamp 排序。< / td > < / tr >
@@ -848,7 +851,7 @@ SubjectAsset {
< tbody >
< tr >
< td > < span class = "tag blue" > 分镜生产板< / span > < / td >
< td > 承载当前主路径:素材输入列按文件任务管理素材;分镜生产板块按分镜纵向排列;每张分镜卡从上到下编辑音频分镜文案、确认该分镜关键元素、生成本分镜候选视频; 底部仅汇总完整视频合成入口。< / td >
< td > 承载当前主路径:素材输入列按文件任务管理素材;点击“开始”后自动触发下载后抽帧、音频处理、Vision 扫描和分镜初稿;分镜生产板块按分镜纵向排列;每张分镜卡从上到下编辑音频分镜文案、选择关键元素并生成提取图/6 视图、生成本分镜候选视频;顶部可“生成全部视频”, 底部仅汇总完整视频合成入口。< / td >
< td > 不要再拆回多个画布节点;不要恢复右侧空白画布占位。< / td >
< td > < code > web/components/ad-recreation-board.tsx< / code > 、< code > web/app/page.tsx< / code > < / td >
< / tr >
@@ -866,7 +869,7 @@ SubjectAsset {
< / tr >
< tr >
< td > < span class = "tag green" > 候选片段< / span > < / td >
< td > 生成视频结果直接显示在对应分镜卡片的视频生成层,可作为后续完整合成输入 。< / td >
< td > 生成视频结果直接显示在对应分镜卡片的视频生成层;单条生成和“生成全部视频”都会默认带入四张 SKG 产品角度图,已生成的关键元素 6 视图会作为主体参考图 。< / td >
< td > 不要把 Compose 提前变成最终剪辑台;最终合成仍是占位。< / td >
< td > < code > /storyboard/video< / code > 、< code > generated_videos< / code > 、< code > AdRecreationBoard< / code > < / td >
< / tr >
@@ -885,9 +888,10 @@ SubjectAsset {
< li > 手动按时间戳加关键帧。< / li >
< li > 关键帧清洗水印,全图或区域清洗。< / li >
< li > Vision 识别关键帧,输出 scene、objects、style、suggested_prompt, 并作为主体候选来源。< / li >
< li > 主体候选确认、改名、删除和主体资产包生成 。< / li >
< li > “开始生产”会在下载完成后自动抽帧、触发音频处理、逐帧 Vision 扫描并保存分镜初稿 。< / li >
< li > 主体候选确认、改名、删除和主体资产包生成;当前分镜卡可点击候选元素直接生成提取图 + 6 视图。< / li >
< li > 分镜工作台 4 图槽和改造说明自动保存。< / li >
< li > 音频文案轨:点击提取音频后按原音频时长自动生成 SKG 英文产品介绍口播;配置 MiniMax 后从男声、女声、成熟声池随机生成自然英文配音 mp3。底部音频条可播放原音频并用指针逐段对齐字幕节点。< / li >
< li > 音频文案轨:点击开始或 提取音频后按原音频时长、语速和停顿 自动生成 SKG 英文产品介绍口播;配置 MiniMax 后从男声、女声、成熟声池随机生成自然英文配音 mp3。底部音频条可播放原音频并用指针逐段对齐字幕节点。< / li >
< li > nano-banana-pro image-to-image 生图。< / li >
< / ul >
< / div >
@@ -912,7 +916,7 @@ SubjectAsset {
< div class = "todo" >
< div class = "todo-item" >
< h3 > 改分镜生产板< / h3 >
< p > “我在素材输入列或右侧分镜生产板块,这里应该怎么展示、编辑、保存和触发下一步 。”< / p >
< p > “我在素材输入列或右侧分镜生产板块,开始生产后哪些步骤自动跑,哪些步骤留给人工选择和审核 。”< / p >
< / div >
< div class = "todo-item" >
< h3 > 改分镜卡片层级< / h3 >
@@ -937,6 +941,18 @@ SubjectAsset {
< h2 > 变更记录< / h2 >
< p > 这个记录不是 git log 的替代品。它记录“产品理解发生了什么变化、影响了哪些源码、你以后描述需求时该怎么说”。后续每次改功能都要补一条。< / p >
< div class = "changelog" >
< article class = "change" >
< header >
< h3 > 2026-05-17 · 开始生产自动编排< / h3 >
< span class = "tag rose" > UI< / span >
< span class = "tag cyan" > Workflow< / span >
< / header >
< div class = "body" >
< p > < strong > 问题:< / strong > 用户希望粘贴视频链接后点击一次“开始”,系统就自动完成素材准备:抽帧、音频分析、关键元素扫描和分镜初稿;人工只负责判断规划是否合理、选择关键元素、再单条或全量生成视频。< / p >
< p > < strong > 改动:< / strong > < code > web/app/page.tsx< / code > 新增开始生产编排状态:创建/激活 job 后,下载完成自动触发 < code > analyzeJob< / code > 与 < code > triggerTranscribe< / code > ,关键帧出来后逐帧调用 < code > describeFrame< / code > 并用 < code > updateStoryboard< / code > 保存分镜初稿。视频生成时若分镜未显式选择产品图,会自动复制四张 < code > desktop-skg-product-angle-01..04< / code > 作为 SKG 产品真源,并把已生成的关键元素 6 视图作为主体参考。< code > AdRecreationBoard< / code > 把导入按钮改为“开始”,分镜卡里的候选元素可点击生成提取图 + 6 视图,顶部新增“生成全部视频”。< code > AudioScript< / code > 新增 < code > speaker_profile< / code > 和 < code > rhythm_profile< / code > ,用于展示讲话人 / 节奏参考。< / p >
< p > < strong > 影响:< / strong > < code > web/app/page.tsx< / code > 、< code > web/components/ad-recreation-board.tsx< / code > 、< code > web/components/nodes/index.tsx< / code > 、< code > web/lib/api.ts< / code > 、< code > api/main.py< / code > 、< code > RULES.md< / code > 、< code > .project.json< / code > 、< code > docs/source-analysis.html< / code > 。后续需求应区分“开始生产自动编排”和“人工审核/选择/生成”的边界。< / p >
< / div >
< / article >
< article class = "change" >
< header >
< h3 > 2026-05-17 · 合并为单一分镜生产板块< / h3 >