本文へ移動
cccskills
無料GitHub で公開

lanshu-create-ai-presenter-video

Turn a topic or finished script into a complete, publish-ready explainer video — led by an AI presenter from an authorized adult presenter image, or performed with no presenter in one of twelve explainer styles (nine visual styles and three narrative ones). Not for promos, ads, or footage montages. Use for new presenter or styled explainer videos and for continuing, revising, captioning, lip-sync repairing, or re-exporting an existing job. Use it whenever the user asks for 数字人口播 / 数字人讲解, for a 讲解视频 / 动画讲解 / 科普视频, asks which styles or templates are available (有哪些风格 / 看看风格 / 风格模板), or names one of the styles: 留白, 信号/科技感, 手帐/手绘, 立体书/纸艺, 波普漫画, 一镜到底/3D, 图纸与注脚, 黑板报, 黏土小城, 推演/动态图解, 案卷/调查复盘, 小剧场/生活场景. Keep model and provider selection capability-based and record the actual choices per job.

インストール方法を見る

含まれるファイル(200)

  • SKILL.md14.9 KB
  • .github/workflows/validate.yml2.0 KB
  • .gitignore360 B
  • agents/openai.yaml443 B
  • assets/job.template.json1.9 KB
  • CHANGELOG.md2.2 KB
  • explainer/core/core.js11.1 KB
  • explainer/core/sfxlib.py9.1 KB
  • explainer/examples/kv-cache/v1-editorial/fonts.json133 B
  • explainer/examples/kv-cache/v1-editorial/hyperframes.json355 B
  • explainer/examples/kv-cache/v1-editorial/index.html48.5 KB
  • explainer/examples/kv-cache/v1-editorial/meta.json114 B
  • explainer/examples/kv-cache/v1-editorial/package.json306 B
  • explainer/examples/kv-cache/v1-editorial/tools/sfx.py7.6 KB
  • explainer/examples/kv-cache/v10-reasoning/beats.js30.3 KB
  • explainer/examples/kv-cache/v10-reasoning/fonts.json678 B
  • explainer/examples/kv-cache/v10-reasoning/hyperframes.json355 B
  • explainer/examples/kv-cache/v10-reasoning/index.html30.3 KB
  • explainer/examples/kv-cache/v10-reasoning/meta.json116 B
  • explainer/examples/kv-cache/v10-reasoning/package.json307 B
  • explainer/examples/kv-cache/v10-reasoning/STYLE.md2.1 KB
  • explainer/examples/kv-cache/v10-reasoning/tools/sfx.py13.2 KB
  • explainer/examples/kv-cache/v10-reasoning/tools/sfx.sh374 B
  • explainer/examples/kv-cache/v11-casefile/beats.js28.9 KB
  • explainer/examples/kv-cache/v11-casefile/fonts.json340 B
  • explainer/examples/kv-cache/v11-casefile/hyperframes.json355 B
  • explainer/examples/kv-cache/v11-casefile/index.html37.0 KB
  • explainer/examples/kv-cache/v11-casefile/meta.json114 B
  • explainer/examples/kv-cache/v11-casefile/package.json306 B
  • explainer/examples/kv-cache/v11-casefile/STYLE.md3.8 KB
  • explainer/examples/kv-cache/v11-casefile/tools/sfx.py3.5 KB
  • explainer/examples/kv-cache/v11-casefile/tools/sfx.sh991 B
  • explainer/examples/kv-cache/v12-sitcom/beats.js37.8 KB
  • explainer/examples/kv-cache/v12-sitcom/fonts.json327 B
  • explainer/examples/kv-cache/v12-sitcom/hyperframes.json355 B
  • explainer/examples/kv-cache/v12-sitcom/index.html27.3 KB
  • explainer/examples/kv-cache/v12-sitcom/meta.json110 B
  • explainer/examples/kv-cache/v12-sitcom/package.json304 B
  • explainer/examples/kv-cache/v12-sitcom/STYLE.md2.6 KB
  • explainer/examples/kv-cache/v12-sitcom/tools/sfx_beats.py11.2 KB
  • explainer/examples/kv-cache/v12-sitcom/tools/sfx.py7.3 KB
  • explainer/examples/kv-cache/v12-sitcom/tools/sfx.sh579 B
  • explainer/examples/kv-cache/v2-signal/fonts.json203 B
  • explainer/examples/kv-cache/v2-signal/hyperframes.json355 B
  • explainer/examples/kv-cache/v2-signal/index.html81.1 KB
  • explainer/examples/kv-cache/v2-signal/meta.json108 B
  • explainer/examples/kv-cache/v2-signal/package.json303 B
  • explainer/examples/kv-cache/v2-signal/tools/sfx.py9.5 KB
  • explainer/examples/kv-cache/v3-notebook/fonts.json61 B
  • explainer/examples/kv-cache/v3-notebook/hyperframes.json355 B
  • explainer/examples/kv-cache/v3-notebook/index.html43.0 KB
  • explainer/examples/kv-cache/v3-notebook/meta.json112 B
  • explainer/examples/kv-cache/v3-notebook/package.json305 B
  • explainer/examples/kv-cache/v3-notebook/tools/sfx.py1.0 KB
  • explainer/examples/kv-cache/v4-paper/fonts.json50 B
  • explainer/examples/kv-cache/v4-paper/hyperframes.json355 B
  • explainer/examples/kv-cache/v4-paper/index.html60.0 KB
  • explainer/examples/kv-cache/v4-paper/meta.json106 B
  • explainer/examples/kv-cache/v4-paper/package.json302 B
  • explainer/examples/kv-cache/v4-paper/tools/sfx.py9.3 KB
  • explainer/examples/kv-cache/v5-comic/fonts.json287 B
  • explainer/examples/kv-cache/v5-comic/hyperframes.json355 B
  • explainer/examples/kv-cache/v5-comic/index.html73.3 KB
  • explainer/examples/kv-cache/v5-comic/meta.json106 B
  • explainer/examples/kv-cache/v5-comic/package.json302 B
  • explainer/examples/kv-cache/v5-comic/tools/sfx.py10.9 KB
  • explainer/examples/kv-cache/v6-cinematic/fonts.json569 B
  • explainer/examples/kv-cache/v6-cinematic/hyperframes.json355 B
  • explainer/examples/kv-cache/v6-cinematic/index.html54.4 KB
  • explainer/examples/kv-cache/v6-cinematic/meta.json114 B
  • explainer/examples/kv-cache/v6-cinematic/package.json306 B
  • explainer/examples/kv-cache/v6-cinematic/tools/sfx.py7.1 KB
  • explainer/examples/kv-cache/v7-drafting/fonts.json558 B
  • explainer/examples/kv-cache/v7-drafting/hyperframes.json355 B
  • explainer/examples/kv-cache/v7-drafting/index.html61.6 KB
  • explainer/examples/kv-cache/v7-drafting/meta.json111 B
  • explainer/examples/kv-cache/v7-drafting/package.json304 B
  • explainer/examples/kv-cache/v7-drafting/tools/sfx.py8.7 KB
  • explainer/examples/kv-cache/v8-chalkboard/fonts.json169 B
  • explainer/examples/kv-cache/v8-chalkboard/hyperframes.json355 B
  • explainer/examples/kv-cache/v8-chalkboard/index.html33.4 KB
  • explainer/examples/kv-cache/v8-chalkboard/meta.json115 B
  • explainer/examples/kv-cache/v8-chalkboard/package.json306 B
  • explainer/examples/kv-cache/v8-chalkboard/tools/sfx.py3.7 KB
  • explainer/examples/kv-cache/v9-clay/fonts.json418 B
  • explainer/examples/kv-cache/v9-clay/hyperframes.json355 B
  • explainer/examples/kv-cache/v9-clay/index.html70.6 KB
  • explainer/examples/kv-cache/v9-clay/meta.json104 B
  • explainer/examples/kv-cache/v9-clay/package.json301 B
  • explainer/examples/kv-cache/v9-clay/STYLE.md1.6 KB
  • explainer/examples/kv-cache/v9-clay/tools/sfx.py8.2 KB
  • explainer/examples/README.md1.4 KB
  • explainer/gallery/nine-styles-kv-cache.jpg239.7 KB
  • explainer/gallery/three-narrative-styles-kv-cache.jpg147.9 KB
  • explainer/GOTCHAS.md4.8 KB
  • explainer/KITS.md18.4 KB
  • explainer/kits/v1-editorial/kit.css14.3 KB
  • explainer/kits/v1-editorial/kit.js24.4 KB
  • explainer/kits/v1-editorial/KIT.md10.6 KB
  • explainer/kits/v1-editorial/paper-grain.svg437 B
  • explainer/kits/v1-editorial/starter/AGENTS.md1.5 KB
  • explainer/kits/v1-editorial/starter/beats.js1.7 KB
  • explainer/kits/v1-editorial/starter/CLAUDE.md1.5 KB
  • explainer/kits/v1-editorial/starter/fonts.json133 B
  • explainer/kits/v1-editorial/starter/hyperframes.json355 B
  • explainer/kits/v1-editorial/starter/index.html32.2 KB
  • explainer/kits/v1-editorial/starter/meta.json112 B
  • explainer/kits/v1-editorial/starter/package.json305 B
  • explainer/kits/v1-editorial/starter/STARTER.md6.9 KB
  • explainer/kits/v1-editorial/starter/tools/sfx.py7.8 KB
  • explainer/kits/v1-editorial/starter/tools/sfx.sh456 B
  • explainer/kits/v10-reasoning/kit.css15.4 KB
  • explainer/kits/v10-reasoning/kit.js43.7 KB
  • explainer/kits/v10-reasoning/KIT.md11.2 KB
  • explainer/kits/v10-reasoning/starter/AGENTS.md1.5 KB
  • explainer/kits/v10-reasoning/starter/beats.js1.4 KB
  • explainer/kits/v10-reasoning/starter/CLAUDE.md1.5 KB
  • explainer/kits/v10-reasoning/starter/fonts.json678 B
  • explainer/kits/v10-reasoning/starter/hyperframes.json355 B
  • explainer/kits/v10-reasoning/starter/index.html29.8 KB
  • explainer/kits/v10-reasoning/starter/meta.json114 B
  • explainer/kits/v10-reasoning/starter/package.json306 B
  • explainer/kits/v10-reasoning/starter/STARTER.md8.5 KB
  • explainer/kits/v10-reasoning/starter/tools/sfx.py8.9 KB
  • explainer/kits/v10-reasoning/starter/tools/sfx.sh374 B
  • explainer/kits/v11-casefile/casefile_sfx.py8.5 KB
  • explainer/kits/v11-casefile/cork.svg1.2 KB
  • explainer/kits/v11-casefile/events.mjs2.8 KB
  • explainer/kits/v11-casefile/kit.css18.2 KB
  • explainer/kits/v11-casefile/kit.js57.8 KB
  • explainer/kits/v11-casefile/KIT.md11.3 KB
  • explainer/kits/v11-casefile/stamp-ink.svg539 B
  • explainer/kits/v11-casefile/starter/AGENTS.md1.5 KB
  • explainer/kits/v11-casefile/starter/beats.js1.6 KB
  • explainer/kits/v11-casefile/starter/CLAUDE.md1.5 KB
  • explainer/kits/v11-casefile/starter/fonts.json340 B
  • explainer/kits/v11-casefile/starter/hyperframes.json355 B
  • explainer/kits/v11-casefile/starter/index.html37.0 KB
  • explainer/kits/v11-casefile/starter/meta.json112 B
  • explainer/kits/v11-casefile/starter/package.json305 B
  • explainer/kits/v11-casefile/starter/STARTER.md8.5 KB
  • explainer/kits/v11-casefile/starter/tools/sfx.py3.5 KB
  • explainer/kits/v11-casefile/starter/tools/sfx.sh991 B
  • explainer/kits/v12-sitcom/kit.css26.6 KB
  • explainer/kits/v12-sitcom/kit.js83.9 KB
  • explainer/kits/v12-sitcom/KIT.md11.5 KB
  • explainer/kits/v12-sitcom/sitcom_sfx.py6.2 KB
  • explainer/kits/v12-sitcom/starter/AGENTS.md1.5 KB
  • explainer/kits/v12-sitcom/starter/beats.js1.8 KB
  • explainer/kits/v12-sitcom/starter/CLAUDE.md1.5 KB
  • explainer/kits/v12-sitcom/starter/fonts.json327 B
  • explainer/kits/v12-sitcom/starter/hyperframes.json355 B
  • explainer/kits/v12-sitcom/starter/index.html26.4 KB
  • explainer/kits/v12-sitcom/starter/meta.json110 B
  • explainer/kits/v12-sitcom/starter/package.json304 B
  • explainer/kits/v12-sitcom/starter/STARTER.md8.2 KB
  • explainer/kits/v12-sitcom/starter/tools/sfx_beats.py1.1 KB
  • explainer/kits/v12-sitcom/starter/tools/sfx.py7.3 KB
  • explainer/kits/v12-sitcom/starter/tools/sfx.sh579 B
  • explainer/kits/v2-signal/kit.css14.4 KB
  • explainer/kits/v2-signal/kit.js28.1 KB
  • explainer/kits/v2-signal/KIT.md10.6 KB
  • explainer/kits/v2-signal/sfx_signal.py3.6 KB
  • explainer/kits/v2-signal/starter/AGENTS.md1.5 KB
  • explainer/kits/v2-signal/starter/beats.js1.3 KB
  • explainer/kits/v2-signal/starter/CLAUDE.md1.5 KB
  • explainer/kits/v2-signal/starter/fonts.json203 B
  • explainer/kits/v2-signal/starter/hyperframes.json355 B
  • explainer/kits/v2-signal/starter/index.html40.8 KB
  • explainer/kits/v2-signal/starter/meta.json106 B
  • explainer/kits/v2-signal/starter/package.json302 B
  • explainer/kits/v2-signal/starter/STARTER.md7.5 KB
  • explainer/kits/v2-signal/starter/tools/sfx.py7.6 KB
  • explainer/kits/v2-signal/starter/tools/sfx.sh445 B
  • explainer/kits/v3-notebook/events.mjs3.1 KB
  • explainer/kits/v3-notebook/fix-56de.woff2940 B
  • explainer/kits/v3-notebook/kit.css12.8 KB
  • explainer/kits/v3-notebook/kit.js44.0 KB
  • explainer/kits/v3-notebook/KIT.md9.2 KB
  • explainer/kits/v3-notebook/notebook_sfx.py6.2 KB
  • explainer/kits/v3-notebook/paper-grain.svg437 B
  • explainer/kits/v3-notebook/starter/AGENTS.md1.5 KB
  • explainer/kits/v3-notebook/starter/beats.js1.5 KB
  • explainer/kits/v3-notebook/starter/CLAUDE.md1.5 KB
  • explainer/kits/v3-notebook/starter/fonts.json61 B
  • explainer/kits/v3-notebook/starter/hyperframes.json355 B
  • explainer/kits/v3-notebook/starter/index.html34.4 KB
  • explainer/kits/v3-notebook/starter/meta.json110 B
  • explainer/kits/v3-notebook/starter/package.json304 B
  • explainer/kits/v3-notebook/starter/STARTER.md7.0 KB
  • explainer/kits/v3-notebook/starter/tools/sfx.py3.4 KB
  • explainer/kits/v3-notebook/starter/tools/sfx.sh882 B
  • explainer/kits/v4-paper/kit.css17.2 KB
  • explainer/kits/v4-paper/kit.js33.7 KB
  • explainer/kits/v4-paper/KIT.md11.4 KB
  • explainer/kits/v4-paper/paper_sfx.py5.0 KB
  • explainer/kits/v4-paper/paper-grain.svg437 B
  • explainer/kits/v4-paper/starter/AGENTS.md1.5 KB
  • explainer/kits/v4-paper/starter/beats.js1.6 KB
  • explainer/kits/v4-paper/starter/CLAUDE.md1.5 KB

