ChatGPT(DALL·E 3)で同じ人物の服とか表情とか変えたい

朝日新聞社メディア事業本部メディア研究開発センター　田森です。

DALL·E 3（以下DALL-Eとします） は、OpenAIが発表した、いわゆる画像生成AIで、ChatGPT Plus（有料）やBing（無料）で利用できます。自然言語でプロンプト（指示）を書くだけで、高品質な画像が作ることができて、絵心のまったくない私でも新しいコンテンツ、例えば漫画とか動画とかも作れるのではないか、とワクワクしています。

漫画や動画を作る場合、ある登場人物がいろんな場所に行ったり、様々な服を着たり、表情を変えたり…同一人物が登場するシーンをたくさん作らなければなりません。ただ、ChatGPT上でDALL-Eを使ってそのようなことができるのか試してみたのですが、なかなか一筋縄ではいかないようで、かなりのランダム性があるようです。

アドベントカレンダー第６日の本記事では、同じような人が服を変えたり、表情を変えたりできないか、試行錯誤してみた結果をご報告します。

# 単純なケース
```
# プロンプト
日本のアニメ風の日本の典型的サラリーマンを描いて下さい。
```

<img width=512 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106239/d58c243d-7f8e-e0bb-55b1-13c9f94deda9.png"/>

この出力に続いて、
```
# プロンプト
この画像の人物が夜、カジュアルな格好になっているシーンを書いて下さい。
```
と指示します。
<img width=512 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106239/27569082-b19f-faba-afc3-4f6b70f4282e.png"/>

まあ、うん... 悪くはないですが、ちょっと違うような気もします。

# ランダムシードの固定
DALL-Eなど、生成AIにおいてランダム性を極力抑えるための一つの方法として、ランダムシードの固定があります。ランダムシードは乱数を発生させるための「種(seed)」のようなものです。画像の生成AIの場合は、ランダムシードを用いて発生させた乱数（ノイズ）から画像を作っていくことが多いので、この大元のランダムシードを固定することで、同じような画像が生成されるのを期待するものです。

ChatGPTにおいては、ランダムシードを調べたり固定したりする方法について正式なアナウンスはなさそうなのですが、検索すると自然言語で問えば生成の際に利用したランダムシードを教えてくれるとのこと。先のサラリーマンの画像に続いて下記のように入力します。

```
# プロンプト
この画像のランダムシードを教えてください

ChatGPT
この画像の生成に使用されたランダムシードは「3954745343」です。
```
`3954745343` がサラリーマン画像を作る際に用いられたランダムシードのようです。ただ、こう答えてはくれていますが、本当にそうだったかどうかはよくわかりません。ここでは信じて進めたいと思います。

ランダムシードの固定についても、プロンプトとして記載します。
```
ランダムシードは3954745343
この画像の人物が夜、カジュアルな格好になっているシーンを書いて下さい
```
<img width=512 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106239/5ee512b2-16c2-0b4a-9367-75fd058515ac.png"/>

きれいな画像ですね。人物が一緒か、と問われると、最初の例よりはだいぶ良くなったような気もしますね！

# 生成IDの利用
調査を進めると、もう一つの方法として、「生成ID」と呼ばれるものを利用した提案がいくつかされているので、検証してみます。生成IDは生成画像それぞれにIDが振られており、「それに近づけて」というようなプロンプトの書き方ができるそうです。

ランダムシードと同様、一番最初のサラリーマンの画像に続いて
```
# プロンプト
この画像のIDを教えてください

ChatGPT
この画像の生成IDは「3PkmdrlJwjiTZrgM」です。
```
`3PkmdrlJwjiTZrgM` がサラリーマン画像の生成IDのようです。これを用いて、ランダムシードのときと同様に指定してみます。ただ、今回は「この画像に近づけて」という指定になるようなので、近づけてほしい部分も特定して指示してみます。
```
# プロンプト
顔の生成IDは「3PkmdrlJwjiTZrgM」
この画像の人物が夜、カジュアルな格好になっているシーンを書いて下さい
```
<img width=512 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106239/d535f15d-d750-2284-a3cb-9c9c92af8d56.png"/>

背景とかは毎度のこと完璧なんですが、登場人物はもう一声（というか少し離れた？）と言う印象。可愛くなりましたね。難しいです。何度か生成してみましたが、あまり安定しませんでした。

# 画像生成時のプロンプトを利用
ChatGPTで生成された画像をクリックして、右上の `i` のボタンをクリックすると、生成された画像の説明のようなものがでてきます。これは、我々が入力したプロンプトを、ChatGPTがさらに解釈して細かい指示を作り、それをDALL-Eに渡しているようで、その「細かい指示＝内部の画像生成のためのプロンプト」だということです。今度はこれを利用してみたいと思います。先の可愛い男子の画像の内部プロンプトはこのようなものでした。雰囲気は完璧なので、今後はこのプロンプトを利用してみます。今後は便宜上「内部プロンプト」と呼ぼうと思います。
![Untitled.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106239/e08b868d-347a-d4ad-d81f-405f124e997e.png)

