シネマティック・ミュージックビデオ・ディレクター は何をしますか?
楽曲を核とした視聴可能な短編映画を制作するためのプロダクションスキルです — 歌詞テンプレートやスライドショー、無関係な生成クリップの寄せ集めではありません。すべてのフレームはコードによって描画され、整数のフレーム番号から再現可能です。
このスキルは、意図的に音楽ファースト、エビデンスファーストのアプローチをとります:
- 映像を想像する前に楽曲を測定する;
- 1つのショットを書く前にテーゼ(主張)とディレクタースコアを書く;
- レンダリング前にフレーム精度の編集を確定する;
- 10~20秒のパイロットでルックとモーションを実証する;
- 再開可能なショット単位でレンダリングする;
- 実際に出荷したファイルを検証する。
絶対ルール: タイムスタンプ、BPM、歌詞行、レンダリング結果、QCパスを決して捏造してはいけません。 証拠が不足している場合は、その項目を
未検証とマークし、納品ノートにその旨を記載してください。
使用すべきタイミング
ユーザーがミュージックビデオ、音楽に合わせたアニメーション短編、タイトルシーケンス、または「私の曲を映画にしてください」というタスクを依頼し、ローカルでのコードレンダリングが許容される場合に使用します。デフォルトの出力は9:16、1080×1920、24fps、H.264 + AACで、オプションのサイドカー字幕ファイルを生成できます。
このスキルを著作権で保護された音声のダウンロード、実在のアーティストの肖像の複製、または既存のMVのショット単位での再現に使用しないでください。ユーザーに、使用する権利がある音声を提供するよう依頼してください。
前提条件(確認し、推測しないこと)
- Node 20以上、ffmpeg/ffprobe、Google ChromeまたはChromium。
- Python 3.10~3.13(
numpy scipy soundfile librosaが必要。matplotlibは任意、Pillowはシート用)。 - プロジェクトの
node_modulesにpuppeteer-core、p5、p5.brush。 - フレーム用の十分なディスク容量: 1080×1920 JPEG q94 ≈ 0.2~0.5 MB/フレーム。4分のフィルムで約1~3 GB。
- 中国語の歌詞の場合、ユーザーからLRC/SRTファイルを入手するか、ローカルのWhisperモデルを使用します。ランダムな歌詞サイトのタイミングを取得して検証済みとして提示しないでください。
scripts/doctor.sh(または references/render-recovery.md の同等のコマンド)を実行し、結果を記録してください。前提条件が不足している場合は、修正するか、ブロックとして報告してください。
制作ループ
0. 受け入れと権利
以下を収集する: 音声パス、歌詞テキストとタイミングファイル(あれば)、アスペクト比/解像度/fps、期限、言語、使用コンテキスト。音声を assets/ に読み取り専用でコピーし、元のファイルは上書きしないこと。権利に関する前提を README.md に記載する(例:「ユーザー提供の音声、私的使用のみ」)。
1. 音楽マスター(ゲート M)
python scripts/analyze_music.py assets/song.m4a \
--out analysis --lrc assets/song.lrc --sections analysis/sections.json \
--asr analysis/asr/whisper.json --fps 24
analysis/audiomap.json、lyrics.json、lyrics.srt、analysis.md、analysis.png を生成します。マップには、再生時間、位相適合テンポグリッド、ビート/ダウンビート、エネルギー/スペクトルカーブ、候補となるクライマックスウィンドウ、セクション範囲、およびライン単位の歌詞タイミング(出自付き)が含まれます。
受け入れ条件:
- 再生時間とサンプルレートが提供されたファイルと一致すること;
- テンポの一貫性が報告されていること。0.6未満の場合は、耳/スペクトログラムで検査し、テンポマップの適用を検討すること;
- すべての歌詞行にタイミングソース(
lrc_line、srt_line、cross_checked、untimed)があること; - ラウドネスを、構造的なクロスチェックなしに感情的なクライマックスとして扱わないこと。
ユーザーが歌詞タイミングを提供しない場合は、ローカルのASR文字起こしを使用して scripts/align_lyrics.py を実行し、確認すること。フレーズタイム(小節/フレーズマーク、カットに使用)とボーカルオンセット(キャプションに使用)は分けて管理すること。カットを整えるために、歌曲全体を黙ってシフトさせないこと。
2. 3つのコンセプト、そして1つに絞る(ゲート D1)
storyboard/concepts.md に、真に異なる3つのフィルムコンセプトを記述する。それぞれを、歌詞/音楽との適合性、ストーリーの完全性、感情的なインパクト、ビジュアルの独創性、コード実現可能性、長編としての観賞性でスコアリングする。1つを選択し、その理由を記述する。これが完了するまでショットコードを開始しないこと。
次に storyboard/director_score.json を記述する:
テーゼ、アンチテーゼ、感情の曲線、ビジュアルチャプター(世界観/パレット/空間/カメラ/文法)、コントラストマップ、モチーフとペイオフ、キャストの欲求/障害/アーク、ショットの役割と引き継ぎ、サウンドとビジュアルの対応マップ。
自身の役割、受け入れ引き継ぎ、送り出し引き継ぎを表明できないショットは準備ができていません。
3. ビジュアル言語とテスト(ゲート D2)
アニメーション化する前に style-guide.md とキャラクター/アートバイブルを作成する。以下を定義する:
16進数のカラーコードとカラースクリプトを含むパレット;9:16のためのレンズ/構図文法;線とテクスチャのルール;キャラクターのプロポーション、シルエット、衣装の一貫性、表情の範囲;照明;トランジションの語彙;フィルムが使用しない具体的な要素(例:「物語的な理由なしに浮遊するパーティクルは禁止」)。
1~3枚のスタイルフレームとキャラクターシートをレンダリングする。サムネイルではなくフル解像度で評価すること。ルックが弱い場合は、40ショット後ではなく、今ビジュアル言語を変更すること。
4. フレーム精度の編集(ゲート E)
storyboard/timeline.json を記述する。fps、total_frames、shots[] を含み、各ショットには以下を含む:
id, start_frame, end_frame, section, lyric_refs, size, composition, environment, action, expression, camera, transition_in/out, emotion, function, implementation, complexity。
ショットは連続しており、音声全体をカバーしている必要がある。
python scripts/validate_timeline.py \
--timeline storyboard/timeline.json --audiomap analysis/audiomap.json \
--out analysis/timeline_validation.md
バリデータは厳格なゲートです: ギャップや重複がないこと、最終フレームが ceil(再生時間×fps) 以上であること、すべての歌詞行が考慮されていること、ビート/歌詞/セクションから不当に離れたカットがないこと(理由が記述されている場合を除く)。
5. パイロット(ゲート P)
以下を少なくとも1つずつ含む10~20秒をレンダリングする:ワイドな導入ショット、キャラクターのミディアムショット、クローズアップ、素早いアクションまたはインパクト、トランジション1つ。コンタクトシートと、実際の音声を含む視聴可能なクリップを構築する。以下を確認:
- スタイルが100%で維持されているか?
- キャラクターのプロポーション、衣装、照明は連続しているか?
- カメラの動きに動機があるか、それとも理由もなく漂っているか?
- カットが音楽的なイベントに合っているか?
- レンダラーは例外なく300フレーム以上を処理できるか?
- 計測されたms/フレームとディスクコストは?
フルパスの前にパイロットを修正する。計測されたパフォーマンスを LESSONS.md に記録する。
6. フルレンダリング(ゲート R)
決定論的なページコントラクトを使用する: window.renderAt(t) -> dataURL、Math.random は不使用、シード付きノイズ、整数フレームインデックス。アトミック書き込みでショット単位またはフレーム単位でレンダリングし、完了したユニットとハッシュのマニフェストを保持することで、変更されたショットが自身のみを無効にするようにする。
node scripts/render.mjs --project . --start 0 --end 232.6 --out renders/frames
「すべて削除してやり直す」よりも、ショット単位での --force/--shot パスを優先する。承認済みの同じショットを2度レンダリングしないこと。失敗したフレームを完了として通過させてはならない: フレームは存在し、非ゼロであり、デコード可能でなければならない。
7. アセンブリ(ゲート A)
ffmpeg -y -framerate 24 -i renders/frames/f_%06d.jpg -i assets/song.m4a \
-c:v libx264 -preset slow -crf 16 -pix_fmt yuv420p -profile:v high -level 4.2 \
-c:a aac -b:a 256k -ar 44100 -shortest -movflags +faststart output/final.mp4
マスター音声は不変です。曲をフェード、リタイム、再エンコードして映像に合わせないこと。最後のショットは音声のテールをカバーしなければなりません。黒いテールや、最終コードが途切れることは許されません。
8. QC(ゲート Q)
両方を実行し、証拠を添付する:
python scripts/qc_video.py output/final.mp4 --audio assets/song.m4a \
--expected-frames 5583 --timeline storyboard/timeline.json --out analysis/qc
技術的QC: デコード、再生時間と音声の比較(許容差 ≤ 0.12秒)、ストリーム数、解像度、fps、pix_fmt、フレーム数、blackdetect、freezedetect、カバレッジ、欠落/プレースホルダーフレーム。 ビジュアルQC: フル解像度のコンタクトシート、シーンごとのキーフレーム、カット部分の連続フレームストリップ、A/V同期スポットチェック、キャラクター連続性の検査、タイトル/キャプションの安全性。
ビジュアルQCは自動化できません。 どのショットを、どの解像度で視聴したか、そして何を発見したかを正確に記述すること。ffprobeが正常でも、ビジュアルパスにはなりません。
9. 納品
以下を出荷する: マスターMP4、低解像度プレビュー、storyboard.md、timeline.json、style-guide.md、qc-report.md、README.md、オプションのSRT、再現可能なソースコード。音声と歌詞は、ユーザーが公開する権利を持っている場合を除き、ローカルに保持する。日付入りの LESSONS.md エントリを追加する。
ファイルコントラクト
project/
assets/ # song.m4a, lyrics.lrc/srt, ユーザー提供の参照資料(上書き禁止)
analysis/ # audiomap.json, lyrics.json, sections.json, validation, QC
storyboard/ # concepts.md, director_score.json, timeline.json, storyboard.md
characters/ # アートバイブル, モデルシート
src/ # 決定論的描画コード: lib/, custom_shots.js, shots.js
studio.html # window.renderAt(t) コントラクト
renders/ # frames/(全体シーケンス), pilot/, manifests
previews/ # pilot.mp4, コンタクトシート, レビューボード
output/ # 最終MP4, プレビュー, SRT, storyboard.md, timeline.json, style-guide.md, QC
譲れないクラフトルール
- 楽曲がマスタータイムラインである。映像は音楽に合わせてカットされる。音楽が映像に合わせてカットされることは決してない。
- 1つの映画であり、ルックのプレイリストではない。モチーフは回帰し、変化する。
- 繰り返されるコーラスは視覚的に韻を踏んでもよいが、同じ構図を変更せずに再利用してはならない。
- キャラクターには欲求、障害、選択、結果が必要である。顔と手は演技をしなければならない。
- カメラの動きには動機(公開、圧力、解放)が必要であり、デフォルトのケンミンズ効果であってはならない。
- すべてのショットには、ストーリーワールドに属する少なくとも1つの動く要素が含まれていなければならない。
- パーティクル、スピードランプ、無意味なブルームでストーリーの欠如を隠してはならない。
- 正直な結果が様式化され限定的である場合は、QCレポートにその旨を記載すること。フォトリアルと呼んではならない。
障害と回復
レンダラーは、エラーを明確に出力し、低コストで再開できるように設計されています:
- アトミックフレーム書き込み(
*.tmp→ リネーム)、半分のJPEGを完了とカウントしない; - ソースハッシュ、開始/終了フレーム、ステータスを含むショット単位のマニフェスト;
--shot/--start/--endで影響範囲のみ再レンダリング;- 最後に成功したエンコードを保持し、QCが合格するまでマスターを上書きしない。
ブラウザまたはGPUがクラッシュした場合は、新しいページ/プロファイルでユニットを2回再試行する。フレームが3回失敗した場合は、停止し、ショットを隔離し、フレーム番号とエラーを報告する。重複フレームや静止画で埋め合わせないこと。
リファレンス一覧
references/directing.md— コンセプト選択、ディレクタースコア、尺、リズム、エンディング。references/visual-language.md— 9:16構図、カメラ、色彩、キャラクター、テクスチャ。references/audio-lyrics.md— 測定、位相適合テンポ、セクション、誠実なアライメント。references/render-recovery.md— 決定論的コントラクト、マニフェスト、エンコーディング、再開。references/qc.md— ハード/ソフトゲート、コンタクトシート、自動化で見えないもの。templates/— ディレクタースコア、タイムライン、ショットカード、スタイルガイド、プロジェクト設定。tests/— パーサー、カバレッジ、バリデータテスト。bash tests/run_tests.shを実行。LESSONS.md— 実際のプロダクションで何が壊れ、何が修正されたか。
クレジットとライセンス
エンジンパターンは、MITライセンスの ClaudeAnimationBase(John Heibel)および claude-music-video-skill(Sage Arbor)から着想を得ています。ワークフローコンセプトは musical-mv-storyboard から研究されましたが、ライセンスはありません。そこからのコードやテキストはコピーされていません。THIRD_PARTY_LICENSES.md を参照してください。p5はLGPL-2.1、p5.brushはMIT、puppeteer-coreはApache-2.0、librosaはISC、ffmpegはGPLです。プロジェクトで使用される楽曲と歌詞は、このスキルの一部ではありません。