ミュージックビデオ(モーション・グラフィックス)
あなたは楽曲を聞くことはできません。視覚的な要素はすべて計測されたデータに基づいています。そのため、最初の作業は常に楽曲フォルダの構築です。楽曲データが間違っていれば、すべてのフレームが間違ったものになります。
ヘルパーはこのファイルと同じ場所にあります。スキルフォルダの run.py を使って実行します(デフォルトのインストールパスを示しています。別の場所にインストールした場合は調整してください):
python3 ~/.claude/skills/music-video/run.py song-folder SONG.mp3 OUT_DIR [--fps 30] [--lyrics-lang en|tr] [--lyrics-text known.txt]
python3 ~/.claude/skills/music-video/run.py analyze SONG.mp3 # ビート/小節/セクションをJSONとして出力
python3 ~/.claude/skills/music-video/run.py dance2d SONG.mp3 --out DIR --analysis OUT_DIR/song-map.json --start 23.8 --dur 14.3 [--render]
楽曲を聴いたと主張しないでください。「分析結果から」と言ってください。
1. 楽曲フォルダ(常に最初)
| ファイル | 内容 | ツール |
|---|---|---|
| passage. | オーディオのバイト単位の同一コピー(sha256チェック済み)。最終的なミックスではこれをそのまま使用 | — |
| song-map.json / .md | BPM、ビート、ダウンビート/小節、エネルギーセクション(calm/build/high)、ビートごとのエネルギー、ドロップ | Beat This! → aubio CLI → 組み込みnumpyトラッカー |
| stems/ | ボーカル / ドラム / ベース / その他(キャッシュされるため再実行は高速) | demucs htdemucs(オプション) |
| envelopes.json | ミックスと各ステムのフレームごとのラウドネス(dBおよび0..1) | numpy |
| hits.json | キック / スネア / ハットの発音タイミングと強度0..1 | ドラムステムに対する帯域分割スペクトルフラックス |
| notes.json | メロディとベースの音符(オプション) | basic-pitch |
| lyrics-passage.json / .md | 単語のタイムスタンプ付き歌詞行 | whisper.cpp whisper-cli(ボーカルステムに対して) |
| song-story.md | あなたが記入するTEMPLATE: テーマ、ボイス、ムードの流れ、セクションごとのキーイメージ | あなた(歌詞とマップから) |
| README.md | 各ファイルの説明、単位(秒)、fps | 自動生成 |
ルール:
- セクションはエネルギーフレーズ(楽曲自身のエネルギーでランク付けされた2小節フレーズ)であり、Aメロ/サビではありません。song-story.md内で自分で名前を付けてください。
--lyrics-textに実際の歌詞(1行につき1行)を指定すると、whisperの単語にアライメントされます。マッチできなかった単語には補間された時間が設定されます(matched: false)。指定しない場合、行はwhisperの生の出力になります。確認してください。無音のボーカルステム上の行はsuspectとフラグが付けられます(whisperはインストゥルメンタルで幻覚を見ることがあります)。インストゥルメンタル曲ではwhisperはスキップされます。- すべての重いステップは失敗する代わりに機能縮退します: Beat This!がない → aubio(外部CLI)→ numpyトラッカー(実際のダウンビートなし、4/4と推測); demucsがない → ミックスのみのエンベロープとヒット; basic-pitchがない → notes.jsonなし; whisperがない → 歌詞なし。実行の
warningsに何がスキップされたかが表示されます。ユーザーに伝えてください。 - hits.jsonはフラッシュ、シェイク、スケールポップに十分な精度ですが、ドラムのトランスクリプションではありません。ハットがスネアと同時に発火したり、ベース音がスネア帯域に漏れることがあります。
- song-story.mdは再実行時に上書きされることはありません。歌詞と分析がサポートする内容のみを記述してください。意味を捏造するのではなく、見出しを「不明」のままにしておいてください。
2. クリエイティブプラン(レンダリング前に表示すること)
- song-story.mdから来る1つのコンセプト、1つの世界、1つのパレット、リリックタイプ用の1つのオープンライセンスフォント(OFL)。
- セクション→シーンテーブル: セクションの変更 = シーンまたはカメラの変更; コーラス/最高エネルギーセクションは最大のビジュアルアイデアを得て、毎回バリエーションを付けて繰り返す; ドロップ = ダウンビートでのカット、フラッシュ、またはスケール。
- リリックタイポグラフィはキーラインのみ(単語のタイミングに合わせたキネティックワード)、すべての行のカラオケではありません。
- 落ち着いた音楽ではフレーズとエネルギーでペース配分し、追跡されたすべてのビートにハードカットしないでください。カットの数よりも、異なる表現の種類の数が重要です。
- プラン(テーブル + 3〜4枚の説明またはレンダリングされたスチル)を表示し、フルレンダリングの前に承認を得てください。
- 事前に読む価値のある構成要素: HyperFrames自身の
music-to-videoスキル(github.com/heygen-com/hyperframes,skills/music-to-video/, Apache-2.0)には、ビートカットモーションプリミティブ(フラッシュカット、クラッシュズーム、ウィップ、クロマチックスプリット、画面シェイク、キネティックレター…)とリリックレイアウトのカタログがあります。
3. 組み込みの2Dダンスビデオ
見た目: フラットキャラクター(丸い黒い頭、丸みを帯びたストロークの手足、色付きのシャツと靴)、アーチ型の鏡のドア、紫/ティール/ゴールド/ピンクの回転するサンバースト背景、太くコンデンストされた(Anton)リリック単語と1つのアクセント単語、異なる色の鏡像ダンサーの列、フィルムストリップ、王冠とチェスの小道具。DevarfのYouTube実験「あらゆる努力レベルで作られた1つのミュージックビデオ」の「低努力」2Dビデオに触発されています。
プランナー(musicvideo/dance2d.py、純粋かつシード付き):
- ウィンドウはダウンビートにスナップします。ビートごとに1つのポーズキーがあり、ポーズはビート上に到達します。
- ダウンビートは大きなポーズ(build: armsUp / point / clap、high: jump / armsUp)と完全な膝のディップを取得します。
- ムーブセット(4ビートフレーズ)はエネルギー準位に応じて小節ごとに変化し、連続して2回繰り返されることはありません。
- シーンはセクション開始時および4小節ごとにカットされます(パレットスワップ、サンバースト速度は準位に応じて変化、方向は交互; calm/buildではドア、highではチェス + 5人のダンサー列、リーダーに王冠)。
- ダンサーのコピー数: calm 1、build 3、high 5。
- 歌詞JSON
[{start, end, text, accent}](ウィンドウ秒単位)→ 各単語がビート上に着地します。
リグ(runtime/char2d.js、window.Char2D): SVGグループ(ピボット: ヒップ > 脚 > すね > 靴、胴体 > 腕 > 前腕、頭)。手足の角度は外側正の度数法(0下、90横、180上)なので、1つのポーズが両側で機能します。グラウンドロックにより下側の足が床に固定されます(スクワットは自動的に下がります)。air はジャンプ用に浮かせます。ポーズ: idle、stepL/R、armsUp、swayL/R、pointL/R、clap、jump、squat、handsOnHips(mirror(p) で左右入れ替え)。poseAt(keys, t) はホールドし、最後の≤0.26秒でイーズインし、大きなヒットではオーバーシュートします。runtime/dance2d.js は window.MV_DANCE からプランを描画します。1つのGSAPトゥイーンがプロキシセッターを駆動し、draw(t) を呼び出すため、すべてのフレームは t の純粋関数になります。
dance2d の出力: DIR/plan.json と DIR/project/(HyperFramesプロジェクト)。--render を付けると DIR/dance2d.mp4 も出力: 1920×1080、30 fps、H.264 yuv420p、ウィンドウの楽曲自身のオーディオ(AAC、フェードなし)。CC BY楽曲の場合は画面に --credit を表示する必要があります。
レンダリングはユーザーの選択です。 --render は npx hyperframes render を実行し、ヘッドレスChrome/Chromiumをダウンロードして駆動します。使用する前に確認を取ってください。これがない場合、プロジェクトフォルダまではPythonのみで動作します。GSAPはバンドルされていません: gsap.min.js を runtime/ に配置するか(または MV_GSAP を設定)、配置しない場合、プロジェクトはレンダリング時にjsDelivr CDNからGSAP 3.14.2を読み込みます。
4. 組み込みリグ以外のキャラクター(自分で持参)
このスキルには3Dモデルは付属していません。ユーザーが3D(Three.js)キャラクターを望む場合:
- 完成したビデオ内での再配布を許可するライセンスのモデルを使用してください。例: CC0モデル、またはユーザーが自身のMixamoアカウントからダウンロードしたキャラクターとアニメーション(完成したビデオ内では問題ありません; 生のファイルは再配布したり公開リポジトリにコミットしたりしてはいけません)。
- 他のプロジェクトからサンプルモデルをライセンスを確認せずにコピーしないでください。
- または、手続き型プリミティブ(カプセル、球、ボックスを単純なボーンチェーンに配置したもの)を使用してください。これらにはライセンスの問題がまったくありません。
フレーム確定性は引き続き適用されます:
mixer.setTime(t * rate)各フレーム、決してmixer.update(dt)は使用しないでください。rate = song_bpm / clip_bpm。小節境界でクリップを切り替えてください。
5. レンダリングルール(任意のレンダラー)
- すべては
t = frame / fpsの純粋関数です。Date、requestAnimationFrameの差分、シードなしのMath.random()は使用しないでください。 - 小さなヒット(カメラシェイク、ライトフラッシュ、スケールポップ)はhits.jsonのキック/スネアに合わせます。輝度やグローはenvelopes.jsonに合わせます。
- 出力: 1920×1080(またはReels/Shorts用に1080×1920)、30 fps、H.264 yuv420p、AAC、楽曲(または選択されたウィンドウ)と同じ長さ。
- 光過敏性: 1秒間に3回以上の全フレームフラッシュは禁止。
- 予算: 考える時間を増やすとより良いモーションが得られますが、1回のセッションでレビューしてください。単一のミュージックビデオに対するマルチエージェントのレビューループはトークンを急速に消費し、制限後に再起動する傾向があります。
6. 納品前のチェック項目
- 最後まで再生されること。再生時間 == 楽曲(またはウィンドウ)の再生時間 ±1フレーム。
- オーディオストリームが元の楽曲であること(デコードされたPCMハッシュを比較、またはラグ0での相互相関ピークを確認)。
- 同期スポットチェック: コーラスのダウンビートで5フレームレンダリングし、ヒットポーズ/フラッシュがそこにあることを確認。
- セクションごとのコンタクトシート(
ffmpeg -i out.mp4 -vf "fps=1,scale=480:-1,tile=4x4" sheet.jpg)を作成し、実際に目視確認すること。 report.md: 何を、なぜ、どのように作成したか、何をチェックしたか、何が確信できないかを記述。