移植自 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 带网关原话 / 正常返回)。
8.9 KiB
8.9 KiB
AVE v2.0 架构重构方案
版本: v2.0 (草案) 创建: 2026-05-15 核心理念: 结果推导 — 从目标视频反推创作链路 知识基础: AI视频提示词系统教科书(19章)+ 全网调研
一、核心差距分析
当前 AVE v1.x 的问题
| 维度 | 现状 | 目标 |
|---|---|---|
| 输入 | 仅支持 YAML 或 纯文本 | 支持小说/故事/RSS/链接等多种输入 |
| 分镜 | 直接 LLM 解析,无结构化分镜 | 四步工作流:场景拆分→镜头分配→风格定调→prompt生成 |
| 风格控制 | 无 | 统一的风格锚点 + 角色一致性 |
| 素材来源 | Pexels(单一) | Kling API / 百炼 / 即梦网页版 / Pexels / 数字人 多引擎 |
| 提示词 | 简单关键词搜索 | 五要素结构化提示词 + 正向/负向 + 权重控制 |
| 输出 | 1080p mp4 仅口播类型 | 支持宣传片/故事片/TVC/漫剧等多类型 |
二、五层架构设计
┌─────────────────────────────────────────────────────────┐
│ Layer 1: 输入层 (文案/小说/RSS/链接 → 结构化内容) │
├─────────────────────────────────────────────────────────┤
│ Layer 2: 分镜引擎 (LLM拆分场景→分配镜头→风格定调→生prompt) │
├─────────────────────────────────────────────────────────┤
│ Layer 3: 素材生产 (Kling/百炼/即梦/Pexels/数字人 多引擎) │
├─────────────────────────────────────────────────────────┤
│ Layer 4: 合成引擎 (TTS + KenBurns + BGM + 字幕 → mp4) │
├─────────────────────────────────────────────────────────┤
│ Layer 5: 输出层 (1080x1920.mp4 → 抖音/快手/视频号) │
└─────────────────────────────────────────────────────────┘
Layer 1: 输入层
输入类型:
├─ YAML脚本 → 直接解析(当前已有)
├─ 纯文本文案 → LLM结构化(当前已有)
├─ 小说/故事 → 四步工作流:规范→分镜→场景表→完整脚本
├─ 网页链接/RSS → web_crawler采集 → 同上流程
└─ 已有视频 → 逆向解构(video-to-prompt)
Layer 2: 分镜引擎(新增/重写)
替换当前的 director_parser,核心能力:
① LLM场景拆分
输入: 文案/故事
输出: 场景列表 (每个场景有时间/地点/氛围)
② 镜头分配
- 景别: 远景/全景/中景/特写/过肩
- 运镜: 推/拉/摇/移/跟/升降/环绕
- 时长: 3-15秒
③ 风格定调
- 风格锚点: "超写实电影感" / "水墨国风" / "扁平化3D"
- 色彩方案: 暖调/冷调/高饱和/低饱和
- 光照方案: 晨光/逆光/霓虹/戏剧光
④ Prompt生成(五要素)
= [风格] + [主体] + [环境] + [镜头运动] + [光线质感]
+ 负向词 + 权重控制
Layer 3: 素材生产层(多引擎)
素材引擎路由:
├─ bailian_kling (主力) → ¥0.5-1/段, 45s, 已跑通
├─ kling_official → ¥1/段, 5min, 100积分
├─ jimeng_web (Peekaboo) → ¥0.3/段, 排队, 自动化中
├─ pexels_free → ¥0/段, 静态, 兜底
├─ wan2.2_digital_human → 数字人口播
└─ buddy_cloud → ¥1.8/段, 备用
Layer 4: 合成引擎
人声合成: CosyVoice TTS + 字级时间戳
素材处理: Ken Burns (5种随机运镜)
背景音乐: 和弦垫音 / mlx-audiocraft / 即梦BGM
音量避让: duck_bgm (基于字级时间戳)
字幕: ASS 精确字幕
Layer 5: 输出层
参数: 1080x1920, 30fps, h264, 8Mbps
格式: mp4
分发: 抖音 / 快手 / 视频号
三、提示词引擎设计(核心升级)
3.1 YAML 脚本格式升级
meta:
project_id: "daoist_002"
style: "knowledge_lecture"
global_style_anchor: "水墨国风,工笔山水画质感" # 新增:全局风格
global_negative: "畸形、扭曲、面瘫、比例失调" # 新增:全局负向词
fps: 24 # 新增:帧率
voice:
provider: aliyun
emotion: 专业沉稳
bgm:
mood: calm
output:
resolution: 1080x1920
fps: 24
segments:
- id: 1
text: "上善若水,水善利万物而不争。——《道德经》"
duration_sec: 10
# 新增:镜头语言
camera: "镜头缓慢俯拍,从高空逐渐推进"
shot_type: "全景" # 远景/全景/中景/特写
# 新增:分镜描述(替代旧的 material.search)
material:
provider: bailian # 引擎选择
prompt_subject: "清澈溪水流过圆石,水滴晶莹"
prompt_environment: "云雾缭绕的深山幽谷"
prompt_lighting: "晨雾中的柔光"
subtitles: true
3.2 Prompt 组装逻辑
def build_prompt(seg, global_style):
"""五要素+ 权重 + 负向词 组装"""
prompt = (
f"({global_style}:1.3), "
f"({seg['prompt_subject']}:1.5), "
f"({seg['prompt_environment']}:1.2), "
f"({seg['camera']}:1.1), "
f"({seg['prompt_lighting']}:1.0)"
)
negative = f"({global_negative}:1.5)"
return prompt, negative
3.3 四步分镜工作流
输入: "今天我要讲一个关于水的故事。上善若水..."
Step 1: LLM规范整理
→ [场景描述]深山溪谷 [人物动作]无 [对话]旁白
Step 2: 镜头规划
→ 需要 8 个镜头,分布: 全景(2) → 中景(3) → 特写(2) → 全景(1)
Step 3: 场景与角色表
→ 场景1: 深山溪谷,清晨,薄雾
→ 场景2: 水库大坝,午后,阳光强烈
Step 4: 生成完整分镜脚本
→ 镜号 | 景别 | 画面描述 | 旁白 | 场景 | 提示词
四、多内容类型支持
4.1 口播知识类(当前)
- 文案 → TTS → AI素材 → 合成
- 适用:道家金句、知识分享、观点输出
4.2 故事叙事类(新增)
- 小说/故事 → 四步分镜 → AI素材 → 合成
- 适用:民间故事、寓言、历史小故事
4.3 漫剧动画类(新增)
- 剧本 → 分镜 → 文生图(角色一致) → 图生视频 → 配音
- 适用:短剧、条漫转视频、AI漫剧
- 工具:Kling图生视频 + CosyVoice配音
4.4 宣传片类(新增)
- 产品介绍 → 分镜 → 风格化素材 → 合成
- 适用:品牌宣传、产品展示
五、实施路线图
| 阶段 | 内容 | 工作量 | 优先级 |
|---|---|---|---|
| P0 本周 | 分镜引擎: YAML升级 + prompt五要素组装 | 1天 | 🔴 |
| P0 本周 | 接入百炼Kling API替换Pexels | 0.5天 | 🔴 |
| P1 下周 | 四步分镜工作流(LLM驱动) + 场景/角色表 | 2天 | 🟡 |
| P1 下周 | 即梦网页版Peekaboo自动化收尾 | 1天 | 🟡 |
| P2 本月 | 故事输入 + 漫剧管线 | 3天 | 🟢 |
| P2 本月 | 风格库 + 模板库建设 | 2天 | 🟢 |
| P3 储备 | 宣传片类型 + 批量生产流水线 | 3天 | 🔵 |
六、知识体系关联
| AVE模块 | 关联教科书章节 | 知识点 |
|---|---|---|
| director_parser | ch14 脚本转提示词 | 四步工作流 |
| material_producer | ch12 模型对比, ch13 工具工作流 | Kling/即梦/百炼接入 |
| composer | ch3 参数(ch4 分镜运镜), ch5 光影色彩 | 帧率/景别/光线设计 |
| bgm_generator | ch6 音频设计 | 音景/情绪音乐 |
| animate | ch7 微表情 | 动作拆解/表情控制 |
| strategy planner | ch1 核心逻辑, ch2 结果驱动 | 逆向推导方法论 |
| style library | ch8-11 多领域应用 | 电影/动漫/TVC/科幻风格 |
七、AVE 当前状态 vs 目标
当前 AVE:
输入 → 解析 → Pexels → TTS → 合成 → mp4
│ │ │ │ │
│ 仅YAML │ 无分镜 单一素材 │ CosyVoice 无BGM
目标 AVE v2.0:
输入 → 分镜引擎 → 多引擎素材 → TTS→BGM→合成 → mp4
│ │ │ │
│ 多类型 │ 四步分镜 │ Kling/即梦 │ 风格统一
│ 统一入口 │ 五要素prompt │ /Pexels/数字人 │ 全链路控制
核心理念总结:
- 结果推导 — 先想清楚最终画面,再反向拆解指令
- 分镜先行 — 不做文字到视频的直接跳转,先做好分镜
- 风格统一 — 全局风格锚点锁死一致性
- 多引擎 — 根据成本/速度/质量动态选择素材来源
- 持续迭代 — 每次只改5%进行AB测试