{"id":"55a40c7b-0024-4758-8a75-c432e33ce3a6","shortId":"Bq5pvj","kind":"skill","title":"chanjing-video-compose","tagline":">-","description":"# Chanjing Video Compose\n\n## 功能说明\n\n调用蝉镜**视频合成** Open API：列举公共/定制形象、上传素材、文本或音频驱动数字人、轮询任务；用户明确要求时用脚本下载成片。本 skill 脚本**不**依赖 ffmpeg/ffprobe（与一键成片编排不同）。凭据与权限边界见同目录 **`manifest.yaml`**。\n\n## 运行依赖\n\n- **python3** 与同仓库 `scripts/*.py`\n- **无** ffmpeg/ffprobe 门控\n\n## 环境变量与机器可读声明\n\n- 环境变量键名与说明：**`manifest.yaml`**（`environment` 段）及本文\n- 变量、凭据模型、合规 **`permissions`**、**`clientPermissions`、`agentPolicy`**：**`manifest.yaml`**\n\n## 使用命令\n\n- **ClawHub**（slug 以注册表为准）：`clawhub run chanjing-video-compose`\n- **本仓库**：`python skills/chanjing-video-compose/scripts/create_task.py …`（见 **Standard Workflow**）\n\n---\n\n## 登记与审稿（单一事实来源）\n\n凭据、`primaryEnv` 省略、可选 env、无 ffmpeg 门控（本 skill 独立使用场景）等：**以 `manifest.yaml` 为准**。本篇从 **When to Use** 起写流程与 API 说明。\n\n## When to Use This Skill\n\n当用户要做这些事时使用本 Skill：\n\n* 创建数字人视频合成任务\n* 用文本驱动数字人出镜\n* 用本地音频驱动数字人视频\n* 查询公共数字人或定制数字人形象\n* 轮询视频合成结果\n* 在用户明确要求时下载最终视频到本地\n\n如果需求更接近“上传一段真人视频做对口型驱动”，优先使用 `chanjing-avatar`，不要混用。\n\n## Preconditions\n\n执行本 Skill 前，必须先通过 `chanjing-credentials-guard` 完成 AK/SK 与 Token 校验。\n\n本 Skill 与 guard 共用：\n\n* `~/.chanjing/credentials.json`\n* `https://open-api.chanjing.cc`\n\n无凭证时，脚本会自动打开蝉镜登录页，并提示配置命令。\n\n### 审阅与安全（凭据与边界）\n\n与 **Purpose / Credentials / Persistence** 相关的逐项说明见 **`manifest.yaml`**。以下仅 **SKILL 正文补充**：\n\n- **`create_task.py --callback`**：若传入 URL，蝉镜可能向该端点推送任务结果；须自行评估信任与可达性。\n\n## Standard Workflow\n\n1. 先让用户明确选择数字人来源：`common`（公共数字人）或 `customised`（定制数字人）\n2. 调用 `list_figures.py --source <common|customised>`（建议 `--json`，公共源可加大 `--page-size` 或翻页）获取可用形象；**在候选内对比** `name`、各 `figure` 的 `type` 与分辨率、`audio_man_id`、`audio_name`（若有）与任务人设后再选定 `person.id`。**禁止**未比较就默认列表最前几项。\n3. 如果选择公共数字人，还要再确认 `figure_type`（与所选 `figures[].type` 一致），例如 `sit_body` / `whole_body` / `circle_view`。无用户特殊要求时，**默认优先年轻、有活力的形象**（名称/`audio_name` 偏青年、学生、元气等）；题材需要成熟或中老年气质时再改选。\n4. 若使用文本驱动，确定 `audio_man_id`\n5. 在创建任务前，必须明确询问用户字幕偏好：`show`（保留字幕）或 `hide`（隐藏字幕）\n6. 如果用户选择 `show` 但没有提出自定义样式或位置需求，直接使用官方文档推荐默认值；只有在用户明确想调整字幕位置或样式时，才继续追问 `subtitle_config` 参数\n7. 若用户要定制字幕位置，说明坐标以左上角为原点，再补充 `subtitle_config` 相关参数\n8. 若使用本地音频或背景图，先调用 `upload_file.py` 获取 `file_id`\n9. 调用 `create_task.py` 创建视频合成任务，得到 `video_id`\n10. 调用 `poll_task.py` 轮询直到成功，得到 `video_url`\n11. 只有在用户明确要求保存到本地时，才调用 `download_result.py`\n\n## Covered APIs\n\n本 Skill 当前覆盖：\n\n* `GET /open/v1/list_common_dp`\n* `POST /open/v1/list_customised_person`\n* `POST /open/v1/create_video`\n* `GET /open/v1/video`\n* `GET /open/v1/common/create_upload_url`\n* `GET /open/v1/common/file_detail`\n\n## Scripts\n\n脚本目录：\n\n* `skills/chanjing-video-compose/scripts/`\n\n| 脚本 | 说明 |\n|------|------|\n| `_auth.py` | 读取凭证、获取或刷新 `access_token` |\n| `list_figures.py` | 按 `--source common|customised` 列出数字人形象，输出 `person.id` / `figure_type` / `audio_man_id` / 预览信息 |\n| `upload_file.py` | 上传音频或背景素材，轮询到文件可用后输出 `file_id` |\n| `create_task.py` | 创建视频合成任务；使用公共数字人时可补充 `--figure-type ...`，字幕支持 `--subtitle show|hide` 以及完整字幕配置参数；可选 **`--callback`**（服务端可能向该 URL 推送结果） |\n| `poll_task.py` | 轮询视频详情直到完成，默认输出 `video_url` |\n| `download_result.py` | 下载最终视频到 `outputs/video-compose/` |\n\n## Usage Examples\n\n示例 1：公共数字人文本驱动\n\n```bash\n# 1. 先列公共数字人\npython skills/chanjing-video-compose/scripts/list_figures.py --source common\n\n# 2. 用公共数字人创建文本驱动视频\nVIDEO_ID=$(python skills/chanjing-video-compose/scripts/create_task.py \\\n  --person-id \"C-ef91f3a6db3144ffb5d6c581ff13c7ec\" \\\n  --figure-type \"sit_body\" \\\n  --audio-man \"C-0ae461135d8a4eb2b59c853162ea9848\" \\\n  --subtitle \"show\" \\\n  --subtitle-x 31 \\\n  --subtitle-y 1521 \\\n  --subtitle-width 1000 \\\n  --subtitle-height 200 \\\n  --subtitle-font-size 64 \\\n  --subtitle-stroke-width 7 \\\n  --text \"你好，这是一个蝉镜视频合成测试。\")\n\n# 3. 轮询到完成，拿到 video_url\npython skills/chanjing-video-compose/scripts/poll_task.py --id \"$VIDEO_ID\"\n```\n\n示例 2：定制数字人上传本地音频驱动\n\n```bash\npython skills/chanjing-video-compose/scripts/list_figures.py --source customised\n\nAUDIO_FILE_ID=$(python skills/chanjing-video-compose/scripts/upload_file.py \\\n  --service make_video_audio \\\n  --file ./input.wav)\n\nVIDEO_ID=$(python skills/chanjing-video-compose/scripts/create_task.py \\\n  --person-id \"C-ef91f3a6db3144ffb5d6c581ff13c7ec\" \\\n  --subtitle \"hide\" \\\n  --audio-file-id \"$AUDIO_FILE_ID\")\n\npython skills/chanjing-video-compose/scripts/poll_task.py --id \"$VIDEO_ID\"\n```\n\n示例 3：显式下载最终视频\n\n```bash\npython skills/chanjing-video-compose/scripts/download_result.py \\\n  --url \"https://example.com/output.mp4\"\n```\n\n## Download Rule\n\n下载是显式动作，不是默认动作：\n\n* `poll_task.py` 成功后应先返回 `video_url`\n* 不要自动下载结果文件\n* 只有当用户明确表达“下载到本地”“保存到 outputs”“帮我落盘”时，才执行 `download_result.py`\n\n## Figure Selection Rule\n\n选择数字人时遵循这条规则：\n\n* 如果用户要用平台已有人物库，先走公共数字人：`list_figures.py --source common`\n* 如果用户要用自己训练或上传生成的人物，先走定制数字人：`list_figures.py --source customised`\n* 使用公共数字人创建视频时，可按所选形态传 `--figure-type <type>`\n* 使用定制数字人时，不需要 `figure_type`\n\n## Subtitle Rule\n\n字幕遵循这条规则：\n\n* 不要默认假设用户要字幕或不要字幕\n* 创建任务前，必须先明确询问用户选择：`show` 或 `hide`\n* 若由 **`chanjing-one-click-video-creation`** 的 **`run_render.py`** 调用 `create_task.py`，以当次 **`workflow.json` 根级 `subtitle_required`** 为准（**默认 false** → `--subtitle hide`；**true** → `show` 及推荐样式），**无需**为该一键成片路径再单独追问字幕开关，除非用户在需求里明确要求改字幕策略\n* 用户选择保留字幕时，调用 `create_task.py --subtitle show`\n* 若用户未指定字幕位置或样式，直接使用官方推荐默认值；`create_task.py` 在未传 `--subtitle-color` 时默认白字 `color=#FFFFFF`：1080p 为 `x=31 y=1521 width=1000 height=200 font_size=64 stroke_width=7 asr_type=0`；4K 画布为 `x=80 y=2840 width=2000 height=1000 font_size=150 stroke_width=7 asr_type=0`（两组均含 `color=#FFFFFF`）\n* 用户选择隐藏字幕时，调用 `create_task.py --subtitle hide` 或兼容旧用法 `--hide-subtitle`\n* 若用户要求调整字幕位置或样式，可继续传 `--subtitle-x` / `--subtitle-y` / `--subtitle-width` / `--subtitle-height` / `--subtitle-font-size` / `--subtitle-color` / `--subtitle-stroke-color` / `--subtitle-stroke-width` / `--subtitle-font-id` / `--subtitle-asr-type`\n* 坐标基于左上角原点；字幕区域不能超出 `screen_width` / `screen_height`\n* 如果用户只说“要字幕”但没指定位置，不必再追问具体数值；除非用户明确要调位置，否则直接走默认值\n\n## Output Convention\n\n默认本地输出目录：\n\n* `outputs/video-compose/`\n\n## Additional Resources\n\n更多接口细节见：\n\n* `skills/chanjing-video-compose/reference.md`\n* `skills/chanjing-video-compose/examples.md`","tags":["chanjing","video","compose","chan","skills","chanjing-ai","agent-skills","claude-code-skills","openclaw-skills"],"capabilities":["skill","source-chanjing-ai","skill-chanjing-video-compose","topic-agent-skills","topic-claude-code-skills","topic-openclaw-skills","topic-skills"],"categories":["chan-skills"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/chanjing-ai/chan-skills/chanjing-video-compose","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add chanjing-ai/chan-skills","source_repo":"https://github.com/chanjing-ai/chan-skills","install_from":"skills.sh"}},"qualityScore":"0.457","qualityRationale":"deterministic score 0.46 from registry signals: · indexed on github topic:agent-skills · 14 github stars · SKILL.md body (5,932 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-04-22T13:03:31.471Z","embedding":null,"createdAt":"2026-04-19T00:41:02.848Z","updatedAt":"2026-04-22T13:03:31.471Z","lastSeenAt":"2026-04-22T13:03:31.471Z","tsv":"'/.chanjing/credentials.json':128 '/input.wav':436 '/open/v1/common/create_upload_url':286 '/open/v1/common/file_detail':288 '/open/v1/create_video':282 '/open/v1/list_common_dp':278 '/open/v1/list_customised_person':280 '/open/v1/video':284 '/output.mp4':470 '0':580,599 '0ae461135d8a4eb2b59c853162ea9848':376 '1':152,345,348 '10':261 '1000':390,569,590 '1080p':562 '11':268 '150':593 '1521':386,567 '2':159,354,419 '200':394,571 '2000':588 '2840':586 '3':190,408,462 '31':382,565 '4':216 '4k':581 '5':222 '6':230 '64':399,574 '7':240,404,577,596 '8':247 '80':584 '9':254 'access':297 'addit':665 'agentpolici':47 'ak/sk':119 'api':12,87,273 'asr':578,597,647 'audio':180,183,210,219,309,372,426,434,450,453 'audio-file-id':449 'audio-man':371 'auth.py':294 'avatar':107 'bash':347,421,464 'bodi':201,203,370 'c':364,375,445 'c-0ae461135d8a4eb2b59c853162ea9848':374 'c-ef91f3a6db3144ffb5d6c581ff13c7ec':363,444 'callback':145,330 'chanj':2,5,56,106,115,522 'chanjing-avatar':105 'chanjing-credentials-guard':114 'chanjing-one-click-video-cr':521 'chanjing-video-compos':1,55 'circl':204 'clawhub':50,53 'click':524 'clientpermiss':46 'color':558,560,601,632,636 'common':154,163,302,353,496 'compos':4,7,58 'config':238,245 'convent':662 'cover':272 'create_task.py':144,256,318,530,549,554,605 'creation':526 'credenti':116,137 'customis':157,164,303,425,501 'download':471 'download_result.py':271,339,487 'ef91f3a6db3144ffb5d6c581ff13c7ec':365,446 'env':71 'environ':39 'exampl':343 'example.com':469 'example.com/output.mp4':468 'fals':538 'ffffff':561,602 'ffmpeg':73 'ffmpeg/ffprobe':24,34 'figur':176,193,196,307,322,367,488,505,509 'figure-typ':321,366,504 'file':252,316,427,435,451,454 'font':397,572,591,628,643 'get':277,283,285,287 'guard':117,126 'height':393,570,589,625,654 'hide':228,327,448,519,540,607,610 'hide-subtitl':609 'id':182,221,253,260,311,317,357,362,415,417,428,438,443,452,455,458,460,644 'json':166 'list_figures.py':161,299,494,499 'make':432 'man':181,220,310,373 'manifest.yaml':27,38,48,80,140 'name':174,184,211 'one':523 'open':11 'open-api.chanjing.cc':129 'output':483,661 'outputs/video-compose':341,664 'page':169 'page-s':168 'permiss':45 'persist':138 'person':361,442 'person-id':360,441 'person.id':187,306 'poll_task.py':263,334,475 'post':279,281 'precondit':109 'primaryenv':68 'purpos':136 'py':32 'python':60,350,358,413,422,429,439,456,465 'python3':29 'requir':535 'resourc':666 'rule':472,490,512 'run':54 'run_render.py':528 'screen':651,653 'script':31,289 'select':489 'servic':431 'show':225,232,326,378,517,542,551 'sit':200,369 'size':170,398,573,592,629 'skill':20,76,93,95,111,124,142,275 'skill-chanjing-video-compose' 'skills/chanjing-video-compose/examples.md':669 'skills/chanjing-video-compose/reference.md':668 'skills/chanjing-video-compose/scripts':291 'skills/chanjing-video-compose/scripts/create_task.py':61,359,440 'skills/chanjing-video-compose/scripts/download_result.py':466 'skills/chanjing-video-compose/scripts/list_figures.py':351,423 'skills/chanjing-video-compose/scripts/poll_task.py':414,457 'skills/chanjing-video-compose/scripts/upload_file.py':430 'slug':51 'sourc':162,301,352,424,495,500 'source-chanjing-ai' 'standard':63,150 'stroke':402,575,594,635,639 'subtitl':237,244,325,377,380,384,388,392,396,401,447,511,534,539,550,557,606,611,615,618,621,624,627,631,634,638,642,646 'subtitle-asr-typ':645 'subtitle-color':556,630 'subtitle-font-id':641 'subtitle-font-s':395,626 'subtitle-height':391,623 'subtitle-i':383,617 'subtitle-stroke-color':633 'subtitle-stroke-width':400,637 'subtitle-width':387,620 'subtitle-x':379,614 'text':405 'token':121,298 'topic-agent-skills' 'topic-claude-code-skills' 'topic-openclaw-skills' 'topic-skills' 'true':541 'type':178,194,197,308,323,368,506,510,579,598,648 'upload_file.py':250,313 'url':147,267,332,338,412,467,478 'usag':342 'use':85,91 'video':3,6,57,259,266,337,356,411,416,433,437,459,477,525 'view':205 'whole':202 'width':389,403,568,576,587,595,622,640,652 'workflow':64,151 'workflow.json':532 'x':381,564,583,616 'y':385,566,585,619 '一致':198 '上传一段真人视频做对口型驱动':103 '上传素材':15 '上传音频或背景素材':314 '下载到本地':481 '下载是显式动作':473 '下载最终视频到':340 '不':22 '不必再追问具体数值':658 '不是默认动作':474 '不要混用':108 '不要自动下载结果文件':479 '不要默认假设用户要字幕或不要字幕':514 '不需要':508 '与':120,125,135 '与一键成片编排不同':25 '与任务人设后再选定':186 '与分辨率':179 '与同仓库':30 '与所选':195 '两组均含':600 '为':563 '为准':81,536 '为该一键成片路径再单独追问字幕开关':545 '以':79 '以下仅':141 '以及完整字幕配置参数':328 '以当次':531 '以注册表为准':52 '优先使用':104 '但没指定位置':657 '但没有提出自定义样式或位置需求':233 '你好':406 '使用公共数字人创建视频时':502 '使用公共数字人时可补充':320 '使用命令':49 '使用定制数字人时':507 '例如':199 '依赖':23 '保存到':482 '保留字幕':226 '偏青年':212 '元气等':214 '先列公共数字人':349 '先让用户明确选择数字人来源':153 '先调用':249 '先走公共数字人':493 '先走定制数字人':498 '公共数字人':155 '公共数字人文本驱动':346 '公共源可加大':167 '共用':127 '再补充':243 '凭据':67 '凭据与权限边界见同目录':26 '凭据与边界':134 '凭据模型':43 '列举公共':13 '列出数字人形象':304 '创建任务前':515 '创建数字人视频合成任务':96 '创建视频合成任务':257,319 '前':112 '功能说明':8 '单一事实来源':66 '参数':239 '及推荐样式':543 '及本文':41 '变量':42 '只有在用户明确想调整字幕位置或样式时':235 '只有在用户明确要求保存到本地时':269 '只有当用户明确表达':480 '可按所选形态传':503 '可继续传':613 '可选':70,329 '各':175 '合规':44 '名称':209 '否则直接走默认值':660 '在候选内对比':173 '在创建任务前':223 '在未传':555 '在用户明确要求时下载最终视频到本地':101 '坐标基于左上角原点':649 '如果用户只说':655 '如果用户要用平台已有人物库':492 '如果用户要用自己训练或上传生成的人物':497 '如果用户选择':231 '如果选择公共数字人':191 '如果需求更接近':102 '字幕区域不能超出':650 '字幕支持':324 '字幕遵循这条规则':513 '学生':213 '完成':118 '定制形象':14 '定制数字人':158 '定制数字人上传本地音频驱动':420 '审阅与安全':133 '帮我落盘':484 '并提示配置命令':132 '建议':165 '当前覆盖':276 '当用户要做这些事时使用本':94 '得到':258,265 '必须先明确询问用户选择':516 '必须先通过':113 '必须明确询问用户字幕偏好':224 '成功后应先返回':476 '或':156,227,518 '或兼容旧用法':608 '或翻页':171 '才执行':486 '才继续追问':236 '才调用':270 '执行本':110 '拿到':410 '按':300 '推送结果':333 '文本或音频驱动数字人':16 '无':33,72 '无凭证时':130 '无用户特殊要求时':206 '无需':544 '时':485 '时默认白字':559 '显式下载最终视频':463 '更多接口细节见':667 '有活力的形象':208 '服务端可能向该':331 '未比较就默认列表最前几项':189 '本':19,75,123,274 '本仓库':59 '本篇从':82 '查询公共数字人或定制数字人形象':99 '校验':122 '根级':533 '正文补充':143 '段':40 '独立使用场景':77 '环境变量与机器可读声明':36 '环境变量键名与说明':37 '用公共数字人创建文本驱动视频':355 '用户明确要求时用脚本下载成片':18 '用户选择保留字幕时':547 '用户选择隐藏字幕时':603 '用文本驱动数字人出镜':97 '用本地音频驱动数字人视频':98 '画布为':582 '登记与审稿':65 '的':177,527 '直接使用官方推荐默认值':553 '直接使用官方文档推荐默认值':234 '相关参数':246 '相关的逐项说明见':139 '省略':69 '确定':218 '示例':344,418,461 '禁止':188 '等':78 '脚本':21,292 '脚本会自动打开蝉镜登录页':131 '脚本目录':290 '若传入':146 '若使用文本驱动':217 '若使用本地音频或背景图':248 '若有':185 '若用户未指定字幕位置或样式':552 '若用户要定制字幕位置':241 '若用户要求调整字幕位置或样式':612 '若由':520 '获取':251 '获取可用形象':172 '获取或刷新':296 '蝉镜可能向该端点推送任务结果':148 '要字幕':656 '见':62 '视频合成':10 '说明':88,293 '说明坐标以左上角为原点':242 '读取凭证':295 '调用':160,255,262,529,548,604 '调用蝉镜':9 '起写流程与':86 '轮询任务':17 '轮询到完成':409 '轮询到文件可用后输出':315 '轮询直到成功':264 '轮询视频合成结果':100 '轮询视频详情直到完成':335 '输出':305 '运行依赖':28 '还要再确认':192 '这是一个蝉镜视频合成测试':407 '选择数字人时遵循这条规则':491 '门控':35,74 '除非用户在需求里明确要求改字幕策略':546 '除非用户明确要调位置':659 '隐藏字幕':229 '须自行评估信任与可达性':149 '预览信息':312 '题材需要成熟或中老年气质时再改选':215 '默认':537 '默认优先年轻':207 '默认本地输出目录':663 '默认输出':336","prices":[{"id":"6739ad2a-1834-46d2-af5f-f1b4b5ff1ffe","listingId":"55a40c7b-0024-4758-8a75-c432e33ce3a6","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"chanjing-ai","category":"chan-skills","install_from":"skills.sh"},"createdAt":"2026-04-19T00:41:02.848Z"}],"sources":[{"listingId":"55a40c7b-0024-4758-8a75-c432e33ce3a6","source":"github","sourceId":"chanjing-ai/chan-skills/chanjing-video-compose","sourceUrl":"https://github.com/chanjing-ai/chan-skills/tree/main/skills/chanjing-video-compose","isPrimary":false,"firstSeenAt":"2026-04-19T00:41:02.848Z","lastSeenAt":"2026-04-22T13:03:31.471Z"}],"details":{"listingId":"55a40c7b-0024-4758-8a75-c432e33ce3a6","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"chanjing-ai","slug":"chanjing-video-compose","github":{"repo":"chanjing-ai/chan-skills","stars":14,"topics":["agent-skills","claude-code-skills","openclaw-skills","skills"],"license":null,"html_url":"https://github.com/chanjing-ai/chan-skills","pushed_at":"2026-03-28T05:19:27Z","description":"蝉系openclaw 技能库，聚焦电商内容创作，提供实用的 AI 工具及技能包","skill_md_sha":"b0ec594b21aaf37a3c5eb05f1dc8008385116639","skill_md_path":"skills/chanjing-video-compose/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/chanjing-ai/chan-skills/tree/main/skills/chanjing-video-compose"},"layout":"multi","source":"github","category":"chan-skills","frontmatter":{"name":"chanjing-video-compose","description":">-"},"skills_sh_url":"https://skills.sh/chanjing-ai/chan-skills/chanjing-video-compose"},"updatedAt":"2026-04-22T13:03:31.471Z"}}