静止画1枚が6秒のループ動画になるまで:実装の詳細と踏んだ落とし穴
これは仕組みの解説ではなく実装の話です。写真が入ってから動画が出るまで、各工程が何をしているのか。そして「もっともらしく見える」やり方のうち、実測すると間違いだったものはどれか。
2026-08-20 作者 William Hsu
全工程
- 受け取りと検査:形式とサイズを確認し、内容の安全チェックを1回。人物向けの動きでは顔検出も走ります。 写真が鳥なのに人物向けの動きを選ぶと、モデルは存在しない人物を生成してしまいます。
- エンコード:写真と動きの指示をまとめて符号化。いちばん時間がかかる工程で、20秒近く。
- サンプリング:turbo LoRAのおかげでたった4ステップ。
- デコード:結果を画面に戻して73フレームを得ます。
- 後処理:24fpsの73フレームは3.04秒。順再生と逆再生をつないで、6.08秒の継ぎ目のないループに。
なぜ73フレームなのか。このモデルのフレーム数は17n+5でなければならず、3秒付近で使える値は73だけでした。 論文には書かれておらず、実装中にぶつかって知りました。
ピンポンループ
生成した3秒の動画は頭と尻がまず揃わないので、そのままループさせると明らかに飛びます。 順再生のあとに逆再生をつなげば両端が同じになり、継ぎ目が見えなくなります。
代償として行ったり来たりした感じが出るので、方向のはっきりした動きは避ける必要があります。 「手をふる」は問題ありません。手はもともと戻ってきます。「振り向く」は、振り向いたあと止まる設計にしないと、 逆再生で顔をそむけることになります。
実測して初めて間違いと分かった3つ
一、「カメラを動かすな」と言うほど画面が寄る
指示に「camera does not move」と足したくなります。実測は逆で、その一文を入れると背景の変位量が 6.6から39.2に悪化しました。おそらくその表現自体が、モデルの注意を「カメラ」という概念に向けてしまうのです。 最終的な指示ではカメラに一切触れず、人物の動作だけを書いています。
二、モデルに額縁を描かせると歪む
当初は成果物にレトロな額縁を入れたいと考えていました。モデルは描けますが、毎回違う形になり、しかも左右非対称です。 ウェブ側のCSSで重ねる方式に変えたところ、額縁は常に正確で、利用者はいつでも変更や解除ができ、 ダウンロードされるファイルもきれいなままになりました。
三、低解像度の写真でも壊れるとは限らない
小さすぎる写真では作れないと思い込み、説明ページにもそう書いていました。実際に96ピクセルの写真で試すと、 ちゃんと動きました。細部がぼやけるだけです。自分の主張を自分で覆し、説明ページも書き直しました。
失敗の処理のほうが手間がかかる
モデルを動かすのに使った時間はごく一部で、残りは現実世界の事故への対処でした。
- 利用者のスマホがタブを凍結し、フロントエンドは切断したと判断して諦める。実際にはバックエンドは最後まで走っている。 今は処理状態をブラウザとサーバーの両方に書いていて、戻ってくれば自動的に再接続します
- 利用者がキャンセルを押しても、生成はまだGPUで走っている。キャンセルは生成側まで届いて実際に中断させないと、 カードは空回りを続け、後ろで並んでいる人まで待たされます
- 出力にも内容の安全チェックが要ります。アップロードで止めるものは、出てきたものも止めなければなりません
どれもモデルの問題ではありませんが、どれも利用者から見れば「このサイトは壊れている」と見えます。