移植自 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 带网关原话 / 正常返回)。
18 KiB
18 KiB
AVE v2.0 落地实施计划
AudioScore Video Engine — 智能体可调用的自动化视频编排引擎
版本: v1.0 (规划) 创建: 2026-05-04 负责人: ghai / Claw 状态: 📋 规划阶段
一、项目概览
1.1 这是什么
AVE v2.0 是一个以双轨音频锚点为时间轴,通过导演脚本精确控制视听元素的自动化视频编排引擎。它接收结构化YAML指令,输出最终视频文件。
1.2 核心能力
| 能力 | 说明 | 技术方案 |
|---|---|---|
| 情绪化人声合成 | 一个音色演绎多种情绪 | 豆包语音 2.0 (火山引擎) |
| 背景音乐生成 | 氛围化配乐,风格可控 | ACE-Step 1.5 / MusicGen (云GPU) |
| 数字人出镜 | 静态图→口播视频 | Wan2.2-S2V (通义万相 API) |
| 素材搜索 | 根据语义搜索视频素材 | Pexels API (免费) |
| 导演脚本 | 文案→结构化YAML→视频 | 本地大模型解析 |
| 渲染合成 | 多轨合成最终视频 | Remotion + FFmpeg |
1.3 系统架构图
用户文案
│
[01_director_parser]
大模型解析 → director_script.yaml
│
┌─────────────┼─────────────┐
│ │ │
▼ ▼ ▼
[02_voice] [03_bgm] [05_material]
豆包语音2.0 ACE-Step Pexels + Wan2.2
│ │ │
└─────────────┼─────────────┘
│
[04_anchor_extractor]
双轨锚点对齐
│
[06_composer]
Remotion + FFmpeg
│
final.mp4
二、目录结构与文件清单
2.1 工具模块路径
参照 05_tools/ 现有模块的 TOOL.md + scripts/ 结构:
~/workbuddy-agent-os/agent-sync/
├── 05_tools/
│ └── 09_ave/ ← 工具模块根目录
│ ├── TOOL.md ← 工具说明文档 (必须)
│ ├── install.sh ← 一键安装脚本 (可选)
│ ├── requirements.txt.pip ← Python 依赖
│ ├── config.yaml ← API 密钥/默认参数配置模板
│ │
│ ├── scripts/ ← 核心脚本目录
│ │ ├── __init__.py
│ │ ├── main.py ← 统一 CLI 入口
│ │ │
│ │ ├── 01_director_parser/
│ │ │ ├── __init__.py
│ │ │ ├── parser.py ← 文案 → director_script.yaml
│ │ │ └── schemas.py ← YAML 结构校验
│ │ │
│ │ ├── 02_voice_synthesizer/
│ │ │ ├── __init__.py
│ │ │ ├── volcano.py ← 豆包语音 2.0 适配器
│ │ │ └── aliyun.py ← CosyVoice 备用适配器
│ │ │
│ │ ├── 03_bgm_generator/
│ │ │ ├── __init__.py
│ │ │ ├── ace_step.py ← ACE-Step 1.5 适配器
│ │ │ └── suno.py ← Suno API 备用适配器
│ │ │
│ │ ├── 04_anchor_extractor/
│ │ │ ├── __init__.py
│ │ │ └── extractor.py ← librosa 锚点提取
│ │ │
│ │ ├── 05_material_producer/
│ │ │ ├── __init__.py
│ │ │ ├── pexels.py ← Pexels 搜索
│ │ │ ├── wan2_2.py ← Wan2.2-S2V 适配器
│ │ │ └── fallback.py ← 本地素材回落
│ │ │
│ │ ├── 06_composer/
│ │ │ ├── __init__.py
│ │ │ ├── remotion.py ← Remotion 项目生成
│ │ │ └── ffmpeg.py ← FFmpeg 后处理
│ │ │
│ │ ├── 07_service_layer/
│ │ │ ├── __init__.py
│ │ │ ├── api.py ← FastAPI 服务
│ │ │ └── skill_bridge.py ← WorkBuddy 技能对接
│ │ │
│ │ └── lib/ ← 通用工具库
│ │ ├── __init__.py
│ │ ├── config.py ← 配置加载
│ │ ├── cache.py ← 素材/结果缓存
│ │ └── logger.py ← 日志
│ │
│ └── assets/ ← 模板/参考资源
│ ├── director_template.yaml ← 导演脚本模板
│ └── demo_scripts/ ← 测试脚本集
│
├── 02_skills/
│ └── ave/ ← WorkBuddy 技能
│ ├── SKILL.md ← 技能定义
│ └── reference/ ← 技能参考文档
│ └── director_schemas.md
│
└── agent-local/
└── tools/
└── ave/ ← 本机数据(不同步)
├── config/
│ └── local.yaml ← 本地 API 密钥等敏感配置
├── cache/
│ ├── materials/ ← 素材缓存
│ └── outputs/ ← 渲染缓存
└── templates/
└── remotion/ ← Remotion 项目模板
2.2 核心文件清单
| 编号 | 文件 | 功能 | 优先级 |
|---|---|---|---|
| P0 | 09_ave/TOOL.md |
工具说明文档 | ⭐ 必须 |
| P0 | 09_ave/scripts/main.py |
CLI 入口 | ⭐ 必须 |
| P0 | 09_ave/scripts/01_director_parser/parser.py |
文案解析 | ⭐ 必须 |
| P0 | 09_ave/scripts/02_voice_synthesizer/volcano.py |
豆包语音 | ⭐ 必须 |
| P0 | 09_ave/scripts/05_material_producer/pexels.py |
素材搜索 | ⭐ 必须 |
| P0 | 09_ave/scripts/06_composer/ffmpeg.py |
合成 | ⭐ 必须 |
| P1 | 09_ave/scripts/03_bgm_generator/ace_step.py |
背景音乐 | 建议 |
| P1 | 09_ave/scripts/04_anchor_extractor/extractor.py |
锚点提取 | 建议 |
| P2 | 09_ave/scripts/05_material_producer/wan2_2.py |
数字人 | 可选 |
| P2 | 09_ave/scripts/07_service_layer/api.py |
FastAPI 服务 | 可选 |
| P2 | 02_skills/ave/SKILL.md |
WorkBuddy 技能 | 可选 |
三、实施阶段(分4阶段推进)
阶段 1:基础设施(1天)
目标:目录结构搭建 + API 注册 + 配置就绪
任务清单:
☐ 创建 09_ave/ 完整目录结构
☐ 创建 agent-local/tools/ave/config/ 目录
☐ 注册火山引擎豆包语音 2.0 → 获取 API Key + App ID + Access Token
☐ 注册阿里云百炼 → 获取 API Key
☐ 注册 Pexels → 获取 API Key
☐ 编写 config.yaml 模板
☐ 编写 local.yaml(本地敏感配置)
☐ 编写 install.sh 安装脚本
☐ 编写 TOOL.md 工具说明
☐ 提交到 Git: git add, commit, push
产出:
- 可
git clone后在目标机器bash install.sh一键就绪 - agentos upgrade 能识别并检查 09_ave 模块
阶段 2:核心链路 MVP(2-3天)
目标:跑通 文案→人声→素材→合成 的可用闭环
任务清单:
02_voice_synthesizer (半天)
☐ 实现 volcano.py 基础 TTS 调用
☐ 测试: python main.py voice --text "测试" --output test.wav
☐ 上传音色样本 → 获取 speaker_id
☐ 实现情感指令参数: emotion, speed, pitch
☐ 实现 CosyVoice 备用适配器
05_material_producer (半天)
☐ 实现 pexels.py 搜索+下载
☐ 实现回退策略: search → fallback cache
☐ 测试: python main.py material --search "sunset beach"
01_director_parser (半天)
☐ 实现 schemas.py YAML 结构校验 (Pydantic)
☐ 实现 parser.py 文案 → YAML
☐ 编写 director_template.yaml
☐ 测试: python main.py parse --script demo.txt
06_composer (半天)
☐ 实现 ffmpeg.py 音视频合成
☐ 实现字幕叠加 (ass/srt 字幕)
☐ 测试: python main.py compose --voice voice.wav --material clips/
MVP 集成测试
☐ 用一个小笑话脚本跑通完整链路
☐ 产出第一个 final.mp4(纯人声+素材画面)
阶段 3:品质提升(1-2天)
目标:加入背景音乐 + 锚点对齐 → 多轨精准编排
任务清单:
03_bgm_generator
☐ 调研 ACE-Step 1.5 部署方案 (云端 GPU)
☐ 或实现 Suno API 备用适配器
☐ 实现 ace_step.py → bgm.wav
04_anchor_extractor
☐ 实现 extractor.py (librosa 节奏检测)
☐ 实现人声字级锚点: word_timestamps → anchors.json
☐ 实现 BGM 段落锚点: section_boundaries
01_director_parser 升级
☐ 支持完整的导演脚本模板 (bgm_section, camera, avatar 等字段)
06_composer 升级
☐ 双轨混音: voice.wav + bgm.wav → mixed_audio.wav
☐ 基于锚点对齐画面切换
☐ 支持分段渲染 (3分钟以上视频)
阶段 4:数字人 + 技能封装(1天)
目标:数字人出镜 + 作为 WorkBuddy 技能可调用
任务清单:
05_material_producer 升级
☐ 实现 wan2_2.py (通义万相 S2V)
☐ 实现 detect 图片合规检查
☐ 实现异步任务轮询
☐ 回落策略: detect失败 → 重试 → 跳过数字人
07_service_layer
☐ FastAPI 服务: POST /ave/generate
☐ 任务队列 + 进度轮询
☐ 错误处理与重试逻辑
02_skills/ave/SKILL.md
☐ 技能触发词: 视频、剪辑、生成视频
☐ 输入: 文案文本 + 风格标签
☐ 流程: 调用大模型 → 生成 YAML → 调用 AVE API
☐ 输出: 返回 final.mp4 本地路径
四、API 注册清单与成本
4.1 必须注册的服务
| 服务 | 用途 | 注册步骤 | 预计耗时 |
|---|---|---|---|
| 火山引擎 | 豆包语音 2.0 | 注册→实名→ARK模型服务→创建API Key | 30min |
| 阿里云百炼 | Wan2.2-S2V + CosyVoice | 注册→实名→开通服务→创建API Key | 20min |
| Pexels | 素材搜索 | 注册→API Dashboard→创建Application | 10min |
4.2 各服务凭证清单
agent-local/tools/ave/config/local.yaml:
# 火山引擎 (豆包语音 2.0)
volcano:
api_key: "sk-xxx" # ARK → API Key 管理
app_id: "xxx" # 语音控制台 → App ID
access_token: "xxx" # 语音控制台 → Access Token
speaker_id: "xxx" # 声音复刻 → 训练后获取
tts_model: "volcano_tts_2.0"
# 阿里云百炼
aliyun:
api_key: "sk-xxx" # 百炼 → API Key
wan_model: "wan2.2-s2v"
cosyvoice_model: "cosyvoice-v3.5-plus"
# Pexels
pexels:
api_key: "xxx" # Pexels API Dashboard
rate_limit: 200 # 请求/小时
4.3 月费预估 (日更一条3分钟视频)
| 模块 | 方案 | 月费 | 备注 |
|---|---|---|---|
| 人声合成 | 豆包语音 2.0 年付 | ~22元 | 首3月免费 |
| 数字人 | HeyGen Creator | ~211元 | 或用 Wan2.2 API 按量计费 |
| 背景音乐 | ACE-Step 云端GPU | ~2元 | 或 Suno API ~15-30元 |
| 素材搜索 | Pexels | 0元 | 免费 |
| 大模型调用 | DeepSeek / 通义千问 | ~1-10元 | 文案解析 |
| 合计 | ~25-250元/月 | 取决于数字人方案 |
五、本地硬件需求
| 环节 | 部署位置 | 需求 | Mac 16G 可行性 |
|---|---|---|---|
| 文案解析 | 云端 API | 无 | ✅ 直接调 |
| 人声合成 | 云端 API | 无 | ✅ 直接调 |
| 背景音乐 | 云端 GPU | 6GB+ 显存 | ❌ 需云 GPU |
| 数字人 | 云端 API | 无 | ✅ 直接调 |
| 素材搜索 | 云端 API | 无 | ✅ 直接调 |
| 锚点提取 | 本地 | CPU, librosa | ✅ |
| Remotion | 本地 | 16GB RAM | ✅ 3-5min 以内 |
| FFmpeg | 本地 | 无特殊要求 | ✅ 已装 |
结论:Mac 16GB 内存足够处理 3 分钟内视频的本地环节。 仅背景音乐生成(ACE-Step)和 Remotion 渲染长视频需要云端或分段。
六、可能遇到的问题与应对
6.1 API 层问题
| 问题 | 概率 | 影响 | 应对方案 |
|---|---|---|---|
| 豆包语音 API 认证失败 | 中 | 人声不可用 | 实现 CosyVoice 备选;local.yaml 三重凭证逐一校验 |
| Wan2.2-S2V 图片检测不通过 | 中 | 数字人无法生成 | 回落:跳过数字人片段,仅用素材画面+字幕 |
| Pexels 搜索无结果 | 高 | 素材缺失 | 3层回落:search → AI生成 → fallback_mood_videos |
| Pexels 速率限制 | 低 | 搜索被限 | 本地缓存层,已搜过的关键词不重复请求 |
| ACE-Step API 响应慢 | 中 | BGM 生成延迟 | 异步队列,不影响主流程;或改用 Suno API |
6.2 本地渲染问题
| 问题 | 概率 | 影响 | 应对方案 |
|---|---|---|---|
| Remotion 内存不足 | 中 | 长视频渲染失败 | 分段渲染(3分钟/段)→ FFmpeg concat |
| FFmpeg 编码参数不合适 | 低 | 视频过大/质量差 | 预设多组编码参数,按场景切换 |
| 中间文件撑满磁盘 | 中 | 渲染中断 | 自动清理策略:渲染成功后删除 wav/clips |
| 中文字幕编码乱码 | 低 | 字幕显示异常 | 强制 UTF-8 + ASS 格式(非 SRT) |
6.3 编排逻辑问题
| 问题 | 概率 | 影响 | 应对方案 |
|---|---|---|---|
| 语音与画面不同步 | 中 | 观感差 | 锚点容差机制:画面切换 ±0.2s |
| BGM 段落与文案不匹配 | 中 | 情绪割裂 | 导演脚本中明确 bgm_section 映射 |
| 多个素材时长与口播不匹配 | 高 | 画面空白/超长 | 自动拼接/裁剪素材到精确时长 |
| 大模型解析 YAML 格式错误 | 中 | 链路中断 | schemas.py 严格校验 + 自动修复 |
七、落地检查清单
7.1 基础设施
☐ 09_ave/ 目录创建完成
☐ TOOL.md 编写完成
☐ install.sh 编写完成
☐ agent-local/tools/ave/config/local.yaml 配置完成
☐ agentos upgrade 能识别 09_ave 模块
☐ git commit + push 到远程
7.2 MVP 链路
☐ 豆包语音 2.0 TTS 调用成功 → test.wav
☐ Pexels 搜索+下载成功 → material.mp4
☐ 文案→导演脚本 YAML 解析成功
☐ FFmpeg 音视频合成成功 → final.mp4
☐ 小笑话脚本跑通全链路
7.3 品质提升
☐ 背景音乐生成 (ACE-Step/Suno) → bgm.wav
☐ 双轨混音: voice + bgm
☐ 锚点提取 + 画面同步切换
☐ 分段渲染 + concat (长视频)
7.4 技能封装
☐ Wan2.2-S2V 数字人接入
☐ FastAPI 服务运行
☐ 02_skills/ave/SKILL.md 编写
☐ agentos sync 注册技能
☐ 技能调用测试: "帮我把这段文案做成视频"
八、技能定义草案
8.1 技能触发
技能名:ave_video_director
触发词:
- 视频、剪辑、生成视频、做视频
- 把这段话做成视频、AI 视频、自动剪辑
- director script、导演脚本
8.2 技能流程
用户输入文案
↓
01_director_parser: 大模型解析文案 → director_script.yaml
↓
02_voice_synthesizer: 逐段合成情绪化人声 → voice_segments/
↓
03_bgm_generator: 生成背景音乐 → bgm.wav (可选)
↓
04_anchor_extractor: 双轨锚点提取 → anchors.json
↓
05_material_producer: 并行搜索素材 → material_clips/
+ Wan2.2-S2V → avatar_clips/ (可选)
↓
06_composer: 编排渲染 + 编码 → final.mp4
↓
返回 final.mp4 路径给用户
8.3 用户输入示例
# 最简调用
python main.py generate --script "今天我们来聊聊..."
# 指定风格
python main.py generate --script demo.txt --style bedtime_story
# 高级:直接传导演脚本
python main.py compose --director-script script.yaml
九、首次启动步骤
# 1. 进入项目
cd ~/workbuddy-agent-os/agent-sync
# 2. 创建目录结构
mkdir -p 05_tools/09_ave/{scripts/{01_director_parser,02_voice_synthesizer,03_bgm_generator,04_anchor_extractor,05_material_producer/{pexels,wan2_2,fallback},06_composer,07_service_layer,lib},assets/demo_scripts}
mkdir -p agent-local/tools/ave/{config,cache/{materials,outputs},templates/remotion}
# 3. 配置 API 密钥 (参考 4.2 节)
# 编辑 agent-local/tools/ave/config/local.yaml
# 4. 安装 Python 依赖
pip install -r 05_tools/09_ave/requirements.txt.pip
# 5. 测试人声合成
python 05_tools/09_ave/scripts/main.py voice --text "你好,这是测试" --output test.wav
# 6. 跑通 MVP 闭环 (文案→人声→素材→合成)
python 05_tools/09_ave/scripts/main.py generate --script assets/demo_scripts/test_story.txt
# 7. 注册技能到 WorkBuddy
agentos sync
# 8. 提交到 Git
git add -A && git commit -m "feat: AVE v2.0 工具模块初始化" && git push
十、文件生成顺序(按依赖关系)
第1批 (并行,无依赖):
├── TOOL.md
├── config.yaml
├── requirements.txt.pip
├── lib/config.py
├── lib/cache.py
└── lib/logger.py
第2批 (无内部依赖):
├── 02_voice_synthesizer/volcano.py
├── 05_material_producer/pexels.py
└── 06_composer/ffmpeg.py
第3批 (依赖第2批):
├── 01_director_parser/parser.py
├── 01_director_parser/schemas.py
├── 02_voice_synthesizer/aliyun.py
└── 05_material_producer/fallback.py
第4批 (依赖第2+3批):
├── 03_bgm_generator/ace_step.py
├── 03_bgm_generator/suno.py
├── 04_anchor_extractor/extractor.py
└── 06_composer/remotion.py
第5批 (依赖前面全部):
├── main.py (CLI 入口)
├── 05_material_producer/wan2_2.py
├── 07_service_layer/api.py
└── 07_service_layer/skill_bridge.py
第6批 (最后):
├── 02_skills/ave/SKILL.md
├── install.sh
└── assets/director_template.yaml
文档版本: v1.0 最后更新: 2026-05-04 下一步: 开始阶段1 → 目录创建 + API 注册