SKILL.md(原文)

インストールする前に、エージェントに与えられる指示の中身を確認できます。

Lanshu Create AI Presenter Video

Produce a verified explainer video from minimal inputs — led by a digital human, or performed in one of twelve explainer styles. The final narration is the master clock for presenter motion, captions, graphics, cuts, and delivery duration.

Choose a route

Every job takes one of two routes, recorded as creative.route. Infer it when the request is clear (cues below); otherwise ask once, with this table and the style gallery (explainer/STYLES.md; attach or link the images explainer/gallery/nine-styles-kv-cache.jpg and explainer/gallery/three-narrative-styles-kv-cache.jpg). Never fall back to presenter silently: it needs a portrait the user may not have.

RouteThe videoThe user providesPaid generationFormat
presenterA digital human presents; captions and keyword graphics support itTopic or script + authorized presenter imageVoice + presenter videoAny; 9:16 by default
styledA performed explainer: every narrated phrase is acted out on screen in one of twelve styles (nine visual, three narrative), no presenterTopic or scriptVoice only16:9
  • A presenter image or the words 数字人 / presenter / 口播 / 真人出镜 point to presenter; 不要真人 / "no presenter" / "faceless", a named style, or 动画讲解 / 手绘 / 黑板 / 黏土 / 漫画 / 推导 / 复盘 / 小剧场 point to styled.
  • A vertical platform (抖音 / 视频号 / 小红书 / 竖屏 / 9:16) is a format request, not a route: styled is 16:9 only. If it comes with no portrait or with styled cues, ask (a 16:9 styled film vs a 9:16 presenter video) instead of switching routes.
  • Narration the user already recorded is the locked audio on either route. Never pass it as --voice-sample (that flag is for voice cloning). On styled use story.py story --audio <file> and ask for the matching script text (or transcribe it and have the user check it).
  • To re-style an earlier job, keep its script and locked audio (no new voice cost), build a new film from the same story.json in the new style, and re-approve the storyboard. Ask which job when it is not obvious.
  • This skill makes explainers. For 宣传片 / 广告 / 发布大片 / footage edits, say so, and offer a product explainer only if the user wants one.
  • For styled also choose creative.explainer_style (v1-editorial … v12-sitcom). Recommend two or three from the topic and audience (one reason each) using explainer/STYLES.md; when the user is unsure, build drafts in the nine visual styles (no extra paid calls once the audio is locked, or with --dry) and let them pick from a still grid. Settle the style before the script is locked: each style shapes how the narration is written and voiced (explainer/STYLES.md, "按风格写稿"). The three narrative styles (v10-reasoning 推演, v11-casefile 案卷, v12-sitcom 小剧场) go further: use the style's suggested arc when it helps the explanation, adapting chapters and order to the topic. The examples are starting points; keep room for other storytelling choices. To compare styles first, use --dry drafts of a first script, then adapt it to the chosen style.
  • styled follows styled-explainer.md and reuses this skill's job directory, state machine, approvals, and delivery checks. The styles are designed to carry the explanation on their own; if a user also wants their digital human in a styled film, that file describes the method (time the film to the presenter's locked narration, give the presenter its own space) as an optional addition, not a separate route.

