AIだけでミュージックビデオを量産する

Sunoで作った自分の楽曲に、フルサイズのアニメMVを付ける。しかも1曲あたり数百円で、寝ている間に。 これは、それを実現するまでの2日間の制作記録です。映像生成はオープンウェイトの動画生成モデル MiniMax H3 をクラウドGPU上で動かしました。

作ったもの

「7月の傘は、まだ閉じない。」(制作名 "Umbrella in July") — フルMV(194秒、62カット、9:16縦型)。 七月の玄関に残された傘をめぐる、静かな喪失と再生の物語。 作品ページ →
「Not December」 — Hooks版MV(60秒、19カット)。 ネオン雨の屋上で歌うロックシンガーの覚醒アンセム。 作品ページ →

キャラクターは楽曲ごとに固定され、カットは楽曲のビートに正確に同期し、 サビでは歌詞に合わせてキャラクターが口パクで歌います。 (上の埋め込みは軽量プレビュー版です)

なぜMiniMax H3か

H3は「動画と音声を同時に生成する」モデルですが、決め手は Ref2VAモード でした。 参照として画像(最大9枚)・動画(3本)・音声(合計15秒)を渡せて、 既存の音源を条件にして口パクを生成できる。つまりSunoの楽曲そのものを 「演技指導」として渡せるのです。これができるモデルは、商用サービスを含めてもほとんどありません。

さらにオープンウェイトなので、実行環境・速度・コストを全部自分でコントロールできます。

パイプラインの全体像

制作は「ローカルPCで頭脳、クラウドGPUで筋肉」の分業です。

ローカル(WSL)
  • 楽曲解析(ビート・歌詞タイミング)
  • ショット分割(ビート同期)
  • プロンプト・ジョブ生成
  • 結合・歌詞タイポグラフィ・仕上げ
Google Drive
  • ジョブキュー
  • 結果同期
クラウドGPU(RunPod 4090)
  • 1コマンドでPod起動
  • モデル自動セットアップ
  • 全カット生成 → 自己削除

一度ジョブを投げたら、あとは完全放置。GPUマシンは仕事を終えると自分で消えて課金が止まります。

01楽曲を解析する

Sunoからダウンロードしたmp3と歌詞テキストを渡すと、ローカルの解析ツールが ビート検出(librosa — 曲のBPMと全ビートのタイムスタンプ)と 歌詞アライメント(faster-whisper — どの歌詞が何秒に歌われるかを単語レベルで特定) を自動で行います。

コツはVAD(音声区間検出)を切ること。歌モノのサビは伴奏が厚く、VADが「音声じゃない」と 誤判定して丸ごと落とすことがありました。

02ストーリーボード(ショット分割)

解析結果から、2〜5秒のショットにビート同期で自動分割します。カット割りが全部ビート上に 乗るので、完成映像は音ハメが気持ちいい。

さらに「2回以上歌われるフレーズ=サビ・フック」を自動検出し、そこだけを口パクカットに 割り当てます。全カットで口パクさせると過剰なので、"歌っている見せ場"に絞るのが演出のコツでした。

03カット毎キービジュアル(GPT-Image2)

ここが画作りの心臓部です。各カットの「スタートフレーム」となる一枚絵を、画像生成AIで先に作り込みます。 共通ヘッダでキャラクター(髪型・衣装・配色)を固定して全カットで同一人物を維持し、 カットごとに構図・ショットサイズ(クローズアップ〜ドローン)・演出を指定。 「文字なし・9:16・セルアニメ調」を徹底します。

A young anime woman with a short red bob with pink underlights, teal eyes, silver earrings and a black o-ring choker, black studded leather jacket over a red shirt, ripped black skinny jeans and boots — the same singer, design, outfit and palette as the reference video.
全プロンプトの先頭に付ける「共通ヘッダ」の実物。これがキャラクターの同一性を担保する
Not December キービジュアル s001Not December キービジュアル s002Not December キービジュアル s003Not December キービジュアル s004Not December キービジュアル s005Not December キービジュアル s006Not December キービジュアル s007Not December キービジュアル s008Not December キービジュアル s009Not December キービジュアル s010Not December キービジュアル s011Not December キービジュアル s012Not December キービジュアル s013Not December キービジュアル s014Not December キービジュアル s015Not December キービジュアル s016Not December キービジュアル s017Not December キービジュアル s018Not December キービジュアル s019

Not December(Hooks版)の全19カット分のキービジュアル。この一枚絵を動画生成の開始フレームとして 渡すので、構図と画風は画像側で保証され、H3は「動かす」ことに専念できます

04動画生成(MiniMax H3 / RunPod)

各カットに3種類の参照を渡します:

参照役割
画像(カット毎キービジュアル)開始フレーム。構図・画風の錨
動画(既存のリファレンス映像)キャラの同一性・世界観・カメラの空気感
音声(Suno楽曲の該当区間)口パク・歌唱表情の駆動源

生成はRunPodのRTX 4090で1カット2〜3分。19カットのHooks版なら約40分・100円未満で全カットが揃います。

05組み立て(ローカル)

