$npx -y skills add chanjing-ai/chan-skills --skill chanjing-video-composeUse Chanjing video synthesis APIs to create digital human videos from text or audio, with optional background upload, polling, and explicit download.
| 1 | # Chanjing Video Compose |
| 2 | |
| 3 | ## 功能说明 |
| 4 | |
| 5 | 调用蝉镜**视频合成** Open API:列举公共/定制形象、上传素材、文本或音频驱动数字人、轮询任务;用户明确要求时用脚本下载成片。本 skill 脚本**不**依赖 ffmpeg/ffprobe(与一键成片编排不同)。凭据与权限边界见同目录 **`manifest.yaml`**。 |
| 6 | |
| 7 | ## 运行依赖 |
| 8 | |
| 9 | - **python3** 与同仓库 `scripts/*.py` |
| 10 | - **无** ffmpeg/ffprobe 门控 |
| 11 | |
| 12 | ## 环境变量与机器可读声明 |
| 13 | |
| 14 | - 环境变量键名与说明:**`manifest.yaml`**(`environment` 段)及本文 |
| 15 | - 变量、凭据模型、合规 **`permissions`**、**`clientPermissions`、`agentPolicy`**:**`manifest.yaml`** |
| 16 | |
| 17 | ## 使用命令 |
| 18 | |
| 19 | - **ClawHub**(slug 以注册表为准):`clawhub run chanjing-video-compose` |
| 20 | - **本仓库**:`python skills/chanjing-video-compose/scripts/create_task.py …`(见 **Standard Workflow**) |
| 21 | |
| 22 | --- |
| 23 | |
| 24 | ## 登记与审稿(单一事实来源) |
| 25 | |
| 26 | 凭据、`primaryEnv` 省略、可选 env、无 ffmpeg 门控(本 skill 独立使用场景)等:**以 `manifest.yaml` 为准**。本篇从 **When to Use** 起写流程与 API 说明。 |
| 27 | |
| 28 | ## When to Use This Skill |
| 29 | |
| 30 | 当用户要做这些事时使用本 Skill: |
| 31 | |
| 32 | * 创建数字人视频合成任务 |
| 33 | * 用文本驱动数字人出镜 |
| 34 | * 用本地音频驱动数字人视频 |
| 35 | * 查询公共数字人或定制数字人形象 |
| 36 | * 轮询视频合成结果 |
| 37 | * 在用户明确要求时下载最终视频到本地 |
| 38 | |
| 39 | 如果需求更接近“上传一段真人视频做对口型驱动”,优先使用 `chanjing-avatar`,不要混用。 |
| 40 | |
| 41 | ## Preconditions |
| 42 | |
| 43 | 执行本 Skill 前,必须先通过 `chanjing-credentials-guard` 完成 AK/SK 与 Token 校验。 |
| 44 | |
| 45 | 本 Skill 与 guard 共用: |
| 46 | |
| 47 | * `~/.chanjing/credentials.json` |
| 48 | * `https://open-api.chanjing.cc` |
| 49 | |
| 50 | 无凭证时,脚本会自动打开蝉镜登录页,并提示配置命令。 |
| 51 | |
| 52 | ### 审阅与安全(凭据与边界) |
| 53 | |
| 54 | 与 **Purpose / Credentials / Persistence** 相关的逐项说明见 **`manifest.yaml`**。以下仅 **SKILL 正文补充**: |
| 55 | |
| 56 | - **`create_task.py --callback`**:若传入 URL,蝉镜可能向该端点推送任务结果;须自行评估信任与可达性。 |
| 57 | |
| 58 | ## Standard Workflow |
| 59 | |
| 60 | 1. 先让用户明确选择数字人来源:`common`(公共数字人)或 `customised`(定制数字人) |
| 61 | 2. 调用 `list_figures.py --source <common|customised>`(建议 `--json`,公共源可加大 `--page-size` 或翻页)获取可用形象;**在候选内对比** `name`、各 `figure` 的 `type` 与分辨率、`audio_man_id`、`audio_name`(若有)与任务人设后再选定 `person.id`。**禁止**未比较就默认列表最前几项。 |
| 62 | 3. 如果选择公共数字人,还要再确认 `figure_type`(与所选 `figures[].type` 一致),例如 `sit_body` / `whole_body` / `circle_view`。无用户特殊要求时,**默认优先年轻、有活力的形象**(名称/`audio_name` 偏青年、学生、元气等);题材需要成熟或中老年气质时再改选。 |
| 63 | 4. 若使用文本驱动,确定 `audio_man_id` |
| 64 | 5. 在创建任务前,必须明确询问用户字幕偏好:`show`(保留字幕)或 `hide`(隐藏字幕) |
| 65 | 6. 如果用户选择 `show` 但没有提出自定义样式或位置需求,直接使用官方文档推荐默认值;只有在用户明确想调整字幕位置或样式时,才继续追问 `subtitle_config` 参数 |
| 66 | 7. 若用户要定制字幕位置,说明坐标以左上角为原点,再补充 `subtitle_config` 相关参数 |
| 67 | 8. 若使用本地音频或背景图,先调用 `upload_file.py` 获取 `file_id` |
| 68 | 9. 调用 `create_task.py` 创建视频合成任务,得到 `video_id` |
| 69 | 10. 调用 `poll_task.py` 轮询直到成功,得到 `video_url` |
| 70 | 11. 只有在用户明确要求保存到本地时,才调用 `download_result.py` |
| 71 | |
| 72 | ## Covered APIs |
| 73 | |
| 74 | 本 Skill 当前覆盖: |
| 75 | |
| 76 | * `GET /open/v1/list_common_dp` |
| 77 | * `POST /open/v1/list_customised_person` |
| 78 | * `POST /open/v1/create_video` |
| 79 | * `GET /open/v1/video` |
| 80 | * `GET /open/v1/common/create_upload_url` |
| 81 | * `GET /open/v1/common/file_detail` |
| 82 | |
| 83 | ## Scripts |
| 84 | |
| 85 | 脚本目录: |
| 86 | |
| 87 | * `skills/chanjing-video-compose/scripts/` |
| 88 | |
| 89 | | 脚本 | 说明 | |
| 90 | |------|------| |
| 91 | | `_auth.py` | 读取凭证、获取或刷新 `access_token` | |
| 92 | | `list_figures.py` | 按 `--source common|customised` 列出数字人形象,输出 `person.id` / `figure_type` / `audio_man_id` / 预览信息 | |
| 93 | | `upload_file.py` | 上传音频或背景素材,轮询到文件可用后输出 `file_id` | |
| 94 | | `create_task.py` | 创建视频合成任务;使用公共数字人时可补充 `--figure-type ...`,字幕支持 `--subtitle show|hide` 以及完整字幕配置参数;可选 **`--callback`**(服务端可能向该 URL 推送结果) | |
| 95 | | `poll_task.py` | 轮询视频详情直到完成,默认输出 `video_url` | |
| 96 | | `download_result.py` | 下载最终视频到 `outputs/video-compose/` | |
| 97 | |
| 98 | ## Usage Examples |
| 99 | |
| 100 | 示例 1:公共数字人文本驱动 |
| 101 | |
| 102 | ```bash |
| 103 | # 1. 先列公共数字人 |
| 104 | python skills/chanjing-video-compose/scripts/list_figures.py --source common |
| 105 | |
| 106 | # 2. 用公共数字人创建文本驱动视频 |
| 107 | VIDEO_ID=$(python skills/chanjing-video-compose/scripts/create_task.py \ |
| 108 | --person-id "C-ef91f3a6db3144ffb5d6c581ff13c7ec" \ |
| 109 | --figure-type "sit_body" \ |
| 110 | --audio-man "C-0ae461135d8a4eb2b59c853162ea9848" \ |
| 111 | --subtitle "show" \ |
| 112 | --subtitle-x 31 \ |
| 113 | --subtitle-y 1521 \ |
| 114 | --subtitle-width 1000 \ |
| 115 | --subtitle-height 200 \ |
| 116 | --subtitle-font-size 64 \ |
| 117 | --subtitle-stroke-width 7 \ |
| 118 | --text "你好,这是一个蝉镜视频合成测试。") |
| 119 | |
| 120 | # 3. 轮询到完成,拿到 video_url |
| 121 | python skills/chanjing-video-compose/scripts/poll_task.py --id "$VIDEO_ID" |
| 122 | ``` |
| 123 | |
| 124 | 示例 2:定制数字人上传本地音频驱动 |
| 125 | |
| 126 | ```bash |
| 127 | python skills/chanjing-video-compose/scripts/list_figures.py --source customised |
| 128 | |
| 129 | AUDIO_FILE_ID=$(python skills/chanjing-video-compose/scripts/upload_file.py \ |
| 130 | --service make_video_audio \ |
| 131 | --file ./input.wav) |
| 132 | |
| 133 | VIDEO_ID=$(python skills/chanjing-video-compose/scripts/create_task.py \ |
| 134 | --person-id "C-ef91f3a6db3144ffb5d6c581ff13c7ec" \ |
| 135 | --subtitle "hide" \ |
| 136 | --audio-file-id "$AUDIO_FILE_ID") |
| 137 | |
| 138 | python skills/chanjing-video-compose/scripts/poll_task.py --id "$VIDEO_ID" |
| 139 | ``` |
| 140 | |
| 141 | 示例 3:显式下载最终视频 |
| 142 | |
| 143 | ```bash |
| 144 | python skills/chanjing-video-compose/scripts/download_result.py \ |
| 145 | --url "https://example.com/output.mp4" |
| 146 | ``` |
| 147 | |
| 148 | ## Dow |