顔も声も存在しない人物を、動画AIに覚えさせる──RTX 5090で作る音声つきキャラLoRA(LTX-2.3)

テクノロジー

前回、絵心ゼロの私がブログのマスコット「OYAJIくん」をLoRAにした話を書きました。あの記事の最後に「次はこの子に色を塗るか、動かすか」と書いたのですが、動かすとなると避けて通れない問題があります。動画生成AIは、いまや音声も一緒に生成するのです。口を動かすなら声がいる。では、その声は誰の声なのか。

実在の人の声を借りるわけにはいきません。かといって私の声では、五十路のオヤジがブログのあちこちで喋り出すことになります。それはそれで一つの地獄です。

そこで発想を変えました。顔も声も、この世に存在しない人物をゼロから設計して、動画生成モデルに「実在」させる。画像生成AIで顔を作り、テキスト指示だけで声を作り、その二つを覚えたLoRAを、音声も同時に出す動画モデル(LTX-2.3)に仕込む。線画のOYAJIくんはハードルが高そうなので、まずは実写系の人物で配管を通すことにしました。

結論から言うと、できました。声は164ステップ目で乗りました。ただし、そこに至るまでに踏んだ罠の数は前回の比ではありません。

まず完成品をどうぞ

音声入力は一切なし。プロンプトに書いた台詞をLoRAが「この人の声」で喋り、口を動かします。

学習した台詞を喋る。声はテキストの指示文から設計したもので、モデルになった人間は存在しません
学習していない台詞「今日はここまでにします。おつかれさまでした。」。声の汎化の実例です。「今日は」が「急は」になっているのは後述のローマ字問題

比較用に、同じプロンプト・同じseedでLoRAを外したものがこちら。別人が別の声で喋ります。

LoRAなしの素のLTX-2.3。見た目も声も毎回違う人が出てきます

そして、この人物に与えた「目標の声」がこれです。

Qwen3-TTSのVoiceDesignで、英語の指示文から設計した声。参照音声13.6秒

何を作ったのか

  • キャラクター:40代の日本人女性、細フレームの眼鏡、ゆるくまとめたウェーブヘア。Qwen-Image-2512で生成した8候補から私が1枚選び、トリガー語は MZKV
  • :Qwen3-TTS(Apache-2.0)のVoiceDesignで「40代前半・落ち着いた温かみのある中低音・ゆっくり丁寧・低音域が少しハスキー」と英語で指示して設計。以後はその1本を参照に固定してクローン
  • 学習先:LTX-2.3(Lightricks、22B、映像と音声を同時生成)。オープンウェイトで音声同時生成でLoRA学習環境が揃っているのは、2026年9月時点でほぼこれだけでした
  • 学習環境:GALLERIA(RTX 5090、VRAM 32GB)+ musubi-tunerのLTX-2対応フォーク。Windowsネイティブ
  • 作業パートナー:Claude Code。調査・環境構築・スクリプト・検証はほぼ全部。私は方針と判断と、目と耳

最初にやったのは規約の読み込みでした

学習データを外部サービスで作るなら、その出力を学習に使ってよいかは規約次第です。Claudeに主要サービスの規約原文を当たらせた結果が意外でした。

サービス出力を他モデルの学習に使えるか
MiniMax H3(API)禁止条項なし
MiniMax H3(オープンウェイト版)禁止(ライセンス §V.3)
Kling、Google Veo 3 / Flow、Runway、ElevenLabs明示的に禁止
LTX-2.x年商1,000万ドル未満ならLoRAの作成・配布・商用まで可
Qwen3-TTS、Qwen-Image、Z-Image、Wan2.2Apache-2.0、制限なし

MiniMaxは「APIで作った素材はOK、手元でオープンウェイト版を回して作った素材はNG」という逆転が起きています。今回は素材生成もApache-2.0とLTX自身で完結させ、外部サービスは使いませんでした。

32GBで音声つきLoRAは回るのか

事前調査で見つかった公開事例は「96GBのGPUで77GB使用」「5090で31GB、ほぼOOM」。回るかどうかが最大の不確定要素だったので、まず測りました。

