init: video-create project with skills and accounts
This commit is contained in:
181
.claude/skills/video-from-script/references/account-system.md
Normal file
181
.claude/skills/video-from-script/references/account-system.md
Normal file
@@ -0,0 +1,181 @@
|
||||
# 账号系统规范
|
||||
|
||||
> 每个账号独立管理视觉风格、提示词策略和 CapCut 配置。
|
||||
> 一个账号可以有多种视觉风格,每种风格是一个独立的 style 文件。
|
||||
|
||||
---
|
||||
|
||||
## 目录结构
|
||||
|
||||
```
|
||||
accounts/
|
||||
├── _template/ # 新账号模板(复制此目录创建新账号)
|
||||
│ ├── account.json
|
||||
│ ├── references/ # 参考图目录
|
||||
│ │ └── .gitkeep
|
||||
│ └── styles/ # 风格文件目录(可多个)
|
||||
│ └── .gitkeep
|
||||
└── {account_id}/ # 用户创建的账号
|
||||
├── account.json
|
||||
├── references/ # 参考图(所有风格共用)
|
||||
│ ├── ref_001.png
|
||||
│ └── ref_002.png
|
||||
└── styles/ # 风格文件(一个文件 = 一种视觉风格)
|
||||
├── cyberpunk-character.md
|
||||
├── dark-archive.md
|
||||
└── neon-city.md
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## account.json 字段说明
|
||||
|
||||
```json
|
||||
{
|
||||
"id": "tech-talk",
|
||||
"name": "科技解说",
|
||||
"description": "科技类短视频账号,深色背景,赛博朋克风格",
|
||||
"pipeline": "image-video", // 已废弃,保留不影响
|
||||
"imageModel": "gemini",
|
||||
"videoModel": "kling",
|
||||
"batchSize": 30,
|
||||
"capcut": {
|
||||
"effects": ["录制边框 III"],
|
||||
"filter": "电影感:40",
|
||||
"subtitleStyle": {
|
||||
"fontSize": 36,
|
||||
"color": "#FFFFFF",
|
||||
"highlightColor": "#FF6B35",
|
||||
"bold": true
|
||||
},
|
||||
"defaultBGM": "https://example.com/bgm_tech.mp3"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
| 字段 | 类型 | 说明 |
|
||||
|------|------|------|
|
||||
| `id` | string | 账号唯一标识(与目录名一致) |
|
||||
| `name` | string | 账号显示名 |
|
||||
| `description` | string | 一句话描述 |
|
||||
| `pipeline` | enum | `image-only` / `image-video` |
|
||||
| `defaultFormat` | string | 默认画幅(9:16 / 16:9 / 1:1 / 4:3) |
|
||||
| `imageModel` | string | 默认图片模型 |
|
||||
| `videoModel` | string | 默认视频模型 |
|
||||
| `batchSize` | number | 默认批量生成数量 |
|
||||
| `capcut.effects` | string[] | CapCut 特效名称列表 |
|
||||
| `capcut.filter` | string | CapCut 滤镜,格式 "名称:强度" |
|
||||
| `capcut.subtitleStyle` | object | 字幕样式(字号、颜色、高亮色、加粗) |
|
||||
| `capcut.defaultBGM` | string | 默认背景音乐 URL |
|
||||
|
||||
---
|
||||
|
||||
## 风格文件(styles/)
|
||||
|
||||
每种视觉风格一个文件,文件名即风格名。文件内同时包含图片和视频的提示词策略。
|
||||
|
||||
### 风格文件结构
|
||||
|
||||
```markdown
|
||||
# 风格名称(英文短横线命名)
|
||||
|
||||
一句话描述风格。
|
||||
|
||||
---
|
||||
|
||||
## 图片提示词
|
||||
|
||||
### 核心视觉要素
|
||||
<!-- 必选的视觉元素 -->
|
||||
|
||||
### 场景/背景规则
|
||||
<!-- 背景要求 -->
|
||||
|
||||
### 色调方案
|
||||
<!-- 可选的色彩组合 -->
|
||||
|
||||
### 构图模式
|
||||
<!-- 支持的构图类型 -->
|
||||
|
||||
### 图片 Prompt 模板
|
||||
<!-- 生成 prompt 时的固定结构 -->
|
||||
|
||||
### 示例
|
||||
<!-- 2-3 个完整示例 -->
|
||||
|
||||
### MJ/Gemini 参数
|
||||
<!-- 模型专用后缀参数 -->
|
||||
|
||||
### 图片禁止项
|
||||
<!-- 不得出现的元素 -->
|
||||
|
||||
---
|
||||
|
||||
## 视频提示词
|
||||
|
||||
### 运镜规则
|
||||
<!-- 运镜方式、节奏 -->
|
||||
|
||||
### 动态元素要求
|
||||
<!-- 光影、角色动作、环境氛围 -->
|
||||
|
||||
### 视频 Prompt 模板
|
||||
<!-- VEO/Grok prompt 结构 -->
|
||||
|
||||
### 示例
|
||||
<!-- 2-3 个完整示例 -->
|
||||
|
||||
### VEO/Grok 后缀
|
||||
<!-- 模型专用后缀 -->
|
||||
|
||||
### 视频禁止项
|
||||
<!-- 不得出现的元素 -->
|
||||
```
|
||||
|
||||
### 风格文件命名
|
||||
|
||||
使用英文短横线命名,描述性强:
|
||||
- `cyberpunk-eastern-character.md` — 赛博东方角色
|
||||
- `dark-forbidden-archive.md` — 暗黑禁书档案
|
||||
- `neon-cityscape.md` — 霓虹城市
|
||||
- `ink-wash-landscape.md` — 水墨山水
|
||||
|
||||
---
|
||||
|
||||
## 创建新账号
|
||||
|
||||
### 一键创建(推荐)
|
||||
|
||||
```bash
|
||||
node scripts/pipeline.js create-account \
|
||||
--id military \
|
||||
--name "军事账号" \
|
||||
--desc "军事主题短视频,暗黑漫画风格" \
|
||||
--video-model veo3-fast \
|
||||
--references ./ref1.png,./ref2.png
|
||||
```
|
||||
|
||||
自动完成:创建目录 → 生成 account.json → 复制参考图 → 上传 OSS → 回写 URL → 生成风格骨架。
|
||||
|
||||
### 手动创建
|
||||
|
||||
1. 复制 `_template/` 目录,重命名为账号 ID
|
||||
2. 编辑 `account.json` 填写账号信息
|
||||
3. 在 `references/` 中放入参考图(所有风格共用)
|
||||
4. 上传参考图到 OSS,URL 写入 account.json:
|
||||
- `node scripts/oss-upload.js accounts/{id}/references/{图片文件}`
|
||||
- 将返回的 URL 写入 `styles.{styleName}.references[].url`
|
||||
5. 在 `styles/` 中创建风格文件(至少一个)
|
||||
|
||||
### 校验账号
|
||||
|
||||
```bash
|
||||
node scripts/pipeline.js validate-account --account military
|
||||
```
|
||||
|
||||
检查:id 匹配、必填字段、参考图完整性、风格文件存在、OSS URL 有效。
|
||||
|
||||
## 添加新风格
|
||||
|
||||
在账号的 `styles/` 目录下新建 `.md` 文件即可,文件名即风格 ID。
|
||||
Claude 调用时指定风格名,如 "用 cyberpunk-eastern-character 风格"。
|
||||
108
.claude/skills/video-from-script/references/manifest-schema.md
Normal file
108
.claude/skills/video-from-script/references/manifest-schema.md
Normal file
@@ -0,0 +1,108 @@
|
||||
# manifest.json 规范
|
||||
|
||||
> `pipeline.js init` 创建,Pipeline 执行,Agent 审查。
|
||||
>
|
||||
> **禁止 AI 手写 manifest.json**,必须通过 `pipeline.js init` 初始化。脚本从 account.json 自动继承结构字段,AI 只提供创意内容(items 的 text/imagePrompt/videoPrompt/keyword)。
|
||||
|
||||
---
|
||||
|
||||
## 创建方式
|
||||
|
||||
```bash
|
||||
# AI 生成创意内容后,通过脚本初始化
|
||||
node pipeline.js init --account military --mode single \
|
||||
--items '[{"text":"中文文案","imagePrompt":"English prompt","videoPrompt":"motion prompt","keyword":"关键词","keywordColor":"#FF6B35"}]'
|
||||
|
||||
# 或从文件读取
|
||||
node pipeline.js init --account military --mode single --items-file ./items.json
|
||||
|
||||
# 校验已有 manifest
|
||||
node pipeline.js validate --manifest <path>
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 顶层字段
|
||||
|
||||
| 字段 | 说明 | 来源 | 谁填充 |
|
||||
|------|------|------|--------|
|
||||
| `account` | 账号 ID | account.json | **init 自动** |
|
||||
| `imageModel` | `gemini` / `mj` | account.json | **init 自动** |
|
||||
| `videoModel` | `veo3-fast` / `grok-video-3` 等 | account.json | **init 自动** |
|
||||
| `format` | 画幅:`9:16` / `16:9` | account.json | **init 自动** |
|
||||
| `mode` | `single` 单图 / `framePair` 首尾帧 | CLI 参数 | **init 自动** |
|
||||
| `references` | 参考图数组,从 account.json styles.*.references 搬入 | account.json | **init 自动** |
|
||||
| `items` | 素材数组(AI 提供创意内容) | CLI --items | **AI → init** |
|
||||
|
||||
**init 自动继承的字段不需要 AI 关心,不会出错。**
|
||||
|
||||
---
|
||||
|
||||
## references 字段
|
||||
|
||||
从 account.json 搬入,pipeline 直接使用,不再回读 account.json。
|
||||
|
||||
- **Gemini** → 读 `file`(本地路径,图生图用)
|
||||
- **MJ** → 读 `url`(公网 URL,`--sref` 用)
|
||||
|
||||
---
|
||||
|
||||
## items[] 字段
|
||||
|
||||
### Agent 写入(创建时)
|
||||
|
||||
| 字段 | 说明 |
|
||||
|------|------|
|
||||
| `status` | 固定写 `"pending"` |
|
||||
| `text` | 中文字幕文案 |
|
||||
| `imagePrompt` | 英文画面描述(给 Gemini/MJ) |
|
||||
| `videoPrompt` | 英文运动描述(给 Grok/VEO),描述镜头运动而非内容 |
|
||||
| `keyword` | 字幕高亮关键词 |
|
||||
| `keywordColor` | 高亮颜色 |
|
||||
|
||||
### Pipeline 回写(执行后)
|
||||
|
||||
| 字段 | 说明 | 写入阶段 |
|
||||
|------|------|---------|
|
||||
| `status` | `pending` → `generating` → `done` / `failed` | images |
|
||||
| `file` | 生成的图片路径(相对 manifest) | images |
|
||||
| `candidates` | MJ 拆分的 4 张候选图路径(Gemini 无此字段) | images |
|
||||
| `url` | 图片 OSS 公网 URL | upload |
|
||||
| `video` | 生成的视频路径 | videos |
|
||||
| `videoDuration` | 视频时长(秒),Grok=6, VEO=8 | videos |
|
||||
| `videoUrl` | 视频 OSS 公网 URL | videos |
|
||||
| `audio` | TTS 音频路径 | tts |
|
||||
| `duration` | 音频时长(秒) | tts |
|
||||
|
||||
### Agent 审查时可操作
|
||||
|
||||
- MJ 换选:`item.file = item.candidates[2]`
|
||||
- 删除不合格 item:直接从 items 数组移除,重新跑 `--phase images`
|
||||
- 调整 prompt 重跑:改 `imagePrompt`,status 改回 `pending`
|
||||
|
||||
---
|
||||
|
||||
## 首尾帧模式
|
||||
|
||||
`mode: "framePair"` 时,`imagePrompt` 作为起始帧,每个 item 额外字段:
|
||||
|
||||
| 字段 | 说明 | 谁填充 |
|
||||
|------|------|--------|
|
||||
| `imagePrompt` | 起始帧画面描述(与 single 模式复用同一字段) | AI |
|
||||
| `lastFramePrompt` | 结束帧画面描述 | AI |
|
||||
| `lastFrame` | 结束帧图片路径 | **pipeline images 回写** |
|
||||
| `lastFrameUrl` | 结束帧 OSS URL | **pipeline upload 回写** |
|
||||
|
||||
**首尾帧规则**:同一场景、视角一致、状态对比。VEO 检测到 `lastFrameUrl` 自动启用双图模式。
|
||||
|
||||
---
|
||||
|
||||
## 目录结构
|
||||
|
||||
```
|
||||
output/{account}_{YYYYMMDD}_{NNN}/
|
||||
├── manifest.json # 主清单
|
||||
├── images/ # scene_{NN}_{keyword}.jpeg(首尾帧加 _last,MJ 候选加 _cand{1-4})
|
||||
├── videos/ # scene_{NN}_{keyword}.mp4
|
||||
└── audio/ # seg_001.mp3
|
||||
```
|
||||
Reference in New Issue
Block a user