# CapCut 成片组装

> 将图片/视频素材通过 CapCut 组装为成品视频。支持配音、字幕、特效、音乐、云渲染。

- **触发词**: 图片成片、视频合成、剪映成片、CapCut 渲染

---

## 前置条件

```
1. CapCut Mate API 可达 → curl {config.capcutMateApiBase}/../docs
   - 部署在 capcut.muyetools.cn（配置在 skills/config.json）
2. npm 依赖            → cd scripts && npm install
3. TTS 配音            → 阿里云 CosyVoice TTS（配置在 config.json 的 ttsApiKey）
4. 同步到本地剪映       → 纯 Node.js（sync-to-jianying.js），无需 Python/uv
```

所有路径和 API 地址统一从 `skills/config.json` 读取。

---

## CLI 接口（快速开始）

```bash
node scripts/capcut_assemble.js \
  --input ./output/batch_xxx \
  --manifest ./output/batch_xxx/manifest.json \
  --mode images|videos \
  --subtitles true \
  --bgm <url> \
  --effects "录制边框 III,雪花" \
  --filter "电影感:50" \
  --format 9:16 \
  --output ./output/final/
```

| 参数 | 必填 | 说明 |
|------|------|------|
| `--input` | 是 | 素材目录 |
| `--manifest` | 是 | manifest.json 路径 |
| `--mode` | 是 | `images` 或 `videos` |
| `--subtitles` | 否 | 是否添加字幕（默认 true） |
| `--bgm` | 否 | 背景音乐 URL（默认取账号配置） |
| `--effects` | 否 | 特效名称，逗号分隔 |
| `--filter` | 否 | 滤镜名称:强度 |
| `--format` | 否 | 画幅（默认取账号配置） |
| `--output` | 否 | 输出目录 |

---

## 完整流程

```dot
digraph assembly_flow {
  rankdir=LR
  node [shape=box, style=filled, fillcolor="#f5f5f5", fontsize=11]

  input [label="素材 + manifest.json", shape=folder, fillcolor="#e3f2fd"]
  step1 [label="1. TTS 配音（可选）\ncosyvoice → MP3 + 时长"]
  step2 [label="2. 上传图片到 OSS\n本地图片 → 公网 URL"]
  step3 [label="3. 创建草稿\ncreate_draft → draft_url"]
  step4 [label="4. 导入素材+音频+字幕+特效"]
  step5 [label="5. 保存草稿\nsave_draft"]
  step6 [label="6. 同步本地剪映\n下载→重写→注册→扫描"]
  step7 [label="7. 云渲染（可选）\ngen_video → 成片 MP4", fillcolor="#e8f5e9"]

  input -> step1 -> step2 -> step3 -> step4 -> step5 -> step6 -> step7
}
```

---

## 详细步骤

### 1. TTS 配音（可选）

使用阿里云 CosyVoice TTS 进行语音合成（通过 DashScope WebSocket，Node.js）。

```js
const { synthesize } = require('./qwen-tts')
const { filePath, duration } = await synthesize('文案', { voice: 'Neil', outputDir: './audio' })
// → ./audio/seg_001.mp3, duration: 3.456
```

配置在 `skills/config.json`：

| 字段 | 说明 | 默认值 |
|------|------|--------|
| `ttsApiKey` | 阿里云百炼 API Key | （必填） |
| `ttsModel` | 模型名称 | `cosyvoice-v3.5-plus` |
| `ttsVoice` | 音色名称 | 账号配置 |
| `ttsLanguage` | 语言类型 | `Chinese` |

推荐音色：

| voice 参数 | 音色名 | 风格 | 适用 |
|------|------|------|------|
| `Cherry` | 芊悦 | 阳光积极小姐姐 | 通用、生活 |
| `Serena` | 苏瑶 | 温柔小姐姐 | 情感、故事 |
| `Ethan` | 晨煦 | 阳光温暖男声 | 科技、教程 |
| `Moon` | 月白 | 率性帅气男声 | 潮流、解说 |
| `Vincent` | 田叔 | 沙哑烟嗓男声 | 军事、纪录 |
| `Kai` | 凯 | 温柔磁性男声 | 情感、配音 |
| `Neil` | 阿闻 | 新闻主持人 | 新闻、财经 |
| `Bellona` | 燕铮莺 | 洪亮有力女声 | 热血、武侠 |

所有音色均支持中英文，输出 MP3 格式（24kHz）。

**作为模块调用**：

```js
const { synthesize, synthesizeBatch } = require('./qwen-tts')

// 单段
const { filePath, duration } = await synthesize('你好世界', { voice: 'Cherry' })

// 批量
const results = await synthesizeBatch(
  [{ id: 1, text: '文案' }, { id: 2, text: '文案2' }],
  { voice: 'Cherry', outputDir: './audio' }
)
```

### 2. 图片上传

CapCut API 需要公网 URL，本地图片通过 OSS 上传：

```bash
node scripts/oss-upload.js ./image.png
# → https://i.ibb.co/xxx/image.png
```

OSS 配置在 `skills/config.json` 的 `ossRegion/ossAccessKeyId/ossAccessKeySecret/ossBucket` 中。

`capcut_assemble.js` 自动处理上传，无需手动调用。

### 3. 创建草稿

```
POST /create_draft  { width: 1080, height: 1920 }
→ 返回 draft_url（后续所有操作都需要传入）
```

### 4. 导入素材

**图片模式** (`--mode images`):

```
POST /add_images
每张图片 3-5 秒，附带动画（默认缩放）
```

**视频模式** (`--mode videos`):

```
POST /add_videos
逐个添加视频片段，自动计算时长
```

### 5. 添加音频

```
POST /add_audios
- BGM: 账号默认音乐 或 用户指定 URL
- 配音: Step 1 生成的 TTS 音频
```

### 6. 添加字幕

```
POST /add_captions
- 文案来自 manifest.json（TTS 分句时按 segment 精确对齐）
- 字体大小、颜色从账号配置读取
```

### 7. 添加特效/滤镜

```
POST /add_effects   ← account.json 中 capcut.effects
POST /add_filters   ← account.json 中 capcut.filter
```

### 8. 保存 + 同步 + 渲染

**保存草稿（服务器端）：**

```
POST /save_draft → 保存到 CapCut Mate 服务器
```

**同步到本地剪映（纯 Node.js）：**

```
sync-to-jianying.js → 下载素材文件 → 路径重写为本地 → 写入剪映草稿目录 → 注册 root_meta_info.json → 触发目录扫描
```

无需 Python/uv，`capcut_assemble.js` 自动调用。

**504 超时回退：**

add_videos 提交 9+ 视频时可能触发网关 504。脚本自动降级：
1. 先尝试全量提交
2. 504 时自动分批（每批 3 个），保持绝对时间不变


---

## 图片动画预设

| 动画名称 | 说明 | 适用场景 |
|---------|------|---------|
| 缩放 | 缓慢放大 | 默认，适合大多数场景 |
| 渐显+放大 | 淡入+放大组合 | 强调、冲击感 |
| 左平移 | 右→左平移 | 风景、全景 |
| 右平移 | 左→右平移 | 风景、全景 |

---

## 质量检查

- [ ] 字幕与文案对应正确
- [ ] 图片动画流畅（无卡顿）
- [ ] BGM 音量与配音平衡
- [ ] 转场自然（无黑帧）
- [ ] 总时长合理（建议 30-90 秒）
