--- name: narrator-ai-cli version: "1.0.0" license: MIT description: >- Create AI-narrated film/drama commentary videos via CLI. Two workflow paths (Original & Adapted narration), 93 movies, 146 BGM tracks, 63 dubbing voices in 11 languages, 90+ narration templates. Use when creating narration videos, film commentary, short drama dubbing, or video production. user-invocable: true tags: - video-narration - film-commentary - ai-video - short-drama - content-creation - dubbing - tts - video-production metadata: openclaw: emoji: "🎬" requires: bins: - narrator-ai-cli primaryEnv: - NARRATOR_APP_KEY --- # narrator-ai-cli Skill You have access to `narrator-ai-cli`, a CLI tool for the Narrator AI video narration API. Always use `--json` flag for all commands to get structured output you can parse. ## Prerequisites The CLI must be configured before use. Check with: ```bash narrator-ai-cli config show ``` If not configured, set up with: ```bash narrator-ai-cli config set app_key ``` Server defaults to `https://openapi.jieshuo.cn` — no need to configure. **Need an app_key or help with setup?** Contact us to get started: - 📧 Email: merlinyang@gridltd.com - 💬 WeChat: ![联系客服](imgs/contact.png) ## Core Rules 1. **ALWAYS use `--json`** for all commands. Parse the JSON output to extract values for next steps. 2. **NEVER fabricate data** — never guess file IDs, movie info, or voice IDs. Always query from CLI commands. 3. **ASK user to choose** when there are multiple options (pre-built vs custom, which template, which movie, etc.). 4. **Poll task status** — tasks are async. After creation, poll with `narrator-ai-cli task query --json` until `status` is `2` (success) or `3` (failed). 5. **video-composing order_num source differs by path**: - Standard Path: use `generate-writing`'s `task_order_num` (NOT clip-data's) - Fast Path: use `fast-clip-data`'s `task_order_num` 6. **dubbing list returns `id` and `type`** — pass `id` as `dubbing`, pass `type` as `dubbing_type`. They are two separate fields. 7. **negative_oss_key = video_oss_key** — always set `negative_oss_key` to the same value as `video_oss_key` in episodes_data. 8. **search-movie may take 60+ seconds** — this is normal (Gradio backend). ## Decision Points (ASK USER) Before starting any workflow, you need to help the user make the following choices. **Present the options and let the user decide. Do NOT pick for them.** ### Decision 1: Which workflow path? ASK: "请选择工作流路径:" - **二创文案**: 爆款学习 → 生成解说文案 → 生成剪辑数据 → 合成视频 → 视觉模板(可选) - Based on existing reference video style, generates adapted narration - Suitable when: user wants to recreate content based on reference material - **原创文案** (faster & cheaper): 快速文案 → 快速剪辑数据 → 合成视频 → 视觉模板(可选) - Generates original narration from movie info + narration template - Three sub-modes: 热门影视(hot drama), 原声混剪(original mix), 冷门/新剧(new drama) - Suitable when: user wants original narration, faster speed, lower cost ### Decision 2: Narration style — pre-built template or custom learning? ASK: "解说风格:使用预置模板还是自定义学习?" - **Option A: Pre-built template** (recommended, 90+ templates across 12 genres) ```bash narrator-ai-cli task narration-styles --json # or filter: narrator-ai-cli task narration-styles --genre --json ``` Show the list to user, let them pick one. The `id` field is the `learning_model_id`. - **Option B: Custom learning** (popular-learning task, Standard Path only) Requires user to provide a reference video + SRT. The output `learning_model_id` is used in generate-writing. ### Decision 3: Movie source files — pre-built material or user upload? ASK: "电影素材:使用预置素材还是自己上传的文件?" - **Option A: Pre-built materials** (93 movies ready to use) ```bash narrator-ai-cli material list --json # or search: narrator-ai-cli material list --search "" --json # or filter: narrator-ai-cli material list --genre --json ``` Show results to user. Each entry has `video_id` and `srt_id`. - Use `video_id` as `video_oss_key` AND `negative_oss_key` - Use `srt_id` as `srt_oss_key` - **Option B: User's uploaded files** ```bash narrator-ai-cli file list --json # or search: narrator-ai-cli file list --search "" --json # or transfer by link: narrator-ai-cli file transfer --link "" --json ``` User picks video and SRT files from their cloud storage. ### Decision 4: BGM — pre-built track or user upload? ASK: "背景音乐:使用预置BGM还是自己上传的音频?" - **Option A: Pre-built BGM** (146 tracks) ```bash narrator-ai-cli bgm list --json # or search: narrator-ai-cli bgm list --search "" --json ``` Show results to user. The `id` field is the `bgm` parameter value. - **Option B: User's uploaded audio** ```bash narrator-ai-cli file list --json ``` User picks an audio file. Use its `file_id` as the `bgm` parameter. ### Decision 5: Dubbing voice — which voice and language? ASK: "配音角色:请选择配音语言和角色" ```bash # First show available languages narrator-ai-cli dubbing languages --json # Then list voices for chosen language narrator-ai-cli dubbing list --lang --json # Or filter by genre recommendation narrator-ai-cli dubbing list --tag --json ``` Show results to user. From the selected voice: - `id` field → pass as `dubbing` parameter - `type` field → pass as `dubbing_type` parameter **There is no "custom upload" option for dubbing — always pick from the pre-built list.** (Users can create custom voices via `voice-clone` task separately.) ### Decision 6: Visual template (optional)? ASK: "是否需要应用视觉模板?(可选步骤)" - **Yes**: Pick a template ```bash narrator-ai-cli task templates --json ``` Show results to user, let them pick. The `name` field goes into `template_name` list. - **No**: Skip magic-video step. ## Workflow Path 1: 二创文案 ``` popular-learning(optional) -> generate-writing -> clip-data -> video-composing -> magic-video(optional) ``` ### Step 1: Get learning_model_id Based on Decision 2: ```bash # Option A: Pre-built template (recommended) narrator-ai-cli task narration-styles --json # -> user picks one -> learning_model_id = selected item's "id" # Option B: Custom learning narrator-ai-cli task create popular-learning --json -d '{ "video_srt_path": "", "video_path": "" }' # Poll until done -> extract learning_model_id from results ``` ### Step 2: Generate Writing ```bash # 2a. Search movie info (for confirmed_movie_json / story_info) narrator-ai-cli task search-movie "" --json # Show 3 results to user, let them pick one # 2b. Get source files (based on Decision 3) # Option A: narrator-ai-cli material list --search "" --json # Option B: narrator-ai-cli file list --json # -> user picks video and SRT files # 2c. Create task narrator-ai-cli task create generate-writing --json -d '{ "learning_model_id": "", "learning_srt": "", "native_video": "", "native_srt": "", "playlet_name": "", "playlet_num": "1", "target_platform": "抖音", "vendor_requirements": "", "task_count": 1, "target_character_name": "", "story_info": "", "episodes_data": [{"video_oss_key": "", "srt_oss_key": "", "negative_oss_key": "", "num": 1}] }' # Poll -> extract task_order_num and results.file_ids[0] ``` ### Step 3: Generate Clip Data ```bash # 3a. Get BGM (based on Decision 4) # Option A: narrator-ai-cli bgm list --json -> user picks -> bgm = selected "id" # Option B: narrator-ai-cli file list --json -> user picks audio -> bgm = selected "file_id" # 3b. Get dubbing voice (Decision 5) # narrator-ai-cli dubbing list --lang --json -> user picks # -> dubbing = selected "id", dubbing_type = selected "type" # 3c. Create task narrator-ai-cli task create clip-data --json -d '{ "order_num": "", "bgm": "", "dubbing": "", "dubbing_type": "" }' # Poll -> extract results.file_ids[0] ``` ### Step 4: Video Composing **IMPORTANT**: `order_num` is from step 2 (generate-writing), NOT step 3 (clip-data). ```bash narrator-ai-cli task create video-composing --json -d '{ "order_num": "", "bgm": "", "dubbing": "", "dubbing_type": "" }' # Poll -> extract video URLs from results ``` ### Step 5 (Optional): Magic Video Based on Decision 6: ```bash # List visual templates narrator-ai-cli task templates --json # -> user picks template name # Apply template narrator-ai-cli task create magic-video --json -d '{ "task_id": "", "template_name": [""] }' ``` ## Workflow Path 2: 原创文案 (faster & cheaper) ``` search-movie -> fast-writing -> fast-clip-data -> video-composing -> magic-video(optional) ``` ### Step 0: Prepare ```bash # Get narration style template (Decision 2) narrator-ai-cli task narration-styles --json # -> user picks one -> learning_model_id # Search movie info (required for target_mode=1) narrator-ai-cli task search-movie "" --json # -> show 3 results, user picks one -> confirmed_movie_json ``` ### Step 1: Fast Writing (原创文案) ASK user to choose a mode: - **Mode 1 - 热门影视** (Hot Drama): generates original narration from movie info. Requires `confirmed_movie_json` from `search-movie`. - **Mode 2 - 原声混剪** (Original Mix): mixes original audio with narration. Requires `episodes_data[{srt_oss_key, num}]`. - **Mode 3 - 冷门/新剧** (New/Niche Drama): for lesser-known content. Requires `episodes_data[{srt_oss_key, num}]`. ```bash # Mode 1 example (most common): narrator-ai-cli task create fast-writing --json -d '{ "learning_model_id": "", "target_mode": "1", "playlet_name": "", "model": "flash", "language": "Chinese (中文)", "perspective": "third_person", "confirmed_movie_json": }' # Mode 2/3 example: narrator-ai-cli task create fast-writing --json -d '{ "learning_model_id": "", "target_mode": "2", "playlet_name": "", "episodes_data": [{"srt_oss_key": "", "num": 1}] }' # Poll -> extract task_id and results.file_ids[0] ``` ### Step 2: Fast Clip Data ```bash # 2a. Get BGM (Decision 4) # Option A: narrator-ai-cli bgm list --json -> user picks # Option B: narrator-ai-cli file list --json -> user picks audio # 2b. Get dubbing voice (Decision 5) # narrator-ai-cli dubbing list --lang --json -> user picks # 2c. Get source files (Decision 3) # Option A: narrator-ai-cli material list --search "" --json # Option B: narrator-ai-cli file list --json # 2d. Create task narrator-ai-cli task create fast-clip-data --json -d '{ "task_id": "", "file_id": "", "bgm": "", "dubbing": "", "dubbing_type": "", "episodes_data": [{"video_oss_key": "", "srt_oss_key": "", "negative_oss_key": "", "num": 1}] }' # Poll -> extract task_order_num ``` ### Step 3: Video Composing **IMPORTANT**: In 原创文案 path, `order_num` comes from `fast-clip-data`'s `task_order_num`. ```bash narrator-ai-cli task create video-composing --json -d '{ "order_num": "", "bgm": "", "dubbing": "", "dubbing_type": "" }' # Poll -> extract video URLs from results ``` ### Step 4 (Optional): Magic Video Based on Decision 6: ```bash narrator-ai-cli task templates --json # -> user picks template narrator-ai-cli task create magic-video --json -d '{ "task_id": "", "template_name": [""] }' ``` ## Standalone Tasks ```bash # Voice Clone — clone a voice from audio sample narrator-ai-cli task create voice-clone --json -d '{"audio_file_id": ""}' # Text to Speech — convert text using cloned voice narrator-ai-cli task create tts --json -d '{"voice_id": "", "audio_text": "text"}' ``` ## Utility Commands ```bash # Account narrator-ai-cli user balance --json # Tasks narrator-ai-cli task list --json narrator-ai-cli task list --status 2 --type 9 --json # filter: status 0-4, type 1-10 narrator-ai-cli task query --json narrator-ai-cli task budget --json -d '{...}' # estimate points narrator-ai-cli task verify --json -d '{...}' # verify materials # Writing management narrator-ai-cli task get-writing --task-id --file-id --json narrator-ai-cli task save-writing --json -d '{"task_id":"...", "file_id":"...", "content":[{"type":"解说","text":"..."}]}' # Files (user's uploaded files) narrator-ai-cli file list --json narrator-ai-cli file list --search "" --json narrator-ai-cli file upload ./file.mp4 --json narrator-ai-cli file transfer --link "" --json # transfer by HTTP/Baidu/PikPak link narrator-ai-cli file info --json narrator-ai-cli file download --json narrator-ai-cli file storage --json narrator-ai-cli file delete --json # Pre-built Resources narrator-ai-cli task narration-styles --json # 90+ narration style templates narrator-ai-cli task narration-styles --genre --json narrator-ai-cli material list --json # 93 pre-built movies (video + SRT) narrator-ai-cli material list --genre --json narrator-ai-cli material list --search "" --json narrator-ai-cli material genres --json narrator-ai-cli bgm list --json # 146 pre-built BGM tracks narrator-ai-cli bgm list --search "" --json narrator-ai-cli dubbing list --json # 63 pre-built dubbing voices narrator-ai-cli dubbing list --lang --json narrator-ai-cli dubbing list --tag --json narrator-ai-cli dubbing languages --json narrator-ai-cli dubbing tags --json narrator-ai-cli task templates --json # visual templates (magic-video) narrator-ai-cli task search-movie "" --json # movie info search # All pre-built resources can be previewed at: # https://ceex7z9m67.feishu.cn/wiki/WLPnwBysairenFkZDbicZOfKnbc ``` ## Task Status Codes - `0` = init - `1` = in_progress - `2` = success (done, extract results) - `3` = failed (check error_message_slug) - `4` = cancelled ## Error Codes - `10001` = failed (generic) - `10004` = invalid app key - `10009` = insufficient balance — notify the user: ``` ⚠️ 账户余额不足,请联系客服充值或获取 App Key: 📧 Email: merlinyang@gridltd.com ``` Then display: `![联系客服](imgs/contact.png)` - `10010` = task not found - `60000` = retryable error (retry the operation)