AIで作ったTOIECの文章から、生成AIで画像を生成する
英単語帳アプリを作る中で一番大事になる部分、画像の生成をコーディングして実際に動かしてみました。
環境
開発環境:Google Colab
言語:Python
Dockerを使おうとしてみたり、WSL上にPython環境を作ったりしましたが、結局一番楽そうだったので、Google Colabにしました。
完成品
最終的に動かしたコード全行です。
from google.colab import userdata
import google.generativeai as genai
import torch
from diffusers import StableDiffusionPipeline
# GEMINIにTOEICっぽい文章を作ってもらう
# 自分が登録したGEMINI_API_KEYを変数に格納
GEMINI_API_KEY = userdata.get("GEMINI_API_KEY")
genai.configure(api_key=GEMINI_API_KEY)
# モデルの選択
model = genai.GenerativeModel("gemini-1.5-flash")
# 生成AIに投げる質問
question = "attendという単語を使ってTOEICに出てきそうな1文を作って。その1文だけ出力して。"
# 回答を変数に格納
response = model.generate_content(question)
# 回答を出力
print(response.text)
# GEMINIから返ってきた回答を基に画像を生成
# 生成したい画像の内容をテキストで指定
input_text = "attend"
# Stable Diffusionのパイプラインを設定
pipeline = StableDiffusionPipeline.from_pretrained(
"CompVis/stable-diffusion-v1-4", revision="fp16"
).to("cuda")
# 画像生成の実行
generated_image = pipeline(str(response), guidance_scale=7.5).images[0]
# 画像の保存
generated_image.save(f"{input_text}.png")
解説
流れとしては大きく分けて以下です。
①GEMINI(生成AI)に特定の単語からTOEICっぽい文章を作ってもらう。
②Stable Diffusion(画像生成AI)を使って、①の回答から画像を生成する。
①GEMINI(生成AI)に特定の単語からTOEICっぽい文章を作ってもらう。
GEMINIというGoogle先生がだしている生成AIをAPIとして利用し、英単語からTOEICっぽい文章を作ってもらいます。
APIとして利用する方法は以下の記事にわかりやすくまとまっていました。同じ会社だけあって親和性がありますね。
今回はattend(出席する)を対象としています。今回はテスト走行なのでベタ打ちしていますが、実際の運用ではattendの部分を変数にしてCSVファイルから単語を抜き出してループさせる予定です。
# 生成AIに投げる質問
question = "attendという単語を使ってTOEICに出てきそうな1文を作って。その1文だけ出力して。"
「attendという単語を使ってTOEICに出てきそうな1文を作って。」だけで終わらせると「もちろんです!」とか、「TOEICに出てきそうな文を考えました。」とか画像生成AIに読ませるには不要な単語が混じるため、「その1文だけ出力して。」を追加しています。
②Stable Diffusion(画像生成AI)を使って、①の回答から画像を生成する。
実装の仕方は下記の記事に詳しく書いてありました。
上記の記事の通りに実装し、後はStable Diffusionに入力する文字列を①で生成した文章が入っている変数を文字列に変換したもの str(response) に変えただけです。
generated_image = pipeline(str(response), guidance_scale=7.5).images[0]
結果
コンソール
コンソールに出力した文章です。print(response.text)でGEMINIから返ってきたTOEICっぽい文章を確認用に出力している部分ですね。
そのほかにも画像を生成している際になんやかんやをあーだこーだしている(多分ロードとか)の文章とか出力されていますが、割愛します。
Please attend the mandatory safety training before operating the machinery.
適当翻訳:機械を動かす前に受講必須の安全講習に出席してくださいね。
オタクトーク:めっちゃTOEICっぽい!mandatory(必須の)とかもTOEIC頻出単語ですし、会社からの命令っぽいのもビジネス英語のテストという意味でめちゃくちゃTOEICらしいですね。リスニングか長文のメールを読む問題(大問6とか)の中で、採用後の動きとかを説明する感じで出てきて、mandatoryの意味が分からないと解けないぞ!みたいな問題に使われそう…!
画像
もたもたしていたところでGPUの使用制限が来たせいなのか、画像が保存できませんでした。。。(いちばんみせたいところなのに)
結果としては画像を見てattendだとは全く想像できない感じの画像になってしまいました。言葉だけで説明するなら、GEMINIが出力してくれた文章が書いてありそうな声明文みたいな感じになっていました。当然文字は読めるものではありません。
改善点
今回のテスト走行で下記の課題が見つかりました。
環境について
GPUの使用制限とかあるので、課金するかColabをやめるかのどっちかしかないですね。なるべくお金はかけたくないですが、私のGPUで果たして画像生成ができるのかどうか…
生成した画像について
画像生成に必要な呪文に対する知識が全くなく、具体的な文章打ち込めば行けるっしょとか甘い期待を抱いていましたが、粉々に粉砕されました。呪文に使えそうな単語を何とか生成するなりなんなりしないと無理そうですね…。A man whoから始まる文章とかにしたら少なくとも人物は登場するのでいい感じの画像になったりするかな…?
終わりに
大枠で一応成功はしましたが、生成した画像が想像以上にあれだったので挫折しそうですが、いろいろと試行錯誤してみます。今後はCSVファイルから単語読み込んだりするのにGitを使いたいので、今あるソースもすべてGitにあげていこうかと思います。