Communitygithub.com

jpoz/make-video

프롬프트에서 나레이션이 포함된 짧은 영화(설명, 제품 소개, 기능 발표, 코드 또는 디자인 안내)를 제작합니다. 모든 프레임은 캔버스에 코드로 그려지며, 로컬 AI 음성(Kokoro), 코드로 만들어진 배경 음악, 단어에 동기화된 큐, 영상에 포함된 자막 및 .srt/.vtt 파일을 생성합니다.

make-video란 무엇인가요?

이 스킬은 사용자가 제공한 프롬프트를 기반으로 나레이션이 포함된 짧은 영화를 제작합니다. 프롬프트 → 스토리보드(실제 음성 및 음악 포함) → 사용자 반복 수정 → 최종 렌더링의 고정된 흐름을 따릅니다. 모든 프레임은 `@napi-rs/canvas` 라이브러리를 사용하여 시간(t)의 순수 함수로 그려지며, ffmpeg를 통해 인코딩됩니다. 음성은 Kokoro 모델을 사용하여 로컬에서 생성되고, 음악은 Python으로 합성됩니다. 각 장면의 그림은 해당 그림을 설명하는 음성의 단어에 정확히 동기화됩니다. 이 스킬은 기능 소개, 제품 발표, 코드 리뷰 안내 또는 설명 영상 제작에 특히 유용합니다. 사용자가 스토리보드를 승인한 후에만 전체 1080p 영상이 렌더링되며, 각 단계에서 실제 프레임을 샘플링하여 확인합니다. Claude Code 환경에서 실행되며 Node 20+, ffmpeg, uv 및 python3가 필요합니다. 최종 출력물은 MP4, SRT 및 VTT 자막 파일, 그리고 완성된 영상을 포함한 스토리보드 페이지입니다.

지원 대상✓Claude Code~Codex CLI✓Cursor
npx skills add https://github.com/jpoz/make-video/tree/HEAD/skills/make-video

즐겨 사용하는 AI에게 물어보기

이 에이전트 스킬이 미리 로드된 새 채팅을 엽니다.

문서

make-video은(는) 무엇을 하나요?

Make a narrated film from a prompt. Every frame is a pure function of time t, drawn on a canvas (@napi-rs/canvas) and encoded with ffmpeg. The voice is generated locally with Kokoro. The music is synthesized in Python. Every picture is timed to the word in the voice that names it.

The flow is fixed: prompt → storyboard (real voice, real music, one real frame per scene) → the user iterates on the storyboard → full render. Do not render the full film before the user approves the storyboard. Sample real frames at every step and fix what you see before you show it.

<skill> below means the folder that holds this SKILL.md.

Requirements

node 20+, ffmpeg, uv (it runs the Python scripts and installs their dependencies), and python3. ./make.sh setup checks for them. The Kokoro model (~115 MB) downloads once, on the first voice run, to ~/.cache/make-video/models. Fonts are not shipped: see references/fonts.md.

1. Understand the film (from the prompt)

Read what the film is about before you write a line: the PR, the repo, the docs, the app, the announcement. Find the real things the film can show: real screens, real code, real output. Decide these, and ask the user only about what you cannot find out yourself:

  • Kind and length. Feature intro or announcement: 30–75 s, 6–10 scenes, real app screens. Explainer: 2–6 min, chapters with title cards, diagrams and code. Rule of thumb: 2.5 words of voice per second.
  • Audience and the one thing they must know or do at the end.
  • Look. The ink palette (near-black, red accent) or navy (deep blue, sky and amber) in theme.mjs, or the product's own colors and fonts.
  • Music style. pop (bright, upbeat) or chip (quiet chiptune), or none.

2. Make the project

<skill>/scripts/new-project.sh ~/Developer/<topic>-video <topic>-video

This copies <skill>/template (a working 30 s sample film) and runs npm install. Get the fonts (references/fonts.md). The project is self-contained. Edit these files:

FileWhat it is
video.jsonThe script: scenes, voice lines, cues, timing, music, the brief for the storyboard
scenes/*.mjsOne draw function per scene id
theme.mjsPalette, fonts, background
music.pyThe score (chords, hooks, instruments), when the defaults do not fit
shots/plan.mjsReal app screenshots to capture, when the film shows an app

Do not edit timeline.json. timeline.py generates it.

3. Write the script (video.json)

Read references/script.md first. In short: one idea per scene, short plain sentences, open with a hook, and end with what to do next. A line is a string, or {"text", "say"} when the caption and the spoken form differ ("video.json" is said "video dot jason"). A cue names the word that a picture lands on: {"label": "badge", "at": "badge", "sound": "chime"}. Put a cue on every important arrival. Fill in brief (lede, approach, open questions); the storyboard shows it.

4. Draw the scenes (scenes/*.mjs)

Read references/drawing.md (the scene API, helpers, layout and motion rules). Each scene gets (ctx, t, S). Put each arrival on S.cue(label) or S.w('word'), and make each element leave by S.tout. Use real material:

  • App screens: capture the real UI with shots/capture.mjs and show it with screens.mjs (camera, cursor, rings). See references/screens.md.
  • Code: code.mjs reads the real file by line number, so a quote cannot be wrong.
  • Program output: run the real program and draw its real output. Do not draw output you have not seen.

Sample while you draw. After each scene, run ./make.sh scene <id> and look at out/sheet.jpg before you go to the next scene. For each tricky move or transition, run ./make.sh clip A B and watch out/clip.mp4. references/review.md has the checklist.

5. The storyboard: the user iterates here

./make.sh storyboard

This runs voice → timeline → music → audio mix → one frame per scene → storyboard.html: a self-contained page with the real voice-and-music mix, a frame of every scene, the script with each cue word marked, the timecodes, and the brief. Playing it highlights the current scene and line.

Before you show it, look at every frame in out/board/ and fix what is wrong. Then give the user the page. If your harness can publish an HTML page or an artifact, publish storyboard.html and share the link. If not, give the file path to open in a browser.

Then iterate with the user. Each change is small and fast: edit a line in video.json (only the changed lines are voiced again), move a cue, change a scene's energy, restyle, redraw a scene. Then run ./make.sh storyboard again. Keep the brief's open questions up to date. Stay in this loop until the user approves the storyboard.

6. The full render

Only after the user approves:

./make.sh film            # or: ./make.sh film --blur 4   (motion blur, ~4x slower)

This writes out/<name>.mp4 (1920×1080, 60 fps, AAC, loudness −16 LUFS), out/<name>.srt, and out/<name>.vtt. Then check the real output, not the code (see references/review.md, "Final check"): pull frames from the encoded MP4, confirm the duration and the streams, and listen to the mix at the points that changed. Run python3 storyboard.py --final to make the storyboard page hold the finished film. Deliver the MP4, the captions, and the storyboard. If the film is an announcement, offer a short post to go with it, written from the same script.

Commands

CommandDoes
./make.sh storyboardVoice, timeline, music, mix, board frames, storyboard.html
./make.sh scene ID [0.3,0.6,0.9]Stills at fractions of one scene, plus out/sheet.jpg
./make.sh samples [24]Stills spread over the whole film, plus out/sheet.jpg
./make.sh stills 3,20.5Stills at exact seconds, plus out/sheet.jpg
./make.sh clip A Bout/clip.mp4: seconds A to B of the real film, with sound
./make.sh voice / music / timelineOne step only
./make.sh film [--blur N]The full render and mix
uv run tts.py --voicesList the Kokoro voices

References

  • references/script.md: how to write the voice-over, and all of video.json
  • references/drawing.md: the scene API, the lib.mjs helpers, layout, motion, scene patterns
  • references/screens.md: capturing real app screens and moving a camera over them
  • references/audio.md: voices, music styles, cue sounds, the mix, extra audio
  • references/review.md: how to sample, the polish checklist, the final check
  • references/fonts.md: where to get fonts

관련 스킬