How to ask, when the request leaves the choice open — one message, in the user's language:

  1. The two routes, one line each: what the video looks like, what the user must provide, what is paid, and the format (presenter: any ratio, 9:16 by default; styled: 16:9 only). Recommend one for this topic and say why (e.g. "no portrait yet, or a concept that needs to be shown → styled"; "personal brand, talking to camera → presenter").
  2. For styled, assume the user does not know the styles yet: show the whole menu — the two gallery images plus the twelve one-line entries of "风格菜单" in explainer/STYLES.md — and mark the two or three that fit this topic and audience, one reason each. Offer "build drafts in the nine visual styles and pick from a still grid" as the alternative. Do the same, without the route table, when the user only asks which styles there are.
  3. Proceed with the recommendation if the user agrees or does not mind; record the choice in job.json.

Required outcome

  • Start from a topic or script and, for the presenter route, one authorized image containing one clear adult presenter.
  • Deliver a fully decoded master video, a smaller share copy, captions, production records, and separate machine and visual QA notes.
  • Keep the workflow portable across providers, models, aspect ratios, languages, and durations.

Operating rules

  • Confirm image rights, adult status, remote-upload approval, and voice-cloning authorization before the relevant remote action.
  • Treat remote generation as potentially billable. Before the first paid call, state the uploaded assets, requested seconds or units, known cost, pilot size, retry ceiling, and expected output. Reuse an approval already given for that exact plan.
  • Never infer a real voice from an image. Use an authorized sample or record a selected stock voice.
  • Lock the complete narration before presenter generation, caption timing, or final scene boundaries.
  • Prefer one presenter image, one voice identity, one visual treatment, and one continuous presenter source.
  • Mute video sources in the final composition. Route only the approved external narration and intentional mix tracks.
  • Preserve provider request bodies and task IDs without credentials or expiring URLs. Poll interrupted work before considering resubmission.
  • Use numeric checks for technical faults and normal-speed visual review for identity, mouth timing, blinking, gestures, hands, lighting, and continuity.
  • Stop after three rejected paid candidates, or before a change that materially affects cost, privacy, voice, appearance, or provider.
  • Do not claim completion until the final files fully decode, the contact sheet or full playback has been reviewed, and check_state.py reports verified.

