feat: add automatic production start workflow
This commit is contained in:
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user