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,351 @@
|
||||
# AVE v3 全链路架构规划书
|
||||
|
||||
> 版本: v3.0-draft | 最后更新: 2026-05-15
|
||||
> 基于全域调研(Kling API / HoloCine / BeatSync-Engine / LatentSync / Lights-Camera-Consistency)
|
||||
|
||||
---
|
||||
|
||||
## 一、现状总览
|
||||
|
||||
### 1.1 已实现能力 ✅
|
||||
|
||||
| 模块 | 功能 | 依赖 |
|
||||
|:----|:----|:----:|
|
||||
| **口播策略** | 文案→TTS→素材搜索→混音→字幕→合成 | CosyVoice + Pexels + FFmpeg |
|
||||
| **卡点策略** | BGM→librosa节拍检测→素材→拍点切换→xfade | librosa + FFmpeg |
|
||||
| **数字人策略** | 图片+音频→Wan2.2 OmniHuman 对口型/M1动作模仿 | 火山引擎 DreamActor |
|
||||
| **Kling API 视频生成** | 文生视频/图生视频 (kling-v3) | 百炼 DashScope / Kling JWT |
|
||||
| **剧本解析** | 文案→LLM分镜→YAML脚本 | LLM (模板/在线) |
|
||||
| **锚点切换** | 静音检测驱动画面切换 | librosa |
|
||||
| **BGM 避让** | 说话时压低BGM / 间隙恢复 | 字级时间戳驱动 |
|
||||
| **字幕生成** | ASS字幕 (字级精确时间戳) | CosyVoice 时间戳 |
|
||||
| **长视频分段** | >180s 自动分段 + concat | FFmpeg |
|
||||
|
||||
### 1.2 待增强能力 🔧
|
||||
|
||||
| 模块 | 现状 | 目标 |
|
||||
|:----|:----|:-----|
|
||||
| **变速卡点** | 仅固定速度 xfade 切换 | setpts + atempo 动态速度曲线 |
|
||||
| **Kling LipSync** | 无集成 | 对接 fal.ai Kling LipSync API |
|
||||
| **角色一致性** | 仅手动 prompt 工程 | 定妆照→参考图→批量生成的自动化管线 |
|
||||
| **节拍检测** | 单层 beat_track | BeatSync-Engine 6阶段架构 (能量/结构/剪切策略) |
|
||||
| **素材复用** | 无缓存系统 | 索引+缓存+标签体系 |
|
||||
|
||||
### 1.3 调研中能力 🔍
|
||||
|
||||
| 模块 | 来源 | 预计投入 |
|
||||
|:----|:----|:--------:|
|
||||
| **角色叙事策略** | HoloCine + Lights-Camera-Consistency | 2-3天 |
|
||||
| **本地 Lip-Sync** | LatentSync v1.5 (字节跳动) | 0.5天部署 |
|
||||
| **多场景批量生成** | Kling Image O1 多图融合 | 0.5天 |
|
||||
| **数字资产索引** | 本地素材库 + 生成历史 | 1天 |
|
||||
|
||||
---
|
||||
|
||||
## 二、四策略管线详解
|
||||
|
||||
### 策略 A:口播(主路径,已成熟)
|
||||
|
||||
```
|
||||
输入: 文案(.txt/.yaml)
|
||||
流程:
|
||||
文案 → [剧本解析] → YAML分镜脚本
|
||||
→ [TTS: CosyVoice] → 带字级时间戳的人声 WAV
|
||||
→ [素材搜索: Pexels] → 每段 2 个视频素材
|
||||
→ [混音] → 人声 + BGM (可选避让)
|
||||
→ [字幕: ASS] → 字级精确时间戳
|
||||
→ [合成: FFmpeg] → 1080×1920 竖版视频
|
||||
输出: final.mp4
|
||||
```
|
||||
|
||||
**可直接执行的命令**: `python main.py video-factory --strategy 口播 --script script.yaml`
|
||||
|
||||
**增强方向**:
|
||||
- 🔧 Kling LipSync 后处理: 合成后加一步 LipSync 让口型匹配
|
||||
- 🧠 Kling AI 素材替代 Pexels: 图生视频生成更精准的场景素材
|
||||
|
||||
---
|
||||
|
||||
### 策略 B:卡点(已实现,需增强)
|
||||
|
||||
```
|
||||
输入: BGM + 素材 (提供/Pexels搜索)
|
||||
流程:
|
||||
BGM → [节拍检测: librosa beat_track] → BPM + 拍点列表
|
||||
→ [分组: N拍/组] → 每组时长 = N × (60/BPM)
|
||||
→ [素材分配] → 循环取素材, 精确裁剪到组时长
|
||||
→ [拼接: xfade] → 过渡拼接 (≤8组)
|
||||
输出: beat_sync.mp4
|
||||
```
|
||||
|
||||
**可直接执行的命令**: `python main.py video-factory --strategy 卡点 --bgm bgm.wav --search 风景`
|
||||
|
||||
**待增强**:
|
||||
| 功能 | 来源 | 实现方式 |
|
||||
|:----|:----|:--------|
|
||||
| **变速卡点 (speed ramp)** | FFmpeg setpts | `setpts=(1/v)*PTS` + `atempo=v` 滤波器链 |
|
||||
| **能量波切密度** | BeatSync-Engine | 高能段落更密集剪切, 低能段落保持 |
|
||||
| **歌曲结构检测** | BeatSync-Engine | Intro→Verse→Chorus→Bridge→Outro 分区 |
|
||||
| **视觉智能选素材** | BeatSync-Engine Qwen3-VL | 动作/美感/质量评分, 语义标签匹配 |
|
||||
|
||||
---
|
||||
|
||||
### 策略 C:数字人(已实现,分模式)
|
||||
|
||||
```
|
||||
输入: 角色头像 + 文案/参考视频
|
||||
流程 (对口型):
|
||||
头像 + 文案 → [TTS: CosyVoice] → 音频
|
||||
→ [Wan2.2 OmniHuman] → 带口型的数字人视频
|
||||
输出: /tmp/ave_digital_human.mp4
|
||||
|
||||
流程 (动作模仿):
|
||||
头像 + 参考视频 → [火山引擎 DreamActor M1] → 动作模仿视频
|
||||
```
|
||||
|
||||
**可直接执行的命令**: `python main.py video-factory --strategy 数字人 --image photo.jpg --text "文案"`
|
||||
|
||||
**增强方向**:
|
||||
- 🔧 Kling LipSync: 将 OmniHuman 换成 Kling LipSync (成本可控, 质量更高)
|
||||
- 🔧 LatentSync v1.5 本地部署: 零成本, 中文优化
|
||||
- 🧠 Wan2.2-S2V-14B: 远期替换, 音频→视频一步到位
|
||||
|
||||
---
|
||||
|
||||
### 策略 D:角色叙事(新策略,调研中)
|
||||
|
||||
```
|
||||
输入: 定妆照 + 剧本(.yaml) → 多场景故事
|
||||
流程:
|
||||
[定妆照生成] → 角色 sheet / 参考图
|
||||
→ [场景分解] → 剧本 → N个场景 + 每个场景的 Prompt
|
||||
→ [批量生成] → Kling 图生视频 (每场景固定seed + 角色描述块)
|
||||
→ [Temporal Bridge] → 上场景末帧 → 下场景首帧条件
|
||||
→ [卡点合成] → BGM + 节拍 + 变速过渡
|
||||
→ [LipSync] → 语音驱动口型
|
||||
输出: story_final.mp4
|
||||
```
|
||||
|
||||
**这个策略目前不存在**,需要从零构建。它吸收外部项目的核心思路:
|
||||
|
||||
| 来源 | 吸收点 | 实现方式 |
|
||||
|:----|:-------|:--------|
|
||||
| **HoloCine** (CVPR 2026) | 全局场景一致性, 稀疏注意力 | 用 Kling 的固定seed + 参考图模拟 |
|
||||
| **Lights-Camera-Consistency** | Asset-First, Temporal Bridge, JSON蓝图 | 设计 AVE 剧本 YAML 扩展格式 |
|
||||
| **Kling 3.0 参考图** | 单参考图锚定全片 | 定妆照→参考图→每场景生成 |
|
||||
| **Grid Method** | 2x3 多视角 Character Sheet | 先生成定妆照网格, 再逐一入场景 |
|
||||
|
||||
---
|
||||
|
||||
## 三、数字资产管理体系
|
||||
|
||||
### 3.1 资产分类
|
||||
|
||||
| 资产类型 | 来源 | 存储位置 | 复用方式 |
|
||||
|:---------|:----|:---------|:--------|
|
||||
| **角色定妆照** | AI生成/用户提供 | `assets/characters/` | Kling 参考图 / IP-Adapter |
|
||||
| **角色 LoRA** | CharForge 训练 | `assets/lora/` | ComfyUI / SD 生态 |
|
||||
| **生成视频片段** | Kling API | `cache/generations/` | 剪辑拼接 / 素材库 |
|
||||
| **Pexels 素材** | 网络搜索 | `cache/pexels/` | 各策略通用 |
|
||||
| **BGM 文件** | Pixabay/生成 | `assets/bgm/` | 卡点 / 口播策略 |
|
||||
| **剧本 YAML** | 用户编写/LLM生成 | `scripts/` | 版本管理 / 批量生产 |
|
||||
| **历史输出** | 各策略成品 | `output/` | 回放 / 二次剪辑 |
|
||||
| **LipSync 缓存** | LatentSync | `cache/lipsync/` | 重复使用 |
|
||||
|
||||
### 3.2 资产流转图(跨策略复用)
|
||||
|
||||
```
|
||||
定妆照 ────→ 口播 (片头数字人)
|
||||
│
|
||||
├──────→ 数字人 (恒等保持)
|
||||
│
|
||||
└──────→ 角色叙事 (场景批量生成)
|
||||
│
|
||||
├──────→ 卡点 (混剪素材)
|
||||
│
|
||||
└──────→ 口播 (最终合成)
|
||||
|
||||
生成片段 ───→ 口播 (Pexels 素材替代)
|
||||
│
|
||||
├──────→ 卡点 (素材复用)
|
||||
│
|
||||
└──────→ 素材缓存 → 下一次复用
|
||||
|
||||
BGM ─────→ 口播 / 卡点 / 角色叙事 (通用)
|
||||
```
|
||||
|
||||
### 3.3 资产索引建议
|
||||
|
||||
当前没有素材索引系统。建议新增 `scripts/asset_manager/` 模块:
|
||||
|
||||
```python
|
||||
# asset_manager/index.py — 素材索引
|
||||
class AssetIndex:
|
||||
def index_pexels_cache(self, cache_dir): ...
|
||||
def index_generations(self, gen_dir): ...
|
||||
def search(self, tags: list[str], type: str): ...
|
||||
def get_character_ref(self, char_id: str): ...
|
||||
def get_lipsync_cache(self, audio_hash: str): ...
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 四、外部项目集成点矩阵
|
||||
|
||||
| 外部项目 | 类型 | 集成方式 | 优先级 | 投入 |
|
||||
|:---------|:----|:---------|:-----:|:----:|
|
||||
| **BeatSync-Engine** | 开源 | 6阶段架构 → 升级 AVE beat_sync.py | P1 | 0.5天 |
|
||||
| **Kling LipSync (fal.ai)** | API | `scripts/composer/lipsync.py` 新增 | **P0** | 0.5天 |
|
||||
| **LatentSync v1.5** | 开源 | `scripts/latentsync/` 本地推理 | P2 | 0.5天 |
|
||||
| **HoloCine** | 论文 | 角色叙事策略的核心理论框架 | P2 | 2天 |
|
||||
| **Lights-Camera-Consistency** | 论文 | JSON蓝图+Temporal Bridge 设计模式 | P2 | 1天 |
|
||||
| **CharForge / IC-LoRA** | 开源 | LoRA 训练管线 | P3 | 1天 |
|
||||
| **Grid Method (Midjourney社区)** | 方法论 | 定妆照生成 prompt 模板 | P0 | 0.2天 |
|
||||
| **Wan2.2-S2V-14B** | 开源 | 远期替换数字人引擎 | P3 | 待定 |
|
||||
| **MoneyPrinterTurbo** | 开源 | 参考其全自动化架构设计 | P3 | 0.3天 |
|
||||
| **ComfyUI-vidflows** | 开源 | ComfyUI 内的多镜头叙事参考 | P3 | 0.3天 |
|
||||
|
||||
---
|
||||
|
||||
## 五、开发路线图(按优先级)
|
||||
|
||||
### Sprint 1 (P0, ~1天)
|
||||
|
||||
| 序号 | 任务 | 产出文件 | 来源 |
|
||||
|:---:|:----|:---------|:-----|
|
||||
| 1 | **定妆照生成** — 2x3 Grid Method Prompt 模板 + 自动化脚本 | `scripts/character_sheet.py` | Grid Method |
|
||||
| 2 | **Kling LipSync 集成** — 新增 lipsync.py 模块 + CLI 子命令 | `scripts/composer/lipsync.py` | fal.ai |
|
||||
| 3 | **角色描述块锁定** — Scene YAML 扩展 `character_ref` 字段 | `scripts/director_parser/schemas.py` | Lights-Camera |
|
||||
|
||||
### Sprint 2 (P1, ~1天)
|
||||
|
||||
| 序号 | 任务 | 产出文件 | 来源 |
|
||||
|:---:|:----|:---------|:-----|
|
||||
| 4 | **变速卡点引擎** — setpts + atempo 动态速度曲线 | `scripts/composer/speed_ramp.py` | BeatSync-Engine |
|
||||
| 5 | **节拍检测升级** — 能量曲线+歌曲结构+剪切策略 (6阶段) | 改写 `scripts/composer/beat_sync.py` | BeatSync-Engine |
|
||||
| 6 | **卡点+口播融合管线** — 口播场景中插入变速卡点过渡 | `scripts/composer/hybrid.py` | 新设计 |
|
||||
|
||||
### Sprint 3 (P2, ~2天)
|
||||
|
||||
| 序号 | 任务 | 产出文件 | 来源 |
|
||||
|:---:|:----|:---------|:-----|
|
||||
| 7 | **角色叙事策略** — 定妆照→场景批量生成→Temporal Bridge | `scripts/story_director/` | HoloCine + LCC |
|
||||
| 8 | **本地 LatentSync 部署** — Docker / venv 部署 + AVE 集成 | `scripts/latentsync/` | 字节跳动 |
|
||||
| 9 | **素材资产管理器** — 索引 + 缓存 + 标签 + 搜索 | `scripts/asset_manager/` | 新设计 |
|
||||
|
||||
### Sprint 4 (P3, 可选)
|
||||
|
||||
| 序号 | 任务 | 来源 |
|
||||
|:---:|:----|:-----|
|
||||
| 10 | LoRA 训练管线 (CharForge) | CharForge |
|
||||
| 11 | Wan2.2-S2V-14B 本地部署 | Wan-AI |
|
||||
| 12 | ComfyUI 工作流导出支持 | ComfyUI-vidflows |
|
||||
|
||||
---
|
||||
|
||||
## 六、关键决策记录
|
||||
|
||||
### 6.1 Kling LipSync vs. 本地 LatentSync
|
||||
|
||||
| 维度 | Kling LipSync (fal.ai) | LatentSync v1.5 (本地) |
|
||||
|:----|:---------------------:|:---------------------:|
|
||||
| 成本 | $0.014/5s (¥0.10/镜头) | 免费 |
|
||||
| 质量 | ⭐⭐⭐⭐ 商业级 | ⭐⭐⭐⭐⭐ 中文优化 |
|
||||
| 部署 | 零部署 (API调用) | 需 8GB VRAM + Docker |
|
||||
| 延迟 | ~12分钟/次 | ~数秒~数十秒 |
|
||||
| 适合 | **短期快速集成** | 中期大批量场景 |
|
||||
|
||||
**结论**:先上 Kling LipSync(P0,半天完成集成),LatentSync 作为 P2 储备。
|
||||
|
||||
### 6.2 角色叙事 vs. 增强现有策略
|
||||
|
||||
**不新建策略**,而是在现有策略上叠加 3 个增强层:
|
||||
1. **定妆照层** — 所有策略共享(P0)
|
||||
2. **角色锁定层** — 场景 YAML 加 character_ref 字段(P0)
|
||||
3. **LipSync 层** — 合成后后处理(P0)
|
||||
|
||||
角色叙事策略本质上是"口播 + 定妆照 + 批量场景 + 卡点的融合产物",不是独立的全新管线。
|
||||
|
||||
### 6.3 素材策略:Pexels vs. Kling AI vs. 即梦VIP
|
||||
|
||||
| 策略 | 成本 | 质量匹配度 | 可用性 |
|
||||
|:----|:----:|:---------:|:------:|
|
||||
| **Pexels** (当前) | 免费 (需API Key) | ⭐⭐ (通用素材, 不精确) | ✅ 稳定 |
|
||||
| **Kling AI 图生视频** | ¥1/5s | ⭐⭐⭐⭐ (精准匹配) | ✅ AVE已集成 |
|
||||
| **即梦VIP (网页版)** | ¥0.22-0.37/段 | ⭐⭐⭐⭐⭐ | 🚧 需Peekaboo |
|
||||
| **即梦API** | ¥1-3/段 | ⭐⭐⭐⭐⭐ | 🚧 高级会员 |
|
||||
|
||||
**结论**:维持 Pexels 为默认素材源(免费),Kling AI 素材为按需增强(高精度场景),即梦为长期优化方向。
|
||||
|
||||
---
|
||||
|
||||
## 七、自纠偏:架构辩论
|
||||
|
||||
### 辩论 1:要不要做统一的"剧本→多场景→角色叙事"管线?
|
||||
|
||||
**正方**:这是用户需要的最终形态——输入一个故事,输出一个完整的角色化视频
|
||||
**反方**:这会是一个很重的投入(2-3天),且依赖多个未成熟的外部模型
|
||||
**裁决**:先不做统一管线。改为在现有 3 个策略上加"角色一致性增强层"和"LipSync 层",角色叙事是"口播+定妆照+卡点"的组合产物。等 P0/P1 完成后,自然就知道统一的管线应该长什么样。
|
||||
|
||||
### 辩论 2:Kling LipSync API 还是本地模型?
|
||||
|
||||
**正方**:API 零部署、零维护、商业级质量、价格合理
|
||||
**反方**:12分钟推理时间太长、依赖服务商、文本模式仅120字
|
||||
**裁决**:API 先上(P0),本地模型作为中期增强(P2)。API 的 12 分钟可以通过并行提交缓冲。
|
||||
|
||||
### 辩论 3:变速卡点值不值得单独做一个模块?
|
||||
|
||||
**正方**:这是用户明确提到的核心需求,也是和竞品差异化的关键
|
||||
**反方**:FFmpeg setpts/atempo 实现简单,不需要单独模块
|
||||
**裁决**:值。但不是单独做"speed_ramp.py",而是把变速作为 beat_sync 管线的一个可选滤波器链。BeatSync-Engine 的能量波切密度策略才是真正的核心创新——变速只是具体实现手段。
|
||||
|
||||
---
|
||||
|
||||
## 八、项目文件结构建议
|
||||
|
||||
```
|
||||
scripts/
|
||||
├── main.py # CLI 入口
|
||||
├── video_factory.py # 工厂路由 (已有, 扩展)
|
||||
├── character_sheet.py # 🆕 定妆照生成 (Grid Method)
|
||||
├── asset_manager/ # 🆕 资产管理
|
||||
│ ├── index.py # 素材索引
|
||||
│ ├── cache.py # 缓存管理
|
||||
│ └── tags.py # 标签系统
|
||||
├── composer/
|
||||
│ ├── beat_sync.py # 🔧 节拍检测升级 (6阶段)
|
||||
│ ├── speed_ramp.py # 🆕 变速滤波器链
|
||||
│ ├── lipsync.py # 🆕 Kling LipSync 集成
|
||||
│ ├── ffmpeg.py # (已有)
|
||||
│ └── hybrid.py # 🆕 口播+卡点融合
|
||||
├── story_director/ # 🆕 角色叙事 (P2)
|
||||
│ ├── scene_planner.py # 场景分解
|
||||
│ ├── temporal_bridge.py # Temporal Bridge
|
||||
│ └── batch_generator.py # 批量 Kling 生成
|
||||
├── director_parser/
|
||||
│ ├── parser.py # 🔧 扩展 character_ref
|
||||
│ └── schemas.py # 🔧 YAML schema 扩展
|
||||
├── material_producer/
|
||||
│ ├── kling/kling.py # 🔧 增加 seed 参数
|
||||
│ └── pexels/search.py # (已有)
|
||||
├── voice_synthesizer/ # (已有)
|
||||
└── lib/
|
||||
└── config.py # (已有)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 九、下一步行动
|
||||
|
||||
**立即做 (P0)**:
|
||||
1. 定妆照 Grid Method Prompt 模板
|
||||
2. Kling LipSync 集成 (lipsync.py + CLI)
|
||||
3. YAML Schema 扩展 (character_ref 字段)
|
||||
|
||||
**明天做 (P1)**:
|
||||
4. 变速卡点引擎
|
||||
5. 节拍检测升级
|
||||
|
||||
**本周做 (P2)**:
|
||||
6. 角色叙事管线初版
|
||||
7. 素材资产管理器
|
||||
Reference in New Issue
Block a user