初音ミクが登場し、ボカロP(松尾P)となった2007年以来の悲願だったリップシンク動画が、ついに俺史上最も手軽にできるようになりました。MiniMax H3とRTX 5090、そしてClaude Code with Fable 5のおかげ。
どのくらい手軽かというと、こうです。
Sunoなんかで作った完成曲(2mix)をブラウザにドロップする
AIがボーカルを聴き取って「歌っている区間」を自動で切り出す
「まとめて生成」を押すと、歌区間はリップシンク動画、間奏はBロール(歩く、空を見上げる、手を振る……)が順に生成される
歌詞を貼り付けると、Whisperが歌声と突き合わせて各区間に自動で割り当てる
「MVを書き出す」を押すと、曲に合わせて全クリップが自動アラインされ、歌詞オーバーレイとタイトル、クレジットが付いたMP4が出てくる
クラウドサービスは使っていません。全部、自宅のPCたちの中で完結しています。
MiniMax H3をベースにClaude Codeが構築
土台になっているのはMiniMaxがオープンウェイトで公開した動画生成モデル「H3」です。映像と音声を同時に生成するのが特徴で、ComfyUIがゼロデイ対応しています。RTX 5090(VRAM 32GB)のWSL2環境で、int8量子化版(21GB)が動きます。
ただ、ComfyUIのノードグラフをiPhoneからいじる気にはなれません。そこでClaude Code(モデルはFable 5)に「ComfyUIはバックエンドに徹してもらって、必要十分な専用UIを作って」と日本語で頼みました。これが8月14日。
以来5日間、私は一行もコードを書いていません。出来上がったのはFastAPIのサーバ(約2000行)と単一HTMLのフロント(約2600行)、ComfyUIのAPI形式ワークフローを組み立てるモジュール、そして自作カスタムノードが2本。Tailscale経由でiPhoneからも使えます。モデルはMusic 3、ACE-Step 1.5、H3、LTX-2.5と増えていき、いまや176GB。

