본문으로 건너뛰기
cccskills
무료GitHub에 공개한국어 소개

music-to-video

음악의 박자와 강약, 무음, 고조를 분석해 글자와 이미지, 영상의 움직임을 맞춥니다. 추가 시각 소재 없이도 구성하며 계획 승인과 화면 확인을 거쳐 MP4로 완성합니다.

원문원문 설명 보기

Use when the user has a music track (an audio file, or a video to pull audio from) and wants a beat-synced HyperFrames video, calm to hard-hitting. The music drives everything: one analyzer reads it once, the orchestrator lays out the frames and fills a per-frame plan, and one sub-agent builds each frame. Typography and templates are the floor — a complete video needs zero assets — but any images or videos the user supplies are cut into the frames on the same beat grid (beat-cut / ken-burns). The genre (lyric video, slideshow, kinetic promo) falls out of the per-frame choices; the pipeline never branches on it.

실행 점수 미검증

설치 방법 보기

이럴 때 유용합니다

  • 음악에 맞춘 홍보 영상 제작
  • 음악과 사진으로 슬라이드쇼 제작
  • 움직이는 글자만으로 음악 영상 제작
  • 잔잔한 곡에 맞춘 영상 구성

한국어 소개

할 수 있는 일

음악의 박자, 강약, 무음, 고조를 분석하고 그 흐름에 맞는 HyperFrames 영상을 제작합니다. 글자와 템플릿만으로 구성할 수 있으며, 보유한 이미지나 영상도 같은 음악 타이밍에 맞춰 넣습니다. 리듬이 강한 곡은 박자에 맞춰 전환하고 잔잔한 곡은 악구와 강약을 따라 전개합니다. 구성안 작성부터 장면 제작, 결합, 검증, MP4 출력까지 다룹니다.

이럴 때 유용합니다

곡을 출발점으로 홍보 영상이나 슬라이드쇼를 만들 때 적합합니다. 시각 소재가 적어도 글자의 움직임을 중심으로 제작할 수 있습니다. 가로, 세로, 정사각형 화면을 지원하며 음악 파일뿐 아니라 영상에서 추출한 오디오도 입력으로 사용합니다.

사용 예시

  • “이 곡에 맞춰 움직이는 글자 중심의 홍보 영상을 만들어 주세요.”
  • “이 음악과 사진으로 박자에 맞춰 전환되는 슬라이드쇼를 만들어 주세요.”

주의 사항

HyperFrames CLI와 Python 3의 librosa, numpy, soundfile이 필요합니다. 구성안과 최종 렌더링 전에 사용자 확인을 받습니다. 음악을 새로 생성할 때는 인증 상태를 확인하고 온라인 또는 로컬 생성을 선택합니다. 내레이션과 웹사이트 녹화는 포함하지 않습니다.

이 소개문은 공개된 SKILL.md를 바탕으로 AI(OpenAI Codex)가 작성했습니다. 정확한 사양은 아래 원문을 확인하세요.

문서 점검

AI가 SKILL.md의 내용에서 주의가 필요한 작업과 도입 전제를 확인했습니다. 점수는 실제로 실행한 결과(실행 검증)만으로 매깁니다.

안전성전송·삭제·명령 실행 등을 명시하고 있는가
B일부 부족계획과 렌더링은 승인이 필요하지만 init의 전역 스킬 업데이트에는 확인 절차가 없습니다.
도입의 용이성필요한 도구나 API 키가 적고 적혀 있는가
B일부 부족Python 의존성 설치 명령은 있지만 HyperFrames CLI 설치 설명은 없습니다.

점수에는 넣지 않았습니다. 2026년 10월 23일 기준으로 AI(OpenAI Codex)가 판정했습니다. 참고용이므로 설치 전에 원문도 확인해 주세요.

평가가 다르다고 생각되면 재검토를 요청하기

어느 항목이 왜 다르다고 생각하는지 적어 주세요. 로그인은 필요 없습니다. SKILL.md와 대조해 평가를 다시 만들고 이곳에 반영합니다.

이 양식은 reCAPTCHA로 보호되며 Google 개인정보처리방침 및 서비스 약관이 적용됩니다.

