Supershipの名畑です。響け!ユーフォニアム3を見ながら、本当に、アニメーション作品としての質が高いなと感じるわけです。アニメーションとは命を吹き込むことだなと。
はじめに
Stability AIが今年の2月、画像生成モデルであるStable Diffusion 3.0を発表し、話題となりました。
Stable Diffusion 3は旧モデルと比較して、画質および様々なプロンプトへの対応が大幅に向上した最新のText 2 Imageモデルだ。
特にこれまでのモデルでは難しかった「画像内での正確なアルファベット表記」が可能になっている。
このStable Diffusion 3.0が先日、APIで利用可能になりました。
Stability AIは4月17日、2月22日にプレビュー版を発表した最新の画像生成AIモデル「Stable Diffusion 3」、その高速版である「Stable Diffusion 3 Turbo」、そしてこれらを搭載したAIチャットボット「Stable Assistant」を発表した。
ということで今回の記事ではこのStable Diffusion 3.0を使ってみます。
スペリング能力が向上したとのことなので、文字を埋め込んだ画像を生成してみました。
注意
- 生成画像の解像度は1024x1024なのですが、記事容量を抑えるため、本記事では512x512に変換した上でアップロードしています
- 本APIは有料です。現時点では1画像生成につきSD3(Stable Diffusion 3.0)は6クレジット、SD3 Turboでは4.5クレジットとなります。1,000クレジットにつき10ドルのため、仮に1ドル150円とすると、1画像につき9円と6.75円です。
API Key
Developer PlatformでAPI Keyを発行する必要があります。
ハードコーディングを避けるため、環境変数にでも保存しておきましょう。今回はSTABILITY_API_KEYという名称で保存されていると仮定して進めます。
export STABILITY_API_KEY =ここに取得したAPI keyを書く
コード
画像生成に用いたPythonのコードは以下です。
import os
import requests
import time
api_host = "https://api.stability.ai/v2beta/stable-image/generate/sd3"
prompt = "ここにプロンプトを書く"
api_key = os.getenv("STABILITY_API_KEY") # 環境変数にAPIキーを保存済み
# API Keyの取得確認
if api_key is None:
raise Exception("Missing Stability API key.")
# APIの呼び出し
response = requests.post(
api_host,
headers={
"Authorization": f"Bearer {api_key}",
"accept": "image/*"
},
files={
"none": ""
},
data={
"prompt": prompt,
"output_format": "png"
},
)
# 画像保存
# ファイル名にはタイムスタンプとプロンプトを含めている
if response.status_code == 200:
with open(f"./{int(time.time())}_{prompt}.png", "wb") as file:
file.write(response.content)
else:
raise Exception(str(response.json()))
本コードは最低限のものとなっています。
アスペクト比の変更やシード値の指定などについてはAPI Referenceをご覧ください。
An old man wearing a T-shirt that says 'Otaku'
まずはシンプルな言葉で試してみます。
prompt = "An old man wearing a T-shirt that says 'Otaku'"
日本語にすると「'Otaku'と書かれたTシャツを着た老夫」ですね。
結果は以下です。
大文字と小文字の違いはありますが、それ以外は意図通りです。
文字が少しTシャツから浮いてしまっている感はありますが。
素晴らしい結果です。
A young Japanese woman holding a piece of paper that says 'Touken Ranbu'
次は固有名詞にしてみます。
prompt = "A young Japanese woman holding a piece of paper that says 'Touken Ranbu'"
日本語にすると「'Touken Ranbu'と書かれた紙を持っている若い日本人女性」になります。Touken Ranbuはもちろん刀剣乱舞のことです。アニメ『刀剣乱舞 廻』は絶賛放送中です。
結果は以下です。
これも意図通りです。
狙った結果で嬉しいです。
指が生成AIでよくありがちな感じになってしまっていますが、今回はスルーします。
A sign that says 'In the name of the moon, I shall punish you!'
次は文章で挑戦してみようと思います。
日本人ならほぼ誰もが知っているであろう名言の英訳です。
prompt = "A sign that says 'In the name of the moon, I shall punish you!'"
日本語に訳すと「'In the name of the moon, I shall punish you!'と書かれた看板」ですね。
「In the name of the moon, I shall punish you!」は「月に代わっておしおきよ!」の英訳です。美少女戦士セーラームーンです。
参考:月に代わっておしおきよ!って英語でなんて言うの? - DMM英会話なんてuKnow?
結果は以下です。
一部ミスがあるのが惜しいです。
しかし、かなりプロンプトに近い感じにはなっています。
A screen projected with 'Bling-Bang-Bang-Born'
もう少し短い英語で試してみます。
prompt = "A screen projected with 'Bling-Bang-Bang-Born'"
日本語に訳すと「'Bling-Bang-Bang-Born'と投影されたスクリーン」となります。Bling-Bang-Bang-Bornは流行りまくったのでもう説明は不要でしょう。
結果は以下です。
こちらも最初のBlingが違ってしまっていますし、ハイフンが一つ足りませんが、かなり正解に近いです。
プロンプトに対して高精度ですね。
An old man wearing a T-shirt that says 'オタク'
ダメ元で日本語も試してみました。
prompt = "An old man wearing a T-shirt that says 'オタク'"
最初に試したプロンプトで、Otakuをオタクと日本語にしてみました。
結果は以下です。
そうですよね。うまくいきませんよね。
おまけ ChatGPTだとどうなるのだろう?
ちなみに、同じ内容をChatGPT(GPT-4 / DALL·E 3)で描いてみるとどうなるのでしょうか。せっかくなので試してみました。
どれも以下のように「下記の文章が示す絵を描いてください。」という指示に続けてStable Diffusion 3の時と同様の英文を書きました。
An old man wearing a T-shirt that says 'Otaku'
A young Japanese woman holding a piece of paper that says 'Touken Ranbu'
A sign that says 'In the name of the moon, I shall punish you!'
A screen projected with 'Bling-Bang-Bang-Born'
An old man wearing a T-shirt that says 'オタク'
試行回数が少ないので参考程度ですが、アルファベットについてはプロンプトに近いです。すごいですね。
ただ、文字の反映に関してはStable Diffusion 3の方がやや正確性が高そうです。
最後に
文字入れだけなら現時点で他にもっと正確な手段がいくつもあるかもしれませんが、Web APIでしかもプロンプトのみで完結するのはかなり魅力的です。
今後、正確性も網羅性も高くなっていくと思うので、楽しみです。
宣伝
SupershipのQiita Organizationを合わせてご覧いただけますと嬉しいです。他のメンバーの記事も多数あります。
Supershipではプロダクト開発やサービス開発に関わる方を絶賛募集しております。
興味がある方はSupership株式会社 採用サイトよりご確認ください。