diff --git a/.memory/worklog.json b/.memory/worklog.json
index fd7d25c..c323ff0 100644
--- a/.memory/worklog.json
+++ b/.memory/worklog.json
@@ -1,31 +1,5 @@
{
"entries": [
- {
- "files_changed": 1,
- "message": "Codex 会话活跃 · 最近命令:codex · 1 项未提交变更 · 最近提交:auto-save 2026-05-14 18:21 (~1)",
- "ts": "2026-05-14T10:26:15Z",
- "type": "session-heartbeat"
- },
- {
- "files_changed": 1,
- "hash": "995dd88",
- "message": "auto-save 2026-05-14 18:27 (~1)",
- "ts": "2026-05-14T18:27:37+08:00",
- "type": "commit"
- },
- {
- "files_changed": 1,
- "message": "Codex 会话活跃 · 最近命令:codex · 1 项未提交变更 · 最近提交:auto-save 2026-05-14 18:27 (~1)",
- "ts": "2026-05-14T10:28:43Z",
- "type": "session-heartbeat"
- },
- {
- "files_changed": 1,
- "hash": "97c039b",
- "message": "auto-save 2026-05-14 22:00 (~1)",
- "ts": "2026-05-14T22:33:31+08:00",
- "type": "commit"
- },
{
"files_changed": 1,
"message": "Codex 会话活跃 · 最近命令:codex · 1 项未提交变更 · 最近提交:auto-save 2026-05-14 22:00 (~1)",
@@ -3270,6 +3244,32 @@
"message": "auto-save 2026-05-17 13:56 (~4)",
"hash": "c4b6980",
"files_changed": 4
+ },
+ {
+ "ts": "2026-05-17T13:58:05+08:00",
+ "type": "commit",
+ "message": "fix: use local asr for transcript timeline",
+ "hash": "660348f",
+ "files_changed": 2
+ },
+ {
+ "ts": "2026-05-17T05:58:25Z",
+ "type": "session-heartbeat",
+ "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:fix: use local asr for transcript timeline",
+ "files_changed": 1
+ },
+ {
+ "ts": "2026-05-17T06:08:25Z",
+ "type": "session-heartbeat",
+ "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:fix: use local asr for transcript timeline",
+ "files_changed": 1
+ },
+ {
+ "ts": "2026-05-17T14:12:15+08:00",
+ "type": "commit",
+ "message": "auto-save 2026-05-17 14:12 (~3)",
+ "hash": "c17fd19",
+ "files_changed": 3
}
]
}
diff --git a/docs/source-analysis.html b/docs/source-analysis.html
index 3a95e1a..79db3b6 100644
--- a/docs/source-analysis.html
+++ b/docs/source-analysis.html
@@ -588,7 +588,7 @@
web/next.config.mjs | Next.js 构建配置:静态导出、图片不走优化、禁用开发环境左下角 Next Dev Indicator,并移除 Next 16 已不支持的 eslint 顶层配置,避免本地 dev 出现配置 Issue 提示。 |
web/app/globals.css | 全局主题变量、登录页视觉样式、ReactFlow 样式引用,以及本地开发态 nextjs-portal 遮挡隐藏规则。 |
web/app/page.tsx | 产品工作台主状态:jobs、activeJobId、生成任务状态;主渲染为全屏素材输入列 + 音频解析工作表;“开始”编排状态只负责在下载完成后自动触发 triggerTranscribe,不再默认触发抽帧、Vision 扫描或分镜初稿保存;底部吸附音频条不再从主界面渲染。 |
- web/components/ad-recreation-board.tsx | 信息流广告音频解析工作表:左侧素材输入;右侧展示视频下载状态、原文案/中文翻译、讲话人/节奏/背景音分析和逐句时间轴。旧分镜卡、抽帧控制和视频生成组件仍保留在文件里,但当前主路径不渲染。 |
+ web/components/ad-recreation-board.tsx | 信息流广告音频解析工作表:左侧素材输入;右侧展示视频下载状态、默认折叠的音频文案依据、逐句时间轴和讲话人/节奏/背景音分析。旧分镜卡、抽帧控制和视频生成组件仍保留在文件里,但当前主路径不渲染。 |
web/app/login/page.tsx | 生产登录页:访问账号/访问密钥表单、保持登录、错误/成功状态;当前只在原版 Digital Oasis 动态背景上叠加一个组合登录框,桌面端左侧是动态角色,右侧是图标化登录表单;面板左上角展示官网 SKG 字标和中文“营销内容工作台”系统标识。 |
web/app/login/layout.tsx | 登录路由专属 layout:覆盖全站默认网页标题和描述为空,避免 /login 继承工作台 metadata 后在页面源码里继续出现登录界面文字以外的文案。 |
web/components/login/oasis-canvas.tsx | 登录页全屏动态视觉层:用 iframe 直接承载下载包 web/public/oasis-source/index.html 的原 WebGPU / Three.js 草场源码;父级登录页只覆盖自己的文案和表单,并在捕获阶段把全局鼠标坐标同时用原生事件和 postMessage 转发给 iframe,避免登录面板或输入框遮挡时草地失去鼠标响应。 |
@@ -612,7 +612,7 @@
api/main.py | FastAPI 单文件后端:登录会话、状态模型、任务恢复、下载、抽帧、Vision、清洗、元素、分镜、原音频转写/翻译、声音与背景音分析、后续口播改写/TTS、文件返回。 |
api/product_library/skg-products | 内置 SKG 白底产品图库:manifest.json 记录从桌面产品图筛出的 gallery 白底图和桌面 4 张产品角度图,images/ 存 45 张参考图。 |
jobs/<jobId>/state.json | 运行时状态文件,不在源码列表里,但刷新恢复依赖它。 |
- jobs/<jobId>/audio.wav | 拆轨得到的原始音频,底部 Audio Strip 会通过只读接口拉取并在浏览器里解码成波形峰值。 |
+ jobs/<jobId>/audio.wav | 拆轨得到的原始音频,当前只作为后端分析和后续必要预览的只读文件来源;主界面不再默认渲染底部音频条。 |
jobs/<jobId>/frames | 关键帧 jpg。注意 frame.index 是稳定 ID,不等于数组下标。 |
jobs/<jobId>/cleaned | 清洗后待应用图片。 |
jobs/<jobId>/elements | 元素提取图,多版本命名:idx_elementId_cutoutId.jpg。 |
@@ -625,7 +625,7 @@
web/app/page.tsx
-> 音频解析工作表:web/components/ad-recreation-board.tsx
-> 开始:创建/激活 job → 下载完成后自动触发音频处理
- -> 左侧素材输入列 + 右侧原文案/中文翻译/声音背景音分析/逐句时间轴
+ -> 左侧素材输入列 + 右侧默认折叠的音频文案依据 + 逐句时间轴 + 声音背景音分析
-> 底部音频条:不再渲染,音频结果集中到右侧工作表
-> 旧节点/深度素材面板:web/components/nodes/index.tsx、web/components/lightbox.tsx、web/components/storyboard-workbench.tsx(底层保留,当前不作为主入口)
-> API 契约:web/lib/api.ts
@@ -643,12 +643,12 @@ api/main.py
你看到的区域信息流广告音频解析工作表
主要源码AdRecreationBoard in web/components/ad-recreation-board.tsx;状态、轮询和接口回写仍在 web/app/page.tsx。
-
适合怎么描述“素材输入列、开始后的自动下载/音频解析、原文案/翻译/声音背景音结果怎么展示”。
+
适合怎么描述“素材输入列、开始后的自动下载/音频解析、逐句时间轴和声音背景音结果怎么展示”。
你看到的区域音频解析结果表
主要源码AudioIntakePanel / AudioIntakeStatus in web/components/ad-recreation-board.tsx;复用 triggerTranscribe 和 AudioScript。
-
适合怎么描述“原始文案、中文翻译、讲话人、节奏、背景音、逐句时间轴还需要哪些字段”。
+
适合怎么描述“逐句时间轴、讲话人、节奏、背景音还需要哪些字段;全文文案依据是否需要展开查看”。
你看到的区域旧深度素材面板(当前不作为主路径)
@@ -863,8 +863,8 @@ SubjectAsset {
| 音频条 |
- 音频解析工作表顶部触发音频解析,结果在右侧原文案、中文翻译、逐句时间轴和声音/背景音分析区展示;底部 AudioStrip 当前不渲染。 |
- 当前第一步不要默认展示底部音频条、新配音播放器,或把 MiniMax 配音当作已完成结果。 |
+ 音频解析工作表顶部触发音频解析;全文音频文案依据默认折叠,主展示以逐句时间轴和声音/背景音分析区为准;底部 AudioStrip 当前不渲染。 |
+ 当前第一步不要默认展示底部音频条、新配音播放器、独立原文案提取大卡片,或把 MiniMax 配音当作已完成结果。 |
web/components/audio-strip.tsx、pipeline_transcribe、AudioScript |
@@ -941,6 +941,18 @@ SubjectAsset {
变更记录
这个记录不是 git log 的替代品。它记录“产品理解发生了什么变化、影响了哪些源码、你以后描述需求时该怎么说”。后续每次改功能都要补一条。
+
+
+ 2026-05-17 · 收紧音频解析第一步版面
+ UI
+ Workflow
+
+
+
问题:音频解析第一步顶部“音频文案依据”和主区域“原文案提取”同时展示全文,和逐句时间轴重复,占用太多工作台版面。
+
改动:web/components/ad-recreation-board.tsx 将顶部“音频文案依据”改为默认折叠的 details;移除主面板里的“原文案提取”大卡片,让“逐句时间轴”成为音频解析后的主展示,声音/背景音分析降到其后。
+
影响:web/components/ad-recreation-board.tsx、docs/source-analysis.html。后续如果需要全文原文案,只展开“音频文案依据”,不要再恢复独立原文案大卡片。
+
+
2026-05-17 · 修复逐句时间轴假字幕
diff --git a/web/components/ad-recreation-board.tsx b/web/components/ad-recreation-board.tsx
index 30e4c08..b7fc457 100644
--- a/web/components/ad-recreation-board.tsx
+++ b/web/components/ad-recreation-board.tsx
@@ -2,7 +2,7 @@
import { type ReactNode, type RefObject, useEffect, useRef, useState } from "react"
import {
- AlertTriangle, Check, Circle, Film, FileText, Image as ImageIcon, Link2, Loader2,
+ AlertTriangle, Check, ChevronDown, Circle, Film, FileText, Image as ImageIcon, Link2, Loader2,
Mic, Package, PanelRight, Play, Plus, Scissors, Sparkles, Trash2, Upload, Wand2,
} from "lucide-react"
import { toast } from "sonner"
@@ -387,23 +387,20 @@ export function AdRecreationBoard({
-
-
-
+
+
+
} title="音频文案依据" />
-
-
-
+
+ {transcriptCount ? `${transcriptCount} 段` : "待解析"}
+
+
+
+
+
{audioPreview(job)}
- {(job?.audio_script?.speaker_profile || job?.audio_script?.rhythm_profile) && (
-
- {job.audio_script.speaker_profile &&
讲话人:{job.audio_script.speaker_profile}
}
- {job.audio_script.rhythm_profile &&
节奏:{job.audio_script.rhythm_profile}
}
- {job.audio_script.background_audio_profile &&
背景音:{job.audio_script.background_audio_profile}
}
-
- )}
-
+
@@ -548,8 +545,6 @@ function AudioIntakePanel({ job }: { job: Job | null }) {
}
const script = job.audio_script
- const original = script?.source_text?.trim() || job.transcript.map((item) => item.en).filter(Boolean).join(" ")
- const translated = script?.source_zh?.trim() || job.transcript.map((item) => item.zh).filter(Boolean).join(" ")
const profiles = [
{ label: "讲话人", value: script?.speaker_profile },
{ label: "节奏", value: script?.rhythm_profile },
@@ -559,29 +554,6 @@ function AudioIntakePanel({ job }: { job: Job | null }) {
return (
-
-
- } title="原文案提取" />
- 0} running={processing} />
-
-
-
-
-
-
-
-
-
- } title="声音与背景音分析" />
- {formatSeconds(job.duration)}
-
-
- {profiles.map((item) => (
-
- ))}
-
-
-
} title="逐句时间轴" />
@@ -608,17 +580,18 @@ function AudioIntakePanel({ job }: { job: Job | null }) {
)}
-
- )
-}
-function TextBlock({ title, value, empty }: { title: string; value?: string; empty: string }) {
- return (
-
-
{title}
-
- {value || {empty}}
-
+
+
+ } title="声音与背景音分析" />
+ {formatSeconds(job.duration)}
+
+
+ {profiles.map((item) => (
+
+ ))}
+
+
)
}