本番想定の768×448、161フレーム(6.4秒)、rank 32でも23.2GB。10GB近い余裕がありました。買ってよかった(2回目
本番想定の768×448、161フレーム(6.4秒)、rank 32でも23.2GB。10GB近い余裕がありました。買ってよかった(2回目

fp8のベースモデルにブロックスワップ(一部の層をCPU側に退避)を組み合わせると、余裕で収まりました。代償は速度で、1ステップ14秒前後。2000ステップで8時間です。寝ている間に回す前提なら許容範囲でした。

顔を作る

Qwen-Image-2512で正面顔の候補を8枚出し、そこから1枚選びます。ここは私の仕事です。「右下の眼鏡の女性で」と言った10秒が、このプロジェクトで私が下した最も重要な判断だったかもしれません。

顔候補8枚。全部この世に存在しない人です
顔候補8枚。全部この世に存在しない人です

選んだ1枚をQwen-Image-Edit-2511に渡して、角度・表情・口の形(母音3種)・照明・服6種・背景8種・画角を変えた57枚を生成しました。前回の教訓「全画像に共通する要素はトリガー語に焼き付く」を意識して、変えたい要素はわざと散らしています。

最初の12枚。服も背景も表情も変えているのに同じ人。数字の顔一致度(FaceNet)は全枚0.7以上でした
最初の12枚。服も背景も表情も変えているのに同じ人。数字の顔一致度(FaceNet)は全枚0.7以上でした

同一人物かどうかは目ではなく機械で判定しました。57枚全部が合格。ただし正面から横を向かせた1枚は、私の目には「若返って別人」に見えたのに数値は0.92でした。目と数字が食い違うときは、たいてい数字のほうが正しいです。

声を作る、そして最初の罠

Qwen3-TTSのVoiceDesignは、英語の説明文だけで新しい声を作れます。同じ指示文で6本作って測ったところ、seedを変えても話者の同一性は0.92〜0.99で変わらず、抑揚だけが変わりました。声質を変えたければ指示文を変える必要がある、というのが実測からの学びです。

採用した1本を参照にして、Baseモデルで台本50行をクローン生成します。ここで最初の大きな罠を踏みました。

生成された音声を私が聞いてみると、声は合っているのに日本語になっていないものが多い。Claudeが原因を切り分けたところ、シェル経由で渡した参照テキスト(60文字の日本語)がUTF-8のバイト列として化けて98文字になっており、クローンの参照が別物になっていました。声質は正しく、台詞だけが崩れる。人間が聞かなければ気づかない壊れ方でした。

修正後は、生成した1行ごとに音声認識(Whisper)で読み返して台本と照合し、一致しない・長すぎる・短すぎるものはseedを変えて自動で作り直す仕組みにしました。50行で22回の作り直しが走り、文字誤り率の平均は0.034に収まりました。

静止画だけで動画に素性は乗るのか

いきなり音声つきの学習に行かず、まず静止画58枚だけでLoRAを作りました。71分。先行事例には「静止画だけでは動画への転写は弱い」とあったのですが、結果は予想を裏切りました。

静止画だけで学習したLoRAで生成した12本の動画から顔を切り出したもの。眼鏡とウェーブヘアは書かなかったので焼き付き、服と背景は書いたので変えられる
静止画だけで学習したLoRAで生成した12本の動画から顔を切り出したもの。眼鏡とウェーブヘアは書かなかったので焼き付き、服と背景は書いたので変えられる

同じプロンプト・同じseedでLoRAあり/なしを比べると、顔の一致度は0.616 → 0.842。前回のキャプション設計(意図する特徴は書かない、変えたい要素は必ず書く)が動画でもそのまま通用しました。面白い副産物として、LoRAなしだとモデルが MZKV を画面内の文字として描こうとするカットがありました。トリガー語がLoRAに吸収されていることの、皮肉な証拠です。

音声つきクリップを作る──そして人間の目が必要だった

音声つきLoRAの学習には、この人物が実際に喋っている動画が要ります。静止画1枚と台詞の音声をLTX-2.3に渡して口パク動画を作る、という手順で46本生成しました。顔一致と音声認識の自動検品は42本が合格。ここまで順調に見えました。

ところが私が42本を一本ずつ目視したところ、25本に欠陥がありました。

症状本数原因
話し終わった後に映像がフェードアウト14音声を無音で6.44秒に埋めていた。LTXは末尾の無音を「場面の終わり」と解釈する
口が動いていない6生成プロンプトに台詞を入れていなかった、横向き・伏し目の元画像
口の動きが音声とずれる3seed依存
冒頭で口が動かない3TTS出力の先頭の無音
ピンボケ、背景の色変化3生成の破綻
作り直し前。話し終わると暗転します。これを42本中14本、学習させるところでした

原因はほぼすべて私たちの前処理にありました。尺を発話の長さに合わせ(2.6〜5.2秒の8段階)、台詞をローマ字でプロンプトに入れ、生成した直後に「口が動いているか」「同期しているか」「暗転していないか」を唇のランドマークと音量の相関で自動判定して、不合格なら別seedか別の元画像で作り直すループにしました。

作り直し後の同じ台詞。最後まで明るいまま、口も動いています

自動判定にも一度バグが出ました。尺を発話ぴったりにした結果、音量の計算で末尾に欠損が出て、口が動いているクリップまで「静止」と判定されたのです。全部が同じ値を出したら測定側を疑え、という教訓を1つ追加しました。

学習、そしてClaudeが落ちた

音声つきLoRAの学習は、まず欠陥データのまま1回走らせ(v1)、私の目視で欠陥に気づいて1513ステップで止め、作り直したデータで2回目(v2)を回しました。2000ステップ、8時間4分です。

この8時間の間にClaude Desktopがクラッシュし、サーバーごと再起動する事態になりました。学習は164ステップで消えていました。原因はClaude Codeから起動したプロセスがClaudeのコンソールにぶら下がっていたことで、以後はWindowsのタスクスケジューラ経由で起動し、Claudeが落ちても学習は続く形にしました。学習ログを1分おきに見張って、チェックポイント保存・異常・完了を通知する監視も付けています。人間が声をかけないとClaudeが次に進めない、という構造的な弱点への対処です。

声は乗ったのか──指標に騙されかけた話

まず、欠陥データで1000ステップ回しただけのv1途中版でも、音声入力なしで目標の声が出ていました。私の耳で「1本目と3本目は似ている、2本目は別人」と判別できるレベルです。

ところが最初に使っていた話者類似度の指標(WavLM)では、LoRAなしの素のモデルのほうが高い値を出しました。成人女性の合成音声どうしを区別できない指標だったのです。ECAPA-TDNNに替えて、正の対照(TTSクローン)と負の対照(別の女性の声、男性の声、素のモデル)を並べたところ、初めて分離しました。

マスターとの声の類似度(ECAPA)
TTSクローン(正の対照)0.76〜0.80
LoRA、音声入力なし0.76〜0.86
素のLTX-2.3、同じプロンプト・同じseed0.15〜0.44
別の女性の声0.23 / 0.61
男性の声0.22 / 0.27

指標は、正負の対照で分離することを確かめてから使う。学習前のTTS検品でWavLMが0.97を出していたのは「壊れていないか」を見ていただけで、「同じ声か」は見ていなかったのでした。

最適なステップはどこか

v2は164ステップごとにチェックポイントを保存したので、13個全部を同じ6プロンプト(未学習の台詞4本+学習済み2本)・同じseedで生成して採点しました。

声は164ステップで乗り、500で頭打ち。顔は500〜650と1640が良く、1968以降で落ちる
声は164ステップで乗り、500で頭打ち。顔は500〜650と1640が良く、1968以降で落ちる
左端がLoRAなし。164ステップではまだ眼鏡が出ず、328以降で安定。1476以降は下段の背景が橙色に振れ、顔の陰影が強まる。過学習はこういう顔をして現れました
左端がLoRAなし。164ステップではまだ眼鏡が出ず、328以降で安定。1476以降は下段の背景が橙色に振れ、顔の陰影が強まる。過学習はこういう顔をして現れました

前回と同じ12プロンプト(黒タートル・紺カーディガン・屋外・全身・クローズアップ・肩越し)でも比較しました。

左から静止画LoRA、v2の656 / 1148 / 1640ステップ。服と背景はどれも指示どおり。文字化け(p03)と全身画角の無視(p11)は別seedで再現せず、外れseedと判定
左から静止画LoRA、v2の656 / 1148 / 1640ステップ。服と背景はどれも指示どおり。文字化け(p03)と全身画角の無視(p11)は別seedで再現せず、外れseedと判定

採用は1640ステップ。顔の一致は12プロンプトで0.817と静止画LoRA(0.788)を上回り、声は0.81、服・背景・画角の指示にも従います。「1000〜1500で十分、それ以上は過学習」というネットの経験則は概ね正しく、今回は顔の観点で1640が最良でした。過学習は服の焼き付きではなく、色被りと陰影の強まりとして現れました。

正直、気になっていること

  • 正面バイアス。「肩越しに振り返る」がv2の全ステップで正面を向きます。学習クリップが全部正面の会話だったからで、横顔・後ろ姿の静止画を含んでいた静止画LoRAはできていました。次は静止画を混ぜます
  • 未学習の台詞の読み間違い(文字誤り率0.13〜0.30)はステップを重ねても改善しません。LoRAが覚えるのは声であって日本語の読みではなく、読みはベースモデルのローマ字解釈で決まります。「Kyou wa」が「急は」になる長音問題は表記の工夫で試す予定です
  • 学習速度。1ステップ14秒はブロックスワップの税金で、96GBのGPUの事例より4〜5倍遅い計算です。転送を片方向にする設定などで1.5〜2倍の余地があり、次回までにベンチマークします

人間がやったこと、AIに任せたこと

工程人間(私)Claude Code
調査・方針「音声も外観もゼロから設計したい」「ライセンスが気になる」モデル・規約・TTS・データセット設計の4系統を並行調査、計画書
キャラ設計顔候補から1枚選ぶ、声の方向性を承認、トリガー語を承認候補生成、57枚の変種、顔一致の自動検品、キャプション
生成物を聞いて「日本語になっていない」と指摘原因の切り分け(シェルの文字化け)、音声認識による検品ループ
学習データ42本を目視して25本の欠陥を列挙原因分析、尺の設計変更、口パクの自動QC、作り直しループ
学習「今すぐ止めて作り直す」の判断、フレーム数とローマ字の疑問実測、2回の学習、監視、タスクスケジューラ化
評価聞き比べ、見比べ指標の較正、13チェックポイントの自動採点、最適ステップの選定

前回は私の仕事が「承認する」に圧縮されていましたが、今回は違いました。人間の目と耳が、自動検品の穴を3回埋めています。声が日本語になっていないこと、42本中25本の欠陥、指標が別人を同一人物と言っていること。どれも数値上は合格だったものです。AIに任せる範囲が広がるほど、人間の役割は「最終成果物を五感で確認する」に寄っていくのだと思います。

まとめ

  • 32GBのRTX 5090で、音声つきの動画キャラLoRAは学習できます(768×448・6.4秒・rank 32で23GB、2000ステップ8時間)
  • 声はテキストの指示だけでゼロから設計でき、LoRAは164ステップでそれを覚えます。顔は500ステップ前後、過学習の兆候は1500ステップ以降
  • キャプション設計の原則(意図する特徴は書かない、変えたい要素は必ず書く)は静止画でも動画でも同じです
  • 自動検品は測定側から疑う。指標は正負の対照で分離を確かめてから使う。全部同じ値なら計算が壊れている
  • 最後は人間の目と耳。今回の致命的な問題は3つとも、数値では合格していました
  • 長時間の学習はAIエージェントのプロセスから切り離して起動する。監視は自動化する

かくして、この世に存在しない人が、存在しない声で、私のブログの話をしてくれるようになりました。次はいよいよ線画のOYAJIくんを喋らせる番です。あの丸メガネの下に、どんな声が似合うのか。

五十路の実験は、まだ続く。

追記(2026-09-06): 「正直、気になっていること」に書いた3点(正面バイアス・読み間違い・学習速度)は、続編で検証と対策をまとめました。→ 公開しました: AIが書いたキャプションの3割が嘘だった──音声つきキャラLoRA改善編、2回の再学習で直したこと・悪化したこと・2倍速くなった学習

コメント

タイトルとURLをコピーしました