feat(monitor): 抖音 Web 接口客户端 —— 绕开爬虫子进程,直接发 HTTP
移植自 mac-agent-os 的 mediacrawler_adapter:不起子进程、不开页面,用浏览器里那份
登录态直接调抖音 Web 接口。产物键名照抄 store/douyin,所以 ingest 那条链路一个字不用改。
**目前能用的(真环境实测,非推断)**:
profile/other : 200, 7075 字节 —— 博主主页指标(粉丝/获赞/作品数/昵称)
aweme/detail : 200, 45425 字节 —— 单条作品详情(含点赞/评论/收藏/分享)
**目前不能用的:作品列表 `aweme/post`。** 两个互相独立的原因:
1. 这个接口被抖音单独升级成了真校验:不带 x-tt-argus 回 403「Uifid Not Found」,
带上 dummy 值回 200 + **空 body**。也就是说「头在不在」骗得过,「真校验」过不了。
同一套头打 profile/other 和 aweme/detail 都是通的 —— 抖音是挑着接口加保护的,
挑中的恰好是「批量拉作品列表」这个最敏感的动作。
2. 改走页面截获也不行:CDP 浏览器打开博主主页会落到「验证码中间页」(当天大量探测的
代价,过几小时要重测)。
所以现在的边界是:**已知作品的指标刷新能做,自动发现新作品做不了**。
**排查中控住变量后得到的两条事实**(都写进注释了):
· `Accept` / `Accept-Language` / `Referer` 才是主页接口能返回真数据的原因 —— 只有
UA+client hints+Cookie 时是 200 但仅 121 字节的空壳,补上这三个头变 7074 字节。
(我先前猜的 sec-ch-ua 不是关键。)
· 因此 UA 与 client hints 必须**成套地取自同一个浏览器**,所以 BrowserIdentity 一次
从 CDP 取齐 cookie + UA + hints,而不是各自写死。
「200 + 空 body 必须当场报错」也是刻意写死的:放过去它会在下游变成「这个博主没作品」,
把一次失败伪装成一条正常结果 —— 爬虫那条路正是这么栽的,还被翻译成「账号被封」。
测试 +11:cookie 解析、请求头成套性(含 uifid 缺失/回退)、产物键名与 store 对齐、
以及 _get 的三条失败路径(空 body / 403 带网关原话 / 正常返回)。
This commit is contained in:
@@ -0,0 +1,480 @@
|
||||
# AVE 视频工厂 — 全链路架构规划 v1.0
|
||||
|
||||
> 日期: 2026-05-18 | 版本: 1.0
|
||||
> 定位: 梳理所有生产路径 + 底层能力原子化 + 自审可行性
|
||||
|
||||
---
|
||||
|
||||
## 目录
|
||||
|
||||
1. [核心洞察](#1-核心洞察)
|
||||
2. [AVE 六条生产路径总览](#2-ave-六条生产路径总览)
|
||||
3. [底层能力层(原子化)](#3-底层能力层原子化)
|
||||
4. [各生产路径的完整链路](#4-各生产路径的完整链路)
|
||||
5. [新增:模仿视频线(Action Transfer)](#5-新增模仿视频线action-transfer)
|
||||
6. [交叉能力矩阵](#6-交叉能力矩阵)
|
||||
7. [优先级与落地路线图](#7-优先级与落地路线图)
|
||||
8. [自审与可行性分析](#8-自审与可行性分析)
|
||||
9. [具体落地建议](#9-具体落地建议)
|
||||
|
||||
---
|
||||
|
||||
## 1. 核心洞察
|
||||
|
||||
### 1.1 用户提到的三条线本质是同一逻辑
|
||||
|
||||
| 用户说的 | 本质 | 核心操作 |
|
||||
|:---------|:-----|:---------|
|
||||
| 卡点视频 | 音频节拍 → 视觉同步切换 | BPM分析 + 拍点对齐 + 素材切换 |
|
||||
| 模仿视频 | 参考视频 → 提取节奏/动作 → 复用结构 | 参考视频分析 + 动作迁移 + 结构复用 |
|
||||
| 主人公更换 | 已有视频 → 替换角色 → 保持动作/场景 | 角色识别 + 角色替换 + 动作保持 |
|
||||
|
||||
**三者共享同一条底层流水线**: `参考源分析 → 结构提取 → 角色/素材替换 → 重新合成`
|
||||
|
||||
### 1.2 AVE 当前状态
|
||||
|
||||
已实现 5 条独立生产路径,但存在三个结构性问题:
|
||||
|
||||
| 问题 | 后果 |
|
||||
|:----|:-----|
|
||||
| 各策略独立实现,底层能力重复 | 口播的素材搜索和卡点的素材搜索各写一遍 |
|
||||
| 角色系统只在"故事"策略中使用 | 口播、卡点、数字人都需要角色但没接入 |
|
||||
| AudioLine 刚刚建成但未接入主流程 | 音频处理能力独立于视频工厂 |
|
||||
|
||||
### 1.3 解决思路
|
||||
|
||||
**分层架构**: 底层能力层(原子操作) → 策略编排层(生产路径) → 接入层(CLI/Dashboard)
|
||||
|
||||
---
|
||||
|
||||
## 2. AVE 六条生产路径总览
|
||||
|
||||
```
|
||||
AVE 视频工厂
|
||||
│
|
||||
├─ 1. 口播线 文案→TTS→素材→BGM→字幕→合成
|
||||
├─ 2. 卡点线 BGM→节拍检测→素材→拍点切换→xfade
|
||||
├─ 3. 数字人线 照片/视频→OmniHuman对口型/DreamActor动作模仿
|
||||
├─ 4. 口播+卡点线 人声锚点+BGM变速→帧锁定拼接 (hybrid)
|
||||
├─ 5. 故事/漫剧线 剧本→场景分解→Kling批量→角色拼接
|
||||
├─ 6. 模仿视频线 ★ 参考视频→结构分析→动作迁移/角色替换→合成
|
||||
│
|
||||
└─ 7. 音频制造线 (独立)
|
||||
├─ 原创 AudioLine Layer3 创作模块
|
||||
├─ 二创 分层改编 (节奏/歌词/旋律/混音)
|
||||
├─ 卡点改编 节拍重塑 + BPM对齐
|
||||
└─ → 接入上述 1-6 条线输出成品
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 3. 底层能力层(原子化)
|
||||
|
||||
> 所有生产路径共享的原子能力。每个能力可独立测试、独立优化、被多种策略调用。
|
||||
|
||||
### 3.1 音频原子能力 ← AudioLine
|
||||
|
||||
| 原子能力 | 输入 | 输出 | 被哪些路径使用 |
|
||||
|:---------|:-----|:-----|:-------------|
|
||||
| A1. 音轨分离 | 音频文件 | {vocals, drums, bass, other} 分轨 | 2-卡点, 4-hybrid, 6-模仿, 7-音频 |
|
||||
| A2. BPM/节拍检测 | 音频文件 | BPM + 节拍时间戳 + 重拍 | 2-卡点, 4-hybrid, 6-模仿 |
|
||||
| A3. 歌曲结构解析 | 音频文件 | [{label, start, end}] 段落 | 6-模仿, 7-二创 |
|
||||
| A4. 情绪分析 | 音频文件 | mood + energy + danceability | 1-口播(BGM选曲), 5-故事(风格匹配) |
|
||||
| A5. 节奏生成 | BPM+风格参数 | 鼓点/节奏音频 | 2-卡点, 7-原创 |
|
||||
| A6. 歌词创作 | 原歌词 + 主题 | 改写歌词 | 7-二创 |
|
||||
| A7. 旋律改编 | 音频 + 风格 | 改编旋律 | 7-二创 |
|
||||
| A8. 混音母带 | 多轨音频 | 混合主轨 + 响度归一 | 1-口播, 2-卡点, 7-原创/二创 |
|
||||
| A9. 分轨时间对齐 | 分轨 + 目标BPM | 对齐后分轨 | 2-卡点, 6-模仿 |
|
||||
| A10. 歌词-节拍对齐 | 歌词 + 节拍 | 时间轴 + LRC/SRT | 1-口播, 2-卡点 |
|
||||
| A11. 多格式导出 | 音频 + 格式 | WAV/MP3/FLAC/AAC | 全部 |
|
||||
|
||||
### 3.2 视觉原子能力
|
||||
|
||||
| 原子能力 | 输入 | 输出 | 被哪些路径使用 |
|
||||
|:---------|:-----|:-----|:-------------|
|
||||
| V1. 素材搜索 | 关键词 + 数量 | 视频素材列表(URL/本地) | 1-口播, 2-卡点, 4-hybrid |
|
||||
| V2. Ken Burns 效果 | 静态图片 | 缓慢缩放/平移视频 | 1-口播, 5-故事 |
|
||||
| V3. 节拍视觉对齐 | 素材 + 节拍 | 按拍点切割/过渡的视频段 | 2-卡点, 4-hybrid, 6-模仿 |
|
||||
| V4. 变速卡点 | 素材 + 节拍能量 | 高潮加速/低谷减速 | 4-hybrid |
|
||||
| V5. 视频拼接 | 视频片段列表 | 完整视频 (xfade/crossfade) | 全部 |
|
||||
| V6. 字幕叠加 | 时间轴 + 文本 | ASS字幕文件 + 视频叠加 | 1-口播, 2-卡点, 5-故事 |
|
||||
| V7. 定妆照生成 | 角色描述 | 角色多角度参考图 (Grid Method) | 5-故事, 6-模仿 ★ |
|
||||
| V8. 图生视频 | 图片 + Prompt | 短视频片段 (Kling) | 5-故事, 6-模仿 ★ |
|
||||
| V9. 首尾帧过渡 | 首帧 + 尾帧 + Prompt | 平滑过渡视频 | 5-故事 |
|
||||
| V10. 语音驱动视频 | 图片 + 音频 | 对口型视频 (LipSync) | 1-口播, 3-数字人 |
|
||||
|
||||
### 3.3 动作迁移原子能力 ★ 新增
|
||||
|
||||
> 源自 Doubao 对话的 Animate 模型思路,也可使用现有 DreamActor
|
||||
|
||||
| 原子能力 | 输入 | 输出 | 被哪些路径使用 |
|
||||
|:---------|:-----|:-----|:-------------|
|
||||
| M1. 参考视频结构分析 | 视频文件 | 分段结构 + 镜头节奏 + 动作时间轴 | 6-模仿 |
|
||||
| M2. 角色识别/分离 | 视频 + 角色标识 | 角色掩码/区域 | 6-模仿 |
|
||||
| M3. 动作迁移 (2D/3D) | 参考视频 + 目标角色 | 目标角色复刻动作的视频 | 3-数字人(DreamActor), 6-模仿 |
|
||||
| M4. 动作骨架提取 | 视频 | 2D/3D 骨骼关键帧序列 | 6-模仿 |
|
||||
| M5. 背景替换/保留 | 视频 + 掩码 | 去除/保留背景后的视频 | 6-模仿 |
|
||||
| M6. 视频结构模板化 | 视频 → 分镜模板 | 可复用的 {时间轴 + 切换点 + 动作标记} | 6-模仿 |
|
||||
|
||||
### 3.4 角色原子能力(跨线复用)
|
||||
|
||||
| 原子能力 | 输入 | 输出 | 被哪些路径使用 |
|
||||
|:---------|:-----|:-----|:-------------|
|
||||
| C1. 角色注册 | 角色描述 → registry | 角色 ID + 属性 + 参考图 | 全部 |
|
||||
| C2. 角色锁定 | 剧本 + 角色 ID | 注入角色描述块 | 5-故事, 6-模仿 |
|
||||
| C3. 角色一致性保持 | 角色参考图 + 场景 | 固定 seed + 定妆照 → 多场景生成 | 5-故事, 6-模仿 |
|
||||
| C4. 角色替换 | 原视频 + 新角色 | 新角色 + 保留原动作/表情 | 6-模仿 |
|
||||
|
||||
### 3.5 通用基础能力
|
||||
|
||||
| 原子能力 | 说明 |
|
||||
|:---------|:-----|
|
||||
| G1. 配置加载 | config.yaml + local.yaml 合并 |
|
||||
| G2. 成本追踪 | 每步操作计费 + API 调用计数 |
|
||||
| G3. 进度报告 | 状态机 + Dashboard 埋点 |
|
||||
| G4. 缓存管理 | 素材/模型/results 缓存 |
|
||||
| G5. 错误容错 | 模块失败不阻塞整条链路 |
|
||||
|
||||
---
|
||||
|
||||
## 4. 各生产路径的完整链路
|
||||
|
||||
> 用 `[A1]` 标记引用底层原子能力;`[★]` 标记待完善/新增
|
||||
|
||||
### 4.1 口播线 (Oral)
|
||||
|
||||
```
|
||||
当前: 文案 → [TTS] → [素材搜索] → [BGM] → [字幕] → [合成]
|
||||
↓
|
||||
优化后: 文案 → [TTS] → [素材搜索+V2 Ken Burns] → [AudioLine A4情绪分析选BGM]
|
||||
→ [混音A8 人声+BGM] → [A10歌词对齐→字幕] → [V10 LipSync] → [合成]
|
||||
```
|
||||
|
||||
**待完善**:
|
||||
- [ ] 接入 AudioLine A4 情绪分析 → 自动匹配 BGM 风格
|
||||
- [ ] 接入 AudioLine A8 混音 → 专业级人声+BGM 电平平衡
|
||||
- [ ] V2 Ken Burns 效果 (已有 Pexels 素材多是静态风格需要)
|
||||
|
||||
### 4.2 卡点线 (Beat)
|
||||
|
||||
```
|
||||
当前: BGM → [节拍检测] → [素材搜索] → [拍点切换] → [xfade]
|
||||
↓
|
||||
优化后: BGM → [AudioLine A2节拍检测] → [A5节奏生成(替换/增强鼓点)]
|
||||
→ [V3节拍视觉对齐] → [V4变速卡点]
|
||||
→ [A9分轨对齐(对齐到目标BPM)] → [合成]
|
||||
```
|
||||
|
||||
**待完善**:
|
||||
- [ ] 接入 AudioLine A5 节奏生成 → 在原BGM上叠加鼓点增强
|
||||
- [ ] 接入 AudioLine A9 分轨对齐 → BPM 变更时各轨统一伸缩
|
||||
- [ ] V3 节拍视觉对齐优化 → 当前只是简单切,需要更精确的拍点类型映射
|
||||
|
||||
### 4.3 数字人线 (Digital Human)
|
||||
|
||||
```
|
||||
当前: 照片/视频 → [OmniHuman 对口型] / [DreamActor 动作模仿]
|
||||
↓
|
||||
优化后: 角色[C1注册] → 生成[C7定妆照] → [TTS] → [V10 LipSync]
|
||||
→ 可选 [M3动作迁移] → [合成+背景]
|
||||
```
|
||||
|
||||
**待完善**:
|
||||
- [ ] 接入 C1 角色注册 → 数字人可被角色库管理
|
||||
- [ ] 接入 Asset Manager → 素材复用
|
||||
- [ ] DreamActor 轮询等待优化 → 当前 60 次循环硬编码
|
||||
|
||||
### 4.4 口播+卡点线 (Hybrid)
|
||||
|
||||
```
|
||||
当前: 人声 + BGM → [变速卡点] → [帧锁定拼接]
|
||||
↓
|
||||
优化后: 人声 → [A1音轨分离] → 人声轨道锚点分析
|
||||
+ BGM → [A2节拍检测] → BGM能量曲线
|
||||
→ [V4变速卡点(人声锚点+BGM能量双驱动)]
|
||||
→ [A8混音(人声+BGM电平平衡)]
|
||||
→ [V3节拍对齐素材] → [合成]
|
||||
```
|
||||
|
||||
**待完善**:
|
||||
- [ ] 双驱动变速逻辑完善 (人声锚点优先级 > BGM 能量)
|
||||
- [ ] 接入 AudioLine A8 混音
|
||||
- [ ] 当前 `compose_hybrid` 需要和 beat_sync 统一底层
|
||||
|
||||
### 4.5 故事/漫剧线 (Story)
|
||||
|
||||
```
|
||||
当前: 剧本 → [场景分解] → [桥接] → [Kling批量生成] → [角色拼接]
|
||||
↓
|
||||
优化后: 剧本 → [C2角色锁定] → [C7定妆照生成]
|
||||
→ [场景分解(Multi-agent)] → [C3角色一致性保持]
|
||||
→ [V8图生视频 + V9首尾帧过渡]
|
||||
→ [AudioLine A6歌词创作 + A10对齐] # 如有旁白/主题曲
|
||||
→ [V6字幕叠加] → [合成]
|
||||
```
|
||||
|
||||
**待完善**:
|
||||
- [ ] 角色锁定已实现 (character_locker.py) 但需要和 AudioLine 歌词输出配合
|
||||
- [ ] 定妆照 → 多场景的角色一致性已部分实现,需扩展到模仿视频线
|
||||
|
||||
### 5. 新增:模仿视频线 (Action Transfer)
|
||||
|
||||
> 这是本方案的核心新增。整合了"卡点模仿" + "主人公更换"两个场景。
|
||||
|
||||
```
|
||||
[参考视频] → Layer1 分析层 → Layer2 动作迁移 → Layer3 替换合成
|
||||
```
|
||||
|
||||
#### 5.1 完整链路
|
||||
|
||||
```
|
||||
输入: 参考视频 + (可选: 目标BGM / 目标角色 / 目标风格)
|
||||
|
||||
Step 1 — 参考视频分析 (M1 + A2 + A3)
|
||||
├─ 视频结构分解: 镜头边界检测 → 分段标记
|
||||
├─ 音频分析: [A2 BPM检测] + [A3结构解析] + [A4情绪分析]
|
||||
├─ 视觉分析: [M4骨架提取] → 动作关键帧序列
|
||||
└─ 节奏模板: 镜头切换时间轴 + 动作标记 + 节拍映射
|
||||
|
||||
Step 2 — 素材/角色准备
|
||||
├─ 使用原视频素材 → 只替换角色 [M5背景保留 + C4角色替换]
|
||||
├─ 使用新素材 → [V1素材搜索] + [V3节拍对齐]
|
||||
└─ 使用原音频 → [A9分轨对齐到目标BPM]
|
||||
|
||||
Step 3 — 动作迁移 (M3)
|
||||
├─ 路径A: DreamActor (火山引擎) → 高质量真人动作迁移
|
||||
├─ 路径B: Animate模型 (ComfyUI+阿里) → 2D卡通动作迁移
|
||||
└─ 路径C: Pose2Pose (轻量开源) → 简单动作映射
|
||||
|
||||
Step 4 — 合成输出
|
||||
├─ 角色一致性保持 [C3]
|
||||
├─ 替换音频: [A8混音] 新BGM/语音 + 原视频动作节奏
|
||||
├─ [V5视频拼接] + [V6字幕叠加]
|
||||
└─ [G3进度报告 + G2成本追踪]
|
||||
```
|
||||
|
||||
#### 5.2 三个子场景映射
|
||||
|
||||
| 用户场景 | Step1 输入 | Step2 替换 | Step3 迁移方式 | Step4 输出 |
|
||||
|:---------|:-----------|:-----------|:---------------|:-----------|
|
||||
| **卡点模仿** | 参考视频 | 换BGM + 换素材 | 保留原动作节奏 | 新BGM+新素材的卡点视频 |
|
||||
| **主人公更换** | 有角色视频 | 换角色 + 保留动作 | DreamActor/Animate | 同场景新角色 |
|
||||
| **风格重制** | 参考视频 | 换BGM + 换角色 + 换风格 | 全链路 | 全新风格视频 |
|
||||
|
||||
#### 5.3 与现有能力的复用关系
|
||||
|
||||
```
|
||||
模仿视频线 ← 已有 → 复用成熟度
|
||||
├─ A2 BPM检测 → AudioLine ✅ 已实现
|
||||
├─ A3结构解析 → AudioLine ✅ 已实现
|
||||
├─ A9分轨对齐 → AudioLine ✅ 已实现
|
||||
├─ A8混音 → AudioLine ✅ 已实现
|
||||
├─ V1素材搜索 → pexels/search ✅ 已实现
|
||||
├─ V3节拍视觉对齐 → beat_sync.py ✅ 已实现
|
||||
├─ V5视频拼接 → ffmpeg.py ✅ 已实现
|
||||
├─ V6字幕叠加 → ffmpeg.py ✅ 已实现
|
||||
├─ C3角色一致性 → character_registry ✅ 部分实现
|
||||
├─ M3动作迁移 → DreamActor ✅ 已有(DreamActor)
|
||||
│ → Animate模型 ⚠️ 需接入(ComfyUI)
|
||||
├─ M1参考视频分析 → ❌ 需新建
|
||||
├─ M4骨架提取 → ❌ 需新建 (或集成 OpenPose)
|
||||
├─ M5背景替换 → ❌ 需新建
|
||||
└─ C4角色替换 → ❌ 需新建 (组合 M3 + M5 + C3)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 6. 交叉能力矩阵
|
||||
|
||||
> 每个 ⬜ = 可用,⬛ = 核心依赖,↔ = 可选接入
|
||||
|
||||
| 原子能力 | 口播 | 卡点 | 数字人 | Hybrid | 故事 | 模仿 | 音频制造 |
|
||||
|:---------|:----:|:----:|:------:|:------:|:----:|:----:|:--------:|
|
||||
| **音频原子 (A1-A11)** | | | | | | | |
|
||||
| A1 音轨分离 | ↔ | ⬛ | | ⬛ | | ⬛ | ⬛ |
|
||||
| A2 BPM检测 | | ⬛ | | ⬛ | | ⬛ | ⬛ |
|
||||
| A3 结构解析 | | ↔ | | | | ⬛ | ⬛ |
|
||||
| A4 情绪分析 | ⬛ | ↔ | | ↔ | ⬛ | ⬛ | ⬛ |
|
||||
| A5 节奏生成 | | ⬛ | | ↔ | | ↔ | ⬛ |
|
||||
| A6 歌词创作 | ↔ | | | | ⬛ | | ⬛ |
|
||||
| A7 旋律改编 | | | | | | | ⬛ |
|
||||
| A8 混音母带 | ⬛ | ⬛ | ↔ | ⬛ | | ↔ | ⬛ |
|
||||
| A9 分轨对齐 | | ⬛ | | ↔ | | ⬛ | ⬛ |
|
||||
| A10 歌词对齐 | ⬛ | ↔ | | | ⬛ | | ↔ |
|
||||
| A11 多格式导出 | ↔ | ↔ | ↔ | ↔ | ↔ | ↔ | ⬛ |
|
||||
| **视觉原子 (V1-V10)** | | | | | | | |
|
||||
| V1 素材搜索 | ⬛ | ⬛ | | ⬛ | ↔ | ⬛ | |
|
||||
| V2 Ken Burns | ⬛ | | | | ⬛ | | |
|
||||
| V3 节拍对齐 | | ⬛ | | ⬛ | | ⬛ | |
|
||||
| V4 变速卡点 | | ⬛ | | ⬛ | | ↔ | |
|
||||
| V5 视频拼接 | ⬛ | ⬛ | ⬛ | ⬛ | ⬛ | ⬛ | |
|
||||
| V6 字幕叠加 | ⬛ | ↔ | | ↔ | ⬛ | ↔ | |
|
||||
| V7 定妆照 | | | ↔ | | ⬛ | ⬛ | |
|
||||
| V8 图生视频 | | | | | ⬛ | ↔ | |
|
||||
| V9 首尾帧 | | | | | ⬛ | | |
|
||||
| V10 LipSync | ⬛ | | ⬛ | ↔ | ⬛ | ↔ | |
|
||||
| **动作原子 (M1-M6) ★** | | | | | | | |
|
||||
| M1 视频结构分析 | | | | | | ⬛ | |
|
||||
| M2 角色识别 | | | ↔ | | | ⬛ | |
|
||||
| M3 动作迁移 | | | ⬛ | | | ⬛ | |
|
||||
| M4 骨架提取 | | | | | | ⬛ | |
|
||||
| M5 背景替换 | | | | | | ⬛ | |
|
||||
| M6 模板化 | | | | | | ⬛ | |
|
||||
| **角色原子 (C1-C4)** | | | | | | | |
|
||||
| C1 角色注册 | ↔ | | ⬛ | | ⬛ | ⬛ | |
|
||||
| C2 角色锁定 | | | | | ⬛ | ⬛ | |
|
||||
| C3 一致性保持 | | | | | ⬛ | ⬛ | |
|
||||
| C4 角色替换 | | | | | | ⬛ | |
|
||||
|
||||
---
|
||||
|
||||
## 7. 优先级与落地路线图
|
||||
|
||||
### Phase 1: 接入现有能力 (1-2天) ← 立即开始
|
||||
|
||||
| # | 任务 | 工作量 | 价值 |
|
||||
|:-:|:-----|:------:|:----:|
|
||||
| 1 | AudioLine 接入 AVE 主流程 (video_factory.py 调 AudioLine.run) | 2h | ⭐⭐⭐ |
|
||||
| 2 | 口播线接入 AudioLine A4 情绪分析 → 自动选BGM | 1h | ⭐⭐ |
|
||||
| 3 | 卡点线接入 AudioLine A9 分轨对齐 → 支持BPM变化 | 1h | ⭐⭐⭐ |
|
||||
| 4 | 口播线接入 AudioLine A8 混音替代简单叠加 | 1h | ⭐⭐ |
|
||||
| 5 | 角色注册接入数字人线 | 1h | ⭐ |
|
||||
|
||||
### Phase 2: 模仿视频线 MVP (3-5天)
|
||||
|
||||
| # | 任务 | 工作量 | 依赖 |
|
||||
|:-:|:-----|:------:|:----:|
|
||||
| 6 | M1 参考视频结构分析 (ffmpeg 场景检测 + A2节拍) | 4h | A2, V5 |
|
||||
| 7 | M4 骨架提取集成 (OpenPose 轻量版) | 6h | - |
|
||||
| 8 | M3 动作迁移路径C (Pose2Pose 轻量) | 4h | M4 |
|
||||
| 9 | 模仿视频线编排器 (复用 orchestrator 模式) | 4h | M1, M3, A2 |
|
||||
| 10 | CLI 接入: `video-factory --strategy 模仿` | 2h | #9 |
|
||||
|
||||
### Phase 3: 角色替换 + 高级动作迁移 (5-7天)
|
||||
|
||||
| # | 任务 | 工作量 | 依赖 |
|
||||
|:-:|:-----|:------:|:----:|
|
||||
| 11 | M5 背景替换 (RMBG/rembg) | 3h | - |
|
||||
| 12 | C4 角色替换组合 (M3+M5+C3) | 4h | M3, M5 |
|
||||
| 13 | M6 视频结构模板化 (保存/加载模板) | 3h | M1 |
|
||||
| 14 | M3 路径A DreamActor 优化 (异步轮询改为 Webhook) | 2h | M3 |
|
||||
| 15 | M3 路径B Animate 模型 ComfyUI 接入 | 8h | - |
|
||||
|
||||
### Phase 4: 优化 + 自动化 (持续)
|
||||
|
||||
| # | 任务 | 说明 |
|
||||
|:-:|:-----|:------|
|
||||
| 16 | 原子操作 CLI 化 → 每个原子能力可独立调用 | |
|
||||
| 17 | Dashboard 接入模仿线 + 动作线数据 | |
|
||||
| 18 | 素材缓存 + 结果缓存 (避免重复 API 调用) | |
|
||||
| 19 | 批量处理模式 (一次性处理多个参考视频) | |
|
||||
|
||||
---
|
||||
|
||||
## 8. 自审与可行性分析
|
||||
|
||||
### 8.1 架构合理性审查
|
||||
|
||||
| 审查维度 | 评分 | 说明 |
|
||||
|:---------|:----:|:-----|
|
||||
| 模块内聚性 | ⭐⭐⭐⭐ | 每条生产路径独立,底层能力原子化 |
|
||||
| 耦合度控制 | ⭐⭐⭐⭐ | 上层通过 orchestrator 调用下层,不跨层调用 |
|
||||
| 可扩展性 | ⭐⭐⭐⭐⭐ | 新增生产路径 = 新编排器 + 复用底层原子 |
|
||||
| 测试可行性 | ⭐⭐⭐ | 原子能力可单独测试,但端到端链路依赖API |
|
||||
| 容错能力 | ⭐⭐⭐ | 模块级容错已实现,但动作迁移线无回退方案 |
|
||||
|
||||
### 8.2 具体落地问题
|
||||
|
||||
#### 问题1: DreamActor 视频轮询耗时太长
|
||||
- **现状**: 60×10s = 10 分钟轮询,阻塞整条链路
|
||||
- **建议**: 改为异步任务,提交流程后立即返回 task_id,后台 Dashboard 显示进度
|
||||
|
||||
#### 问题2: Animate 模型依赖 ComfyUI
|
||||
- **现状**: ComfyUI 非本地部署,需额外启动
|
||||
- **建议**: Phase 2 先用 DreamActor 跑通 MVP,ComfyUI 接入作为 Phase 3 优化项
|
||||
|
||||
#### 问题3: 骨架提取 (M4) 精度
|
||||
- **现状**: OpenPose 需要 GPU,轻量版(MediaPipe Pose)精度有限
|
||||
- **建议**:
|
||||
- 路径A: 用 MediaPipe (免费,精准度70%)
|
||||
- 路径B: 用阿里 Animate 内置骨骼提取 (精准度90%,需 ComfyUI)
|
||||
- 路径C: 跳过骨架提取,直接用原始视频做帧匹配 (最简单)
|
||||
|
||||
#### 问题4: AudioLine 依赖 oMLX + Suno + Mubert
|
||||
- **现状**: oMLX 需手动启动,Suno/Mubert 需 API key
|
||||
- **建议**:
|
||||
- 无 API key 时模块自动回退到本地方案 (已实现)
|
||||
- oMLX 启动自动化加入 launchd 或 Start Server 脚本
|
||||
|
||||
#### 问题5: 角色替换的"合理性"问题
|
||||
- **现状**: 替换角色后,原视频中的人脸/手部动作可能与新角色不匹配
|
||||
- **建议**:
|
||||
- 2D 卡通角色替换比真人替换更容易获得合理结果
|
||||
- 真人替换建议用 DreamActor(原生支持面部替换)
|
||||
- 首次测试建议用卡通角色 + 卡点场景,不要一步上真人
|
||||
|
||||
### 8.3 是否有更优解?
|
||||
|
||||
| 现有方案 | 更优解 | 评估 |
|
||||
|:---------|:-------|:-----|
|
||||
| 每条线独立编排器 | **统一编排器 + 插件模式** | 更优但重构成本高,建议 Phase 4 |
|
||||
| DreamActor 轮询 | **Webhook 回调** | 更优,但需服务端支持,暂不可行 |
|
||||
| OpenPose 本地骨架 | **阿里 Animate 内置骨骼** | 更优,但需接入 ComfyUI |
|
||||
| 手动 API Key 配置 | **环境变量 + .env 文件** | 更优,建议 Phase 1 顺便完成 |
|
||||
| stand-alone AudioLine | **AudioLine as AVE plugin** | 已在设计范围内 |
|
||||
|
||||
### 8.4 风险矩阵
|
||||
|
||||
| 风险 | 概率 | 影响 | 缓解措施 |
|
||||
|:----|:----:|:----:|:---------|
|
||||
| API 限频/涨价 | 中 | 高 | 本地回退 + 成本预警 |
|
||||
| 动作迁移质量不达标 | 中 | 高 | Phase 2 MVP 先用简单场景验证 |
|
||||
| ComfyUI 部署复杂 | 高 | 中 | 先用 DreamActor,ComfyUI 后接 |
|
||||
| 角色替换效果假 | 中 | 中 | 用卡通角色测试,真人暂缓 |
|
||||
| AudioLine 依赖未启动 | 低 | 中 | oMLX 自动启动 + 模块自检告警 |
|
||||
|
||||
---
|
||||
|
||||
## 9. 具体落地建议
|
||||
|
||||
### 9.1 立即执行 (今天/明天)
|
||||
|
||||
```bash
|
||||
# Step 1: AudioLine 接入 AVE 主流程
|
||||
# 在 video_factory.py 中新增:
|
||||
# from audio_line import AudioLine
|
||||
# al = AudioLine()
|
||||
#
|
||||
# # 口播线: 用 AudioLine 情绪分析选BGM
|
||||
# emotion = al.emotion_analyzer.analyze(voice_path)
|
||||
# bgm_style = emotion_to_bgm(emotion.mood)
|
||||
#
|
||||
# # 卡点线: 用 AudioLine BPM分析 + 分轨对齐
|
||||
# beat = al.beat_detector.detect(bgm_path)
|
||||
# aligned_stems = al.stem_aligner.align_to_bpm(...)
|
||||
```
|
||||
|
||||
### 9.2 本周内
|
||||
|
||||
```
|
||||
1. 模仿视频线 MVP:
|
||||
- 输入: 参考视频
|
||||
- 输出: 提取的结构模板 + 骨架序列
|
||||
- 不生成最终视频,只验证分析层
|
||||
|
||||
2. 角色系统统一:
|
||||
- 数字人注册到 CharacterRegistry
|
||||
- 口播脚本支持引用角色
|
||||
```
|
||||
|
||||
### 9.3 需要注意的坑
|
||||
|
||||
1. **不要一步到位**:先跑通 MVP 再迭代优化
|
||||
2. **每个原子能力先单测再集成**:特别是 M1-M6 动作迁移线
|
||||
3. **AudioLine 已经写好,但 demo/ 里还没跑的端到端测试**:先跑通一个卡点场景的端到端
|
||||
4. **模仿视频线的骨架提取不要依赖 GPU**:用 MediaPipe 或完全跳过骨架,直接用帧匹配
|
||||
|
||||
---
|
||||
|
||||
> 本方案已包含自审环节 (Section 8),所有建议均有明确的落地路径。
|
||||
> 下一步建议: 确认方案方向 → Phase 1 将 AudioLine 接入 AVE → Phase 2 开始模仿视频线 MVP
|
||||
Reference in New Issue
Block a user