포함된 파일(132)

  • SKILL.md15.8 KB
  • references/frame-skeleton.md6.4 KB
  • references/montage.md3.3 KB
  • references/motion-primitive-catalog.md9.7 KB
  • references/motion-primitives/3d-card-flip/index.html4.1 KB
  • references/motion-primitives/assets/gsap.min.js71.2 KB
  • references/motion-primitives/bg-flow-field/index.html11.8 KB
  • references/motion-primitives/binary-decrypt/index.html3.4 KB
  • references/motion-primitives/blur-resolve/index.html2.4 KB
  • references/motion-primitives/braam-punch/index.html3.4 KB
  • references/motion-primitives/chromatic-split/index.html4.2 KB
  • references/motion-primitives/chrome-sweep/index.html2.5 KB
  • references/motion-primitives/counting-punch/index.html3.9 KB
  • references/motion-primitives/crash-zoom-in/index.html4.1 KB
  • references/motion-primitives/datamosh-smear/index.html4.2 KB
  • references/motion-primitives/directional-fill/index.html3.5 KB
  • references/motion-primitives/dolly-zoom/index.html4.0 KB
  • references/motion-primitives/electric-arc/index.html4.1 KB
  • references/motion-primitives/flash-cut/index.html3.9 KB
  • references/motion-primitives/gooey-metaball/index.html5.6 KB
  • references/motion-primitives/hard-cut/index.html3.4 KB
  • references/motion-primitives/hypercut-whip/index.html2.0 KB
  • references/motion-primitives/iris-open/index.html2.7 KB
  • references/motion-primitives/kinetic-letter-in/index.html2.3 KB
  • references/motion-primitives/liquid-morph/index.html3.7 KB
  • references/motion-primitives/mask-reveal/index.html2.8 KB
  • references/motion-primitives/mosaic-pack/index.html3.5 KB
  • references/motion-primitives/neon-flicker/index.html2.7 KB
  • references/motion-primitives/outline-to-fill/index.html3.0 KB
  • references/motion-primitives/palette-flip/index.html3.5 KB
  • references/motion-primitives/particle-burst/index.html3.9 KB
  • references/motion-primitives/pixel-dissolve/index.html3.3 KB
  • references/motion-primitives/radial-burst-lines/index.html4.4 KB
  • references/motion-primitives/screen-shake/index.html2.9 KB
  • references/motion-primitives/slot-machine-reveal/index.html3.5 KB
  • references/motion-primitives/spotlight-sweep/index.html3.7 KB
  • references/motion-primitives/staggered-exit/index.html3.1 KB
  • references/motion-primitives/text-spectral-rays/index.html12.0 KB
  • references/motion-primitives/text-spectral-rays/USAGE.md2.3 KB
  • references/motion-primitives/text-wave-distort/index.html3.7 KB
  • references/motion-primitives/tile-mosaic/index.html3.8 KB
  • references/motion-primitives/typewriter-reveal/index.html3.3 KB
  • references/motion-primitives/word-grid-burst/index.html3.4 KB
  • references/planning.md6.0 KB
  • references/storyboard-format.md6.1 KB
  • references/template-catalog.md8.3 KB
  • references/templates/card-flyby/index.html20.2 KB
  • references/templates/card-flyby/program.json642 B
  • references/templates/held-message-living-field/index.html16.9 KB
  • references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/asphalt-031.png112.5 KB
  • references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/bark-014.png88.5 KB
  • references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/brick.png40.0 KB
  • references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/bricks-075-a.png48.2 KB
  • references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/bricks-101.png47.3 KB
  • references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/bricks-102.png35.2 KB
  • references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/bricks-104.png19.7 KB
  • references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/carpet.png158.7 KB
  • references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/concrete-034.png45.9 KB
  • references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/concrete-042-a.png84.3 KB
  • references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/concrete-046.png97.2 KB
  • references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/concrete-047-a.png111.5 KB
  • references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/concrete.png176.0 KB
  • references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/diamond-plate-009.png90.2 KB
  • references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/fabric-080.png30.2 KB
  • references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/fabric-083.png86.8 KB
  • references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/grass-001.png101.9 KB
  • references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/grass-004.png99.5 KB
  • references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/grass-005.png108.2 KB
  • references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/ground-037.png116.6 KB
  • references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/ground-054.png118.3 KB
  • references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/ground-068.png101.2 KB
  • references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/ground-080.png103.8 KB
  • references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/ground-103.png104.1 KB
  • references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/ground-104.png96.4 KB
  • references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/lava.png72.7 KB
  • references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/leather-037.png118.1 KB
  • references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/marble-012.png92.9 KB
  • references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/marble-016.png100.2 KB
  • references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/metal-032.png86.1 KB
  • references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/metal-038.png67.7 KB
  • references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/metal-041-a.png95.6 KB
  • references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/metal-046-b.png98.4 KB
  • references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/metal-048-a.png105.8 KB
  • references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/metal-049-a.png93.8 KB
  • references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/metal-055-a.png51.6 KB
  • references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/metal-061-b.png84.6 KB
  • references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/metal.png194.6 KB
  • references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/onyx.png85.1 KB
  • references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/painted-plaster-017.png53.4 KB
  • references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/paving-stones-138.png34.2 KB
  • references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/paving-stones-150.png41.8 KB
  • references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/plaster-001.png104.1 KB
  • references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/road-007.png84.1 KB
  • references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/road-008-a.png115.2 KB
  • references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/road-009-c.png72.5 KB
  • references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/road-012-a.png110.1 KB
  • references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/road-012-b.png109.2 KB
  • references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/road-013-a.png102.5 KB
  • references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/rock-058.png78.4 KB
  • references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/rock-063.png39.4 KB
  • references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/rock.png131.0 KB
  • references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/snow-015.png63.7 KB
  • references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/snow.png95.9 KB
  • references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/tiles-138.png109.6 KB
  • references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/travertine-009.png67.3 KB
  • references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/wood-049.png40.1 KB
  • references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/wood-051.png44.4 KB
  • references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/wood-058.png81.8 KB
  • references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/wood-066.png82.0 KB
  • references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/wood-092.png71.9 KB
  • references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/wood-094.png71.0 KB
  • references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/wood-floor-051.png41.6 KB
  • references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/wood-floor-064.png39.8 KB
  • references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/wood-floor-070.png51.8 KB
  • references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/wood.png41.2 KB
  • references/templates/held-text-strobe-burst/index.html11.2 KB
  • references/templates/intro-kinetic-cascade/index.html18.5 KB
  • references/templates/intro-kinetic-cascade/program.json1.5 KB
  • references/templates/logo-split-lockup-pulse/assets/fredoka-700.woff215.5 KB
  • references/templates/logo-split-lockup-pulse/index.html22.9 KB
  • references/templates/poster-tile-mosaic/index.html23.8 KB
  • references/templates/poster-tile-mosaic/program.json558 B
  • references/templates/roll-flipbook-word-cycle/index.html10.9 KB
  • references/templates/split-anchor-word-slot/index.html24.5 KB
  • references/templates/split-anchor-word-slot/program.json707 B
  • references/templates/typewriter-phrase-keyword-shuffle/index.html9.8 KB
  • scripts/analyze-beatgrid.py22.9 KB
  • scripts/assemble-index.mjs8.2 KB
  • scripts/lib/storyboard.mjs8.1 KB
  • scripts/stage-assets.mjs2.1 KB
  • scripts/validate-plan.mjs6.5 KB
  • sub-agents/frame-worker.md4.9 KB

