feat(monitor): 抖音 Web 接口客户端 —— 绕开爬虫子进程,直接发 HTTP
Deploy VitePress site to Pages / build (push) Canceled after 0s
Deploy VitePress site to Pages / Deploy (push) Canceled after 0s

移植自 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:
2026-10-10 17:12:25 +08:00
parent 21ff01b894
commit 2112c1a870
1601 changed files with 367425 additions and 0 deletions
@@ -0,0 +1,837 @@
# 导演创作系统(Director Creative System, DCS)· 项目开发说明书 v2.0
> **来源**:用户原始设计文档 `~/Documents/导演创作系统(Director.docx`(829 行,2026-10-01 09:48 更新)
> **入库原因**:作为视频工厂的**设计基准**(`PLANS/VIDEO_FACTORY_MASTER.md` 附录 C 即对照本文档)
> **入库时间**:2026-10-01 | 原文由 textutil 从 docx 提取(仅格式变换,内容未改)
---
导演创作系统(Director Creative System, DCS)
项目开发说明书 v2.0
一、项目定位
DCS是一套面向广告导演/制片人的AI视频生产系统。导演用自然语言描述故事,系统自动完成分镜拆解、资产调度、视频生成、特效叠加和后期合成,输出接近真人实拍质感的20-30秒短片。
核心设计原则:
1. 解耦:导演系统、编排系统、能力API、合成后期互相独立,可单独替换。
2. 标准化:所有模块通过统一分镜Schema交互,换模块不改流程。
3. 导演优先:3D角色、特效运镜、产品资产均可由导演在控制台按需调用,不盲目抽卡。
4. 真实感优先:分镜遵循伪纪录片/手机随手拍美学,后期强制走去AI化处理链。
5. 低成本起步:本地零GPU,所有算力走远端API。
二、系统架构
```
┌───────────────────────────────────────────────────────────────────────┐
│ 层0:导演控制台(Appsmith,本地Docker,端口80) │
│ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │分镜编辑 │ │资产库 │ │3D角色 │ │特效库 │ │任务状态 │ │
│ │ │ │ │ │生产 │ │ │ │ │ │
│ └──────────┘ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │成片预览 │ │参数模板 │ │系统设置 │ │
│ └──────────┘ └──────────┘ └──────────┘ │
└─────────────────────────────┬─────────────────────────────────────────┘
↓
┌───────────────────────────────────────────────────────────────────────┐
│ 层1:导演层(可替换) │
│ │
│ 导演系统(当前选型:AI Storyboard Director v5.2) │
│ 职责:自然语言故事 → 统一分镜Schema (JSON) │
│ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ 统一分镜Schema(标准接口) │ │
│ │ 所有模块的“普通话” │ │
│ └─────────────────────────────────────────────────────────┘ │
└─────────────────────────────┬─────────────────────────────────────────┘
↓
┌───────────────────────────────────────────────────────────────────────┐
│ 层2:编排层(n8n,本地Docker,端口5678) │
│ │
│ 读取分镜Schema → 按type分发 → 调用各API → 收集输出 → 交给合成层 │
│ │
│ ┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐ │
│ │TTS节点 │ │口播节点│ │动作节点│ │背景节点│ │特效节点│ │3D节点 │ │
│ └────────┘ └────────┘ └────────┘ └────────┘ └────────┘ └────────┘ │
└─────────────────────────────┬─────────────────────────────────────────┘
↓
┌───────────────────────────────────────────────────────────────────────┐
│ 层3:能力层(全部远端API,可替换) │
│ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────────┐│
│ │Fish Audio│ │D-ID/ │ │可灵/ │ │通义万相 │ │RunningHub ││
│ │TTS │ │HeyGen │ │Wan-Anim │ │背景/空镜 │ │(ComfyUI) ││
│ └──────────┘ └──────────┘ └──────────┘ └──────────┘ └──────────────┘│
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │混元3D │ │万兴天幕 │ │海螺AI │ │其他特效 │ │
│ │角色生成 │ │子弹时间 │ │运镜 │ │ │ │
│ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │
└─────────────────────────────┬─────────────────────────────────────────┘
↓
┌───────────────────────────────────────────────────────────────────────┐
│ 层4:合成层(FFmpeg,本地) │
│ │
│ 去AI化处理链:轻微模糊 → 胶片颗粒 → 调色 → 帧混合 → 拼接 │
│ 输出:成片mp4 │
└───────────────────────────────────────────────────────────────────────┘
```
三、分层职责与模块规范
3.1 层0:导演控制台
部署:Appsmith,本地Docker,端口80。跨平台(macOS/Linux),迁移时导出数据库+环境变量即可。
页面清单:
页面 功能 数据源
分镜编辑 输入故事大纲 → 调用导演系统 → 展示分镜表 → 逐条修改 FastAPI /api/director/generate
资产库 角色/场景/道具/产品/BGM/音效管理 FastAPI /api/assets/*
3D角色生产 上传概念图 → 生成多视图+骨骼绑定 → 存入资产库 混元3D API
特效库 浏览可用特效,查看参数说明,预览示例 FastAPI /api/vfx/list
任务状态 查看n8n任务队列,每条分镜状态 FastAPI /api/task/*
成片预览 按项目分组播放成片 本地文件系统
参数模板 管理各内容类型的模板(广告/日记/短剧) config/templates/
系统设置 API Key管理、提供商切换、去AI化参数 config/providers.yaml
控制台可设置参数:
A. 导演系统配置
· 当前导演系统:下拉选择
· 导演系统API地址
· 默认输出Schema版本
B. 能力提供商配置
模块 可选提供商 切换方式
TTS Fish Audio / ElevenLabs / Qwen3-TTS 下拉 + Key
口播视频 D-ID / HeyGen / 本地LongCat 下拉 + Key
动作视频 可灵 / Wan-Animate-2 / Runway 下拉 + Key
背景/空镜 通义万相 / Sora 2 / 可灵 下拉 + Key
ComfyUI RunningHub / ComfyDeploy / 自建 下拉 + API地址
3D角色 混元3D / Autodesk Flow Studio 下拉 + Key
特效-子弹时间 万兴天幕 / 海螺AI / 可灵 下拉 + Key
特效-运镜 可灵 / 海螺AI 下拉 + Key
C. 去AI化参数(全局默认,可被分镜覆盖)
· 模糊 sigma:默认 0.4
· 胶片颗粒强度:默认 12
· 饱和度偏移:默认 -0.12
· 色温偏移:默认 +0.03
· 帧混合帧数:默认 2
3.2 层1:导演层
职责:接收自然语言故事,输出统一分镜Schema。
可替换性:任何导演系统,只要输出符合统一分镜Schema的JSON,即可接入。若输出格式不同,需写薄适配器转换。
导演系统输入:
```json
{
"story": "我住院第三天,躺在病床上录了一段……",
"content_type": "personal_vlog",
"template_id": "vlog_hospital_001",
"global_anchors": {
"character_id": "char_001",
"location_id": "loc_hospital_302",
"shooting_style": "documentary_realism"
}
}
```
当前推荐:AI Storyboard Director v5.2(支持“假设标记”,可强制保留不完美细节)。备选:clip-storyboard-director(4D持久化缓冲区,跨场景一致性最强)。
3.3 层2:编排层(n8n)
部署:本地 Docker,端口 5678。
工作流设计:
```
[Webhook触发]
→ [读取分镜Schema JSON]
→ [循环每条shot]
→ [Switch节点:按type分发]
├─ type == "talking_head" → [HTTP Request: 口播API]
├─ type == "action" → [HTTP Request: 动作API]
├─ type == "background" → [HTTP Request: 背景API]
├─ type == "comfyui" → [HTTP Request: RunningHub API]
├─ type == "vfx" → [HTTP Request: 特效API]
└─ type == "3d_character" → [HTTP Request: 混元3D API]
→ [等待任务完成(轮询)]
→ [下载输出片段到本地临时目录]
→ [FFmpeg节点:去AI化处理链]
→ [FFmpeg节点:拼接所有片段]
→ [输出成片mp4到指定目录]
→ [回调控制台更新任务状态]
```
3.4 层3:能力层
统一接口约定:所有能力API返回格式统一为:
```json
{
"status": "success",
"video_url": "https://.../output.mp4",
"duration": 8.0,
"format": "mp4",
"error": null
}
```
各模块调用方式:
模块 API 调用方式 关键参数
TTS Fish Audio POST /v1/tts text, voice_id, emotion_tags
口播 D-ID POST /talks source_url, script.audio_url, config.sentiment
动作 可灵 POST /v1/videos image_url, prompt, camera_control
背景 通义万相 POST /api/v1/video prompt, size, seconds
ComfyUI RunningHub POST /api/v1/workflow workflow_id, node_overrides
3D角色 混元3D SubmitHunyuanTo3DProJob Prompt/ImageUrl, ViewImage
子弹时间 万兴天幕 POST /api/v1/vfx image_url, effect_type
运镜 可灵 camera_control参数 pan/tilt/roll/zoom ∈ [-10,10]
运镜 海螺AI 嵌套指令 环绕+降速+焦点锁定
四、统一分镜 Schema(标准接口)
src/schemas.py:
```python
from pydantic import BaseModel, Field
from typing import List, Optional, Literal
class GlobalAnchors(BaseModel):
character_id: str
character_3d_id: Optional[str] = None
location_id: str
product_id: Optional[str] = None
wardrobe: str
lighting_state: str
camera_lens: str
shooting_style: str = "documentary_realism"
consistency_seed: int = 42
class ShotContract(BaseModel):
shot_size: str
angle: str
camera_move: str
lens_feel: str
depth_of_field: str
frame_rate_feel: str
class VFXConfig(BaseModel):
vfx_id: Optional[str] = None
vfx_type: Optional[Literal["bullet_time", "orbit", "slow_motion",
"focus_lock", "custom"]] = None
provider: Optional[str] = None
params: Optional[dict] = None
class ExpressionDetail(BaseModel):
eyes: Optional[str] = None
mouth: Optional[str] = None
brow: Optional[str] = None
class SFX(BaseModel):
id: str
at_second: float
volume: float = 0.4
class AudioConfig(BaseModel):
voice_volume: float = 1.0
bgm_id: Optional[str] = None
bgm_volume: float = 0.15
bgm_fade_in: float = 1.0
bgm_fade_out: float = 1.0
sfx: List[SFX] = []
audio_cue: Optional[str] = None
denoise: bool = False
class Subtitle(BaseModel):
enabled: bool = True
text: str
style: str = "手机系统默认"
position: str = "bottom_center"
class Transition(BaseModel):
type: Literal["cut", "dissolve", "fade", "wipe"] = "cut"
duration: float = 0
class Speed(BaseModel):
factor: float = 1.0
ramp: Optional[str] = None
class ColorConfig(BaseModel):
lut: Optional[str] = None
saturation_offset: float = -0.12
temperature_shift: float = 0.03
class PostProcess(BaseModel):
grain_intensity: int = 12
blur_sigma: float = 0.4
frame_interpolation: bool = False
class OutputConfig(BaseModel):
resolution: str = "1080x1920"
fps: int = 30
bitrate: str = "8M"
class Shot(BaseModel):
shot_id: str
scene_id: str
duration: float
type: Literal["talking_head", "action", "background",
"comfyui", "vfx", "3d_character"]
character_id: str
character_3d_id: Optional[str] = None
location_id: str
product_id: Optional[str] = None
product_focus: bool = False
product_placement: Optional[str] = None
props: List[str] = []
continuity_mode: Literal[
"fresh_location",
"previous_frame_continuation",
"location_reappearance"
]
shot_contract: ShotContract
vfx: Optional[VFXConfig] = None
visual_description: str
text: Optional[str] = None
sentiment: Optional[str] = None
expression_detail: Optional[ExpressionDetail] = None
action: Optional[str] = None
audio: Optional[AudioConfig] = None
subtitle: Optional[Subtitle] = None
transition_in: Transition = Transition()
transition_out: Transition = Transition()
speed: Speed = Speed()
color: ColorConfig = ColorConfig()
post_process: PostProcess = PostProcess()
output: OutputConfig = OutputConfig()
class Storyboard(BaseModel):
project_id: str
schema_version: str = "2.0"
global_anchors: GlobalAnchors
shots: List[Shot]
```
特效参数示例(vfx字段):
```json
{
"vfx": {
"vfx_id": "vfx_bullet_time_01",
"vfx_type": "bullet_time",
"provider": "wondershare_tianmu",
"params": {
"source_image": "keyframe_01.png",
"duration": 3.0,
"freeze_radius": 0.5
}
}
}
```
可灵环绕运镜参数(写入shot_contract.camera_move或vfx.params):
可灵的camera_control支持六种运镜参数,取值范围均为[-10, 10]:horizontal(水平平移)、vertical(垂直平移)、pan(水平摇镜,绕y轴旋转)、tilt(垂直摇镜,绕x轴)、roll(旋转运镜,绕z轴)、zoom(变焦)。同时支持预定义运镜类型:simple、down_back(下移拉远)、forward_up(推进上移)、right_turn_forward(右旋推进)、left_turn_forward(左旋推进)。导演可在控制台选择预定义类型或手动指定六参数组合。
五、资产库规范
目录结构:
```
assets/
├── characters/
│ └── char_001/
│ ├── reference.png
│ ├── reference_side.png
│ ├── reference_full.png
│ ├── lora.safetensors
│ ├── voice_sample.mp3
│ └── meta.json
├── characters_3d/
│ └── char_001_3d/
│ ├── model.glb
│ ├── model.fbx
│ ├── texture/
│ ├── rig_info.json
│ └── meta.json
├── locations/
│ └── loc_hospital_302/
│ ├── reference.png
│ ├── reference_video.mp4
│ └── meta.json
├── real_locations/
│ └── loc_cafe_01/
│ ├── reference_wide.jpg
│ ├── reference_detail.jpg
│ ├── reference_light.jpg
│ ├── reference_video.mp4
│ └── meta.json
├── products/
│ └── prod_skin_cream/
│ ├── reference_front.png
│ ├── reference_angle.png
│ ├── reference_detail.png
│ ├── reference_in_hand.png
│ └── meta.json
├── props/
├── bgm/
├── sfx/
└── vfx_presets/
├── bullet_time.yaml
├── orbit.yaml
└── slow_motion.yaml
```
角色3D元数据(meta.json) :
```json
{
"id": "char_001_3d",
"name": "患者A-3D",
"source_tool": "hunyuan_3d",
"model_formats": ["glb", "fbx"],
"rigged": true,
"rig_type": "humanoid",
"reference_2d_id": "char_001",
"consistency_seed": 42,
"created_at": "2026-10-01"
}
```
产品元数据:
```json
{
"id": "prod_skin_cream",
"name": "XX精华面霜",
"category": "护肤品",
"must_keep": ["瓶身标签文字", "瓶盖金色边框", "整体配色"],
"reference_images": {
"front": "reference_front.png",
"angle": "reference_angle.png",
"detail": "reference_detail.png",
"in_hand": "reference_in_hand.png"
},
"consistency_seed": 88
}
```
调用方式:分镜Schema中通过 character_id、character_3d_id、location_id、product_id、props、bgm_id、sfx.id、vfx.vfx_id 引用。n8n根据ID从资产库读取文件路径,注入API请求。
六、3D角色生产模块
功能:导演上传角色概念图,系统自动生成多视图+骨骼绑定3D模型,存入资产库,后续分镜通过 character_3d_id 引用。
调用流程:
```
导演上传正面概念图
↓ 控制台 → FastAPI → 混元3D API
混元3D SubmitHunyuanTo3DProJob
↓ 传入 Prompt/ImageUrl + ViewImage(多视角图片)
返回 JobId → 轮询 DescribeProfileTo3DJob
↓ Status == DONE
获得 File3D(OBJ/GLB格式,含Url和PreviewImageUrl)
↓ 下载到 assets/characters_3d/
自动绑定骨骼(混元3D内置AutoRigging)
↓ 存入资产库
后续分镜通过 character_3d_id 引用
```
混元3D API关键参数:
· 输入:Prompt(文本)或 ImageUrl(图片URL,有效期24小时)或 ViewImage(多视角图片,支持back/left/right)
· 输出:File3D 数组,包含 Type(文件格式)、Url(文件URL)、PreviewImageUrl(预览图)
· 任务查询:DescribeProfileTo3DJob 返回 Status(WAIT/RUN/FAIL/DONE)和 ResultFile3Ds
· 支持接口:SubmitHunyuanTo3DProJob(专业版)、SubmitHunyuanTo3DRapidJob(极速版)、SubmitAutoRiggingJob(自动骨骼绑定)
七、特效运镜库
7.1 子弹时间
提供商 调用方式 关键参数
万兴天幕 POST /api/v1/vfx image_url, effect_type="bullet_time", duration
可灵 camera_control参数组合 pan ∈ [-10,10], roll ∈ [-10,10], zoom
海螺AI T2V-01-Director模型 内置Bullet Time模板,自动应用时间凝滞+环绕视角
ComfyUI RunningHub工作流 VFX-Bullet Time Effect工作流,两阶段渲染
万兴天幕的“子弹时间”特效支持单张静态图片一键生成影视级动态视频,无需复杂拍摄,且已开放API接口支持MCP协议。海螺AI的T2V-01-Director模型预置了标准化运镜模组,调用内置Bullet Time模板即可触发基础子弹时间逻辑,系统自动应用时间凝滞+环绕视角参数。
7.2 环绕运镜
可灵支持精细的环绕运镜控制。预定义类型中,right_turn_forward 实现“先右旋转后前进”,left_turn_forward 实现“先左旋并前进”。手动模式下可通过 pan 参数实现水平面上的旋转,pan 负值表示绕y轴向左旋转,正值表示向右旋转,取值范围[-10, 10]。
7.3 慢动作/升格
可灵的 frame_rate_feel 参数控制帧率感觉。海螺AI支持嵌套运镜指令,将“环绕+降速+焦点锁定”三重动作按时间顺序嵌套至提示词中。
7.4 特效库的导演操作方式
导演在控制台分镜编辑页面中,每条镜头可展开“特效”面板:
1. 从下拉菜单选择特效类型(子弹时间/环绕/慢动作/焦点锁定/自定义)
2. 选择提供商(万兴天幕/可灵/海螺AI/ComfyUI)
3. 填写参数表单(根据特效类型动态显示)
4. 点击“预览”可调用测试API生成样片
5. 确认后,参数写入分镜Schema的 vfx 字段
八、去AI化处理链
de_ai.py:
```python
class DeAIProcessor:
def process(self, input_path: str, output_path: str,
params: PostProcess, color: ColorConfig):
"""
按顺序执行:
1. gblur sigma={blur_sigma} # 消除AI边缘锐利感
2. noise alls={grain_intensity}:allf=t+u # 添加真实传感器噪点
3. eq saturation={1+saturation_offset} # 饱和度降低
4. curves=all='0/0 0.5/0.55 1/1' # S曲线拉反差
5. colortemperature=temperature=5300 # 色温偏移
"""
```
FFmpeg命令模板:
```bash
ffmpeg -i input.mp4 \
-vf "gblur=sigma=0.4,noise=alls=12:allf=t+u,\
eq=saturation=0.88,curves=all='0/0 0.5/0.55 1/1',\
colortemperature=temperature=5300" \
-c:v libx264 -preset medium -crf 18 \
output.mp4
```
拼接:所有处理后的片段用 concat 滤镜拼接,输出最终mp4。
九、FastAPI入口
端点列表:
方法 路径 功能
POST /api/director/generate 输入故事,返回分镜Schema
POST /api/task/submit 提交分镜,返回task_id
GET /api/task/{task_id} 查询任务状态
POST /api/task/{task_id}/retry 重试某镜头
GET /api/assets/characters 列出所有角色
POST /api/assets/characters 上传角色
GET /api/assets/characters_3d 列出3D角色
POST /api/assets/characters_3d/generate 调用混元3D生成角色
GET /api/assets/products 列出产品资产
POST /api/assets/products 上传产品
GET /api/vfx/list 列出可用特效
POST /api/vfx/preview 生成特效样片
GET /api/output/{project_id} 列出成片
GET /api/config/providers 获取当前提供商配置
PUT /api/config/providers 切换提供商
十、部署说明
10.1 本地环境
组件 部署方式 端口 备注
n8n Docker 5678 挂载 ~/dcs/n8n
Appsmith Docker 80 挂载 ~/dcs/appsmith
FastAPI Docker 8000 挂载 assets/output/temp/config
FFmpeg 本地安装 — brew install ffmpeg / apt install ffmpeg
资产库 本地文件夹 — ~/dcs/assets
导演系统 本地脚本或远端API — 包装为FastAPI端点
10.2 Docker Compose
```yaml
version: '3.8'
services:
n8n:
image: n8nio/n8n
ports:
- "5678:5678"
volumes:
- ./n8n:/home/node/.n8n
environment:
- N8N_BASIC_AUTH_ACTIVE=true
- N8N_BASIC_AUTH_USER=admin
- N8N_BASIC_AUTH_PASSWORD=admin
appsmith:
image: appsmith/appsmith-ce
ports:
- "80:80"
volumes:
- ./appsmith:/appsmith-stacks
api:
build: .
ports:
- "8000:8000"
volumes:
- ./assets:/app/assets
- ./output:/app/output
- ./temp:/app/temp
- ./config:/app/config
env_file:
- .env
depends_on:
- n8n
```
10.3 远程访问
Tailscale:本地机器和其他设备安装Tailscale,登录同一账号。访问 http://<Tailscale IP>:80(Appsmith)和 http://<Tailscale IP>:5678(n8n)。
十一、环境变量清单
```bash
# ========== 导演系统 ==========
DIRECTOR_TYPE=storyboard_director_v52
# ========== TTS ==========
TTS_PROVIDER=fish_audio
FISH_AUDIO_API_KEY=
FISH_AUDIO_VOICE_ID=
ELEVENLABS_API_KEY=
# ========== 口播视频 ==========
TALKING_HEAD_PROVIDER=d_id
D_ID_API_KEY=
D_ID_AVATAR_ID=
HEYGEN_API_KEY=
# ========== 动作视频 ==========
ACTION_PROVIDER=kling
KLING_API_KEY=
KLING_API_SECRET=
WAN_ANIMATE_API_KEY=
# ========== 背景视频 ==========
BACKGROUND_PROVIDER=tongyi_wanxiang
TONGYI_API_KEY=
SORA_API_KEY=
# ========== ComfyUI ==========
COMFYUI_PROVIDER=runninghub
RUNNINGHUB_API_KEY=
RUNNINGHUB_WORKFLOW_ID=
# ========== 3D角色 ==========
CHARACTER_3D_PROVIDER=hunyuan_3d
HUNYUAN_3D_SECRET_ID=
HUNYUAN_3D_SECRET_KEY=
HUNYUAN_3D_REGION=ap-guangzhou
# ========== 特效 ==========
VFX_BULLET_TIME_PROVIDER=wondershare_tianmu
WONDERSHARE_TIANMU_API_KEY=
VFX_CAMERA_PROVIDER=kling
# 可灵camera_control参数在分镜Schema中动态传入
# ========== 本地路径 ==========
ASSETS_DIR=./assets
OUTPUT_DIR=./output
TEMP_DIR=./temp
# ========== 去AI化默认参数 ==========
DEAI_BLUR_SIGMA=0.4
DEAI_GRAIN_INTENSITY=12
DEAI_SATURATION_OFFSET=-0.12
DEAI_TEMPERATURE_SHIFT=0.03
DEAI_FRAME_BLEND=2
# ========== 服务端口 ==========
API_PORT=8000
N8N_PORT=5678
APPSMITH_PORT=80
```
十二、项目目录结构
```
dcs/
├── README.md
├── docker-compose.yml
├── .env.example
├── requirements.txt
├── start.sh
├── stop.sh
│
├── config/
│ ├── providers.yaml
│ ├── templates/
│ │ ├── vlog_hospital.yaml
│ │ ├── product_ad.yaml
│ │ └── daily_diary.yaml
│ └── post_process.yaml
│
├── assets/
│ ├── characters/
│ ├── characters_3d/
│ ├── locations/
│ ├── real_locations/
│ ├── products/
│ ├── props/
│ ├── bgm/
│ ├── sfx/
│ └── vfx_presets/
│
├── src/
│ ├── main.py
│ ├── schemas.py
│ │
│ ├── director/
│ │ ├── base.py
│ │ ├── storyboard_director.py
│ │ └── adapter.py
│ │
│ ├── orchestrator/
│ │ ├── dispatcher.py
│ │ └── task_manager.py
│ │
│ ├── providers/
│ │ ├── base.py
│ │ ├── tts/
│ │ │ ├── fish_audio.py
│ │ │ └── elevenlabs.py
│ │ ├── talking_head/
│ │ │ ├── d_id.py
│ │ │ └── heygen.py
│ │ ├── action/
│ │ │ ├── kling.py
│ │ │ └── wan_animate.py
│ │ ├── background/
│ │ │ ├── tongyi_wanxiang.py
│ │ │ └── sora.py
│ │ ├── comfyui/
│ │ │ └── runninghub.py
│ │ ├── character_3d/
│ │ │ ├── hunyuan_3d.py
│ │ │ └── flow_studio.py
│ │ └── vfx/
│ │ ├── wondershare_tianmu.py
│ │ ├── hailuo.py
│ │ └── kling_vfx.py
│ │
│ ├── compositor/
│ │ ├── de_ai.py
│ │ ├── concat.py
│ │ └── ffmpeg_utils.py
│ │
│ ├── assets_manager/
│ │ ├── loader.py
│ │ └── validator.py
│ │
│ └── utils/
│ ├── logger.py
│ ├── retry.py
│ └── file_utils.py
│
├── n8n/
│ └── workflow.json
│
├── appsmith/
│ └── application.json
│
├── output/
├── temp/
│
└── tests/
├── test_schemas.py
├── test_director.py
├── test_providers.py
├── test_compositor.py
└── fixtures/
└── sample_storyboard.json
```
十三、开发路线图
阶段 目标 交付物
阶段1:手动验证 用现有API跑通一条20秒测试片 分镜JSON、测试视频、去AI化参数
阶段2:本地环境 部署n8n + Appsmith + FFmpeg 可访问的控制台
阶段3:导演系统接入 导演系统输出统一Schema 分镜编辑页面可用
阶段4:n8n工作流 串联TTS+口播+背景+FFmpeg 自动生成第一条成片
阶段5:3D角色+特效 接入混元3D + 万兴天幕/可灵运镜 3D角色和特效可用
阶段6:ComfyUI接入 RunningHub API调用 精细控制镜头
阶段7:批量生产 循环分镜表,批量输出 批量任务队列
阶段8:优化迭代 调参、换API、迁移服务器 稳定生产系统
十四、AI编程工具执行清单
```
请按以下顺序生成项目代码:
1. 创建项目根目录结构(mkdir -p dcs/src/...)
2. requirements.txt(fastapi, uvicorn, pydantic, requests, pyyaml, ffmpeg-python)
3. .env.example(按第十一节)
4. src/schemas.py(按第四节)
5. src/director/base.py + storyboard_director.py + adapter.py
6. src/providers/base.py
7. src/providers/tts/fish_audio.py
8. src/providers/talking_head/d_id.py
9. src/providers/action/kling.py(含camera_control参数支持)
10. src/providers/background/tongyi_wanxiang.py
11. src/providers/comfyui/runninghub.py
12. src/providers/character_3d/hunyuan_3d.py
13. src/providers/vfx/wondershare_tianmu.py
14. src/providers/vfx/hailuo.py
15. src/providers/vfx/kling_vfx.py
16. src/compositor/de_ai.py + concat.py + ffmpeg_utils.py
17. src/assets_manager/loader.py + validator.py
18. src/orchestrator/dispatcher.py + task_manager.py
19. src/main.py
20. src/utils/logger.py + retry.py
21. docker-compose.yml
22. start.sh
23. config/providers.yaml + templates/vlog_hospital.yaml
24. tests/test_schemas.py + fixtures/sample_storyboard.json
25. n8n/workflow.json
26. appsmith/application.json(可先留框架)
生成后运行 pytest 确保测试通过。
所有API Key从环境变量读取,不硬编码。
所有异步API调用使用统一的 poll_until_complete 轮询逻辑。
所有Provider继承 BaseProvider,实现 generate(shot, assets) -> dict 方法。
```
十五、需团队手动完成的事项
事项 操作
注册API Fish Audio、D-ID、可灵、通义万相、RunningHub、混元3D、万兴天幕
填写.env 把Key填入.env文件
导入n8n工作流 n8n界面 → Import from File
导入Appsmith应用 Appsmith界面 → Import Application
准备角色参考图 放入assets/characters/char_001/
准备产品参考图 放入assets/products/
在RunningHub搭建工作流 导入社区工作流或手动搭建,发布为API工作流
跑第一条测试 在控制台输入故事,点击生成
十六、导演操作流程(日常使用)
```
1. 打开浏览器 → http://localhost
2. 在分镜编辑页输入故事大纲
3. 选择内容类型(产品广告/个人日记/场景短剧)
4. 选择角色(2D参考图 或 3D绑定模型)
5. 选择场景/场地/产品
6. 点击“生成分镜” → 导演系统返回分镜表
7. 逐条检查/修改 → 可添加特效(子弹时间/环绕运镜等)
8. 点击“提交任务”
9. n8n自动调用各API生成片段
10. FFmpeg自动去AI化+拼接
11. 刷新页面 → 预览成片
12. 不满意 → 修改对应镜头参数 → 重试单条
```