auto-save 2026-05-18 15:13 (~8)

This commit is contained in:
2026-05-18 15:13:30 +08:00
parent ebac2e86b5
commit 2a1aa4c994
8 changed files with 35 additions and 21 deletions

View File

@@ -1,7 +1,7 @@
# SKG TK 二创验证 — 当前状态2026-05-18
## 一句话
当前产品方向已收窄为“信息流广告快速复刻”TK 链接 / 上传视频后,先下载源视频,再并行跑音频文案路和视频视觉路;产品素材独立成池,自动识别视角并补缺角度;分镜工作台按逐句时间轴写新口播、人物/产品需求和首尾帧规划。当前暂停直接提交视频模型,先逐条生成并审核首帧 / 尾帧。
当前产品方向已收窄为“信息流广告快速复刻”TK 链接 / 上传视频后,先下载源视频,再并行跑音频文案路和视频视觉路;视频视觉路自动抽 6 张人物定向随机参考帧;产品素材独立成池,自动识别视角并补缺角度;分镜工作台按逐句时间轴写新口播、人物/产品需求和首尾帧规划。当前暂停直接提交视频模型,先逐条生成并审核首帧 / 尾帧。
## 路径 / 端口
- 当前工作树:`/Users/kangwan/Projects/business/20260512-20260512-skg-tk-二创验证-backend/`
@@ -34,7 +34,7 @@
|---|---|---|---|
| 1 | 输入 / 下载 | 已通 | TK 链接或上传视频创建 job下载完成后进入分析队列。 |
| 2 | 音频文案路 | 已通 | 拆 `audio.wav`ASR、翻译、讲话人 / 节奏 / 背景音分析;结果默认折叠展示。 |
| 3 | 视频视觉路 | 已通 | 自动或手动抽参考帧当前工作区按 9:16 原视频播放秒数补帧。 |
| 3 | 视频视觉路 | 已通 | 自动抽 6 张人物定向随机参考帧当前工作区按 9:16 原视频播放秒数手动补帧。 |
| 4 | 相似主体资产 | 已通 | 用关键帧和可选内置角色生成同一主体的 10 张白底视图。 |
| 5 | 产品资产池 | 已通 | 上传 / 内置产品图统一入池,自动识别视角、结构点、用途、风险,缺角度可补图。 |
| 6 | 分镜工作台 | 已通 | 按逐句时间轴编辑新口播、镜头类型、人物 / 产品开关、首帧 / 尾帧规划。 |
@@ -88,6 +88,7 @@ POST /jobs/{id}/frames/{idx}/storyboard/video
5. 语音只走 Azure OpenAI TTS不要新增或依赖 MiniMax 配音配置。
6. 当前主流程不直接批量提交视频;先走“分镜规划 → 首尾帧 → 人工审核”。
7. 产品素材池默认是“同一产品”,不做不同产品身份判断;视角识别必须按佩戴者左 / 右、上 / 下、内 / 外侧描述。
8. 自动抽帧默认是 `frames=6` + `target=random_subject` + `quality=accurate` + `mode=replace`;如果需要特定动作或表情,用“当前点抽帧”手动补。
8. 后端长任务不要用 `--reload`
9. 关键帧 `index` 是稳定 ID不等于数组下标前端取帧用 `frames.find(x => x.index === idx)`

View File

@@ -1,12 +1,5 @@
{
"entries": [
{
"files_changed": 1,
"hash": "0b97d03",
"message": "auto-save 2026-05-15 17:44 (~1)",
"ts": "2026-05-15T17:45:02+08:00",
"type": "commit"
},
{
"files_changed": 1,
"hash": "eeeaebd",
@@ -3257,6 +3250,13 @@
"message": "fix: force azure openai tts voice path",
"hash": "4d2a4a0",
"files_changed": 4
},
{
"ts": "2026-05-18T15:08:05+08:00",
"type": "commit",
"message": "auto-save 2026-05-18 15:07 (~5)",
"hash": "ebac2e8",
"files_changed": 5
}
]
}

View File