リップシンクの仕組みは「たった80行」
本題のリップシンクです。H3は音声と映像のattentionが一体という構造をしていて、Redditなどのコミュニティで「Audio Drive」と呼ばれる手法が確立されていました。原理は拍子抜けするほどシンプルで、
H3の潜在表現(映像+音声のペア)のうち、音声側を手持ちの音声に差し替えて固定する
モデルは「固定された音声に合う映像」だけを生成する
これだけ。口の動きが音声に合うんです。Claude Codeはこの原理を確認したうえで、外部依存なしの自作ノード約80行として実装しました。最終的な動画に入る音声はVAEを往復させたものではなく入力した音声そのものなので、音質劣化はゼロ(波形相関0.998を実測で確認済み)。
参照画像で人物を固定し、プロンプトに「The person in <Picture 1> sings with the voice of <Audio 1>, lips in sync.」と書けば、その人がその声で歌います。8秒の歌で生成51秒(Turbo LoRA使用時)。
曲を丸ごと放り込めるようにする
1本できると欲が出ます。H3の学習範囲は約15秒まで。曲は数分。そこで、
Demucs(torchaudio内蔵の音源分離)でボーカルを抜き、歌っている区間を検出。前奏・間奏・後奏は「インスト区間」として区別(40秒の曲で解析2秒)
歌区間を12秒以内(15秒ギリギリにしたらマシンが落ちた)に、フレーズの切れ目(一番静かな瞬間)で自動分割
駆動音声には2mixのスライスをそのまま使う。モデルがビートも聴くので、口だけでなく体の動きも音楽に乗る。これ重要
インスト区間にはBロール用のプロンプトが自動で入り、区間ごとに書き換え可能
歌詞の扱いが面白いところで、貼り付けた歌詞はWhisper(large-v3-turbo)が区間ごとの歌声を聴き取って、行の割り振りを決めます。認識結果を歌詞として使うのではなく、手元の歌詞を正としたまま「どの行がどの区間か」のアンサーにだけ使う設計。歌の認識は完璧ではないけれど、明瞭に聴き取れた区間がアンカーになって全体が揃います。ズレたら行単位で前後に送るボタンで手修正できます。
割り当てた歌詞は生成プロンプトにも入るので発音が合いやすくなり、MV書き出し時には字幕としてオーバーレイされます。
「MVを書き出す」ボタン
最後の合成はComfyUIを通さず、サーバ内でPyAVとPillowがやります。音声は曲を丸ごと1本流し、各クリップを区間の開始時刻に置くだけ。だからズレようがない。動画が足りない区間は前のクリップの静止で埋まり、冒頭にタイトル(フェードアウト付き)、末尾に5秒のクレジット表記。40秒の曲で書き出し3秒です。
生成中はプログレスバーに「LipSync 3/12・完了予定14:32」と出て、終わるとOS通知が来ます。放置してコーヒー飲んだり満洲で3割うまい餃子定食を食べたりできます。書き出しには「曲の終わりのフェードアウト」も付けました(映像と音が一緒に黒と無音へ沈む)。
名前は「LaViale」
一応の完成を見たので、名前を付けることにしました。最初に思いついたLipSingerは先客あり。Claude Codeと「リップシンクは他言語で何と言う?」から始めて、イタリア語の labiale(ラビアーレ=唇の)に行き着きましたがそのままだと変な誤解を生みそうなので、bをVideoのVに置き換えて LaViale。唇の子音どうしなので発音はほぼ変わらず(スペイン語ではbとvは同じ音)、綴りの中に la vie(人生)が埋まっているのも気に入っています(NECのノートPCじゃないよ)。商標的な衝突がないことも確認してもらいました。
全工程を1タブに
命名すると欲が出て、「独立したタブを立てて、その中で全部できるようにして」と頼みました。出来上がったLaVialeタブは、工程ごとに色分けされた3段構成です。
曲を用意する(金)—— 2mixをドロップすると自動で解析まで走る。Music 3 / ACE-Stepタブへのジャンプと、Sunoへの外部リンクもここに
人物と画の設定(青)—— 人物の画像1枚(H3の参照画像・LTXの開始画像・区間別開始画像の参照を兼ねる)、解像度、口の動きの強さ
区間ごとに生成(緑)—— H3/LTXの選択、歌詞の割り当て、一括生成、MV書き出しまで
Music 3やACE-Stepで曲を作った場合は、プレビューの横の「🎤 MVで使う」を押すと、曲と歌詞(構成タグを取り除いた整形済み)がまとめてLaVialeに転送されます。Sunoから持ってきた場合は、Suno側で歌詞をコピーしてからmp3をドロップすると「これは歌詞ですか?」ボタンが出て、一押しで歌詞欄に入る。ちなみにiPhoneのファイルAppでmp3がグレーアウトして選べない、というiOSの罠も踏みました(file inputのacceptにMIME型だけでなく拡張子を併記すると直る。ダウンロードしたmp3は種別情報が汚れがちなので)。これは何度やっても直らないので、メモリーに入れておきました。
LTX 2.5ならどうか
MiniMax H3がすごい、と評判ですが、実は同時期にLTX 2.5という強力な動画生成AIが登場しています。以前のLTX 2.3からのバージョンアップですが、こちらも優秀という評判。このバージョン2.5でリップシンクをしているというコメントをいただいたので、こちらも試してみることにしました。
こちらはH3よりも一桁二桁くらい高速。画質もいいです。ただし問題なのは、ファーストフレームはサポートしていても参照画像ではないこと。つまり、添付した画像で必ず始まってしまうので、プロンプトを変えてもほぼ同じ展開になってしまう。最初は正面から、次は側面からとか下から煽るようにといった指定ができないのです。
これを解決するために、ファーストフレームをプロンプトに合わせて生成し直すことにしました。妻LoRAによるKrea 2生成を使うことで、キャラクターの同一性を保持したうえで、別のショットで始めることが可能になったのです。
例えばクリップを14分割するとしたら、ファーストフレームも14枚作り、それぞれを始点としたプロンプトを別個に用意することになります。たいへん面倒ですが、その作業を含めてもH3よりだいぶ高速化できるのですからやらない手はありません。
もう一つの、こちらはより深刻な問題だったのが、歌のリップシンクの場合、表現が大げさになってしまい、西洋の歌手が額に皺を寄せ、目を閉じて歌うというパターンにどうしてもハマってしまうところ。これはいかんともしがたく、このせいで多くのリップシンクソフトorサービスが実用的ではなかったのです。
singという言葉だと、どうあがいてもそうなるので、speak、whisperといった言葉で代替させたところ、うまくいきました。LTX 2.5の歌うプロンプトは囁くように、ケアレスwhisper。これで解決です。
LTX 2.5導入には高速化以外にもう一つメリットが。動画のアップスケール、高精細化機能があるのです。試しに、8ミリビデオで撮影した1987年のビデオでやってみたら、高額な月額サブスク必須となってしまった(買い切りではなくなった)Topaz VideoのSilverlightモデルとほぼ同等。720pとはいえこれならサブスクいらんなあ。お得お得。4Kにするだけなら既にDGX Sparkにツールを組み込んであるし。
LTX 2.5はH3同様、最長でも15秒という制限があるのですが、事前に分割してアップスケール後に結合するという方法で乗り切ることができました。
音楽生成はMiniMax Music 3とACE-Step、動画生成はMiniMax H3とLTX 2.5というそれぞれ2つのルートを用途に応じて使い分けることができるのです。H3とLTX 2.5は作り方が違うので、それぞれ味がある。分割したクリップは同じ位置なので、両方作っておいて後で入れ替えたりもできそうです。
別の部屋のAIが演出を考える
ここまでで「作業」は自動化できたのですが、区間ごとの映像プロンプトを考えるのは人間の仕事として残っていました。5090マシンは2階の寝室に置いてあるのですが、考える方は1階リビング部屋のDGX Spark上のローカルLLMに任せます。
「🎬 AIで演出」を押すと、歌詞全体と区間一覧が1回のリクエストでLLM(Qwen 3.8 27B)に渡り、曲全体の世界観、主人公の衣装・小物(ルック)、そして区間ごとの演出がJSONで返ってきます。面白いのは歌詞と連動させるかどうかの判断もLLMがするところで、「流れる星をかぞえて」のような具体的な画になる行は流れ星のモチーフが入り、「さよならは言わないで」のような抽象的な行は光と色の雰囲気だけになる。区間ごとに呼ばずに一括にしたのは、世界観の一貫性を壊さないためです。
ルックの記述はそのまま画像生成(Krea+キャラクターLoRA)への指示になりますが、顔の特徴は書かせません。顔はLoRAが固定するので、LLMには衣装と髪型と小物だけ考えさせる。気に入った世界観はそのままに演出だけ振り直す「🎲同じ世界観で振り直す」ボタンもあります。
筆者が作るのは妻のMVだけなので、妻のLoRAを使うことに特化しています。だからこんな強引な仕様が成り立つのです。
このSpark側のLLM基盤(mazzaispark)は別のClaude Codeセッションが建てていて、2台のマシンのAIが共有ドキュメント(CLAUDE.md)越しに連携しています。こちらが「format: jsonをOllamaに透過してほしい」「taskフィールドでモデルを使い分けてほしい」と依頼を書いておくと、向こうのセッションが実装してくる。いまはタグ生成のような軽い仕事はgpt-oss 20Bが、演出のような重い仕事はQwen 27Bが受けるルーティングまで入りました。
「合ったり合わなかったり」の謎が解けた
公開後、同じくH3でMVの口パクを作っている方から面白いコメントをもらいました。「Ref2VAに外部音源を食わせると合ったり合わなかったりで、通す音声帯域に依存するらしいと突き止めていたが、8月18日のアップデートで苦労なしになった」と。
調べると、ComfyUI本体のコミット(ff6c8a8「Support per-token video and audio latent noise masks on MiniMax-H3」)が該当しました。差分を読んで謎が解けます。それまで音声潜在の固定は効いてはいたものの、注入スケールが不正確だったのです。H3は映像と音声でtimestep shiftが異なるのに、その補正なしで固定潜在をモデルに見せていた。つまりモデルは微妙にスケールの狂った音声を「聞いて」いた。スペクトルの形によって狂いの影響が違うから、「帯域依存」に見えていたわけです。
たしかに以前に作っていたものはリップシンクが合わないところがあります。
うちのUIに「口の動きの強さ」というスライダー(音声潜在の振幅スケール)があって、これを下げると口の動きが穏やかになるのを利用していたのですが、これは実はスケールずれを手動補正するノブだったらしい。ComfyUIを更新して同一シードでA/Bを取ると、口の動きの総量が約4割増え、スライダーは1.0(=補正なし)が最適になりました。自作ノードは無改修のまま。原理を理解して最小構成で作っておくと、本体側の進化にそのまま乗れるという、いい教訓でした。

