OpenAIのGPT Image 1のWeb API呼び出しをPythonで実装して画像生成した記録

[Supership](https://supership.jp/)の名畑です。[ウィッチウォッチ](https://witchwatch-anime.com/)はジャンプで毎週読んでいてお気に入りの作品ですが、[OP](https://www.youtube.com/watch?v=a_NB6QkfzAM)や[ED](https://www.youtube.com/watch?v=n9sb98NNmTI)も含めてアニメの出来がかなり良く、新鮮な気持ちで楽しんでいます。[OPの魔法失敗ver.](https://www.youtube.com/watch?v=mWwHJYOdvd0)を見て、アニメってすごいと再実感。

## はじめに

> 　OpenAIは2025年3月25日（米国時間、以下同）、「GPT-4o」に組み込まれた新たな画像生成機能を発表した。同日より、ChatGPTのデフォルト（既定）の画像生成機能として「Free」「Plus」「Pro」「Team」プランのユーザーに提供を開始している。
>
>　ChatGPTでGPT-4oを選択し、チャット上で画像の作成やカスタマイズを指示できる。画像のアスペクト比、16進コードを使用した色の指定、背景の透過など、画像の仕様とともに画像で表現したい内容をチャットで指示すると、最大1分程度で詳細な画像が生成される。
>
> 参考：[「GPT-4o」の新たな画像生成機能は、OpenAIが開発してきた画像生成AI「DALL-E」と何が違うのか：日本語にも対応、SNSで話題に - ＠IT](https://atmarkit.itmedia.co.jp/ait/articles/2504/19/news041.html)

先月[OpenAI](https://openai.com/)よりリリースされました新たな画像生成機能がかなりの話題を巻き起こしました。

本機能が先日よりAPI経由でも呼べるようになりました。

> GPT Image 1 is our new state-of-the-art image generation model. It is a natively multimodal language model that accepts both text and image inputs, and produces image outputs.
> 
> 参考：[OpenAI Platform](https://platform.openai.com/docs/models/gpt-image-1)

本APIの呼び出しを**Python**で実装してみたというのが今回の記事の内容になります。すでに多くの方が試した後だとは思います。

## 公式ドキュメント

- [Image generationのGuide](https://platform.openai.com/docs/guides/image-generation?image-generation-model=gpt-image-1)
- [API reference - Images](https://platform.openai.com/docs/api-reference/images)
- [Pricing](https://platform.openai.com/docs/pricing)

## 環境

私の環境はmacOSです。
Pythonはすでにインストール済みです。

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

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

## 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はハードコーディングを避けるため環境変数に設定します。

私の環境での設定ファイルはzshrcです。

```shell-session
$ open ~/.zshrc
```

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

```shell-session
export OPENAI_API_KEY=ここに取得したAPI keyを書く
```

## 認証

**GPT Image 1**にアクセスするためには、[Organization settings](https://platform.openai.com/settings/organization/general)のページで認証が必要です。

**Verify Organization**を押すとID Checkのポップアップが表示されます。

![openai_image_api_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/869934/08ac240f-298d-4d45-aa5d-de9a3e35ef71.png)

最初に居住地として「日本」を選ぶと、以下から一つ選ぶようにと表示されました。

- 運転免許証
- パスポート
- 在留カード
- マイナンバーカード
- ビザ

完了後、15分ほど経つとAPIの呼び出しができるようになります。

## 画像生成

実際に画像を生成してみます。

### コード

[API reference - Create image](https://platform.openai.com/docs/api-reference/images/create)によるとサイズや画質や透過背景など多くのパラメータが指定可能ですが、まずはシンプルにモデルとプロンプトの指定だけで画像を生成してみます。

```python
from openai import OpenAI
import os
import base64

client = OpenAI()
client.api_key = os.getenv("OPENAI_API_KEY")  # API keyのセット
response = client.images.generate(
    model="gpt-image-1",  # モデル
    prompt="28-year-old Japanese pretty woman with black bobbed hair"  # プロンプト
)

# 画像保存
with open("gpt-image-1-sample-1.png", "wb") as f:
    f.write(base64.b64decode(response.data[0].b64_json))
```

プロンプトは「**28-year-old Japanese pretty woman with black bobbed hair**」です。
日本語訳すると「**黒髪ボブヘアの28歳の可愛い日本人女性**」になります。
比較のために、過去記事[OpenAIのDALL·E 3のWeb API呼び出しをPythonで実装して画像生成した記録](https://qiita.com/nabata/items/3db85197404d2ee55f36)で用いたのと同様のプロンプトとしました。もう1年半前の記事になるんですね。


### 画像

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

![gpt-image-1-sample-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/869934/1ac4f3ee-9169-43e4-806a-1ac2323af74a.png)

かなりリアルな画像に思えます。
プロンプトの再現度が高いと感じます。

## 元画像ありでの画像生成

[API reference - Create image edit](https://platform.openai.com/docs/api-reference/images/createEdit)を参考に、元画像ありでの画像生成を試してみます。

**image**として先ほど生成した画像を指定し、プロンプトは「**Please make the woman in the attached picture wear glasses**」としました。
日本語訳すると「**添付画像の女性に眼鏡をかけさせてください**」ですね。

```python
from openai import OpenAI
import os
import base64

client = OpenAI()
client.api_key = os.getenv("OPENAI_API_KEY")  # API keyのセット

response = client.images.edit(
    model="gpt-image-1",  # モデル
    image=open("gpt-image-1-sample-1.png", "rb"),  # 画像
    prompt="Please make the woman in the attached picture wear glasses"  # プロンプト
)

# 画像保存
with open("gpt-image-1-sample-2.png", "wb") as f:
    f.write(base64.b64decode(response.data[0].b64_json))
```

### 画像

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

![gpt-image-1-sample-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/869934/a8b69a27-a85e-4c54-aef0-9e30b39a30ae.png)

服の質感や肌や歯など、完全に同じというわけではないですが、元画像の再現度がかなり高く生成されました。

## 最後に

非常に汎用性高く使えそうです。

流石の素晴らしい進化だと感じました。

## 宣伝

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

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