生成AI研究室(33) “転がらないはず”のゴルフボールを、新開発ノードで止めた——完成動画をClaude Codeに見せて「そこだけ」を直す

生成AI研究室(33) "転がらないはず"のゴルフボールを、新開発ノードで止めた——完成動画を見せて「そこだけ」を直す
完成版(10秒)。ボールは最後まで同じ位置

今回の完成版です。何本焼いても最後の1秒で転がっていたゴルフボールを、新しく作ったノードで止めました。完成動画を根拠に問題の部分だけを切り分け、そこだけを直す構造です。人物・構図・カメラ・動作はそのままです。

動画生成で一番消耗するのは、狙った絵がほぼ出ているのに、一か所だけが毎回破綻するときです。今回のゴルフ動画がそれでした。人物も、構図も、しゃがんでラインを読む動作も出ている。なのに、ボールが最後の1秒で転がる。日本語を言い換え、英語を書き直し、Macでもデスクトップでも何本も焼き直しましたが、転がり続けました。

破綻した動きを止める手は、大きく2つあります。ひとつは、Blenderなどで動きの構造を作った参照動画をH3に読ませる方法。もうひとつは、プロンプトで何とかする方法で、たいていの人は日々こちらで格闘しています。この記事は後者です。ただし、全文を書き直して運に任せるのではなく、完成した動画を根拠に、問題の部分だけを切り分けて直すノードを作り、それでボールを止めた記録です。

目次

先に結論

  • ボールを止めたのは、新しく作ったノードの構造——完成動画のコマを根拠に、問題の部分だけを切り分け、その範囲の差分だけを返させ、検査して採用する流れ——です。日本語の指摘は「ゴルフボールが動いている。全区間静止状態にする」の一文。出てきた英語の変更は6か所、残りの492語は文字単位でそのまま。
  • 差分の中身は、ボールの固定を書いていた否定形(never rolls or shifts)を肯定形(最終フレームまで同じ位置を保つ)に替えたこと。「rolls」という語そのものが転がりを呼び込んでいた。
  • ノードは、完成動画のコマと日本語の指摘を Claude Code に渡し、許可した範囲の差分だけを返させ、日本語で確認してから採用する。範囲外は一文字も変わらないことを機械的に保証する。全文を書き直して運に任せる方法では、ここに辿り着けなかった。
  • Claude Code は、コマの画素座標からボールが動き出した時刻(約8.7秒)を自分で特定した。

1. 全文を書き直すと、良かった所まで変わる

前回(32)で、日本語をノードに書くと Claude Code が H3 用の英語を書く形ができました。しかし、焼いた結果を見て直すには、日本語を書き換えてもう一度全文を書かせるしかありません。すると、カメラの高さも、歩き出す時刻も、しゃがみ方も、毎回少しずつ違う英語になる。直したいのはボールの1点なのに、比べる相手が毎回変わり、何が効いたのか分からなくなります。これが「プロンプトで格闘する」ときの正体です。

必要なのは、前回の英語を土台に指摘した所だけを変えることと、変えていない所が本当に変わっていないことを機械的に保証することでした。

2. 仕組み——記録して、指摘して、差分を見て、採用して、焼く

ComfyUIのワークフローに4つのノードを足しました。実装は ChatGPT(Codex)に任せ、当方は仕様と判断を担当しています。

全体の形は下の図です。設計の最初に ChatGPT が示した接続図で、上半分が生成、下半分が修正。完成動画を同じ実行の中に戻すのではなく、保存した記録を読んで次の実行で直します。

