今日拾ったネタ
結論はシンプルだ。口の動きのタイミングを決めるのは、プロンプトの言葉ではなく、参照として渡す音声の無音の置き方だった。この記録を書いたのは、YouTubeでAIのVTuberユニットを開発しているアルトルタ開発チームの四ツ谷さんで、ComfyUIで動くMiniMax H3を使い、キャラクターの自己紹介の短い動画を作った。
前提として、MiniMax H3自身に、きれいな日本語を喋らせることは現状まだできないと四ツ谷さんは明言している。紹介されているのは、外部で用意した日本語の音声のタイミングに、生成される映像の口の動きを合わせる方法だ。公開した音声はMiniMax H3が作ったものではなく、生成した映像から音声を消し、同じ台詞の音声を編集で重ねている。
| 項目 | 崩れた条件 | うまくいった条件 |
|---|---|---|
| 間の作り方 | プロンプトで無言を指示する | 参照音声の中に無音を置く |
| 冒頭の助走 | 声がすぐ始まる音声 | 声の前に一秒弱の無音を入れる |
| 尺 | 動画が参照音声より長い | 音声の前後を無音で埋めて尺をそろえる |
| 台詞の指定 | 音声とテキストを両方渡す | 音声だけに任せる |
| 二人のカット | 全体の音声だけ、または話者別だけ | 全体の音声と話者別の音声を組み合わせる |
MiniMaxの公式発表によれば、MiniMax H3は次世代の汎用の動画モデルとしてオープンソースで公開された。手元の環境で動かせるからこそ、四ツ谷さんのチームは同じ条件で何度も生成を繰り返し、口の動きを一コマずつ照合するような細かな検証ができている。
MiniMax H3では、参照から映像と音声を作る機能に、台詞の音声を参照として渡す。MiniMaxの公式発表は、MiniMax H3が文章、画像、音声、参照動画の関係と、それらが生成したい結果にどう関わるかを読み取ると説明している。音声合成のAivisSpeechで作った台詞を渡すと、その発話のタイミングに合わせて口を動かした映像が生成された。
コマ単位で口の形を後から手作業で直す必要はない。ただし渡し方に罠がある。音声の指定を入れ子の形で書くと、エラーも出さずに黙って無視される。
項目名をドットでつないだ形で書いたときだけ正しく読み込まれた。エラーが出ないのに効いていない、という状況は検証をしないと気づけない。
もう一つの注意は、台詞のテキストを別に書かないことだ。参照音声が内容とタイミングの両方を伝えるので、テキストの台詞も同時に渡すと二重に喋ってしまう。実際に、名乗りの言葉が二重になった例が出ている。
本当に効いているのかを確かめるため、四ツ谷さんは同じシードと同じプロンプトで、参照音声の有無だけを変えて比べた。参照音声を渡したときだけ、発話の始まりや息継ぎの時刻が実際の音声に近づき、波形の相関も大きく上がった。渡さない場合は、音声の中身を知らないままそれらしく口を動かしているだけで、相関はほぼ無いに等しかった。
で、何がすごいの?
タイミングの制御をどこで行うべきかを、四ツ谷さんは実測で突き止めた。プロンプトに最初は無言で静止と書いても、MiniMax H3はほとんど従わず、一秒から二秒ほどずれた。ところが参照音声の頭に無音区間を作っておくと、喋り出し、息継ぎの始まりと終わり、発話の終わりのどれも、ほぼコマ単位の誤差で正確になぞった。
クリップの長さと参照音声の長さをそろえることも必要だった。参照音声より動画のほうが長いと、余った時間を埋めようとして語尾を繰り返してしまう。実際に、長さの差の分だけ余計に喋ったケースが測られている。参照音声の前後を無音で埋め、動画の尺にぴったり合わせておく必要がある。
冒頭の無音の助走にも法則があった。カットの頭から声が出るまでの無音が一秒弱、目安として〇・九秒以上あれば口の動きは合い、〇・五秒に満たないと必ず崩れた。いきなり喋り出す音声を渡されると、発話のタイミングをつかめないらしい。この助走は、台詞そのものに含まれる頭の無音も合わせて数える。
途中で一度、フレーム数が学習の範囲を超えているのが原因ではないかという仮説を立てて検証し、外れている。フレーム数を範囲内に収めても直らず、逆に境界をずらした副作用で、成功していた別のカットを壊してしまった。振り返れば、変わっていたのは助走の無音の長さだけだった。
もう一つの発見が、二人が同時に喋るカットでの口の取り違えの解消だ。一本の音声だけを渡し、前半は左の子、後半は右の子が喋るとプロンプトに書いても、ほとんど従わない。十二か所の確認点のうち四か所で、喋るはずのない側の口が動いたり、誰も動かなかったりした。
話者ごとに音声を分けて渡すと取り違えは直ったが、片方が喋っている間はもう片方が完全に無音になるため、一本あたりの発話の割合が下がりすぎて、口の動きそのものが崩れた。最終的に落ち着いたのは、カット全体の音声でタイミングの土台を作り、話者別の音声でどちらの口が動くかを指定する、三本の組み合わせだった。
この構成に変えると、十二か所すべてで取り違えが消えた。プロンプトには、それぞれのキャラクターは全体の音声の中で自分の声が始まるまで口を閉じて静止し、終わった瞬間に閉じる、という一文を添えている。早く喋り始めないことを明示する言葉が効いたという。
そして四ツ谷さんが一番書いておきたいとしているのが、一度間違えた結論の話だ。最初は話者別の二本だけの方式を正解とし、完成品まで作ったが、見返すと口の動きが音声より大きく早かった。検証の早い段階で波形の相関は低く出ていたのに、最終的に音声は差し替えるから関係ないと、その数値を切り捨ててしまっていた。
実際どう使う?
キャラクターに日本語の台詞を喋らせたい人は、まず分業の形を決めるといい。声は音声合成で作り、映像の口の動きだけをMiniMax H3に合わせてもらう。公開する音声は生成物ではなく、編集で重ねる元の台詞の音声にする。役割を分けておけば、それぞれの品質を別々に詰められる。
参照音声を作る段階で、三つのことを決めておきたい。一つ目は、動画の尺に合わせて音声の前後を無音で埋めること。二つ目は、台詞の前に一秒弱の無音の助走を必ず入れること。三つ目は、間を作りたいときは音声の中に無音を置くことだ。プロンプトへの指示は効かない。
複数のキャラクターが喋るカットでは、全体の音声と話者別の音声を組み合わせて渡す。MiniMaxの公式発表が説明するように、MiniMax H3は文章や画像と音声、参照動画の関係を読み取って生成に反映する。どの音声がどの人物のものかをはっきり分けて渡すことが、その読み取りを助けるのだろう。
ワークフローの設定では、音声の指定を正しい書式で渡しているかを最初に確認したい。黙って無視される書き方があるので、参照音声の有無だけを変えた比較を一度やっておくと安心だ。生成が成功したように見えても、実は音声が使われていなかった、という事態を早い段階で防げる。
検証の段取りも参考になる。四ツ谷さんのチームは、口の開閉を一コマずつ目で照合する確認シートを作り、波形の相関のような数値の指標と組み合わせていた。見た目の確認と数値の確認を両方持っておけば、どちらか一方の思い込みに引きずられにくい。
そして、事前に決めた判定の基準を、結果が思わしくないからといって、基準のほうがおかしかったと都合よく解釈し直さないこと。まず基準を信じて、原因のほうを疑う。四ツ谷さんは、これが地味に一番効いた教訓だったと書いている。
もちろん、今回の数値はこのチームの環境と素材での実測だ。助走の長さや組み合わせの最適解は、モデルの更新や声質、台詞の長さによって変わる可能性がある。自分の素材で同じ比較を小さく試し、手元の目安を作ってから本番に使うのが確実だろう。
日本語を喋れないモデルでも、声と口を分けて考えれば日本語の作品に使える。モデルの弱点を嘆くより、得意な部分だけを借りる設計に切り替える。
AI編集部のつぶやき