SKILL.md(원문)

설치하기 전에 에이전트에게 전달되는 지시 내용을 확인할 수 있습니다.

music-to-video — one music-grounded, beat-synced video workflow

Use this skill to turn a music track into a beat-synced HyperFrames video. You analyze the track once, lay out the frames, fill in a per-frame plan, and build each frame as a composition. The input is a music track plus optional user images or videos — there is no narration and no website capture. Typography and templates are the floor (a complete video needs zero assets); any media the user supplies is cut in on the same beat grid.

You are the orchestrator. Work in videos/<project>/. Run the steps in order and pass each Gate before moving on. Two steps need the user: Step 3 (plan approval) and Step 6 (render approval). Do every step yourself except Step 4, where you dispatch one sub-agent per frame. Keep design and motion rules out of this file — they live in references/ and the frame-worker sub-agent.

SKILL_DIR = this skill directory. PROJECT_DIR = videos/<project-name>/.

Workflow: Step 0 setup → hyperframes.json + assets/bgm.mp3; Step 1 analyze → audiomap.json; Step 2 skeleton → STORYBOARD.md (frames, groups TBD); Step 3 plan → complete STORYBOARD.md + frame.md; Step 4 build → compositions/frames/NN-*.html; Step 5 assemble → index.html; Step 6 render → renders/video.mp4.