設計時にChatGPTが示した接続図: 参照メディア→Rewriter(最初の英語を作る)→H3動画生成→完成動画を保存→生成記録(動画・使用プロンプト・素材・設定をひとまとめに保存)。日本語の指摘・変更してよい範囲と合わせてReviser(必要な部分を修正)→修正案確認(変更前後と理由を表示)→採用した英語を次回生成に使用
ノード役割
生成条件の記録参照素材・解像度・尺・seed・モードなど、その1本の条件をまとめる
採用プロンプト切替通常は元の英語を通す。採用案があるときは、採用記録・素材・設定を照合して修正版を通す
完成動画の記録完成した動画と、その生成に使った英語・素材・設定・実行グラフを1組で保存する
動画フィードバック・修正確認日本語の指摘を入れ、修正案を作らせ、差分を日本語で確認し、採用する
ComfyUIに足した4ノード: 生成条件の記録・採用プロンプト切替・完成動画の記録・動画フィードバック修正確認
  1. いつもどおり焼く。完成すると、動画・元の英語・参照素材・設定が1組で記録される。
  2. 「直したい点」と「変えない点」を日本語で書く。変更を許す節(今回は detailed_description)と、詳しく見る時間帯(今回は8〜10秒)を指定する。
  3. ① 修正案を作成(焼かない)。ここだけが Claude Code を呼ぶ。動画全区間から均等に12枚、指定した時間帯から最大12枚のコマを切り出し、記録と一緒に渡す。
  4. 返ってきた案を、日本語の「変更前・変更後・理由」と英語の差分で読む。語数・書式・許可範囲・維持条件の矛盾は自動で検査される。
  5. ② 採用(焼かない)。切替ノードが修正版を通す状態になる。
  6. 通常の実行で焼く。seedや素材が記録と違えば止まる。
動画フィードバック・修正確認ノード。日本語の指摘、変更を許す節、時間帯、観察と変更前後の日本語、①修正案作成と②採用のボタン、採用済み表示

3. 「そこだけ」をどう保証するか

Claude Code に新しい全文を書かせるのではなく、許可した節の中の old → new の対だけを返させます。old は元の英語に一か所だけ一致する文字列でなければならず、一致しない・複数一致する・範囲外に触れる・節の見出しを足す案は拒否されます。差分は最大12か所、1か所の置換元は1600文字以内。差分以外の文字列はそのまま残ります。

さらに、日本語の説明(変更前・変更後・理由)を必須にし、適用後の英語を H3 の書式検査(節の順序・ラベル・参照番号・850語上限)にかけ、違反があれば元の英語を基準に1回だけ再修正。それでも残れば採用できません。採用後は、修正案・記録・動画・参照ファイルのどれかが変わると使えなくなります。

保証するのは「許可範囲外の文字列が変わらない」ことまでです。意味が指摘に沿っているかは日本語の差分で本人が読み、映像が直ったかは焼いてから確かめます。

4. 実際にボールを止めるまで

指摘は一文、「ゴルフボールが動いている。ゴルフボールを全区間静止状態にする。」。維持条件は「指摘した部分以外の人物・衣装・構図・動作・カット・音を維持」。変更を許した節は detailed_description、詳しく見る時間帯は8〜10秒。

4-1. Claude Code が座標で動き出しを当てた

返ってきた観察は、コマの画素座標を連番で追ったものでした。ボールの位置は 0.00秒(約349,735)・4.58秒(348,735)・8.00秒(348,737)・8.55秒(347,735)までほぼ同じ画素にあり、9.09秒(340,744)・9.45秒(325,758)・10.00秒(307,777)と画面左下、カメラの手前方向へ連続して動く。同じ区間でピンの基部(約207,830)と旗、人物の位置は変わらず、カメラも静止している——つまり画面全体のパンやズームではなく、ボール単体が動いている。「約8.7秒以降の最後の1.3〜1.5秒で転がっている」という指摘の再現です。

ボール以外は指示どおりだとも書いてきました。カットなしの連続ワンテイク、芝すれすれの静止ローアングル、1.2秒・2.6秒の二歩、4.0秒のパター接地、5.2秒のしゃがみ込み、7.0秒の着座完了。

4-2. 原因は否定形——6か所の差分

原因として挙げたのは、元の英語がボールの固定を否定形で書いていたことでした。「which stays exactly where it is」「never rolls or shifts」。H3 は否定を苦手とし、「rolls」という語自体が転がりを呼び込む。これは当方が第23回で見た「否定表現はH3で崩れやすい」と同じ筋です。

採用した案は6か所の差分で、すべて detailed_description の中。中核の2か所を日本語の変更前後で引きます。