Start or resume a job

For a new job, read generation.md. Set SKILL_DIR to the directory that contains this file; its location depends on the harness. Then run:

SKILL_DIR=/path/to/lanshu-create-ai-presenter-video

python3 "$SKILL_DIR/scripts/init_job.py" \
  --job-dir ~/Videos/my-presenter-video \
  --presenter-image ~/Pictures/presenter.png \
  --topic "用一分钟讲清楚上下文工程"

For the styled route add --route styled --explainer-style v3-notebook (no presenter image needed).

Use --script for an existing script file. Optional flags include --voice-sample, --supporting-media, --duration, --aspect, --width, --height, --fps, --watermark, and --cta. The initializer copies every input into the job and records job-relative paths, so the job directory is self-contained; keep later artifact paths job-relative too.

Inspect the actual source image and listen to any voice sample. Record the manual review and approvals in job.json, then run:

python3 "$SKILL_DIR/scripts/preflight.py" ~/Videos/my-presenter-video/job.json

For an existing job, read job.json, current artifacts, task IDs, and QA reports, then run check_state.py (below) to find the earliest unfinished state. Resume there without regenerating accepted work.

Production state machine

Advance a job only when its evidence exists:

intake
→ content_locked       passing preflight report, script, beat sheet
→ audio_locked         decodable final audio, ASR report
→ visual_plan_locked   timeline, storyboard, plan.status "approved"
→ presenter_generated  recorded main_presenter capability, selected video, visual review
→ composition_checked  composition report
→ rendered             decodable render with video and audio
→ verified             master, share, delivery report with passing output loudness

