LoginSignup
4
0

OpenAIのImages APIを用いた画像生成をPythonで実装してみた記録

Posted at

Supershipの名畑です。今更ながらヒプノシスマイクのアニメやCDに触れているのですが、独歩くんに共感しながら頑張ります。

はじめに

OpenAIのChat API(Chat completions)を用いての会話をPythonで実装してみた記録ではOpenAIが提供しているChat APIを用いて会話を実装してみました。

今回はImages APIを使用した画像生成を同じくPythonで実装します。

アカウントの作成やAPI Keyのセットなどについては前の記事をご参照ください。

Images API

その名前の通り、画像を扱うAPIです。プロンプトか画像を入力すると新しい画像を生成します。
詳しくはAPI referenceImage 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です。

size256x256512x5121024x1024のいずれかが指定できます。デフォルトは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://..."
    }
  ]
}

以下の画像が生成されました。

white_laptop.png

Create image edit

すでにある画像を元にして編集するためのAPIです。

使えるパラメータは下記の通りです。

  • image
  • mask
  • prompt
  • n
  • size
  • response_format
  • user

太字になっているimage(元画像)とpromptのみがrequiredです。

mask元画像のうちのどこを編集するかを指定するパラメータです。元画像の編集してほしい箇所を透過させた画像を渡します。

今回は元画像として先ほど作成した画像(white_laptop.png)と、新たにその一部をくり抜いた以下の画像(white_laptop_mask.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"])

生成された絵は以下です。

cute_fairy.png

くり抜いた箇所に妖精が加えられました。

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枚です。

variation_1.png

variation_2.png

翻訳

最後に「入力した指示に応じて画像を生成する」というコードを書いてみようと思います。

日本語より英語の方が結果の質が高い」という話を聞いたことがあるため、今回は日本語の入力を英語に翻訳して画像を生成するということをやってみようと思います。

コードは前の記事同様で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"])

白いノートパソコンの上に可愛い妖精がいる」という指示で描かれた絵は以下です。

fairy_laptop.png

最後に

触っているだけでどんどん時間が溶けていく面白さです。

次回記事ではStable Diffusionを触ってみようと思います。

宣伝

SupershipのQiita Organizationを合わせてご覧いただけますと嬉しいです。他のメンバーの記事も多数あります。

Supershipではプロダクト開発やサービス開発に関わる方を絶賛募集しております。
興味がある方はSupership株式会社 採用サイトよりご確認ください。

4
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
0