auto-save 2026-05-14 12:42 (~9)
This commit is contained in:
@@ -558,7 +558,7 @@
|
||||
<div class="step"><div class="num">5</div><h3>素材准备</h3><p>清洗关键帧,把多张关键帧作为同一主体的参考,先重绘六张标准站立主体资产图,再按关键帧生成多个去主体、相似或换风格场景图。</p></div>
|
||||
<div class="step"><div class="num">6</div><h3>分镜改造</h3><p>把参考主体、场景、动作和 SKG 产品放入分镜结构;产品融合使用纵向 6 行镜头工作表,每行绑定产品图、白底人物图、产品区域、场景图、描述词、秒数和单条生成入口。</p></div>
|
||||
<div class="step"><div class="num">7</div><h3>生成视频</h3><p>普通分镜可调用 Seedance / Kling / Veo 3;产品融合固定用 GPT Image 2 生成位置引导图,再用 Seedance 按秒数生成视频,结果回写到画面工作台节点。</p></div>
|
||||
<div class="step"><div class="num">8</div><h3>声音文案</h3><p>音频轨独立处理:ASR 提取原始英文文案、翻译成中文对照、接 SKG 产品卖点改写成英文 voice-over;配置 MiniMax 后直接生成英文配音 mp3。底部音频条播放原音频时,指针会按时间走过字幕节点。</p></div>
|
||||
<div class="step"><div class="num">8</div><h3>声音文案</h3><p>音频轨独立处理:提取原音频并按实际秒数生成 SKG 英文产品介绍 voice-over,ASR/翻译只作为改前对照和节奏参考;配置 MiniMax 后从男声、女声、成熟声池随机生成自然英文配音 mp3。底部音频条播放原音频时,指针会按时间走过字幕节点。</p></div>
|
||||
<div class="step"><div class="num">9</div><h3>合成成品</h3><p>片段、字幕、配音、转场合成最终 mp4。当前未实现。</p></div>
|
||||
</div>
|
||||
</section>
|
||||
@@ -572,7 +572,7 @@
|
||||
<tbody>
|
||||
<tr><td><code>web/app/page.tsx</code></td><td>产品工作台主状态:jobs、activeJobId、按 job 隔离的 selectedFrames/详情面板状态、clipboard、ReactFlow 节点和边;负责打开/找回画布工作面板。</td></tr>
|
||||
<tr><td><code>web/components/nodes/index.tsx</code></td><td>DAG 节点定义:Input、VisualLab、Audio、Compose,以及画布工作面板 KeyframePanel / VideoFramePanel;旧 Keyframe/Storyboard/VideoGen 组件保留但不再挂主画布。</td></tr>
|
||||
<tr><td><code>web/components/audio-strip.tsx</code></td><td>底部吸附音频条:可拖拽调整高度;播放原音频时移动指针,逐个高亮英文/中文字幕节点和对应波形,并在右侧固定显示 SKG 英文改写稿和 MiniMax 英文配音。</td></tr>
|
||||
<tr><td><code>web/components/audio-strip.tsx</code></td><td>底部吸附音频条:可拖拽调整高度;播放原音频时移动指针,逐个高亮英文/中文字幕节点和对应波形,并在右侧固定显示按原音频时长生成的 SKG 英文产品口播和 MiniMax 随机英文配音。</td></tr>
|
||||
<tr><td><code>web/components/lightbox.tsx</code></td><td>关键帧素材准备面板:清洗、统一主体候选、参考帧网格、六张主体重绘图、每帧去主体场景图、纵向 6 行产品融合镜头工作表和审核。</td></tr>
|
||||
<tr><td><code>web/components/product-library-picker.tsx</code></td><td>SKG 内置白底产品图库选择器:搜索、品类筛选、预览尺寸,并把库内图片复制为当前 job 的 <code>asset</code>。</td></tr>
|
||||
<tr><td><code>web/components/storyboard-bar.tsx</code></td><td>顶部分镜编排条:展示选入编排的关键帧,并作为唯一分镜导航。</td></tr>
|
||||
@@ -701,7 +701,7 @@ api/main.py
|
||||
</div>
|
||||
<div class="card">
|
||||
<h3>AudioScript</h3>
|
||||
<p>音频文案轨的结构化产物。<code>pipeline_transcribe</code> 在 ASR 和翻译后写入:先生成 SKG 英文 voice-over 改写稿,再用 MiniMax T2A 生成英文配音文件。</p>
|
||||
<p>音频文案轨的结构化产物。<code>pipeline_transcribe</code> 提取 <code>audio.wav</code> 后按原音频秒数写入 SKG 英文产品介绍 voice-over,再用 MiniMax T2A 从英文音色池随机生成配音文件。</p>
|
||||
<pre>AudioScript {
|
||||
status: idle | rewriting | completed | failed,
|
||||
source_text,
|
||||
@@ -791,7 +791,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>;随后 ASR 得到英文时间戳段落,再翻译中文,并按 <code>AUDIO_PRODUCT_BRIEF</code> 生成英文 <code>audio_script.rewritten_text</code>;配置 <code>MINIMAX_API_KEY</code> 后调用 MiniMax T2A 生成英文 <code>audio_script.voice_url</code>。前端不自动触发,用户在 Audio 节点点击“提取音频 / 重新提取音频”即可启动并立即打开底部音频条;抽帧中也允许并行触发,忙碌态由 <code>audio_script.status</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>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>
|
||||
@@ -840,7 +840,7 @@ SubjectAsset {
|
||||
</tr>
|
||||
<tr>
|
||||
<td><span class="tag gray">Audio / ASR / Rewrite</span></td>
|
||||
<td>独立声音文案轨:从 <code>source.mp4</code> 直接提取 <code>audio.wav</code>,再提取原始口播、翻译中文、改写成 SKG 产品语境英文 voice-over;MiniMax T2A 配置后生成英文配音 mp3。不再等待抽帧完成,用户在主画布 <code>AudioNode</code> 点击卡片或“提取音频 / 重新提取音频”即可打开底部音频条并启动;即使视觉抽帧正在进行,也通过 <code>audio_script.status</code> 并行管理音频忙碌态。<code>AudioNode</code> 用“改前 · 原音频 / 改后 · SKG English VO”摘要展示;底部 <code>AudioStrip</code> 吸附屏幕底端,可拖拽调整高度,按时间段展示英文、中文翻译和波形;原音频播放时指针同步穿过字幕节点,右侧显示英文改写稿和 MiniMax 英文配音。</td>
|
||||
<td>独立声音文案轨:从 <code>source.mp4</code> 直接提取 <code>audio.wav</code>,按原音频时长生成 SKG 产品语境英文 voice-over;ASR/翻译保留为改前对照和节奏参考。MiniMax T2A 配置后从男声、女声、成熟声池随机生成自然英文配音 mp3。不再等待抽帧完成,用户在主画布 <code>AudioNode</code> 点击卡片或“提取音频 / 重新提取音频”即可打开底部音频条并启动;即使视觉抽帧正在进行,也通过 <code>audio_script.status</code> 并行管理音频忙碌态。<code>AudioNode</code> 用“改前 · 原音频 / 改后 · SKG Product VO”摘要展示;底部 <code>AudioStrip</code> 吸附屏幕底端,可拖拽调整高度,按时间段展示英文、中文翻译和波形;原音频播放时指针同步穿过字幕节点,右侧显示英文产品口播和 MiniMax 英文配音。</td>
|
||||
<td>不要阻断视觉素材管线。</td>
|
||||
<td><code>AudioNode</code>、<code>AudioStrip</code>、<code>ASRNode</code>、<code>TranslateNode</code>、<code>RewriteNode</code>、<code>pipeline_transcribe</code>、<code>AudioScript</code></td>
|
||||
</tr>
|
||||
@@ -867,7 +867,7 @@ SubjectAsset {
|
||||
<li>Vision 识别关键帧,输出 scene、objects、style、suggested_prompt,并作为主体候选来源。</li>
|
||||
<li>主体候选确认、改名、删除和主体资产包生成。</li>
|
||||
<li>分镜工作台 4 图槽和改造说明自动保存。</li>
|
||||
<li>音频文案轨:ASR/翻译后自动生成 SKG 英文口播改写稿;配置 MiniMax 后生成英文配音 mp3。底部音频条可播放原音频并用指针逐段对齐字幕节点。</li>
|
||||
<li>音频文案轨:点击提取音频后按原音频时长自动生成 SKG 英文产品介绍口播;配置 MiniMax 后从男声、女声、成熟声池随机生成自然英文配音 mp3。底部音频条可播放原音频并用指针逐段对齐字幕节点。</li>
|
||||
<li>nano-banana-pro image-to-image 生图。</li>
|
||||
</ul>
|
||||
</div>
|
||||
@@ -875,7 +875,7 @@ SubjectAsset {
|
||||
<h3>阻塞 / 占位</h3>
|
||||
<ul>
|
||||
<li>ASR:优先走当前 OpenAI-compatible 音频转写入口;如果该网关没有 <code>/audio/transcriptions</code>,自动 fallback 到 <code>ASR_FALLBACK_MODEL</code>(默认 <code>gemini-2.5-flash</code>)的多模态音频识别。</li>
|
||||
<li>MiniMax:当前接入的是官方 T2A 英文配音能力,不是 ASR;API Key 只能放本地环境变量,不能写入仓库。</li>
|
||||
<li>MiniMax:当前接入的是官方 T2A 英文配音能力,不是 ASR;默认随机音色池是 <code>English_magnetic_voiced_man</code>、<code>English_Upbeat_Woman</code>、<code>English_MaturePartner</code>。API Key 只能放本地环境变量,不能写入仓库。</li>
|
||||
<li>Audio Product Brief:默认是通用 SKG 放松产品卖点,后续可改成跟已选产品库条目联动。</li>
|
||||
<li>Video Gen:模型层按业务保留 Seedance / Kling / Veo/Voe 选择;后端已支持 Poe、火山方舟和 SKG 豆包视频网关。Seedance 可通过 <code>VIDEO_API_BASE_URL=https://ai.skg.com/doubao</code> 走 content JSON 异步任务,提交后写入 Video Gen 节点并轮询到完成。</li>
|
||||
<li>Compose:还没做本地 ffmpeg 字幕/TTS 合成。</li>
|
||||
@@ -975,7 +975,7 @@ SubjectAsset {
|
||||
</header>
|
||||
<div class="body">
|
||||
<p><strong>问题:</strong>等待抽帧完成后自动启动音频,不符合“先把声音文案拿出来审核”的工作流;用户需要在音频卡片上直接触发。</p>
|
||||
<p><strong>改动:</strong>移除前端抽帧完成后的自动转写逻辑;<code>AudioNode</code> 保留并固定显示“提取音频 / 重新提取音频”按钮,点击音频卡片也会立即打开底部音频条。后端 <code>/transcribe</code> 不再要求 <code>frames_extracted</code>,视频就绪后可直接从 <code>source.mp4</code> 拆出 <code>audio.wav</code>,并继续 ASR、翻译、SKG 英文改写和 MiniMax 英文配音;抽帧中触发时不抢主状态,而是用 <code>audio_script.status</code> 表示音频处理中。当当前网关的 <code>whisper-1</code> audio endpoint 返回 404 时,会 fallback 到 Gemini 多模态音频识别;改写模型解析失败时使用本地 SKG 英文口播模板兜底,不再把可用文案标成前端错误。</p>
|
||||
<p><strong>改动:</strong>移除前端抽帧完成后的自动转写逻辑;<code>AudioNode</code> 保留并固定显示“提取音频 / 重新提取音频”按钮,点击音频卡片也会立即打开底部音频条。后端 <code>/transcribe</code> 不再要求 <code>frames_extracted</code>,视频就绪后可直接从 <code>source.mp4</code> 拆出 <code>audio.wav</code>,并按原音频时长生成 SKG 英文产品介绍和 MiniMax 随机英文配音;抽帧中触发时不抢主状态,而是用 <code>audio_script.status</code> 表示音频处理中。当当前网关的 <code>whisper-1</code> audio endpoint 返回 404 时,会 fallback 到 Gemini 多模态音频识别;ASR 不可用时也会继续按原音频时长生成产品口播,不把可用文案标成前端错误。</p>
|
||||
<p><strong>影响:</strong><code>web/app/page.tsx</code>、<code>web/components/nodes/index.tsx</code>、<code>api/main.py</code>、<code>docs/source-analysis.html</code>。</p>
|
||||
</div>
|
||||
</article>
|
||||
@@ -987,7 +987,7 @@ SubjectAsset {
|
||||
</header>
|
||||
<div class="body">
|
||||
<p><strong>问题:</strong>音频和文案只在节点或侧栏里展示,审核时缺少“文字和声音时间轴对应”的空间;英文口播和中文翻译也没有上下对齐。</p>
|
||||
<p><strong>改动:</strong>新增 <code>web/components/audio-strip.tsx</code>,在主工作台底部吸附显示,可拖拽调整高度、可收起。每个音频段按时间横向排列,上方显示英文,中间显示中文翻译,下方显示对应波形条;底部原音频播放器驱动时间轴,播放时绿色指针会沿全局波形移动,并在当前字幕节点内同步走过该段。右侧显示改写后的 SKG English VO、MiniMax 英文配音和产品依据。后端新增 <code>source_audio_url</code> 和 <code>GET /jobs/{id}/audio.wav</code> 只读接口,前端用 Web Audio API 解码生成波形峰值。</p>
|
||||
<p><strong>改动:</strong>新增 <code>web/components/audio-strip.tsx</code>,在主工作台底部吸附显示,可拖拽调整高度、可收起。每个音频段按时间横向排列,上方显示英文,中间显示中文翻译,下方显示对应波形条;底部原音频播放器驱动时间轴,播放时绿色指针会沿全局波形移动,并在当前字幕节点内同步走过该段。右侧显示按原音频时长生成的 SKG 英文产品口播、MiniMax 随机英文配音和产品依据。后端新增 <code>source_audio_url</code> 和 <code>GET /jobs/{id}/audio.wav</code> 只读接口,前端用 Web Audio API 解码生成波形峰值。</p>
|
||||
<p><strong>影响:</strong><code>web/app/page.tsx</code>、<code>web/components/audio-strip.tsx</code>、<code>web/lib/api.ts</code>、<code>api/main.py</code>、<code>docs/source-analysis.html</code>。</p>
|
||||
</div>
|
||||
</article>
|
||||
@@ -999,7 +999,7 @@ SubjectAsset {
|
||||
</header>
|
||||
<div class="body">
|
||||
<p><strong>问题:</strong>音频识别成功后只显示改写文案,用户看不到它和原音频之间的变化关系,难以判断“是不是把参考视频转成我们自己的话”。</p>
|
||||
<p><strong>改动:</strong><code>AudioNode</code> 增加轻量对照摘要:改前显示原音频识别/翻译预览,改后显示 SKG 英文口播;侧栏 <code>Rewrite</code> 面板改为完整审核视图,先列原音频逐段 ASR/翻译,再列英文改写稿、产品卖点依据和 MiniMax 英文配音播放器。</p>
|
||||
<p><strong>改动:</strong><code>AudioNode</code> 增加轻量对照摘要:改前显示原音频识别/翻译预览,改后显示 SKG 英文产品口播;侧栏 <code>Rewrite</code> 面板改为完整审核视图,先列原音频逐段 ASR/翻译,再列英文产品介绍稿、产品卖点依据和 MiniMax 英文配音播放器。</p>
|
||||
<p><strong>影响:</strong><code>web/components/nodes/index.tsx</code>、<code>web/components/dashboard.tsx</code>、<code>docs/source-analysis.html</code>。</p>
|
||||
</div>
|
||||
</article>
|
||||
|
||||
Reference in New Issue
Block a user