On the styled route there is no presenter: presenter_generated is reached by the performed film instead (artifacts.story, artifacts.film_project, and the visual review).

Never edit state by hand. Record artifacts in job.json, then let the checker compute the state:

python3 "$SKILL_DIR/scripts/check_state.py" ~/Videos/my-presenter-video/job.json --write

Without --write it only reports. It exits non-zero when the recorded state claims more than the evidence supports, and lists what the next state is missing.

1. Lock content and audio

Read generation.md.

  1. Turn a topic into one spoken content spine, or polish a supplied script without changing factual meaning silently.
  2. Save the production script, beat sheet, pronunciations, and narration sections.
  3. Generate the complete approved narration with one voice configuration.
  4. Normalize sections consistently, run ASR on the final audio, and correct material omissions, additions, numbers, names, or repeated speech.
  5. Record real durations. These durations now define the timeline.

2. Plan and generate the presenter

Choose a presenter-led, screen-demo, or mixed-explainer route. Use supporting media only when it proves or clarifies a spoken point.

When the provider caps request or reference-audio duration below the narration length, plan the split from the locked audio's ASR timings instead of guessing:

python3 "$SKILL_DIR/scripts/plan_segments.py" \
  --timings ~/Videos/my-presenter-video/qa/asr/sentences.json \
  --audio ~/Videos/my-presenter-video/assets/audio/final/narration.wav \
  --cap 15 --whole-seconds \
  --output ~/Videos/my-presenter-video/qa/requests/segment-plan.json