生成された各クリップを:

  1. ビート境界にフレーム単位でトリム(H3の音声は破棄)
  2. 結合してSunoの原音源を1本敷く — 口パクは位置合わせだけでピタリと同期
  3. 歌詞タイポグラフィを合成(明朝系フォント、ボーカルのタイミングに同期してカットごとに配置が変わる演出)
  4. グレインで質感を統一

CapCutでの手動仕上げ用に、トリム済みクリップ一式+歌詞タイミング(SRT)+カット表も自動で書き出します。

06生成時歌詞デザイン — 歌詞を「字幕」ではなくシーンに描かせる

後処理で字幕を乗せる方式は、どうしてもMVの画に「後から貼った」感が出ます。 そこで最終的にたどり着いたのが、歌詞そのものを画像生成の段階でシーンのデザイン要素として描き込み、 H3にそれを保持したまま動かさせる手法です。

  1. GPT-Image2に「歌詞の正確な綴りを、シーンの幾何(空・壁・光条・雨)に沿ったタイポグラフィとして 統合せよ」というプロンプトで歌詞入りキービジュアルを生成(綴りは全数目視QC — 画像モデルの誤字は意外と多い)
  2. それをRef2VAの開始フレームにして、プロンプト側に「このタイポグラフィは完全保持。 文字の追加・削除・改変禁止。発光や揺らぎの微アニメは可」という保持指示を追加
  3. H3が、稲妻や光条と一体化した歌詞をそのまま保った状態でシーンを動かす
キービジュアル(文字なし版)
文字なし版キービジュアル
歌詞入りキービジュアル「Break it out! My voice collides」
歌詞「Break it out! My voice collides」を稲妻と一体のブラシタイポとして描き込んだ版
完成カット(再生ボタンで再生・音声なし)。文字は最後まで一字も崩れませんでした
歌詞入りキービジュアル「Not December — I'm awake」(放射光条・セリフ体)
同手法の別カット。「Not December — I'm awake」を放射光条に沿うセリフ体で
歌詞入りキービジュアル「Not December — I'm awake」(白い稲妻空・クローズアップ)
白い稲妻の空に重ねたクローズアップ版。カットごとに書体と載せ方を変えています

Not Decemberのサビ3カットで実験し、1カット目(「Break it out! My voice collides」が稲妻と共に 空へ炸裂するカット)は一発で完璧。歌詞がカメラワークや天候と同じ「演出の一部」になる — 字幕では絶対に出ない画です。

副産物の学びも2つ:

  • ロングトーンは口パクさせない: 前の行の語尾を延ばすカットで律儀に音声同期させると、口がパクパクして破綻します。 「既に歌った母音を保持、新たな発語なし」と書くのが正解
  • キービジュアルとモーション指示の整合が絶対: クローズアップの一枚絵に「ステージを歩き回る」と書くと、モデルは矛盾を解決しようとして 服装ごと別人にしてしまう

07リテイク運用 — 気に入らないカットだけ再生成

全カットをブラウザで一覧再生できるレビューページを自動生成し、気に入らないカットにチェックを 入れると「リテイク: s008 s013」というコマンドができあがります。それをAIアシスタントに貼るだけで、 該当カットだけが新しいシードで再生成され、MVが自動で組み直されます。 1カットあたり数円・数分なので、納得いくまで回せる。

リテイク選択UI: クリップ一覧にチェックを入れるとリテイクコマンドが生成される
自動生成されるレビューページ。チェックした2カットがコマンドに反映されている

数字で見る

項目7月の傘は、まだ閉じない。(フル)Not December(Hooks)
尺 / カット数194秒 / 6260秒 / 19
口パクカット50(全ボーカル)8(フックのみ)
生成GPU時間約5.5時間約40分
直接コスト約1,000円(試行錯誤込み)約100円
制作期間2日(パイプライン構築込み)数時間

1曲目はインフラ構築と失敗の授業料込み。2曲目からは「ストーリーボード確定 → 翌朝完成」のペースです。

つまずきと学び

正直に書くと、順風満帆ではありませんでした。

  • Colabの切断地獄: 無料〜Pro環境ではブラウザが閉じるたびにバッチが止まる。 1曲目は6回再開しました。→ 「キューをDriveに置き、何度切れても続きから再開できる」設計に したことで救われ、最終的にRunPodの使い捨てGPUに移行して完全放置を実現
  • GPUホストのガチャ: 古いドライバ、RAM不足のホストを引いて起動失敗。 → CUDAバージョンとRAM下限を指定して配置するよう修正
  • 日本語フォントの豆腐化: 字幕が「□□□□」に。→ Windows側のフォントを参照する仕組みに
  • 生成の"学習レンジ": H3は約5秒未満の生成が学習外。短カットをどう扱うかは コストと品質のトレードオフで、実測しながら調整しました

これから

  • 生成時歌詞デザインの適用範囲拡大(サビ・タイトルラインを曲ごとに選定)
  • 生成の高速化実験(キャッシュ・アテンション最適化の組み合わせ比較)
  • 月20曲ペースの量産と、伸びた曲のフル尺拡張

制作環境: Suno(楽曲) / GPT-Image2(キービジュアル) / MiniMax H3 + ComfyUI(動画生成) / RunPod RTX 4090(GPU) / 自作パイプライン(Python) / CapCut(仕上げ)

▶ 7月の傘は、まだ閉じない。を聴く → ▶ Not December を聴く →