動画AIで「ここだけ動かして」が効かないときの見分け方|霧だけのはずが、景色ごと流れていた

動画AIで「ここだけ動かして」が効かないときの見分け方|霧だけのはずが、景色ごと流れていた

ある曲の宣伝用に、短い動画を作っていました。動画のAI(Kling)に「霧だけ、ゆっくり流して」と頼むと、霧は流れました。ただし山も、木も、道も、いっしょに横へ流れていました。動いていないのは、手前の車のダッシュボードだけ。見た目は、走っている車の窓から見た景色でした。

先に結論です。「〜だけ動かして」が効いたかどうかは、見た目の印象ではなく、場所ごとに動いた量を測ると分かります。全部の場所が同じだけ動いていたら、動いたのは被写体ではなくカメラです。この記事では、測り方(短いスクリプトつき)と、外れたときの3つの対処を置いておきます。

目次

そもそも、なぜ動かしたかったのか

最初に作った宣伝動画は、絵を1枚、ゆっくりズームしただけのものでした。それをTikTokに上げようとすると、「オリジナルではないコンテンツ、低品質のコンテンツ」という警告が出ました。静止画だけでできた動画は、低品質として扱われるようです。投稿はできますが、おすすめには載りにくくなります。

そこで、動画のAIで絵の一部をちゃんと動かすことにしました。1本目の「信号だけ、赤から青に」は、頼んだとおりにできました。外れたのは2本目の「霧だけ」です。

何が起きたか:霧だけのはずが、景色ごと流れた

この記事の絵は、当時の絵ではなく、説明のためにあらためてAIに描かせた絵をプログラムで動かした再現です。

再現。上は頼んだ動き=霧だけが流れて、山・道・車は止まったまま。下は実際に出てきた動き=ダッシュボードから上の景色が、山も霧も道もまとめて横に流れた。説明のため
再現。上は頼んだ動き=霧だけが流れて、山・道・車は止まったまま。下は実際に出てきた動き=ダッシュボードから上の景色が、山も霧も道もまとめて横に流れた。説明のためにあらためて描かせた絵を動かした図

霧そのものは、崩れずにきれいに流れていました。だから最初は「できた」と見えてしまいます。おかしいと分かったのは、場所ごとに動いた量を測ってからでした。当時の動画では、山・霧・木が同じ15ピクセルずつ横に動き、ダッシュボードだけが止まっていました。

測り方:四角を置いて、ずれを数字にする

やることは単純です。動画の頭のコマと少し後のコマを取り出し、画面に「山」「霧」「道」「手前」の四角を置いて、四角の中の絵がまとめて何ピクセルずれたかを出します。中身は、画像処理ライブラリOpenCVの位相相関という計算です。うちで使っている短いスクリプトを置いておきます。

# ugoki_sokutei.py(抜粋)
import cv2, numpy as np
a = cv2.imread("head.png", cv2.IMREAD_GRAYSCALE)   # 頭のコマ
b = cv2.imread("later.png", cv2.IMREAD_GRAYSCALE)  # 少し後のコマ
H, W = a.shape
regions = {"mountain": (0.30, 0.12, 0.62, 0.32),   # 画面に対する割合
           "fog":      (0.55, 0.20, 0.85, 0.40),
           "road":     (0.40, 0.55, 0.70, 0.72),
           "dash":     (0.10, 0.80, 0.90, 0.98)}
for name, (x0, y0, x1, y1) in regions.items():
    pa = np.float32(a[int(H*y0):int(H*y1), int(W*x0):int(W*x1)])
    pb = np.float32(b[int(H*y0):int(H*y1), int(W*x0):int(W*x1)])
    win = cv2.createHanningWindow(pa.shape[::-1], cv2.CV_32F)
    (dx, dy), r = cv2.phaseCorrelate(pa, pb, win)
    print(name, round(dx, 1), round(dy, 1))

この記事の再現動画(頼んだ動きの見本と、実際の動き)で測った結果がこれです。

測定の実行結果。実際の動きでは、山・霧・道がそろって約59ピクセル横に動き、ダッシュボードだけ0。霧だけの見本では、4か所とも0
測定の実行結果。実際の動きでは、山・霧・道がそろって約59ピクセル横に動き、ダッシュボードだけ0。霧だけの見本では、4か所とも0

数字の読み方

測った結果起きていること
手前以外が、全部同じ量だけ動いたカメラが動いた(横に流れる・寄る・引く)
背景が全部0カメラは止まっている(正しい)
頼んだ場所だけ数字が出る頼んだ物だけが動いている(正しい)
場所ごとにばらばらの量絵がゆがんでいる・伸び縮みしている

ひとつ注意があります。霧のような薄くて形のはっきりしない物は、動いていても数字に出にくいです。四角の中では、奥の山の模様のほうが強く効くからです。なので、この測り方は「霧が動いたか」を確かめるより、「背景が止まっているか」を確かめるのに使うのが向いています。

外れたときの対処1:カメラを止める宣言を先に書く

動画のAIは、指示がなければカメラを動かしたがります。うちでは今、Klingに渡す文の頭に、必ずカメラを止める宣言を置いています。動いてよい物を2つまでに絞って、ほかは止まっていると全部書きます。

Static locked camera: the camera does not move, zoom or pan
at any moment of the clip. Only two things move, softly: ...
The mountains, the road, the trees and the whole scene
stay perfectly still, and the light stays exactly the same.

プロンプトの書き方そのものは、AI動画が言うことを聞かない時の手なずけプロンプト術に詳しくまとめています。

外れたときの対処2:外れた場所だけ、止まった絵で上書きする

一部だけが余計に動いた場合は、そこだけ動画の頭のコマの絵を重ねて止められます。柱や家具のように、もともと動かない物なら、止めても見た目は変わりません。止めたあとは、もう一度同じ測り方で、その場所が0になったかを確かめます。

外れたときの対処3:崩れていなければ、別の意味で使う

今回は、カメラが動いた以外は崩れていませんでした。霧もきれいで、手前のダッシュボードもそのまま。そこで、霧だけを動かすのはあきらめて、走る車の窓から見た景色として使うことにしました。逆向きに再生して、曲の流れに合わせています。

頼み直すたびにクレジットは減りますし、次も当たるとは限りません。出てきた物が崩れていないなら、「そういう絵だった」ことにするのも、立派な回避策でした。

まとめ

  • 静止画をズームしただけの動画は、TikTokで低品質と扱われることがある
  • 「〜だけ動かして」が効いたかは、場所ごとに動いた量を測ると分かる
  • 手前以外が全部同じだけ動いていたら、カメラが動いた
  • 薄い物の動きは数字に出にくい。背景が止まっているかを見る
  • 対処は、カメラを止める宣言・外れた所だけ止まった絵で上書き・崩れていなければ別の意味で使う

画像のAIに形を伝えるコツは画像AIに形を伝えるコツにまとめています。今回の件は、うちのYouTubeでも【AIに勝てなかった日】の4本目として、動く図解つきで動画にしています。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

AIを"部下"のように使って、ブログ運営や副業を効率化している運営者です。
煩雑な作業はAI部下たちに任せて、空いた時間を仕事・趣味・大切な人に。
「楽して稼ぐ」ではなく「時間を取り戻す」をモットーに、AI活用のリアルを正直に発信しています。

目次