Save the plan path in plan.segment_plan. Generate every segment from the same image, seed, framing, light, and motion constraints.

Generate a short, low-cost pilot before a full run. Prioritize identity and mouth timing for the main track. Use one controlled gesture for an actionful opening or close. When body motion is accepted but mouth timing fails, preserve the motion plate and apply a dedicated lip-sync repair with the locked audio.

Archive the prompt, parameters, provider/model/version, region, task ID, requested seconds, and acceptance notes.

3. Edit the video

Read editing.md.

Build a deterministic timeline driven by the locked audio. Keep authored start, duration, and source offset independent. Add captions and keyword callouts only after audio and selected media are final.

When using HyperFrames, load the current hyperframes, general-video, and relevant domain instructions. Run the project check, inspect transition and emphasis frames, open the Studio preview, and wait for final visual approval before rendering.

4. Verify and deliver

Read qa-recovery.md.

Render at delivery quality, watch the complete video, and finalize it:

bash "$SKILL_DIR/scripts/finalize_delivery.sh" \
  ~/Videos/my-presenter-video/renders/rendered.mp4 \
  ~/Videos/my-presenter-video/outputs \
  my-video

The finalizer preserves the input aspect ratio, performs two-pass program loudness normalization, creates master/share encodes, fully decodes them, measures their delivered loudness, counts black and frozen-picture events, and produces a nine-frame contact sheet. It builds everything in a temporary directory and publishes nothing unless every check passes. The target defaults to -16 LUFS; set PROGRAM_LUFS (for example PROGRAM_LUFS=-14) when the destination requires another.

