Supershipの名畑です。今更ながらヒプノシスマイクのアニメやCDに触れているのですが、独歩くんに共感しながら頑張ります。
はじめに
OpenAIのChat API(Chat completions)を用いての会話をPythonで実装してみた記録ではOpenAIが提供しているChat APIを用いて会話を実装してみました。
今回はImages APIを使用した画像生成を同じくPythonで実装します。
アカウントの作成やAPI Keyのセットなどについては前の記事をご参照ください。
Images API
その名前の通り、画像を扱うAPIです。プロンプトか画像を入力すると新しい画像を生成します。
詳しくはAPI referenceやImage generationのGuideをご参照ください。
価格
価格はPricingに書かれていますが、解像度によって変わります。最も安い256x256で1imageにつき0.016ドルです。1ドル135円換算で2.43円です。
Resolution | Price |
---|---|
1024×1024 | $0.020 / image |
512×512 | $0.018 / image |
256×256 | $0.016 / image |
Create image
プロンプトを指定すると画像を生成して返してくれます。
- prompt
- n
- size
- response_format
- user
promptのみがrequiredで、その他はoptionalです。
nは画像枚数で1がデフォルトで最大値は10です。
sizeは256x256、512x512、1024x1024のいずれかが指定できます。デフォルトは1024x1024。
response_formatは生成された画像をurlで受け取るか、b64_jsonで受け取るか。URLs will expire after an hourとあるので、urlの有効期限は1時間です。
userはユーザーのモニタリングをするためのものですが、詳しくはEnd-user IDsをご覧ください。
createメソッドのサンプルコードは下記です。a white laptop、つまり、白いノートパソコンを描くようにプロンプトで指示を出しました。
import os
import openai
openai.api_key = os.getenv("OPENAI_API_KEY")
image = openai.Image.create(
prompt="a white laptop",
size="256x256"
)
print(image["data"][0]["url"])
APIレスポンスは下記の形式です。
{
"created": 1683178048,
"data": [
{
"url": "https://..."
}
]
}
以下の画像が生成されました。
Create image edit
すでにある画像を元にして編集するためのAPIです。
使えるパラメータは下記の通りです。
- image
- mask
- prompt
- n
- size
- response_format
- user
太字になっているimage(元画像)とpromptのみがrequiredです。
maskは元画像のうちのどこを編集するかを指定するパラメータです。元画像の編集してほしい箇所を透過させた画像を渡します。
今回は元画像として先ほど作成した画像(white_laptop.png)と、新たにその一部をくり抜いた以下の画像(white_laptop_mask.png)を使ってみます。
コードは下記です。
可愛い妖精(a cute fairy)を描いてもらいます。
import os
import openai
openai.api_key = os.getenv("OPENAI_API_KEY")
image = openai.Image.create_edit(
image=open("white_laptop.png", "rb"),
mask=open("white_laptop_mask.png", "rb"),
prompt="a cute fairy",
size="256x256"
)
print(image["data"][0]["url"])
生成された絵は以下です。
くり抜いた箇所に妖精が加えられました。
Create image variation
元画像を与えるとその変化版(variation)を作成してくれるというAPIです。
- image
- n
- size
- response_format
- user
image(元画像)のみがrequiredです。
先ほどの画像(cute_fairy.png)を元に2枚生成してもらいましょう。
import os
import openai
openai.api_key = os.getenv("OPENAI_API_KEY")
images = openai.Image.create_variation(
image=open("cute_fairy.png", "rb"),
n=2,
size="256x256"
)
print(images["data"][0]["url"])
print(images["data"][1]["url"])
できた画像は以下の2枚です。
翻訳
最後に「入力した指示に応じて画像を生成する」というコードを書いてみようと思います。
「日本語より英語の方が結果の質が高い」という話を聞いたことがあるため、今回は日本語の入力を英語に翻訳して画像を生成するということをやってみようと思います。
コードは前の記事同様でExamplesのページのEnglish to other languagesというサンプルを元にしました。
import os
import openai
openai.api_key = os.getenv("OPENAI_API_KEY")
your_message = input("描いてほしい絵について説明してください: ")
completion = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[
{"role": "system", "content": "You are a helpful assistant that translates Japanese to English."},
{"role": "user", "content": "Translate the following Japanese text to English:" + your_message}
]
)
eng_message = completion["choices"][0]["message"]["content"]
print("英訳されたメッセージ: " + eng_message)
試してみたのが下記です。「白いノートパソコンの上に可愛い妖精がいる」が私の入力した文章です。
描いてほしい絵について説明してください: 白いノートパソコンの上に可愛い妖精がいる
英訳されたメッセージ: "A cute fairy is on top of a white laptop."
入力した指示に応じて絵を描くコード
import os
import openai
openai.api_key = os.getenv("OPENAI_API_KEY")
# 入力
your_message = input("描いてほしい絵について説明してください: ")
# 翻訳
completion = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[
{"role": "system", "content": "You are a helpful assistant that translates Japanese to English."},
{"role": "user", "content": "Translate the following Japanese text to English:" + your_message}
]
)
eng_message = completion["choices"][0]["message"]["content"]
print("英訳されたメッセージ: " + eng_message)
# 画像生成
image = openai.Image.create(
prompt=eng_message,
size="256x256"
)
print(image["data"][0]["url"])
「白いノートパソコンの上に可愛い妖精がいる」という指示で描かれた絵は以下です。
最後に
触っているだけでどんどん時間が溶けていく面白さです。
次回記事ではStable Diffusionを触ってみようと思います。
宣伝
SupershipのQiita Organizationを合わせてご覧いただけますと嬉しいです。他のメンバーの記事も多数あります。
Supershipではプロダクト開発やサービス開発に関わる方を絶賛募集しております。
興味がある方はSupership株式会社 採用サイトよりご確認ください。