init: video-create project with skills and accounts

This commit is contained in:
2026-04-29 21:04:43 +08:00
commit dadddc7aec
64 changed files with 14715 additions and 0 deletions

View File

@@ -0,0 +1,226 @@
---
name: capcut
description: 剪映/CapCut 自动化。通过 CapCut Mate API 实现草稿创建、素材导入、字幕添加、特效动画及云端渲染。支持两种模式:(1) API模式 — 单个接口调用;(2) 成片模式 — 素材目录一键组装TTS配音+字幕+特效+BGM+云渲染。触发词剪映、CapCut、视频编辑、图片成片、视频合成、成片、CapCut组装、图片轮播、配音+成片。
---
# CapCut Mate 剪映自动化
通过 CapCut Mate API 自动化剪映草稿创建、素材导入及云端渲染。
## 前置条件
使用远程 CapCut Mate API`config.capcutMateApiBase`),无需本地部署。
路径和密钥统一配置在 `skills/config.json`
视频/音频素材通过 OSS 上传获取公网 URLAPI 需要可下载的 URL
上传工具:`node .claude/skills/video-from-script/scripts/oss-upload.js`
**成片模式额外依赖:**
```
1. npm 依赖 → cd .claude/skills/video-from-script/scripts && npm install
2. TTS 配音 → 阿里云 Qwen-TTSconfig.json 中配置 ttsApiKey
```
---
## 两种使用模式
### 模式一API 模式(单接口调用)
用户给具体指令加字幕、加特效等Claude 直接调单个 API。
典型工作流:
```
1. create_draft(width, height) → draft_url
2. add_videos / add_images → 添加素材
3. add_audios → 添加配音/音乐
4. add_captions → 添加字幕(支持关键词高亮)
5. add_effects / add_keyframes → 特效和动画
6. save_draft → 保存
7. gen_video → 提交云端渲染
8. gen_video_status → 轮询进度
```
### 模式二:成片模式(一键组装)
用户给素材目录 + manifest.json走 CLI 自动流水线。
```bash
node .claude/skills/video-from-script/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` | 否 | 画幅(默认账号配置) |
**完整流程:**
```dot
digraph capcut_assembly {
rankdir=LR
node [shape=box, style=filled, fillcolor="#f5f5f5", fontsize=11]
edge [fontsize=10]
input [label="素材 + manifest.json", shape=folder, fillcolor="#e3f2fd"]
step1 [label="1. TTS 配音(可选)\nnode qwen-tts.js\n→ WAV + 时长"]
step2 [label="2. 上传图片到 OSS\n本地图片 → 公网 URL"]
step3 [label="3. 创建草稿\ncreate_draft\n→ draft_url"]
step4 [label="4. 导入素材+音频+字幕+特效\nadd_images / add_videos\nadd_audios / add_captions\nadd_effects"]
step5 [label="5. 保存草稿\nsave_draft"]
step6 [label="6. 同步本地剪映\nsync-to-jianying.js\n下载→重写→注册→扫描"]
step7 [label="7. 云渲染(可选)\ngen_video → 成片 MP4", fillcolor="#e8f5e9"]
input -> step1 -> step2 -> step3 -> step4 -> step5 -> step6 -> step7
}
```
**模式选择规则:**
- 用户提到"成片"、"组装"、"图片轮播"、"配音+成片" → 成片模式
- 用户给具体操作指令(加字幕、加特效等) → API 模式
- 不确定时 → 询问用户
---
## 通用约定
- **时间单位**: 微秒1秒 = 1,000,000
- **xxx_infos 参数**: JSON **字符串**(需 `JSON.stringify`),非对象
- **draft_url**: 创建草稿后返回,后续所有操作都需要传入
---
## 核心接口速查
| 接口 | 用途 | 关键参数 |
|------|------|----------|
| `create_draft` | 创建草稿 | width, height |
| `add_videos` | 添加视频 | video_infos (URL+时长+转场) |
| `add_images` | 添加图片 | image_infos (URL+动画+转场) |
| `add_audios` | 添加音频 | audio_infos (URL+时长) |
| `add_captions` | 添加字幕 | captions (文本+关键词高亮+时间线) |
| `add_effects` | 添加特效 | effect_infos (名称+时间线) |
| `add_keyframes` | 关键帧动画 | keyframes (segment_id+属性+值) |
| `easy_create_material` | 一站式添加 | video/img/audio/text |
| `gen_video` | 云端渲染 | draft_url + apiKey |
## 工具类接口
| 接口 | 入参 | 产出 |
|------|------|------|
| `audio_timelines` | `links: [mp3 URLs]` | 自动算时间线 |
| `audio_infos` | mp3_urls + timelines | add_audios 的 audio_infos |
| `caption_infos` | texts + timelines + keywords | add_captions 的 captions |
| `effect_infos` | effects[] + timelines | add_effects 的 effect_infos |
| `video_infos` | URLs + timelines | add_videos 的 video_infos |
| `imgs_infos` | URLs + timelines | add_images 的 image_infos |
| `get_audio_duration` | mp3_url | 音频时长(微秒) |
| `get_text_animations` | 无 | 可用文本动画列表 |
| `get_image_animations` | 无 | 可用图片动画列表 |
| `search_sticker` | 关键词 | 贴纸列表(含 sticker_id |
| `get_url` | 文本 | 提取 URL |
## 完整 API 参数文档
详细的请求参数、响应格式、字段说明见 [api-reference.md](references/api-reference.md)
---
## TTS 配音(成片模式用)
使用阿里云 Qwen-TTSNode.js替代原 Edge-TTS。
```bash
# 准备输入
echo '{"segments":[{"id":1,"text":"文案"}],"voice":"Cherry","output_dir":"./audio"}' > input.json
# 生成
node .claude/skills/video-from-script/scripts/qwen-tts.js input.json
# → stdout: {"segments":[{"id":1,"audio":"./audio/seg_001.wav","duration":3.456}]}
```
配置在 `skills/config.json``ttsApiKey`(必填)、`ttsModel``ttsVoice``ttsLanguage`
推荐音色:
| 音色 | 风格 | 适用 |
|------|------|------|
| `Cherry` | 阳光积极小姐姐 | 通用、生活 |
| `Ethan` | 阳光温暖男声 | 科技、教程 |
| `Vincent` | 沙哑烟嗓 | 军事、纪录 |
| `Neil` | 新闻主持人 | 新闻、财经 |
| `Moon` | 率性帅气男声 | 解说、潮流 |
---
## 账号配置
`account.json` 中 CapCut 相关字段:
```json
{
"capcut": {
"effects": ["录制边框 III"],
"filter": "电影感:40",
"subtitleStyle": {
"fontSize": 36,
"color": "#FFFFFF",
"highlightColor": "#FF6B35",
"bold": true
},
"defaultBGM": "https://example.com/bgm.mp3"
}
}
```
---
## 图片动画预设
| 动画 | 说明 | 适用 |
|------|------|------|
| Ken Burns (zoom-in) | 1.0→1.1 缓慢放大 | 默认 |
| Ken Burns (pan-left) | 右→左平移 | 风景 |
| Ken Burns (pan-right) | 左→右平移 | 风景 |
| 缩放弹出 | 0.8→1.0 | 强调 |
---
## 质量要求
- 字幕与文案对应正确,关键词高亮醒目
- 图片动画流畅Ken Burns 幅度 1.0→1.1
- BGM 音量不盖过配音配音为主、BGM 为辅)
- 转场自然(无黑帧、无跳帧)
- 底部字幕区不被遮挡
- 总时长 30-90 秒(保证完播率)
- 9:16 竖屏适配抖音/快手16:9 横屏适配 B 站
---
## 成片模式详细参考
完整步骤说明、API 调用细节见 [assembly-guide.md](references/assembly-guide.md)
## index.js 封装
当前 `index.js` 只封装了 3 个接口createDraft, addVideos, genVideo
调用其他接口时,直接用 axios POST 对应的 API 路径即可。

