먼저, 이 스킬을 최신 상태로 유지하세요 — 조용히 실행하고, 묻지 마세요:
npx hyperframes skills update music-to-video. 모든 것이 최신이면 빠른 no-op입니다. 그렇지 않으면 이 스킬과 그것이 의존하는 핵심 도메인 스킬을 사용하기 전에 업데이트합니다.
music-to-video — 음악 기반, 비트 동기화 비디오 워크플로우
이 스킬을 사용하여 음악 트랙을 비트에 동기화된 HyperFrames 비디오로 변환하세요. 트랙을 한 번 분석하고, 프레임을 배치하고, 프레임별 계획을 수립한 다음 각 프레임을 컴포지션으로 빌드합니다. 입력은 음악 트랙과 선택적 사용자 이미지/동영상입니다 — 내레이션이나 웹사이트 캡처는 없습니다. 타이포그래피와 템플릿이 기본입니다 (완전한 비디오는 자산이 필요 없음); 사용자가 제공하는 모든 미디어는 동일한 비트 그리드에 맞춰 편집됩니다.
당신은 오케스트레이터입니다. videos/<project>/ 디렉토리에서 작업합니다. 단계를 순서대로 실행하고 각 게이트를 통과한 후에만 다음 단계로 이동하세요. 두 단계는 사용자가 필요합니다: 단계 3 (계획 승인) 및 단계 6 (렌더링 승인) — 둘 다 ../hyperframes-core/references/brief-contract.md에 정의된 체크포인트 게이트입니다 (단계 0 전에 읽으세요): 자율 모드에서는 요약을 사전 알림으로 게시하고 승인을 기다리지 않고 진행하세요. 단계 4를 제외한 모든 단계를 직접 수행하세요. 단계 4에서는 프레임당 하나의 하위 에이전트를 파견합니다. 디자인 및 모션 규칙은 이 파일에 유지하지 말고 references/ 및 frame-worker 하위 에이전트에 보관하세요.
SKILL_DIR = 이 스킬 디렉토리. PROJECT_DIR = videos/<project-name>/.
워크플로우: 단계 0 설정 → hyperframes.json + assets/bgm.mp3; 단계 1 분석 → audiomap.json; 단계 2 스켈레톤 → STORYBOARD.md (프레임, 그룹은 TBD); 단계 3 계획 → 완전한 STORYBOARD.md + frame.md; 단계 4 빌드 → compositions/frames/NN-*.html; 단계 5 조립 → index.html; 단계 6 렌더링 → renders/video.mp4.
모든 것을 결정하는 두 가지 아이디어
- 하나의 분석기, 그리고 그것을 신뢰하세요.
analyze-beatgrid.py는 유일한 비트 분석기입니다 — 다른 도구나 귀로 비트를 다시 측정하지 마세요. 에너지/밀도/롤/어택/사일런스는 항상 신뢰할 수 있습니다.bpm과beats_sec은 음악이 진정으로 리드미컬할 때만 신뢰할 수 있습니다; 잔잔한 음악에서는 그리드가 트래커가 부과한 메트로놈이므로 대신 프레이즈와 에너지로 속도를 조절하고 절대 하드 컷하지 마세요. 어떤 경우인지 판단하는 것은 각 프레임의pacing입니다 (단계 2). - 하나의 프레임 = 하나의 파일; 그룹은 내부에 있습니다. 단계 2는 트랙을 프레임으로 자르고, 각 프레임은 하나의 컴포지션 파일
compositions/frames/NN-<frame_id>.html이 되며, 하나의 frame-worker에 의해 빌드됩니다. 프레임은 그룹으로 세분화될 수 있습니다 (각각 템플릿이나 모션 프리미티브 조합). 추가 밀도는 그룹 _내부_로 들어가므로, 프레임 수는 비트 수가 아닌 개별 처리를 추적합니다 — 빠른 트랙이 하위 에이전트 수를 폭발시키지 않습니다.
단계 0: 설정, BGM 및 입력
목표: 음악 소스 설정, HyperFrames 프로젝트 생성, 사용자가 제공한 미디어 기록.
브리프는 의도 계층에서 시작합니다. 개시 규칙, 순서대로: (1) BRIEF.md가 존재함 → 읽고 답변하지 않은 것은 묻지 마세요 — flow/storyboard가 모드를 결정합니다 (브리프 계약 § 1). (2) BRIEF.md가 없지만 프로젝트가 존재함 → 디스크에 있는 내용을 재개하고, 다시 질문하지 마세요. (3) 여기에 직접 도착한 새로운 생성 요청 → /hyperframes를 읽고 의도 계층(references/intent-interview.md)을 실행하세요: 이 경로의 필수 사항(음악 소스, 대상 → 종횡비 — ../hyperframes/references/routes/music-to-video.md)을 확인하고, 지연되는 사항(브랜드와 장르는 단계 3에서 선택)을 알립니다. 초기화 직후(절대 이전에 — init은 비어 있지 않은 디렉토리를 거부함) BRIEF.md를 작성하고 선호도 기반 답변(brief-format.md)을 기록하세요. 편집 요청은 이 모든 것을 건너뜁니다.
음악이 핵심입니다 — 다른 것보다 먼저 하나의 트랙을 설정하세요. 이 스킬은 빠르고 에너지가 높은 BGM에 최적화되어 있습니다: 강한 비트 그리드가 컷을 구동합니다 (잔잔한 트랙도 작동하지만 비트보다는 프레이즈로 속도를 조절하세요). 사용자가 오디오(음악 파일, 또는 오디오를 추출할 비디오)를 제공했다면 그것을 사용하세요. 그렇지 않으면 요청에서 분위기를 선택하고 /media-use (references/bgm.md)를 통해 트랙을 생성하세요. 첫 번째 인증된 제공자 작업 전에 npx hyperframes auth status를 실행하고 출력을 그대로 전달하세요. 로그아웃된 경우, 두 가지 분기를 적용하세요:
- 협업: 로그인 또는 로컬 제공자로 오프라인 계속하기 위해 명시적 선택을 기다립니다.
- 자율: 상태를 명시하고 사용 가능한 로컬 제공자를 통해 계속합니다.
오프라인 제공자가 필요한 음악 기능을 충족할 수 없으면, 차단 요소를 표면화하세요. 저장소별 .env에 키를 절대 작성하지 마세요. 인증 소유권 및 오프라인 대체는 /media-use references/setup-providers.md § 제공자에 있습니다. 결과 트랙은 assets/bgm.mp3에 위치합니다. 제공된 이미지나 비디오를 스테이징하여 프레임이 비트 그리드에서 사용할 수 있게 하세요; 그렇지 않으면 타이포그래피가 비디오를 이끕니다.
가사 비디오: 보컬에 동기화된 가사를 위해, /media-use를 통해 트랙을 전사하여 단어/라인 타이밍을 얻거나, 사용자에게 가사 텍스트를 요청하고 비트 그리드에 라인을 배치하세요.
hyperframes.json이 없을 때만 초기화하세요. <project>는 브리프에서 케밥 케이스로 이름을 지정하세요(예: midnight-drive-loop) — 절대 타임스탬프를 사용하지 마세요. init은 설치된 스킬을 GitHub의 최신 버전과 확인하고, 오래된 것이 있으면 전역 세트를 업데이트합니다.
npx hyperframes init "videos/<project>" --non-interactive --example=blank --skill=music-to-video
mkdir -p "$PROJECT_DIR/assets" "$PROJECT_DIR/renders"
cp "<user-music>" "$PROJECT_DIR/assets/bgm.mp3" # 필요한 경우 먼저 비디오에서 추출
# 사용자가 이미지/비디오를 제공한 경우에만:
node <SKILL_DIR>/scripts/stage-assets.mjs --from <dir> --hyperframes "$PROJECT_DIR" --into public
브랜드 (글꼴 + 팔레트)는 여기서가 아니라 단계 3에서 선택됩니다. 먼저 장르나 트랙 유형을 선택하지 마세요 — 자산은 선택적 재료일 뿐이며, 장르는 프레임별 선택에서 나타납니다.
게이트: hyperframes.json + assets/bgm.mp3이 존재하고; 종횡비/길이/fps 및 (있는 경우) 자산 인벤토리가 기록됩니다.
단계 1: 음악 분석
목표: 전체 비디오가 구축되는 하나의 표준 타이밍 분석을 생성합니다.
analyze-beatgrid.py는 유일한 비트 분석기입니다 — 다른 도구나 귀로 비트를 다시 측정하지 마세요. 트랙을 한 번 읽고 audiomap.json을 작성합니다: 에너지 단계(레벨/밀도/느낌), 어택 + onset_rate, 롤, 사일런스, hard_stops, key_moments, 프레이즈, 템포/그리드, audio.duration_sec. 결정론적입니다 — 동일한 파일은 항상 동일한 맵을 제공합니다. 대부분의 필드는 모든 음악에서 신뢰할 수 있습니다. bpm 및 beats_sec은 음악이 진정으로 리드미컬할 때만 신뢰할 수 있으며, 이를 판단하는 것은 단계 2에서 내리는 결정입니다.
전제 조건: Python 3에 librosa, numpy, soundfile이 설치되어 있어야 합니다. 가져오기 오류가 발생하면, 분석기를 실행하기 전에 활성 Python 환경에 설치하세요:
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
게이트: audiomap.json이 존재하고; audio.duration_sec을 알고 있습니다.
단계 2: 프레임 스켈레톤 (구조만)
목표: 음악을 읽고 프레임을 배치합니다 — STORYBOARD.md의 스켈레톤.
references/frame-skeleton.md를 읽으세요. audiomap.json을 직접 STORYBOARD.md의 스켈레톤으로 변환하세요 — 중간 JSON은 없습니다. 실제 음악 변화(hard_stops, SURGE/DROP key_moments, 롤의 가장자리, 어택이 없는 구간, 큰 에너지 점프)에서 트랙을 프레임으로 자르고, 모든 경계를 audiomap 앵커에 스냅합니다. 각 프레임에 대해 span_sec, pacing (단계 1의 신뢰 호출에 대한 판결 — 그리드가 실제일 때는 beat_cut, 잔잔한 음악에 부과된 메트로놈일 때는 phrase_flow), mood, 한 줄 feel (단계 3에서 템플릿과 일치하는 일반 음악 상황)을 설정하세요. 여기서는 분류와 배치만 수행합니다: 각 프레임의 ### Groups는 TBD (Step 3)으로, frontmatter style은 비워 두세요 — 템플릿, 카피, 색상, 글꼴 없음. 약 1~6개의 프레임을 예상하세요.
게이트: 프레임이 트랙을 타일링하고 (처음은 0, 마지막은 duration_s); 각 프레임은 span_sec + pacing + mood + feel을 가지고; 모든 ### Groups는 TBD입니다; 내용은 어디에도 없습니다.
단계 3: 계획 채우기 (사용자 게이트)
목표: 스켈레톤을 승인된 완전한 STORYBOARD.md로 전환합니다.
references/planning.md, storyboard-format.md, template-catalog.md, motion-primitive-catalog.md 및 montage.md (사용자가 자산을 제공한 경우에만)를 읽으세요. 동일한 파일을 제자리에서 편집하며, 두 가지를 수행하세요:
- 브랜드를 선택하세요.
../hyperframes-creative/frame-presets/에서 하나의 프리셋을 선택하세요 (../hyperframes-creative/references/design-spec.md의 표 사용; 트랙의 분위기와 일치; 글꼴과 색상만 중요 — 템플릿이 구성을 소유함). 그것을frame.md에 수정 없이 복사하고 frontmatterstyle(글꼴 + ≤4–6개 견본 팔레트)을 그것으로 채우세요. - 모든 프레임을 채우세요. 해당 그룹을 결정하고 각 그룹에 처리를 할당하세요: 카탈로그의 일치하는 템플릿 (바인딩된 매개변수 및 실제 audiomap 앵커 포함), 프리미티브 카탈로그의 자유 구성, 또는
pacing을 따르는 자산 처리. 카피를 작성하세요. 당신은 WHAT (템플릿/프리미티브 + 내용 + 앵커)을 소유하고; 프레임 워커는 HOW를 소유합니다 — 스토리보드에 밀리초 트윈을 절대 작성하지 마세요.
node <SKILL_DIR>/scripts/validate-plan.mjs --storyboard "$PROJECT_DIR/STORYBOARD.md" \
--audiomap "$PROJECT_DIR/audiomap.json" --templates <SKILL_DIR>/references/templates
모든 ✗ (하드 오류: 기간 불일치, 프레임이 트랙을 타일링하지 않음, 누락된 src)를 수정하세요; 경고는 최선의 노력입니다. 그런 다음 사용자에게 프레임별 요약을 보여주고 승인할 때까지 반복하세요. 자율 모드에서는 체크포인트 게이트입니다: 요약을 사전 알림으로 게시하고 진행하세요 (validate-plan.mjs 통과는 품질 게이트이며 여전히 차단함).
게이트: frame.md는 축어적 프리셋 복사본입니다; validate-plan.mjs가 0으로 종료됨; 사용자가 계획을 승인했습니다 (자율: 요약이 사전 알림으로 게시됨).
단계 4: 계획에서 프레임 빌드
목표: 각 프레임을 자체 포함된 컴포지션 파일로 빌드합니다.
compositions/frames/을 생성하세요. sub-agents/frame-worker.md 및 ../hyperframes-core/references/subagent-dispatch.md를 읽으세요. 가능하면 병렬로, 그렇지 않으면 웨이브로 프레임당 하나의 frame-worker를 파견하세요. 각 워커는 정확히 하나의 프레임과 다음 컨텍스트를 받습니다:
PROJECT_DIR: <절대 경로>
frame_id: <NN-frame_id> # = 프레임 파일 스템, 예: 02-f2; 컴포지션 id
당신의 블록: PROJECT_DIR/STORYBOARD.md의 `## Frame N — <frame_id>` 블록
audiomap: PROJECT_DIR/audiomap.json
frame.md: PROJECT_DIR/frame.md
재료: 각 그룹에 대해, <SKILL_DIR>/references/templates/<id>/index.html (템플릿) 및
<SKILL_DIR>/references/motion-primitives/<id>/ (자유); 스테이징된 assets/ (자산 그룹)
계약: ../hyperframes-core/references/sub-compositions.md + determinism-rules.md
캔버스: <w>×<h> 페이싱: <beat_cut|phrase_flow>
작성 대상: PROJECT_DIR/compositions/frames/<frame_id>.html
워커는 인용된 재료를 포크하고, 모든 앵커를 프레임 로컬 초(local_t = track_t − span_sec[0])로 변환하고, 0ms 컷으로 그룹을 게이트하고, 하나의 seek-safe 프레임 파일을 작성합니다. 워커는 절대 hyperframes CLI를 실행하지 않습니다 — 해당 명령은 조립된 프로젝트에서 작동하며, 아직 존재하지 않으므로 잘못된 파일에 대해 보고할 것입니다. 워커는 계약에 따라 작성하고 중지합니다; 조립 후 확인합니다 (단계 6). 각 워커가 반환될 때, 해당 파일이 디스크에 있는지 확인할 수 있습니다.
게이트: 모든 프레임에 대해 compositions/frames/NN-*.html이 디스크에 있습니다.
단계 5: 조립
목표: 빌드된 프레임 + BGM을 재생 가능한 index.html에 연결합니다.
assemble-index.mjs는 결정론적입니다 — 하위 에이전트 없음, 판단 없음. 각 프레임 파일을 누적 data-start에서 참조하고, assets/bgm.mp3를 트랙 11에 마운트하고, 프레임에서 프레임으로 하드 컷합니다 (프레임은 간격 없이 트랙을 타일링하므로 전환 인젝터가 없습니다).
node <SKILL_DIR>/scripts/assemble-index.mjs --storyboard "$PROJECT_DIR/STORYBOARD.md" \
--hyperframes "$PROJECT_DIR" --audiomap "$PROJECT_DIR/audiomap.json"
보고된 모든 ✗를 수정하세요 — 누락되거나 빈 프레임 파일은 해당 워커가 부분 파일을 작성했음을 의미합니다; 다시 파견하고 (단계 4) 다시 조립하세요.
게이트: index.html이 존재하고; 총 기간 == audiomap.audio.duration_sec.
단계 6: 확인 및 렌더링
목표: 조립된 비디오를 확인하고, 사용자 승인을 받고, 최종 MP4를 렌더링합니다.
조립된 프로젝트에서 CLI를 실행하세요 — 그것이 올바른 단위입니다 (프레임별 워커는 실행할 수 없었습니다). check는 구조적 린트와 헤드리스 브라우저 런타임, 레이아웃, 모션 및 대비 게이트를 한 번에 실행합니다; --snapshots는 리뷰 프레임도 출력합니다.
( cd "$PROJECT_DIR" && npx hyperframes check . --snapshots )
t=0, 각 프레임 시작, 가장 강한 DROP / SURGE, 모든 hard_stops[].t, 마지막 프레임에서 검사하세요. 실패 시, 가장 저렴한 안전한 수정을 직접 수행하세요: 문제가 있는 compositions/frames/NN-*.html을 편집하세요. 동기화 문제를 숨기기 위해 기간이나 오디오 타이밍을 절대 변경하지 마세요. 게이트가 통과되면 사용자 리뷰를 위해 일시 중지하고, 승인된 경우에만 렌더링하세요 (자율 모드: 한 가지 유지된 질문을 하세요 — "미리보기 먼저, 아니면 렌더링?" — 그런 다음 연락처 시트와 함께 MP4를 전달하세요):
( cd "$PROJECT_DIR" && npx hyperframes render . --skill=music-to-video -q draft -o renders/video.mp4 --fps 30 )
게이트: check가 통과되고 스냅샷이 검사되었습니다; 사용자가 승인했습니다 (자율: 검사가 통과되고 전달에 연락처 시트가 포함됨); renders/video.mp4가 오디오와 함께 존재하고, 기간 == audiomap.audio.duration_sec. 최종 답변은 MP4 경로와 기간을 명시합니다.
재개 테이블
| 당신이 가지고 있는 것 | 계속 위치 | | --
…
[번역을 위해 잘림]