Two ideas that shape everything

  • One analyzer, and you trust it. analyze-beatgrid.py is the only beat analyzer — never re-measure beats with another tool or by ear. Its energy / density / rolls / onsets / silences are always reliable. Its bpm and beats_sec are reliable only when the music is genuinely rhythmic; on calm music the grid is a metronome the tracker imposed, so pace by phrases and energy instead and never hard-cut to it. Deciding which case you're in is each frame's pacing (Step 2).
  • One frame = one file; groups live inside. Step 2 cuts the track into frames, and each frame becomes one composition file compositions/frames/NN-<frame_id>.html, built by one frame-worker. A frame can subdivide into groups (each a template or a motion-primitives combo). Extra density goes inside a group, so frame count tracks distinct treatments, not beats — a fast track does not blow up the number of sub-agents.

Step 0: Setup, BGM, and inputs

Goal: Establish the music source, create the HyperFrames project, and note any user-supplied media.

The music is the spine — establish one track before anything else. This skill is tuned for fast, high-energy BGM: a strong beat grid drives the cuts (calm tracks work, but pace by phrase rather than beat). If the user gave you audio — a music file, or a video to pull the audio from — use it. If not, generate one: choose the mood from the user's description (e.g. "driving synthwave", "trap beat", "upbeat corporate") and produce a track via /hyperframes-media (references/bgm.md — HeyGen retrieval when credentialed, else local Lyria / MusicGen; ElevenLabs or another generator also works). Before generating, run npx hyperframes auth status and relay its output verbatim (don't paraphrase or rewrite it) — it shows whether BGM comes from HeyGen or local MusicGen and, if not signed in, how to sign in. If not signed in, STOP and wait for the user to choose — sign in, or continue offline with local MusicGen — before generating the track; don't write keys into a per-repo .env. (In autonomous mode, note the status and continue offline.) See /hyperframes-media → Preflight for the canonical guidance. Either way the track lands at assets/bgm.mp3. Stage any user-supplied images or videos so frames can weave them in on the beat grid; otherwise typography carries the whole video.

Initialize only if hyperframes.json is missing. Name <project> from the brief in kebab-case, such as midnight-drive-loop — never a timestamp. init checks the installed skills against the latest on GitHub and updates the global set if any are out of date.

npx hyperframes init "videos/<project>" --non-interactive --example=blank
mkdir -p "$PROJECT_DIR/assets" "$PROJECT_DIR/renders"
cp "<user-music>" "$PROJECT_DIR/assets/bgm.mp3"   # extract from a video first if needed
# only if the user gave you images/videos:
node <SKILL_DIR>/scripts/stage-assets.mjs --from <dir> --hyperframes "$PROJECT_DIR" --into public

The brand (font + palette) is chosen at Step 3, not here. Don't pick a genre or a track type up front — assets are just an optional ingredient, and the genre emerges from the per-frame choices.

Gate: hyperframes.json + assets/bgm.mp3 exist; aspect / length / fps and (if any) the asset inventory are noted.


Step 1: Analyze the music

Goal: Produce the one canonical timing analysis the whole video is built on.

analyze-beatgrid.py is the only beat analyzer — never re-measure beats with another tool or by ear. It reads the track once and writes audiomap.json: energy phases (level / density / feel), onsets + onset_rate, rolls, silences, hard_stops, key_moments, phrases, tempo / grid, and audio.duration_sec. It's deterministic — the same file always gives the same map. Most fields are reliable on any music; bpm and beats_sec are reliable only when the music is genuinely rhythmic, and judging that is the call you make at Step 2.

