OpenAIのDALL·E 3のWeb API呼び出しをPythonで実装して画像生成した記録

[Supership](https://supership.jp/)の名畑です。[Dr.STONEの新作短編](https://www.oricon.co.jp/news/2300621/full/)が熱すぎる。

## はじめに

先日「[New models and developer products announced at DevDay](https://openai.com/blog/new-models-and-developer-products-announced-at-devday)」というアナウンスがありました通り、[OpenAI](https://openai.com/)で様々なアップデートが行われました。

そのうちの一つとして、これまで[ChatGPT](https://chat.openai.com/)か[Bing](https://www.microsoft.com/ja-jp/bing)経由での利用のみだった画像生成の[DALL·E 3](https://openai.com/dall-e-3)が**Web API**でも呼べるようになりましたので、それを**Python**で実装してみたというのがこちらの記事の内容になります。

## 公式のドキュメント

- [API reference](https://platform.openai.com/docs/api-reference/images)
- [Image generationのGuide](https://platform.openai.com/docs/guides/images/image-generation-beta)

## 価格

- [Pricing](https://openai.com/pricing)

現時点では**DALL·E 3**をQualityが**Standard**、解像度が**1024×1024**の場合は1枚につき**0.040ドル**です。
仮に1ドル150円とすると**6円**ですね。

## 環境

私の環境はmacOS(Ventura)です。

Pythonはすでにインストール済みとします。

```shell-session
$ python --version
Python 3.10.12
```

OpenAIのライブラリ(Pythonバインディング)をインストールしておきます。

```shell-session
$ pip install openai
```

現時点でのバージョンは1.2.3でした。

```shell-session
$ openai --version
openai 1.2.3
```

## OpenAIのアカウント作成

[OpenAI platform](https://platform.openai.com/)でアカウント作成をします。
メールアドレス(電話での認証あり)、Google、Microsoft Accountのいずれかが使えます。

## API key発行

サインイン後の[API keys](https://platform.openai.com/account/api-keys)のページで行えます。**Create new secret key**を押して、名前(optional)をつけるだけです。
API keyは作成時しか画面に表示されませんので気をつけてください。画面上から後で知る方法はありません。

取得したAPI keyはハードコーディングを避けるため環境変数に設定します。方法は検索ください。

今回は公式に倣い**OPENAI\_API\_KEY**という環境変数名としました。

```bash
export OPENAI_API_KEY=ここに取得したAPI keyを書く
```

## コード

```Python
from openai import OpenAI
import os
import time
import base64

client = OpenAI()
client.api_key = os.getenv("OPENAI_API_KEY")  # API keyのセット
response = client.images.generate(
  model="dall-e-3",  # モデル
  prompt="28-year-old Japanese pretty woman with black bobbed hair",  # プロンプト
  n=1,  # 生成数
  size="1024x1024",  # 解像度 dall-e-3では1024x1024、1792x1024、1024x1792
  response_format="b64_json",  # レスポンスフォーマット url or b64_json
  quality="hd",  # 品質 standard or hd
  style="vivid"  # スタイル vivid or natural
)

# 画像保存
# ファイル名にはタイムスタンプと通番を含めています
for i, d in enumerate(response.data):
    with open(f"./dall-e-3_{int(time.time())}_{i}.png", "wb") as f:
        f.write(base64.b64decode(d.b64_json))
```

ここでは指定していませんがリクエストパラメータには[user](https://platform.openai.com/docs/guides/safety-best-practices/end-user-ids)もあります。

## レスポンス

レスポンスには生成されたプロンプトも含まれます。

> ImagesResponse(created=1699712124, data=[Image(b64_json='略', revised_prompt="A 28-year-old Japanese woman who is aesthetically pleasing to the eye, with her short, black, bobbed hair emphasizing her facial features. She carries an aura of elegance that is further highlighted by her hair's bob cut, adding a modern touch to her traditional beauty.", url=None)])

## 画像

生成された画像はこちら。

![dall-e-3_api.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/869934/cbe2dad8-3836-200e-b90a-86e70aea9c06.png)

## 最後に

**edit**や**variation**の**API**はまだ下記の通りなので**dall-e-3**には対応していないです。

> The model to use for image generation. Only dall-e-2 is supported at this time.

実際に**dall-e-3**を指定して呼び出してみると下記のエラーでした。model指定しないでくださいと。

> Invalid model dall-e-3. The model argument should be left blank.

ただ、近いうちにきっと対応されるでしょう。
そう思わせてくれる変化の速さは圧倒的すぎる。

## 宣伝

[SupershipのQiita Organization](https://qiita.com/organizations/supership-inc)を合わせてご覧いただけますと嬉しいです。他のメンバーの記事も多数あります。

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