@@ -11,7 +11,7 @@
- 详见 `CLAUDE.md` 立项决策段 + `.memory/plan.md` 七步管线拆解
- 风格:`04-Dark-Gallery-Ambient`(路径:`~/Projects/research/20260305-网页风格库/04-Dark-Gallery-Ambient.md`
- 第一冲刺:步骤 1-4下载 / 拆轨 / 关键帧 / ASR+翻译)
- 当前产品方向2026-05-18 再确认):先解决信息流广告快速复刻的第一步,不再沿用“开始后线性完成抽帧、分镜、元素生成、合成”的旧做法。主界面为“左侧素材输入列 + 右侧信息流复刻工作表”。用户粘贴 TK 链接或上传视频后点击“开始分析”,系统自动下载源视频;下载完成后并行启动两条路:音频文案路提取原音频文案/字幕,并分析讲话人、语速节奏、背景音乐/环境声/音效;视频视觉路自动抽取参考帧,供人工选择可用主体并生成相似主体白底视图。产品图上传后独立形成产品资产包,自动识别视角/结构/比例并补缺角度。分镜工作台按逐句时间轴规划新口播、镜头类型、首帧/尾帧、人物需求和产品出现方式;当前暂停直接调视频模型,先逐条用“相似主体视图 + 产品素材池 + 首尾帧文字规划”生成并审核首帧/尾帧,保存规划后再决定哪些分镜进入单条视频候选。
- 当前产品方向2026-05-18 再确认):先解决信息流广告快速复刻的第一步,不再沿用“开始后线性完成抽帧、分镜、元素生成、合成”的旧做法。主界面为“左侧素材输入列 + 右侧信息流复刻工作表”。用户粘贴 TK 链接或上传视频后点击“开始分析”,系统自动下载源视频;下载完成后并行启动两条路:音频文案路提取原音频文案/字幕,并分析讲话人、语速节奏、背景音乐/环境声/音效;视频视觉路自动抽取 6 张人物定向随机参考帧,供人工选择可用主体并生成相似主体白底视图。产品图上传后独立形成产品资产包,自动识别视角/结构/比例并补缺角度。分镜工作台按逐句时间轴规划新口播、镜头类型、首帧/尾帧、人物需求和产品出现方式;当前暂停直接调视频模型,先逐条用“相似主体视图 + 产品素材池 + 首尾帧文字规划”生成并审核首帧/尾帧,保存规划后再决定哪些分镜进入单条视频候选。
## 部署事实
- 平台VPS `76.13.31.179`Ubuntu 24.04 / Docker Compose / Coolify Traefik

View File

@@ -77,7 +77,7 @@ VIDEO_DURATION_FIELD=seconds
VIDEO_POLL_TIMEOUT_SECONDS=900
# 工作目录
KEYFRAME_COUNT=12
KEYFRAME_COUNT=6
JOBS_DIR=./jobs
# CORS

View File

@@ -1696,7 +1696,7 @@ def pipeline_download(job_id: str) -> None:
def pipeline_analyze(
job_id: str,
frame_count: int = KEYFRAME_COUNT,
target: FrameExtractTarget = "transparent_human",
target: FrameExtractTarget = "random_subject",
mode: FrameExtractMode = "replace",
quality: FrameExtractQuality = "auto",
) -> None:
@@ -3145,7 +3145,7 @@ async def trigger_analyze(
job_id: str,
bg: BackgroundTasks,
frames: int = KEYFRAME_COUNT,
target: FrameExtractTarget = "transparent_human",
target: FrameExtractTarget = "random_subject",
mode: FrameExtractMode = "replace",
quality: FrameExtractQuality = "auto",
) -> Job:

View File

@@ -3,7 +3,7 @@
# Runtime
JOBS_DIR=/data/jobs
KEYFRAME_COUNT=12
KEYFRAME_COUNT=6
CORS_ORIGINS=https://marketing.skg.com
API_PORT=4291

File diff suppressed because one or more lines are too long

View File

@@ -692,7 +692,7 @@ export async function triggerTranscribe(id: string): Promise<Job> {
export async function analyzeJob(
id: string,
frames = 6,
target: FrameExtractTarget = "balanced",
target: FrameExtractTarget = "random_subject",
mode: FrameExtractMode = "replace",
quality: FrameExtractQuality = "auto",
): Promise<Job> {