こちらはiPhoneでのビュー。デスクトップ版と同じ機能があります。上から下に向かって流れ作業のようにボタンをタップしていくだけで、ミュージックビデオができてしまうのです。便利でしょ?
失敗の記録
ただ、開発は順風満帆ではありませんでした。印象的だった事故を2つ。
その1。 1344×768で114秒の長尺を一気に生成しようとしたら、4時間半走った末にメモリ不足でOSにkillされました。しかも当時の設計では結果が全部メモリ上にあり、7セグメント分が完全に消失。この事故を報告すると、Claude Codeは「セグメントごとにファイルに書き出し、途中で落ちてもそこまでは残る」設計に作り直し、落ちたジョブの検知と、書きかけセグメントの救出UIまで付けてきました。
その2。 Sunoでできた曲「青い窓」で作った11本のリップシンク動画の管理情報が、開発中のサーバ再起動で消えました。ところがClaude Codeは、残っていた音声スライスと動画ファイルの音声波形を相関で突き合わせ、11本全部を機械的に復元(全て相関0.996以上)。以後は編集状態が自動保存されるようになり、「解析済みの曲を開く」からいつでも再開可能。これは失敗を糧とした良い機能。
初音ミクから19年
思えば2007年からこっち、「歌に口を合わせる」という作業はずっと手間の塊でした。当時はVOCALOIDのVSQデータを読み込んで初音ミクがかわいい立ち絵でリップシンクしてくれる、その名も「RipSync」という偉大なソフトがありました(作者の開発中動画)。
手軽に初音ミクに歌わせてみた動画を作れることから大流行。人間ではないものが歌っているように見せる口パクはここから始まったと言ってもいいでしょう。
それがいま、曲を生成してボタンを2つ押すと、うちのPCが勝手にMVを組み上げてくれます。
開発に要したのは5日。私がやったのは日本語で要望と文句(「88%から動かない」「分割したものと違う曲が生成されている」)を言うことだけで、原因の切り分けも、実測も、ドキュメント化も、全部Claude Codeがやりました。開発ログ(SESSION.md)は117項目になっています。
ローカル生成なので、かかるコストは電気代のみ。iPhoneがあればどこからでもMVを作れます。なんという万能感でしょう。
ところで、RipSyncなつかしいので、作者サイトを見たら、2008年には開発終了しているのですが、改変など自由というソースコードが配られていました。それをChatGPTに読み込ませて要望を出していったら、オーディオデータを読み込ませると、母音に合わせて口を動かしてくれるというアプリを作ってくれました。TTSを組み込んだり、録画機能をつけたりしましたが、もっといいアイデアが。
妻が描いた猫耳キャラクターを使い、DiffSingerの再生と同期させるのです。
妻の歌声を元にして作ったAI歌唱合成DiffSingerバージョンで、妻が描いたキャラクターがリアルタイムでリップシンクしてくれます。たのしいなあ。

今はこのアバターを、自作アプリ全般をまたいだエージェントとして、音声及びテキストでの対話ができるようにして組み込んでいるところです。OpenClawやHermes Agentとは対極的な、きわめて私的なエージェントとなってくれるでしょう。


