今回は今までの方式（ランダムシード + 画像ID）に、さらにこのプロンプトを入力してどうなるか見てみます。最初のサラリーマン画像のランダムシードと画像IDを用いつつ、雰囲気の指示として先の内部プロンプトを利用します。
```
# プロンプト
顔の生成IDは「3PkmdrlJwjiTZrgM」、ランダムシードは「3954745343」
An illustration in Japanese anime style. This scene shows him in the evening, wearing casual attire. He is dressed in a relaxed t-shirt and jeans, with a light jacket. His expression is more relaxed and content compared to his daytime appearance. He is strolling through a city street at night, with street lights and neon signs illuminating the background, creating a vibrant and atmospheric night scene in a Japanese city.
```
![Untitled 2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106239/75d2fdc0-0621-9f3c-27d8-beec1a9e6724.png)

<img width=512 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106239/a1d788bf-c849-a86f-af12-fe1b45cc71ba.png"/>
<img width=512 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106239/b9fd4051-c6be-b0b4-84b6-a6167adb3d18.png"/>
<img width=512 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106239/f2959786-5ada-0ae9-7289-c0f3380e368b.png"/>

数枚出しましたが、かなり安定したように思います。特に2枚目はいいんじゃないかなーと思ったりします。

# GPTs「DALL·E」を利用してみる
昨今のChatGPTでは、ChatGPTを利用した独自のツールを作れる「GPTs」が公開されました。自分でGPTsを作れたりしますが、OpenAIがあらかじめ用意してくれているものもあります。その中の「DALL·E」を使ってみて、追加の検証をしてみようと思います。更にうまく行ったりしないかな、という望みを持ちまして…
<img width=512 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106239/65514ec2-b39a-0ad4-8263-a90f8f23f552.png"/>
これをクリックすると利用できるようになりますが、利用方法は今までと同じで、プロンプトを入れるだけです。
![Untitled 3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106239/5ba3b30c-27b8-f627-4127-aa70d5ed5563.png)
やはり安定していますが、通常のChat上と比較してもあまり変わらなさそうですね。

ここで気づいたのですが、GPTsを利用すると、別のチャットになるのですが、生成IDやランダムシードは効いているようですね。想定では、別のチャットになるとこういったものは引き継がないのかな、と思いましたが、別のチャットでも引き継げるようで、どうやら適当なIDやランダムシードではないようです。

## 生成IDやランダムシードを抜いてみる
果たして本当にこれらは効いているのか？と不安になり、抜いて生成してみました。
![Untitled 4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106239/eb2225c1-bad4-7672-3090-027bfa14874e.png)
内部プロンプトのお陰で雰囲気は保っていますが、顔はかなり違いますね。やはり、これらの指定は効いているようです。何度かやるとこんなのもでました。
<img width=512 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106239/c97a5d9c-054d-46fd-7072-8d5d27ffbc7c.png"/>


# 同じ状況で表情を変える
ところで最初のサラリーマン、表情が厳しいですね。日々のお仕事、ご苦労さまです！

今回は服装や背景は変えずに、表情を変えてみたいと思います。内部プロンプトは省いて、単純な指示だけにしてみます。
```
# プロンプト
生成IDは「3PkmdrlJwjiTZrgM」、ランダムシードは「3954745343」
登場人物の表情を優しい表情にして下さい。背景はそのままにして下さい。
```
<img width=512 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106239/57fa3ee1-ac18-ef0f-e4e8-ee70af7efc89.png"/>

ネクタイとか、背景も少し変わりました（駅のホームみたいになった…）が、一見したところちゃんとポイントは抑えられていそうですね。

なお、ランダムシードは固定されていますが、生成IDは異なっているようで、ちゃんと機能しているような気もします。
![Untitled 6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106239/95771b20-23ee-0193-48e6-d5f1e6d61ee9.png)

# 背景をそのままで、登場人物を変える
この情景に、もう1人登場人物を登場させてみましょう。先程と同じような簡単なプロンプトでうまくいきました。
```
# プロンプト
生成IDは「3PkmdrlJwjiTZrgM」、ランダムシードは「3954745343」
登場人物を女性にしてください。背景はそのままにして下さい。
```
<img width=512 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106239/9dfc843f-ad89-d0b0-dbda-c4a67d788f83.png"/>

# おわりに
正直なところ、画像の生成AIで動画を作ろう！みたいな業務は弊社にはいまのところ無いのですが、調べると色々なところで議論されていたので、面白そうなのでやってみました。

## おまけ
やりすぎて途中から変になりました。
<img width=512 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106239/b504dbb4-3ee0-10dd-da84-bdbe8f774fca.png"/>