移植自 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 带网关原话 / 正常返回)。
15 KiB
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/ 模块:
# 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 个增强层:
- 定妆照层 — 所有策略共享(P0)
- 角色锁定层 — 场景 YAML 加 character_ref 字段(P0)
- 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):
- 定妆照 Grid Method Prompt 模板
- Kling LipSync 集成 (lipsync.py + CLI)
- YAML Schema 扩展 (character_ref 字段)
明天做 (P1): 4. 变速卡点引擎 5. 节拍检测升级
本周做 (P2): 6. 角色叙事管线初版 7. 素材资产管理器