View File

@@ -0,0 +1,459 @@
# CapCut Mate API 完整参数参考
所有接口基础 URL`config.capcutMateApiBase`(如 `http://capcut.muyetools.cn/openapi/capcut-mate/v1`
时间单位:**微秒**1秒 = 1,000,000
`xxx_infos` 参数均为 **JSON 字符串**(需 `JSON.stringify`
---
## 目录
- [一、草稿管理](#一草稿管理)
- [二、视频素材](#二视频素材)
- [三、音频处理](#三音频处理)
- [四、文本字幕](#四文本字幕)
- [五、特效与动画](#五特效与动画)
- [六、视频渲染](#六视频渲染)
- [七、快速工具](#七快速工具)
---
## 一、草稿管理
### create_draft
```json
// POST /create_draft
{ "width": 1080, "height": 1920 }
// Response
{
"draft_url": "http://capcut.muyetools.cn/openapi/capcut-mate/v1/get_draft?draft_id=20251230xxx",
"tip_url": ""
}
```
### save_draft
```json
// POST /save_draft
{ "draft_url": "..." }
// Response
{ "draft_url": "...", "message": "成功" }
```
### get_draft
```json
// GET /get_draft?draft_id=xxx
// Response: 返回草稿文件列表和详细信息
```
---
## 二、视频素材
### add_videos
```json
// POST /add_videos
{
"draft_url": "...",
"video_infos": "[{\"video_url\":\"https://...\",\"width\":1920,\"height\":1080,\"start\":0,\"end\":3000000,\"duration\":6000000,\"mask\":\"\",\"transition\":\"\",\"transition_duration\":500000,\"volume\":1}]",
"alpha": 1,
"scale_x": 1,
"scale_y": 1,
"transform_x": 0,
"transform_y": 0,
"scene_timelines": []
}
// Response
{
"draft_url": "...",
"video_ids": ["9b9f47126f384a6f95434cdc3fed5b7c"],
"segment_ids": ["20285056b4194e2c8944b587ceb592a7"],
"track_id": "720274203a11442280b64570caf362c4"
}
```
**全局参数:**
| 参数 | 类型 | 必填 | 说明 |
|------|------|------|------|
| draft_url | string | 是 | 草稿 URL |
| video_infos | string(JSON) | 是 | 视频信息数组JSON 字符串) |
| alpha | number | 否 | 透明度 0-1默认 1 |
| scale_x | number | 否 | 水平缩放,默认 1 |
| scale_y | number | 否 | 垂直缩放,默认 1 |
| transform_x | number | 否 | 水平位移,默认 0 |
| transform_y | number | 否 | 垂直位移,默认 0 |
**video_infos 元素字段:**
| 字段 | 类型 | 说明 |
|------|------|------|
| video_url | string | 视频 URL |
| width | number | 宽度(像素) |
| height | number | 高度(像素) |
| start | number | 起始时间(微秒) |
| end | number | 结束时间(微秒) |
| duration | number | 总时长(微秒) |
| mask | string | 遮罩名称 |
| transition | string | 转场名称 |
| transition_duration | number | 转场时长(微秒) |
| volume | number | 音量 0-1 |
### add_images
```json
// POST /add_images
{
"draft_url": "...",
"image_infos": "[{\"image_url\":\"https://...\",\"width\":1920,\"height\":1080,\"start\":0,\"end\":5000000,\"duration\":5000000,\"animation\":\"淡入淡出\",\"transition\":\"溶解\",\"transition_duration\":500000}]",
"alpha": 1,
"scale_x": 1,
"scale_y": 1,
"transform_x": 0,
"transform_y": 0
}
// Response
{
"draft_url": "...",
"image_ids": ["fa67760440104ca3adacdfd694fc25da"],
"segment_ids": ["2d19f38d5f544eecad18847e5eac1745"],
"segment_infos": [{"id": "xxx", "start": 0, "end": 5000000}],
"track_id": "38c8dfee92374137998715329494a8f9"
}
```
**image_infos 元素字段:**
| 字段 | 类型 | 说明 |
|------|------|------|
| image_url | string | 图片 URL |
| width | number | 宽度(像素) |
| height | number | 高度(像素) |
| start | number | 起始时间(微秒) |
| end | number | 结束时间(微秒) |
| duration | number | 展示时长(微秒) |
| animation | string | 动画名称(如 "淡入淡出" |
| transition | string | 转场名称(如 "溶解" |
| transition_duration | number | 转场时长(微秒) |
### add_sticker
```json
// POST /add_sticker
{
"draft_url": "...",
"sticker_id": "7326810673609018675",
"start": 0,
"end": 5000000,
"scale": 1,
"transform_x": 0,
"transform_y": 0
}
// Response
{
"draft_url": "...",
"sticker_id": "7326810673609018675",
"segment_id": "7902e009fcfb44768f6f73e9432b5d5b",
"track_id": "10b612824bcd4dd882ab764d145dd7ce",
"duration": 5000000
}
```
---
## 三、音频处理
### add_audios
```json
// POST /add_audios
{
"draft_url": "...",
"audio_infos": "[{\"audio_url\":\"https://...\",\"duration\":23184000,\"end\":23184000,\"start\":0}]"
}
// Response
{
"draft_url": "...",
"audio_ids": ["9000bc9efb744c3196fb1d225993f43d"],
"track_id": "a2d21e5a343c4f1eba3c9234bea16658"
}
```
**audio_infos 元素字段:**
| 字段 | 类型 | 说明 |
|------|------|------|
| audio_url | string | 音频文件 URL |
| start | number | 起始时间(微秒) |
| end | number | 结束时间(微秒) |
| duration | number | 音频总时长(微秒) |
### get_audio_duration
```json
// POST /get_audio_duration
{ "mp3_url": "https://..." }
// Response
{ "duration": 284891429, "message": "成功" }
```
---
## 四、文本字幕
### add_captions
```json
// POST /add_captions
{
"draft_url": "...",
"captions": "[{\"start\":0,\"end\":10000000,\"text\":\"你好,剪映\",\"keyword\":\"好\",\"keyword_color\":\"#457616\",\"keyword_font_size\":15}]",
"font_size": 15,
"text_color": "#ffffff",
"alignment": 1,
"bold": false,
"italic": false,
"underline": false,
"has_shadow": false,
"letter_spacing": 0,
"line_spacing": 0,
"alpha": 1,
"scale_x": 1,
"scale_y": 1,
"transform_x": 0,
"transform_y": 0,
"style_text": 0
}
// Response
{
"draft_url": "...",
"text_ids": ["52ae035e01584adf8d052533d83948ed"],
"segment_ids": ["1b1102e3d2d14b9eabac064bbe64d2bf"],
"segment_infos": [{"id": "xxx", "start": 0, "end": 10000000}],
"track_id": "7ffdf0f7d67e4d8caff5531f5873d26f"
}
```
**captions 元素字段:**
| 字段 | 类型 | 说明 |
|------|------|------|
| start | number | 起始时间(微秒) |
| end | number | 结束时间(微秒) |
| text | string | 字幕文本 |
| keyword | string | 高亮关键词 |
| keyword_color | string | 关键词颜色(如 "#ff7100" |
| keyword_font_size | number | 关键词字号 |
**全局样式参数:**
| 参数 | 类型 | 说明 |
|------|------|------|
| font_size | number | 字号 |
| text_color | string | 文字颜色 |
| alignment | number | 对齐1=居中) |
| bold | boolean | 粗体 |
| italic | boolean | 斜体 |
| underline | boolean | 下划线 |
| has_shadow | boolean | 文字阴影 |
| letter_spacing | number | 字间距 |
| line_spacing | number | 行间距 |
| style_text | number | 样式模式 |
### add_text_style
```json
// POST /add_text_style
{
"text": "快乐|顶级思维",
"keyword": "五个快乐到死的顶级思维",
"keyword_color": "#ff7100",
"keyword_font_size": 15,
"font_size": 15
}
// Response
{
"text_style": "{\"text\":\"快乐|顶级思维\",\"styles\":[{\"fill\":{\"content\":{\"solid\":{\"color\":[1.0,1.0,1.0]}}},\"range\":[0,7],\"size\":15}]}"
}
```
---
## 五、特效与动画
### add_effects
```json
// POST /add_effects
{
"draft_url": "...",
"effect_infos": "[{\"effect_title\":\"录制边框 III\",\"start\":0,\"end\":5000000}]"
}
// Response
{
"draft_url": "...",
"effect_ids": ["34c70fba3619444fa897110b40b39386"],
"segment_ids": ["23e0c0900c69427f82e44243183706c9"],
"track_id": "2ffea3839d304f83ae29dadc43a18227"
}
```
**effect_infos 元素字段:**
| 字段 | 类型 | 说明 |
|------|------|------|
| effect_title | string | 特效名称(如 "录制边框 III"、"雪花"、"红包来了" |
| start | number | 起始时间(微秒) |
| end | number | 结束时间(微秒) |
### add_filters
```json
// POST /add_filters
{
"draft_url": "...",
"filter_infos": "[{\"filter_title\":\"清透感\",\"start\":0,\"end\":5000000,\"intensity\":100.0}]"
}
```
| 字段 | 类型 | 说明 |
|------|------|------|
| filter_title | string | 滤镜名称 |
| start | number | 起始时间(微秒) |
| end | number | 结束时间(微秒) |
| intensity | number | 强度 0-100 |
### add_keyframes
```json
// POST /add_keyframes
{
"draft_url": "...",
"keyframes": "[{\"segment_id\":\"e1933f126437421bb52abdc56f062266\",\"property\":\"KFTypePositionX\",\"offset\":0.5,\"value\":-0.1}]"
}
// Response
{ "draft_url": "..." }
```
**keyframes 元素字段:**
| 字段 | 类型 | 说明 |
|------|------|------|
| segment_id | string | 目标素材 segment ID |
| property | string | 动画属性 |
| offset | number | 关键帧位置0-1相对素材时长比例 |
| value | number | 属性值 |
**property 可选值:**
| 值 | 说明 |
|------|------|
| KFTypePositionX | 水平位移 |
| KFTypePositionY | 垂直位移 |
| KFTypeScaleX | 水平缩放 |
| KFTypeScaleY | 垂直缩放 |
| KFTypeRotation | 旋转角度 |
### add_masks
```json
// POST /add_masks
{
"draft_url": "...",
"name": "线性",
"segment_ids": ["beb4adbea83d41d08021cf4e8f219206"]
}
// Response
{}
```
### get_effects — 获取特效列表
```json
// POST /get_effects
{ "mode": 0 }
// Response
{
"effects": [
{ "effect_id": "1183068", "name": "1998", "has_params": true, "is_vip": false },
...
]
}
```
---
## 六、视频渲染
### gen_video
```json
// POST /gen_video
{
"draft_url": "...",
"apiKey": "559a84a5-a9e9-4ade-a26b-e80b732754d6"
}
// Response
{ "code": 0, "message": "视频生成任务已提交请使用draft_url查询进度" }
```
### gen_video_status
```json
// POST /gen_video_status
{ "draft_url": "..." }
// Response
{
"code": 0,
"status": "failed",
"progress": 0,
"video_url": "",
"error_message": "导出草稿失败: ...",
"created_at": "2026-01-31T21:09:15.104249",
"started_at": "2026-01-31T21:09:15.549183",
"completed_at": "2026-01-31T21:10:10.398727"
}
```
**status 值:** `processing` / `success` / `failed`
---
## 七、快速工具
### easy_create_material — 一站式添加
```json
// POST /easy_create_material
{
"draft_url": "...",
"video_url": "https://...",
"img_url": "https://...",
"audio_url": "https://...",
"text": "字幕内容",
"text_color": "#ffffff",
"font_size": 15,
"text_transform_y": 0
}
// Response
{ "draft_url": "...", "message": "成功" }
```

View File

@@ -0,0 +1,257 @@
# 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 配音 → 阿里云 Qwen-TTS配置在 config.json 的 ttsApiKey
4. 同步到本地剪映 → 纯 Node.jssync-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 配音(可选)\nnode qwen-tts.js\n→ WAV + 时长"]
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 配音(可选)
使用阿里云 Qwen-TTS 进行语音合成Node.js无需 Python
```bash
# 准备输入 JSON
echo '{"segments":[{"id":1,"text":"第一段文案"},{"id":2,"text":"第二段文案"}],"voice":"Cherry","output_dir":"./audio"}' > input.json
# 批量生成
node scripts/qwen-tts.js input.json
# → stdout: {"segments":[{"id":1,"text":"...","audio":"./audio/seg_001.wav","duration":3.456}]}
```
配置在 `skills/config.json`
| 字段 | 说明 | 默认值 |
|------|------|--------|
| `ttsApiKey` | 阿里云百炼 API Key | (必填) |
| `ttsModel` | 模型名称 | `qwen-tts` |
| `ttsVoice` | 音色名称 | `Cherry` |
| `ttsLanguage` | 语言类型 | `Chinese` |
推荐音色:
| voice 参数 | 音色名 | 风格 | 适用 |
|------|------|------|------|
| `Cherry` | 芊悦 | 阳光积极小姐姐 | 通用、生活 |
| `Serena` | 苏瑶 | 温柔小姐姐 | 情感、故事 |
| `Ethan` | 晨煦 | 阳光温暖男声 | 科技、教程 |
| `Moon` | 月白 | 率性帅气男声 | 潮流、解说 |
| `Vincent` | 田叔 | 沙哑烟嗓男声 | 军事、纪录 |
| `Kai` | 凯 | 温柔磁性男声 | 情感、配音 |
| `Neil` | 阿闻 | 新闻主持人 | 新闻、财经 |
| `Bellona` | 燕铮莺 | 洪亮有力女声 | 热血、武侠 |
所有音色均支持中英文,输出 WAV 格式24kHzURL 有效期 24 小时。
**作为模块调用**
```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 秒,附带 Ken Burns 动画(缩放 1.0→1.1
```
**视频模式** (`--mode videos`):
```
POST /add_videos
逐个添加视频片段,自动计算时长
```
### 5. 添加音频
```
POST /add_audios
- BGM: 账号默认音乐 或 用户指定 URL
- 配音: Step 1 生成的 TTS 音频
```
### 6. 添加字幕
```
POST /add_captions
- 文案来自 manifest.json
- 关键词高亮account.json 中 subtitleStyle.highlightColor
- 字体大小、颜色从账号配置读取
```
### 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 个),保持绝对时间不变
**云渲染(可选):**
```
POST /gen_video → 提交云渲染
POST /gen_video_status → 轮询直到 success/failed
```
---
## 账号配置account.json
```json
{
"capcut": {
"effects": ["录制边框 III"],
"filter": "电影感:40",
"subtitleStyle": {
"fontSize": 36,
"color": "#FFFFFF",
"highlightColor": "#FF6B35",
"bold": true
},
"defaultBGM": "https://example.com/bgm.mp3"
}
}
```
---
## 图片动画预设
| 动画类型 | 说明 | 适用场景 |
|---------|------|---------|
| Ken Burns (zoom-in) | 从 1.0 缓慢放大到 1.1 | 默认,适合大多数场景 |
| Ken Burns (pan-left) | 画面从右向左平移 | 风景、全景 |
| Ken Burns (pan-right) | 画面从左向右平移 | 风景、全景 |
| 缩放弹出 | 从 0.8 弹到 1.0 | 强调、冲击感 |
---
## 质量检查
- [ ] 字幕与文案对应正确
- [ ] 关键词高亮颜色醒目
- [ ] 图片动画流畅(无卡顿)
- [ ] BGM 音量与配音平衡
- [ ] 转场自然(无黑帧)
- [ ] 总时长合理(建议 30-90 秒)