Prerequisites: Python 3 with librosa, numpy, and soundfile available. If import fails, install them into the active Python environment before running the analyzer:

python3 -m pip install librosa numpy soundfile
python3 <SKILL_DIR>/scripts/analyze-beatgrid.py "$PROJECT_DIR/assets/bgm.mp3" \
  -o "$PROJECT_DIR/audiomap.json" --print

Gate: audiomap.json exists; audio.duration_sec is known.


Step 2: Frame skeleton (structure only)

Goal: Read the music and lay out the frames — the skeleton of STORYBOARD.md.

Read references/frame-skeleton.md. Turn audiomap.json into the skeleton of STORYBOARD.md yourself — there is no intermediate JSON. Cut the track into frames at real musical changes (hard_stops, SURGE / DROP key_moments, the edges of a roll, a stretch with no onsets, a big energy jump), snapping every boundary to an audiomap anchor. For each frame set span_sec, pacing (the verdict from Step 1's trust call — beat_cut when the grid is real, phrase_flow when it's a metronome imposed on calm music), mood, and a one-line feel (the plain music situation Step 3 matches a template against). Only classify and lay out here: leave every frame's ### Groups as TBD (Step 3) and the frontmatter style blank — no templates, copy, color, or fonts. Expect ~1–6 frames.

Gate: frames tile the track (first at 0, last at duration_s); each carries span_sec + pacing + mood + feel; every ### Groups is TBD; no content anywhere.


Step 3: Fill the plan (user-gated)

Goal: Turn the skeleton into an approved, complete STORYBOARD.md.

Read references/planning.md, storyboard-format.md, template-catalog.md, motion-primitive-catalog.md, and montage.md (only if the user supplied assets). Editing the same file in place, do two things:

  1. Pick the brand. Choose one preset from ../hyperframes-creative/frame-presets/ using the table in ../hyperframes-creative/references/design-spec.md (match the track's mood; only its fonts and colors matter — templates own composition). Copy it into frame.md unmodified and fill the frontmatter style (font + a ≤4–6 swatch palette) from it.
  2. Fill every frame. Decide its groups and give each a treatment: a matched template from the catalog (with bound params and real audiomap anchors), a free-compose from the primitive catalog, or an asset treatment that obeys pacing. Write the copy. You own WHAT (template / primitives + content + anchors); the frame-worker owns HOW — never write millisecond tweens into the storyboard.
node <SKILL_DIR>/scripts/validate-plan.mjs --storyboard "$PROJECT_DIR/STORYBOARD.md" \
  --audiomap "$PROJECT_DIR/audiomap.json" --templates <SKILL_DIR>/references/templates

Fix every ✗ (hard errors: duration mismatch, frames not tiling the track, a missing src); warnings are best-effort. Then show the user a frame-by-frame summary and iterate until they approve.

Gate: frame.md is a verbatim preset copy; validate-plan.mjs exits 0; the user approved the plan.


Step 4: Build frames from the plan

Goal: Build every frame as a self-contained composition file.

Create compositions/frames/. Read sub-agents/frame-worker.md and ../hyperframes-core/references/subagent-dispatch.md. Dispatch one frame-worker per frame, in parallel where possible (otherwise in waves). Each worker gets exactly one frame and this context:

PROJECT_DIR: <abs path>
frame_id: <NN-frame_id>              # = the frame file stem, e.g. 02-f2; the composition id
Your block: the `## Frame N — <frame_id>` block in PROJECT_DIR/STORYBOARD.md
audiomap: PROJECT_DIR/audiomap.json
frame.md: PROJECT_DIR/frame.md
Materials: for each group, <SKILL_DIR>/references/templates/<id>/index.html (templates) and
           <SKILL_DIR>/references/motion-primitives/<id>/ (free); staged assets/ (asset groups)
Contracts: ../hyperframes-core/references/sub-compositions.md + determinism-rules.md
Canvas: <w>×<h>   Pacing: <beat_cut|phrase_flow>
Write to: PROJECT_DIR/compositions/frames/<frame_id>.html

The worker forks the cited materials, converts every anchor to frame-local seconds (local_t = track_t − span_sec[0]), gates its groups with 0ms cuts, and writes one seek-safe frame file. The worker never runs the hyperframes CLI — those commands operate on the assembled project, which doesn't exist yet, so they'd report on the wrong files. The worker just writes to the contract and stops; you verify after assembly (Step 6). As each worker returns, you can confirm its file landed on disk.

Gate: every frame has its compositions/frames/NN-*.html on disk.


Step 5: Assemble

Goal: Wire the built frames + BGM into the playable index.html.

assemble-index.mjs is deterministic — no subagent, no judgment. It references each frame file at its cumulative data-start, mounts assets/bgm.mp3 on track 11, and hard-cuts frame → frame (frames tile the track with no gaps, so there is no transition injector).

node <SKILL_DIR>/scripts/assemble-index.mjs --storyboard "$PROJECT_DIR/STORYBOARD.md" \
  --hyperframes "$PROJECT_DIR" --audiomap "$PROJECT_DIR/audiomap.json"

Fix any ✗ it reports — a missing or blank frame file means that worker wrote a partial file; re-dispatch it (Step 4) and re-assemble.

Gate: index.html exists; total duration == audiomap.audio.duration_sec.


Step 6: Verify and render

Goal: Verify the assembled video, get user approval, and render the final MP4.

Run the CLI on the assembled project — that's the correct unit (the per-frame workers couldn't run it). lint checks structure, validate runs headless Chrome (catching JS errors and missing assets), inspect snapshots frames.