Inspect the contact sheet, review any freeze events against intentional still shots, record the outputs and delivery report in job.json, and run check_state.py --write to reach verified.

Default behavior for minimal input

  • Infer language from the request.
  • On the presenter route, use 9:16, 1080×1920, 30fps unless the intended platform suggests another format. The styled route is always 16:9, 1920×1080, 30fps.
  • Preserve a supplied script's natural duration; for a topic, target 45–75 seconds.
  • Use a suitable stock voice when no authorized voice sample exists.
  • On the presenter route, use a presenter-led layout with a designed hook, 2–4 useful beats, and a concise close; on the styled route, the style's starter sets the layout.
  • Omit music and promotional CTA unless requested or clearly justified.
  • Keep styling credible, contemporary, readable, and safe for the destination platform.

Required job artifacts

job.json
docs/{SCRIPT,BEAT_SHEET,TIMELINE,STORYBOARD}.md
assets/source/
assets/audio/{reference,raw,final}/
assets/video/{candidates,selected,render}/
assets/captions/
qa/{requests,asr,contacts,reports}/
renders/
outputs/

Reference routing

  • Read styled-explainer.md whenever creative.route is styled; it maps every state above onto the explainer tools in explainer/. Choose styles with explainer/STYLES.md.
  • Read generation.md for intake, content, voice, tool selection, presenter prompts, paid generation, or provider changes.
  • Read editing.md for timeline construction, screen-demo layouts, openings, closes, captions, keyword callouts, previews, and exports.
  • Read qa-recovery.md before accepting media or delivery, and whenever lip sync, identity, hands, exposure, freezes, captions, audio, or remote jobs fail.

レビュー

まだレビューはありません。使ってみた感想をお寄せください。

このスキルの問題を報告する