ある曲の宣伝用に、短い動画を作っていました。動画の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))
この記事の再現動画(頼んだ動きの見本と、実際の動き)で測った結果がこれです。

数字の読み方
| 測った結果 | 起きていること |
|---|---|
| 手前以外が、全部同じ量だけ動いた | カメラが動いた(横に流れる・寄る・引く) |
| 背景が全部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本目として、動く図解つきで動画にしています。