( cd "$PROJECT_DIR" && npx hyperframes lint . && npx hyperframes validate . && npx hyperframes inspect . )

Inspect at t=0, each frame start, the strongest DROP / SURGE, every hard_stops[].t, and the final frame. On failure, make the cheapest safe fix yourself: edit the offending compositions/frames/NN-*.html. Never change duration or audio timing to hide a sync issue. Once the gates pass, pause for user review, then render only on approval:

( cd "$PROJECT_DIR" && npx hyperframes render . --skill=music-to-video -q draft -o renders/video.mp4 --fps 30 )

Gate: lint / validate / inspect passed; the user approved; renders/video.mp4 exists with audio, duration == audiomap.audio.duration_sec. The final reply states the MP4 path and duration.


Resume table

You haveContinue from
assets/bgm.mp3 onlyStep 1
audiomap.jsonStep 2
STORYBOARD.md (skeleton)Step 3
STORYBOARD.md (complete)Step 4
all frame filesStep 5
index.htmlStep 6

Quick Reference

Formats: landscape 1920x1080 by default; portrait 1080x1920; square 1080x1080. Set the canvas once in the storyboard frontmatter (canvas: { w, h, fps }).

Scripts under scripts/: analyze-beatgrid.py (the one analyzer), validate-plan.mjs (plan check), assemble-index.mjs (index assembly), stage-assets.mjs (stage user media), lib/storyboard.mjs (vendored parser). Everything else is the hyperframes CLI.

ReadWhen
references/frame-skeleton.mdStep 2: read the music, lay out the frames, set pacing
references/planning.md · storyboard-format.mdStep 3: pick the brand, fill each frame, write the plan
references/template-catalog.mdStep 3: pick a template per group
references/motion-primitive-catalog.mdStep 3/4: L0 recipes for free-compose
references/montage.mdStep 3/4: asset treatments (beat-cut / ken-burns)
sub-agents/frame-worker.mdStep 4: dispatch + build one frame
../hyperframes-core/references/subagent-dispatch.mdStep 4: dispatch sub-agents safely
../hyperframes-creative/references/design-spec.mdStep 3: pick the preset (the brand)

Directory layout

music-to-video/
  SKILL.md
  references/   frame-skeleton.md · planning.md · storyboard-format.md
                template-catalog.md · motion-primitive-catalog.md · montage.md
                templates/<id>/          { index.html (+ assets/ · program.json) }  ← L1 catalog impls
                motion-primitives/<id>/  { index.html } (+ ../assets/gsap.min.js shared by recipes) ← L0 catalog impls
  scripts/      analyze-beatgrid.py · assemble-index.mjs · validate-plan.mjs · stage-assets.mjs · lib/storyboard.mjs
  sub-agents/   frame-worker.md   ← the one subagent (one per frame)

