絵本生成AIをChatGPTとDALL·E 2で作る

会話型AIの勢いがすごいですねー！

ChatGPTに対抗してGoogleも[Bardなるものを発表](https://internet.watch.impress.co.jp/docs/news/1476940.html)し、これからどんどん発展していきそうです。

ChatGPTの方はOpenAIからAPIも提供されているので（[正確には今後提供予定、今出されているものはChatGPTではなくGPT-3系のモデル](https://qiita.com/Tyamamoto1007/items/464e142c2d88d314ab6c)）、これと、同じくOpenAIが提供している画像生成AIのAPIである[DALL·E 2](https://openai.com/dall-e-2/)を組み合わせてみたら面白いんじゃないかということで、今回はLINE上に絵本生成AIサービスを作ってみました。

# イメージ図
イメージ図はこんな感じです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/451285/abbe4e8a-6c39-7c8b-279e-4b9737ec524c.png)

LINEから何かトピックとなる言葉を送るとを送るとGASがそれを受け取って、文章生成AIに投げます。

文章生成AIで生成された文章を受け取ったら、今度はそれを画像生成AIの方に投げます。

返ってきた文章と画像をLINEに返してやれば即興絵本がLINE上で読むことができます。

# 文章生成AI
文章生成AIは、OpenAIのページのExamplesにもある[Micro horror story creator](https://platform.openai.com/examples/default-micro-horror)を使います。以下のようにpronptにトピックを指定してあげると適当なホラーストーリーを作ってくれるみたいです。

```json:Micro horror story creator API request body
{
  "model": "text-davinci-003",
  "prompt": "Topic: Breakfast\nTwo-Sentence Horror Story: He always stops crying when I pour the milk on his cereal. I just have to remember not to let him see his face on the carton.\n    \nTopic: Wind\nTwo-Sentence Horror Story:",
  "temperature": 0.8,
  "max_tokens": 60,
  "top_p": 1.0,
  "frequency_penalty": 0.5,
  "presence_penalty": 0.0
}
```

今回はTwo-Sentence Horror Storyではなく、ある程度読み応えを期待して以下のように「起承転結の4文の童話」として指定してみます。文章量が増えるので```max_tokens```も大きくしています。

```json:Micro tale creator API request body
{
  "model": "text-davinci-003",
  "prompt": "トピック:" + topic + "\n起承転結の4文の童話:",,
  "temperature": 0.8,
  "max_tokens": 600,
  "top_p": 1.0,
  "frequency_penalty": 0.5,
  "presence_penalty": 0.0
}
```

例えば、トピックに「勇敢なゴリラ」を指定した時以下のような文章が返ってきました。

```
起: あるところに、勇敢なゴリラのハナコがいました。

承: ゴリラのハナコは、仲間たちと森のどこかにある城を探しに行くことを決心しました。

転: 城の前には、大きなドラゴンが待ち受けていました。勇敢なゴリラのハナコはドラゴンを打ち破り、城を発見しました。

結: 勇敢なゴリラのハナコは、城で宝物を見つけることができました。宝物を持って夕日を見ながら、ハナコは元の森に帰って行きました。
```

面白いかは別にしてストーリー性のある中々良い感じの文章が出力できているのではないでしょうか。

これを一文ずつ画像生成AIに投げたら、絵本を作ることが出来そうです。

少し困ったのは、この「起:」「承:」「転:」「結:」の後ろのコロンが全角だったり半角だったり、あるいは()で書かれたりとコロコロ変わっていたのと、たまに起承転結の順番も目茶苦茶だったりしたので、画像生成AIに投げるときに少し工夫が必要でした。この辺は私の扱い方が悪いかもしれませんが、ChatGPTがリリースされるとある程度使いやすくなるんじゃないかなーと思います。

# 画像生成AI
文章生成AIは、OpenAIのページの[Documentation](https://platform.openai.com/docs/guides/images)を読みながら作っていきます。といっても特に難しいことはなく文章と画像の枚数とサイズを指定してあげるだけです。

```json:DALLE2 API request body
{
    "prompt": prompt,
    "n": 1,
    "size": "256x256"
  }
```

画像は、```"256x256"``` ```"512x512"``` ```"1024x1024"```から選べるようですが、高精細なほど使用トークン量が増えるようなので```"256x256"```にしました。あとpromptが英語のみの対応なので、promptに[GASの機能で翻訳](https://qiita.com/a_eau_/items/92430bc9d749fb9c330a)をかけました。それと、DALL·E 2は写真のような画像も出力してくれますが、今回は絵本テイストにしたく画像間のテイストも併せたいので、promptの末尾に```"super fine illustration,colorful painting style with a pop color and a very fine touch, soft tone"```のように「呪文」をつけてみました。語句に関しては、ネットで調べて良さそうな奴を追加追加でつけていきましたが、プロンプトエンジニアとしてのスキルも伸ばしていきたいものですね。prompt変換のGASでの実装を一応載せておきます。

```javascript:prompt_convert
prompt_converted = LanguageApp.translate(prompt, "ja", "en")+"super fine illustration,colorful painting style with a pop color and a very fine touch, soft tone")
```

ちなみに先ほどの「勇敢なゴリラ」で画像生成するとこんな感じになりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/451285/5a4f45cb-bc1a-642b-052c-72478685bce6.png)

# 最終的に（作例紹介）
こんな感じになりました。大体1つの話作るのに1分くらいかかります。

### 作例①「雪だるまの海水浴」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/451285/76e3aa42-6186-1112-1e30-098e6afb414c.png)
所々ツッコミどころはありますが、おおむねいい感じではないでしょうか！

起承転結があるだけでなんだかいい話感がでますよね。

### 作例②「トマトときゅうりのロマンス」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/451285/1ef05a73-b07b-1b5e-db38-2ad86b574233.png)

「片やきの」って何でしょうか？笑

ちょっと文章が変になるときもありますね。

それと文章中にきゅうり、トマトが入らないと人物として描写されてしまいますね。改善ポイントです。

個人的には3枚目がツボです笑

### 作例③「ペンギンの東京大冒険」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/451285/c9f7c5fd-9afb-d4c9-1d06-044f5dcbddaa.png)

僕たちの戦いはこれからだ！みたいな終わり方、、、笑

続きがわたし、気になります！

全体的に絵柄も統一されていていい感じに仕上がりました。

# まとめ
文章生成AIと画像生成AIを組み合わせて絵本生成AIを作ってみました。まだまだ改善の余地はありますが、意外といい感じに仕上がりました。保育園とか幼稚園とか託児所とかで提供できたらいいですね～

今回、文章生成AIと画像生成AIで作ってみましたが、これに音楽生成AIとか音声合成を使うことができれば、デジタル紙芝居とかあわよくばアニメみたいなものも作れちゃうかもです。生成AI分野はこの先目が離せませんね。