ChatGPTがGIF生成に対応、6コマ画像からも作れる

ChatGPTがGIF生成に対応、6コマ画像からも作れる

OpenAIは11月4日にChatGPT Images 2.6を公開した。最も注目される新機能がGIFで、プロンプト1つか写真1枚を渡すとループするアニメーションを生成し、その後に速度の調整や1コマ単位の修正もできる。公式デモのプロンプトは拍子抜けするほど簡単で、「can you make a gif of a cat dancing?」というものだ。

手元のCodexで同じように一連のアニメーションを作ってみたが、最初の一歩から想定どおりにはいかなかった。

GIFを頼んだのに、返ってきたのはPNG

OpenAIによると、Images 2.6はChatGPTとCodexの全プランで利用できる。Codexに折り紙の船のGIFを直接頼むと、約21秒後に返ってきたのは1536×1024の単フレームPNGだった。

Codexに組み込まれた画像生成ツールの入力は4つだけで、プロンプト、参照画像のパス、直近の画像を何枚引き継ぐか、背景を透過にするかどうかである。モデル名、出力形式、フレーム数はいずれも含まれず、応答にもモデルのバージョンは表示されない。

そのため、この一連の画像の出自を先に説明しておく。いずれもCodex上でImages 2.6の機能を使うよう明示して生成したものだが、実際に2.6で生成されたかどうかは確認できない。今回ネイティブのGIFが得られなかったからといって、2.6が非対応だとは言えない。ChatGPTのWeb版とAPIは別の入口を使っている。GIFの提供は順次進んでいるとの報道もあり、アカウントにまだ表示されなくても不思議ではない。

回り道:まず6コマの画像を描く

OpenAIの公式例は、実は発想のヒントになっている。動きを1枚のスプライトシートに描き、それをつないでアニメーションにするというやり方だ。この方法は入口を選ばず、画像を生成できる場所ならどこでも使える。プロンプトの構成は次のとおり。

3列×2行のスプライトシート。全6コマ、各コマは同じサイズ。
読む順序は左から右、上から下。
内容:白い折り紙の船が、水色の水面でゆるやかに上下に揺れ、それに合わせて波紋が変化する。
すべてのコマでカメラ、船の形、背景は変えない。
6コマ目は自然に1コマ目へつながること。
文字、数字、ロゴは入れない。

画像を入手したら切り分ける。数行のPythonで合成できる。

from PIL import Image

sheet = Image.open("boat-sheet.png").convert("RGB")
w, h = sheet.width // 3, sheet.height // 2
frames = [sheet.crop((x * w, y * h, (x + 1) * w, (y + 1) * h))
          for y in range(2) for x in range(3)]
frames[0].save("boat.gif", save_all=True, append_images=frames[1:],
               duration=140, loop=0)

この折り紙の船はこうして作った。6コマ、1コマ140ミリ秒、512×512で、ファイルサイズは500KB未満。

Illustration: a paper boat bobs on pale blue water, a looping GIF assembled from a six-frame AI sheet

4本のGIFを作って分かったこと

キャラクターの見た目は想像より安定していた。オリジナルの子ギツネは、マフラー、お腹、耳が6コマすべてで一致しており、粘土のテクスチャと輪郭にわずかな揺れが出る程度だった。

Illustration: a clay fox in a blue scarf waves, keeping a consistent look across six AI-generated frames

背景が細かいほど、ボロが出やすい。折り紙の船の水面のテクスチャはコマごとに少しずつ違い、速度を落とすと分かる。きれいなループにしたいなら、背景は単色か大きな面で構成するのがよい。

軌道を描く動きがいちばん難しい。円を描いて飛ぶ紙飛行機は、最初の版では経路がよれよれで、描き直してようやく使えた。最終版でも折れ線にわずかなずれが残っている。手を振る、上下に揺れる、うなずくといった、その場での小さな動きは明らかに成功率が高い。

6コマで足りるが、欲張らないこと。1本のGIFで表現するのは1つの動きだけにするとよい。堅実な進め方は、まず1本作り、同じキャラクターで複数の版を出し、顔、色、ロゴが崩れていないかを確認してから、量産するかどうかを決めることだ。

APIのパラメーターはより明確

開発者向けには正式なパラメーターがある。output_formatをgifにし、frame_countとframe_duration_msを組み合わせる。既定値は9フレーム、1フレーム200ミリ秒。フレーム数の上限はドキュメントで食い違っており、ガイドには2〜64、APIリファレンスには2〜16とある。無難に、当面は16以内で使うのがよい。

動かす前に、静止画を固める

やり直しの多くは、動かす前の段階で起きる。キャラクターの顔立ち、配色、マフラーの結び方が固まっていないと、6コマ画像のどこか1コマがずれただけで全体を作り直すことになる。

そこで、まず満足のいく静止画のキャラクター設定画を1枚作り、確定してから動かす順序が手間が少ない。この工程はChatGPTでやる必要はない。PixPixのGPT Image 2.6ページは開いてすぐこうしたワークフローになっており、プロンプトか参照画像から始めて、一度に1か所ずつ修正しながら、残したいディテールを同時に指定できる。既定ではより精細なSunburstが選ばれている。上記のスプライトシート用プロンプトはそれ自体が静止画のリクエストなので、理屈の上ではそこに入れて試すこともでき、切り分けと合成は引き続き手元で行う。この方法は未検証で、PixPixのページにもGIF機能の記載はないため、あくまで一案にとどまる。

公開前に注意したい点もある。プラットフォームによってはGIFのアップロードに対応が不十分で、動画への変換が必要になることがある。画像内の文字とロゴはコマごとに確認すること。他人の写真でGIFを作る場合は、先に本人の同意を得ること。

参考資料:OpenAI Developer Communityのお知らせ、CocoLoop、OpenAI画像生成ドキュメント、The Decoder、AI×SNS Lab。所要時間とファイルの数値は自社テストによるもので、モデルのバージョンは確認できていない。