리뷰

아직 리뷰가 없습니다. 사용해 본 소감을 남겨 주세요.

댓글

로그인 없이 쓸 수 있습니다. 사용 후기, 질문, 작동하지 않은 환경 등을 편하게 남겨 주세요.

아직 댓글이 없습니다. 첫 댓글을 남겨 보세요.

보내면 바로 공개됩니다. 이메일 주소나 전화번호 같은 개인 정보는 쓰지 마세요. URL은 2개까지입니다.

0 / 1,000자

이 양식은 reCAPTCHA로 보호되며 Google 개인정보처리방침 및 서비스 약관이 적용됩니다.

같은 저장소의 스킬

3d-asset-generation

무료요약 있음

글이나 이미지로 3D 모델을 생성하고 카탈로그 소재와 함께 활용합니다. Blender에서 형상, 재질, 크기와 지면 접촉을 점검하고 출처를 기록한 뒤 장면에 배치합니다.

  • 글로 독자적인 3D 소품 제작
  • 콘셉트 이미지의 물체를 입체로 제작
  • 카탈로그의 식물과 바위로 배경 채우기
calesthio/OpenMontage7.1만2026년 10월 24일 업데이트

acestep

무료요약 있음

ACE-Step 1.5로 곡의 스타일, 길이, 템포 등을 지정해 영상 배경 음악과 가사가 있는 곡을 생성합니다. 참고 음원 편곡과 보컬·악기 분리도 지원합니다.

  • 영상 장면에 맞는 배경 음악 제작
  • 가사가 있는 짧은 징글 제작
  • 참고 음원을 재즈 스타일로 편곡
calesthio/OpenMontage7.1만2026년 10월 24일 업데이트

agents

무료요약 있음

ElevenLabs로 음성 대화 AI를 만들고 목소리, 응답 방침, 외부 도구 연동을 설정합니다. 웹사이트 삽입과 Twilio를 통한 전화 발신도 다룹니다.

  • 문의 응대용 음성 봇 제작
  • 웹사이트에 음성 안내 삽입
  • 대화 가능한 음성 캐릭터 시제품 제작
calesthio/OpenMontage7.1만2026년 10월 24일 업데이트

ai-video-gen

무료요약 있음

텍스트나 참고 이미지로 AI 영상을 생성하고 용도와 비용에 맞는 서비스를 선택하도록 돕습니다. 화면 비율 설정, 진행 상황 확인, Gemini Omni를 통한 대화형 편집도 지원합니다.

  • 글로 설명한 장면을 영상으로 만듭니다
  • 상품 사진에 움직임을 더합니다
  • 소셜 미디어용 세로 영상을 제작합니다
calesthio/OpenMontage7.1만2026년 10월 24일 업데이트

ai-video-gen

무료요약 있음

글이나 참고 이미지로 AI 영상을 생성하고 용도와 비용에 맞는 서비스를 선택합니다. 소셜 미디어용 세로 영상, 상품 사진의 영상화, 기존 클립의 대화형 편집을 지원합니다.

  • 소셜 미디어용 세로 영상 제작
  • 상품 사진에 움직임 추가
  • 예산과 표현에 맞는 생성 서비스 선택
calesthio/OpenMontage7.1만2026년 10월 24일 업데이트

atlas-cloud

무료요약 있음

Atlas Cloud에서 하나의 API 키로 여러 모델을 사용해 이미지와 영상을 생성하고 편집합니다. 결과물과 사용 모델, 설정, 예상 비용 기록을 저장합니다.

  • 한 서비스에서 이미지와 영상 생성
  • 참고 자료로 상품 이미지 편집
  • 이미지·영상·음성을 참고한 영상 생성
calesthio/OpenMontage7.1만2026년 10월 24일 업데이트

calesthio의 스킬 모두 보기

이 스킬의 문제 신고