init: video-create project with skills and accounts
This commit is contained in:
226
.claude/skills/capcut/SKILL.md
Normal file
226
.claude/skills/capcut/SKILL.md
Normal 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 上传获取公网 URL(API 需要可下载的 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-TTS(config.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-TTS(Node.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 路径即可。
|
||||
459
.claude/skills/capcut/references/api-reference.md
Normal file
459
.claude/skills/capcut/references/api-reference.md
Normal 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": "成功" }
|
||||
```
|
||||
257
.claude/skills/capcut/references/assembly-guide.md
Normal file
257
.claude/skills/capcut/references/assembly-guide.md
Normal 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.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 配音(可选)\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 格式(24kHz),URL 有效期 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 秒)
|
||||
Reference in New Issue
Block a user