生成AIが、主人公を毎シーン 別人で描いてくる。一人の男の物語なのに

Claudeで執筆しました

歴史系の解説動画を、全自動で作っています。シーンごとに、その場面の絵をローカルの画像生成AIに1枚ずつ描かせる。ある古代ローマの武将、一人の男の生涯を追う動画を作っていました。

出来上がったものを、頭から1シーンずつ見返します。そこで固まりました。

主人公が、シーンごとに 別人なんです。

あるシーンでは、宝冠をかぶった王様。次のシーンでは、房飾りの兜をかぶった若い兵士。その次は、白髭の老人。……同じ人の、はずなんですが。一人の男の伝記で、主役の顔が毎回 変わる。これは致命傷です。

しかも、よく見ると歴史の粗も混じっている。古代の海戦のはずなのに、船が大航海時代の帆船(オールで漕ぐ古代のガレー船じゃない。時代が千年以上ズレてる)。共和政ローマの人物が王冠をかぶっている(ローマは「王になりたい」だけで処刑した国です。皮肉が過ぎる)。遠景の街に、あるはずのないドーム。石のアーチには、崩れた偽ラテン語が彫られている。

原因は「毎回ゼロから頼んでいた」こと

なぜこうなるか。答えは単純でした。

シーンごとに、プロンプトを独立して書いていたんです。1シーン目の絵を頼み、2シーン目の絵を頼み……と、その都度 別々にお願いする。すると生成AIは、毎回 主人公の顔つきも、時代設定も、ゼロから想像し直す。独立して頼む、というのは、毎回ドリフト(ズレ)する、ということでした。

「同じ人を描いて」と毎回 言葉で祈っても、絵は言うことを聞いてくれません。

①作成時に予防する、人物を1回だけ宣言して、注入する

まず打った手は、宣言の再利用です。

主人公の外見(年齢、髪と髭、鎧、マント、「王冠はかぶらない」まで)を、1箇所に1回だけ書く。人物カード、と呼んでいます。そして各シーンのプロンプトでは、その人物をプレースホルダで参照するだけにする。生成の直前に、カードの中身を全シーンへ自動で差し込む。

時代・史実の共通制約(古代・ガレー船・王冠なし・ドームなし……)も、同じように1回宣言して全プロンプトに注入する。

これで、主人公は「同じ人」として認識できる水準まで揃いました。船もガレー船になり、王冠も消えた。外見を1箇所で管理できるので、直したければ1行いじれば全シーンに効く。毎回 手で書き直す作業が、消えました。

②それでも残る、プロンプトは「お願い」でしかない

ところが、宣言しても消えないものがあった。「ドームを描くな」「文字を描くな」と書いても、モデルはしれっとドームを描き、アーチに偽の碑文を彫る。

ネガティブな指示(「〜するな」)は、このモデルには「守ってくれたら嬉しい」程度の効き目でした。宣言することと、守らせることは、別なんです。

そこで打ったのが、pixelの検問です。

動画に仕上げる(重い工程)前に、生成された画像そのものを、目で見られるAIに検査させる。プロンプトの文字列じゃなく、出てきたピクセルを見る。「崩れた偽文字が無いか」「時代錯誤(近代の帆船・王冠・ドーム)が無いか」「主役が同じ人に見えるか」「その絵は、そのシーンのナレーションの場面を表しているか」。落ちたシーンだけ、乱数の種を変えて生成し直す。合格するまで回す。

この検問は、宣言では消せなかったものを、ちゃんと捕まえました。アーチの偽碑文と、遠景のドーム。種を変えて描き直したら、消えました。

面白いのは、これが結局、自分が最初に手で1シーンずつ睨んでやったことを、そのまま仕組みにしただけ、という点です。人間の目視QAを、AIの目視ゲートに置き換えた。

学び

  • 独立生成は、ドリフトの温床。シーンごとに別々に頼むと、共通のはずのもの(人物・時代)が毎回ズレる。共通項は1回だけ宣言して注入する。祈るな、宣言しろ。
  • ネガティブプロンプトは強制力じゃない。「〜するな」は、守られたらラッキー、くらいに思っておく。守らせたいなら、生成物を見る検問を別に置く。
  • 生成の品質は、作成時に設計する。「宣言で予防し、pixelで検査する」。プロンプトに祈って後で泣くより、①宣言の注入と②目視の検問を、最初からパイプラインに組み込む。

生成AIに「毎回 同じ人を描いて」とお願いするのは、やめました。一度だけ 人物カードを書き、出てきた絵を疑う検問を置く。それだけで、主人公は同じ顔で、最後のシーンまで立っていてくれます。