auto-save 2026-05-14 11:21 (~7)

This commit is contained in:
2026-05-14 11:25:23 +08:00
parent 4127adc5e7
commit 12dec58056
7 changed files with 123 additions and 36 deletions

View File

@@ -791,7 +791,7 @@ SubjectAsset {
<tr><td>创建任务</td><td><code>POST /jobs</code></td><td><code>createJob</code></td><td>提交 TK 链接,后台开始下载,停在 downloaded 等用户点解析。</td></tr>
<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/&lt;id&gt;</code> 目录移除整个 job包括源视频、关键帧、元素提取图和生成视频。</td></tr>
<tr><td>解析视频</td><td><code>POST /jobs/{id}/analyze?frames=&amp;target=&amp;mode=&amp;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}/analyze?frames=&amp;target=&amp;mode=&amp;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>;随后 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>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>
@@ -875,7 +875,7 @@ SubjectAsset {
<div class="card">
<h3>阻塞 / 占位</h3>
<ul>
<li>ASR仍依赖当前 OpenAI-compatible 音频转写入口;如果该网关 audio endpoint 不通,文案提取仍会失败</li>
<li>ASR优先走当前 OpenAI-compatible 音频转写入口;如果该网关没有 <code>/audio/transcriptions</code>,自动 fallback 到 <code>ASR_FALLBACK_MODEL</code>(默认 <code>gemini-2.5-flash</code>)的多模态音频识别</li>
<li>MiniMax当前接入的是官方 T2A 配音能力,不是 ASRAPI 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>
@@ -918,6 +918,18 @@ SubjectAsset {
<h2>变更记录</h2>
<p>这个记录不是 git log 的替代品。它记录“产品理解发生了什么变化、影响了哪些源码、你以后描述需求时该怎么说”。后续每次改功能都要补一条。</p>
<div class="changelog">
<article class="change">
<header>
<h3>2026-05-14 · 本地抽帧改为展示友好算力档</h3>
<span class="tag orange">抽帧</span>
<span class="tag gray">Audio</span>
</header>
<div class="body">
<p><strong>问题:</strong>透明骨架人目标逐帧调用 Vision 验收会拖慢抽帧;切回本机算力后,如果自动档直接跑最高极准,也可能在展示时占满机器资源。</p>
<p><strong>改动:</strong><code>transparent_human</code> 目标保留,但抽帧阶段只走本地扫描、评分、去重和时间覆盖,不再逐帧调用 Vision。<code>quality=auto</code> 最高只自动选择精细;极准仍保留为手动选项。抽帧开始拆出 <code>audio.wav</code> 后会启动独立音频线程,视觉抽帧和音频处理并行,互不标失败。</p>
<p><strong>影响:</strong><code>api/main.py</code><code>web/components/nodes/index.tsx</code><code>docs/source-analysis.html</code></p>
</div>
</article>
<article class="change">
<header>
<h3>2026-05-14 · 修复 ReactFlow Hydration 和后端 reload 卡住</h3>
@@ -938,7 +950,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> 表示音频处理中。</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 多模态音频识别。</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>
@@ -1234,7 +1246,7 @@ SubjectAsset {
</header>
<div class="body">
<p><strong>问题:</strong>抽帧精度不应该每次都让用户判断;点击一个视频抽帧后,其他视频不应被全局禁用,而应该可以先后排队。另外打开视频抽帧侧边面板后,也应能自动抽帧。</p>
<p><strong>改动:</strong><code>quality</code> 新增 <code>auto</code> 默认值,后端按 CPU 核数、内存和视频时长解析为快速精细或极准;本机 M2 Max + 64GB 的短视频会自动走极准。后端新增内存队列 <code>ANALYZE_QUEUE</code>,多个 <code>analyze</code> 请求按顺序执行;前端轮询所有运行中的 job不只轮询当前 active job。<code>VideoFramePanelNode</code> 内也加入同一套自动抽帧工具条。</p>
<p><strong>改动:</strong><code>quality</code> 新增 <code>auto</code> 默认值,后端按 CPU 核数、内存和视频时长解析为快速精细为了展示稳定auto 不再自动进入极准,极准仅在用户手动选择时启用。后端新增内存队列 <code>ANALYZE_QUEUE</code>,多个 <code>analyze</code> 请求按顺序执行;前端轮询所有运行中的 job不只轮询当前 active job。<code>VideoFramePanelNode</code> 内也加入同一套自动抽帧工具条。</p>
<p><strong>影响:</strong><code>api/main.py</code><code>web/lib/api.ts</code><code>web/app/page.tsx</code><code>web/components/nodes/index.tsx</code><code>docs/source-analysis.html</code>。队列目前是进程内队列,重启后不会恢复未执行的排队任务。</p>
</div>
</article>