変更前変更後
変更3(ボールの定義)<Subject 5>はカップの約2.5m先の芝の上に静止して置かれ、小さくシャープに写る<Subject 5>はカップの2.5m先、小さくシャープに芝の一房に収まり、カップまでの距離は全フレームで同一である
変更6(終盤)彼女の唇は全編閉じたままで話すようには動かず、<Subject 5>は転がったりずれたりしない(never rolls or shifts)彼女の唇は全編閉じたままで話すようには動かず、<Subject 5>は最終フレームまでその静止位置を保ち続ける

英語ではこうです。

変更前: <Subject 5> rests motionless on the turf about two and a half metres past the cup, small and sharp.

変更後: <Subject 5> sits small and sharp two and a half metres past the cup in one tuft of grass, its distance to the cup identical in every frame.

残りの4か所は、同じ節の中で語数を収めるための言い換えで、カメラの高さ・時刻・動作は一つも落としていません(理由欄に「27語→16語に語数のみ圧縮」のように書かれます)。

4-3. 語数の配分

元の英語は944語で、当方の完走実績の上限850語をすでに超えていました。変更不可の部分だけで492語あるので、変更できる部分は358語以下に収めないと850語に入りません。最初の案は1004語で停止、語数の予算(元の語数・変更不可の語数・変更可能部分の上限・目標)を渡すように直して842語、しかし短縮で元の詳細を省いた矛盾が残って保留、再修正で841語・違反なし。採用は3回目の案です。

5. 結果——ノードの構造で止めた

左が最初の1本、右が完成版です。最初の1本は、立ち上がって歩き、足でボールを蹴って動かしてしまいます。完成版は、人物・構図・カメラ・動作はそのままで、ボールが最後まで同じ位置に留まります。

最初の1本。立ち上がって歩き、足でボールを蹴って動かしてしまう
完成版。ボールは最後まで同じ位置

指摘は一文、変えたのは英語の6か所だけで、それ以外の492語は文字単位で同じです。文字列を維持しても映像の他の部分まで同一になる保証はありませんが、少なくともこの1本では、直したい所だけが直りました。何本も焼いて止まらなかったボールを、ノードの構造で止めた。

6. つまずいた所3つ

問題正体対応
「850語以内」と書いても収まらない変更不可の部分だけで492語。全体の上限だけでは足りない変更可能部分の残り語数を計算して渡す
「読取権限が拒否された」と出た画像の Read ではなく、Claude Code が勝手に使おうとした補助の Bash(語数計算・切り抜き)が拒否されていた使える道具を Read だけに限定(--tools Read)。権限の緩和はしない
841語の正しい案なのに読めないJSONの文字列を "…" + "…" と連結して返していた保存した返答から文字列の連結だけを正規化して復元。以後は JSON Schema を指定

ほかに、Claude Code を待つ間の状態(準備・画像確認・作成・検査・再修正)と経過時間を表示する仕組み、②を押したあとに「採用済み ✓」と出る仕組みを足しています。裏で2〜4分黙って動くので、これがないと止まっているように見えます。

7. 限界

  • コマは静止画です。コマとコマの間の短い動き、滑らかさ、音は判定できません。音の指摘は日本語で書く必要があります。
  • 文字列を維持しても、映像の他の部分が完全に同一になる保証はありません。seed固定は比べる条件を揃えるためのものです。
  • 採用案は記録と同じ条件でしか通りません。seed・尺・素材を変えると止まります。
  • 1本の改善から、他の動画での成功率や所要時間の短縮は言えません。

まとめ

  • 一か所だけ破綻する動画は、全文を書き直すと他が崩れる。完成動画を根拠に、問題の部分だけを切り分けて直す道具を作った。
  • 転がり続けたゴルフボールを、この構造で止めた。出てきた差分は否定形→肯定形の6か所。944語→841語、492語は文字単位で維持。
  • Claude Code は画素座標で動き出しの時刻を自分で当てた。
  • プロンプトで格闘する時間を、「どこを直すか」の判断に使える形になった。

環境: MacBook Pro M5(32GB)・ComfyUI・Claude Code(定額プラン)・モデル Claude Opus 5・実装 ChatGPT(Codex)。参照: 第32回、第31回、第23回。

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

この記事を書いた人

コメント

コメントする

目次