見出し画像

Google ColabからDALL·E 3 APIで画像生成し、Googleドライブに保存する

DALL·E 3は、2023年9月に発表されたOpenAI社による画像生成モデルです。この記事では、Google ColabでDALL·E 3のAPIを利用し、生成した画像をGoogleドライブに保存する方法を紹介します。Google環境でDALL·E 3を繰り返し利用したい方にお勧めです。

DALL·E 3をひとまず試してみたい方や、APIの基本的な使い方を知りたい方は以下の記事をご参照ください。


▍DALL·E 3の魅力と利用方法

すでにDALL·E 3をご存知の方は読み飛ばしてください。

■ 魅力

DALL·E 3の主な魅力は以下の2点だと考えています。

  • プロンプト(生成指示)に凝らなくても高品質な結果が得られる

  • プロンプトに日本語を使える

これらの特徴の背景には、プロンプトの自動改訂があります。利用者が指定したプロンプトをそのまま使うのではなく、OpenAI側で改訂したプロンプトを使って画像生成を行います。

そのため、プロンプトを細かく調整する手間をかけずに、求める画像に近い結果を簡単に得られます。裏を返せば細かな調整がしづらいですが、それっぽい画像を手軽に生成したい場合に特に重宝します。

■ 利用方法

DALL·E 3の主な利用方法は以下の3点です。

  • ChatGPTの有料プラン(Plus、Teamなど)
    ChatGPT経由で利用します。生成した画像の編集を含め、DALL·E 3以外に各プランで提供される機能を利用できます。

  • Bing Image Creator
    無料で利用できます。画像サイズなどの細かな指定ができません。

  • OpenAIのAPI
    プログラム経由で利用します。使用量に応じた課金で、1枚あたり$0.040からです(2024年8月時点)。詳細は公式サイトをご確認ください。

うちでは以前ChatGPT Teamを利用していましたが、別のサービス(Claude)に乗り換えました。また、横長の画像を生成する機会が多いのですが、Bing Image Creatorでのサイズ指定方法が分かりませんでした。これらの理由から、OpenAIのAPIを利用することにしました。

▍事前準備

 必要なものは以下の2点です。

  • Googleアカウント(Google Colabおよびドライブを利用するため)

  • OpenAIのAPIキー

OpenAIのAPIキーは、OpenAI developer platformで作成できます。アカウント作成などは以下の記事をご参照ください。

▍コード

次の5ブロックに分けて説明します。

  • ライブラリの準備

  • 画像出力先の指定

  • APIキーの指定とOpenAIクライアントの準備

  • 画像を生成・保存する関数の作成

  • 画像生成と保存(関数の実行)

■ ライブラリの準備

必要なライブラリをインストール・インポートします。

# OpenAI APIクライアントのインストール
!pip install openai
# 必要なライブラリのインポート

# Googleドライブとフォルダの利用
from google.colab import drive
import os
from pathlib import Path
# パスワード(APIキー)入力
import getpass
# OpenAI APIの利用
from openai import OpenAI
import requests
# 日時の取得(ファイル名出力用)
from datetime import datetime
from zoneinfo import ZoneInfo
# 画像の出力
import base64
import io
from PIL import Image
# 画像メタデータの出力
from PIL.PngImagePlugin import PngInfo

■ 画像出力先の指定

Googleドライブを使えるようにして、画像の出力先を指定します。

# Googleドライブをマウント
drive.mount("/content/drive")
# 出力先のフォルダを作成・移動
output_path = Path("/content/drive/MyDrive/Colab Notebooks/Dalle3/output")
output_path.mkdir(parents=True, exist_ok=True)
os.chdir(str(output_path))

出力先は、マイドライブ内の「Colab Notebooks/Dalle3/output」を指定しています。指定したフォルダがない場合、自動で作成されます。

■ APIキーの指定とOpenAIクライアントの準備

OpenAIのAPIを利用する準備をします。

# APIキーが環境変数に設定されていない場合、ユーザーに入力を求める
if "OPENAI_API_KEY" not in os.environ:
    os.environ["OPENAI_API_KEY"] = getpass.getpass("OpenAI API Key: ")

# APIキーの最後の4文字を表示
print(f'OpenAI API Key: ...{os.environ["OPENAI_API_KEY"][-4:]}')

# OpenAIクライアントオブジェクトを作成
client = OpenAI()

セキュリティを考慮し、APIキーを直接コードに書かないようにしています。初回はAPIキーの入力エリアが表示されるので、そこにOpenAIのAPIキーを入力します。

APIキーをコードに直接書きたい場合は以下に置き換えてください。

# OpenAIのAPIキーを指定
os.environ["OPENAI_API_KEY"] = "{OpenAI API Key}"

# OpenAIクライアントオブジェクトを作成
client = OpenAI()

■ 画像を生成・保存する関数の作成

DALL·E 3で画像を生成し、表示とGoogleドライブへの保存を行う関数を作成します。

def generate_image(client, prompt, quality="standard", size="1024x1024", style="vivid"):
    """
    Dalle3で画像を生成し、結果を保存します。

    Args:
        client: OpenAIのクライアントオブジェクト
        prompt (str): プロンプト
        quality (str, optional): 品質 ["standard", "hd"]
        size (str, optional): サイズ(WxH) ["1024x1024", "1024x1792", "1792x1024"]
        style (str, optional): スタイル ["vivid", "natural"]
    """
    try:
        response = client.images.generate(
            model="dall-e-3", 
            prompt=prompt,
            n=1, # Dalle3では1枚のみ
            quality=quality,
            response_format="b64_json", 
            size=size,
            style=style,
        )
    except Exception as e:
        print(f"画像生成中にエラーが発生しました: {e}")
        return

    # 作成日時を日本時間に変換
    datetime_string = datetime.fromtimestamp(response.created, tz=ZoneInfo("Asia/Tokyo")).strftime("%Y%m%d_%H%M%S")

    # 生成画像分繰り返し(Dalle3だと1枚のみ)
    for i, data in enumerate(response.data):
        # Base64の画像データを実際の画像に変換
        image_data = base64.b64decode(data.b64_json)
        image = Image.open(io.BytesIO(image_data))

        # 画像と改訂後プロンプトを表示
        display(image)
        revised_prompt = data.revised_prompt
        print(revised_prompt)

        # 改訂後プロンプトをメタデータとして追加
        image_metadata = PngInfo()
        image_metadata.add_text("parameters", revised_prompt)

        # 画像とメタデータを保存
        image.save(f"{datetime_string}_{i}.png", pnginfo=image_metadata)

client.images.generate が画像生成のAPIです。

  • プロンプト(prompt)は必ず指定します。

  • 品質(quality)、サイズ(size)、スタイル(style)は変更できます。DALL·E 3の選択肢はdocstring(関数冒頭の説明文)に記述しています。

  • modelnresponse_formatは、DALL·E 3の使用とファイル保存に適した形式を指定しています。

  • 詳細は公式ドキュメントをご参照ください。

生成結果の扱いは次のとおりです。

  • 生成された画像と改訂後のプロンプトを画面に表示します。

  • 作成日時を含むファイル名でGoogleドライブ上の出力先フォルダに保存します。このとき、改訂後プロンプトも画像のメタデータに加えます。

■ 画像生成と保存(関数の実行)

プロンプトを指定し、関数を実行します。プロンプトは改訂されるので、日本語で指定しても問題ありません。

# プロンプトを指定
prompt = "アニメ風のイラスト。黒いローブを着た魔女の女の子。黒猫。夜。"

# 関数を実行
generate_image(client, prompt)

画像の品質、サイズ、スタイルを変更するには、引数を指定します。

generate_image(client, prompt, quality="hd", size="1792x1024", style="natural")

生成結果はGoogle Colabの画面に表示され、Googleドライブに保存されます。以下は出力結果の例です。

生成された画像(サイズは1792x1024)

Illustration in anime style depicting a young girl with a mysterious atmosphere, who is a self-learning witch. She is wearing a mystical black robe and has an enchanting black cat companion. The scene is set at night with a splendid silver moon illuminating the landscape, accentuating the highlights and shadows. This peaceful nocturnal scene is imbued with an aura of otherworldly serenity inherent to magical settings and mystical narratives.

改訂後プロンプト

▍おまけ:画像のメタデータ

改訂後のプロンプトは画面に表示するとともに、出力する画像(png)のメタデータにも加えています。

残念ながら、Googleドライブ上ではこのメタデータは表示されません。PythonならPILライブラリ、WebサービスならMetadata2Goなどで表示できます。また、Stable Diffusion WebUIなど、PNG Infoを表示するツールでも確認できます。「PNG Info」で探すのが一番手っ取り早いかもしれません。

▍おわりに

この記事では、Google ColabでDALL·E 3のAPIを利用し、生成画像をGoogleドライブに保存する方法を紹介しました。

生成した画像と改訂後プロンプトを保存するので、DALL·E 3を繰り返し利用する際にお役立ていただけると思います。

最後までご精読いただき、ありがとうございました!


私たちのデジタル技術活用の記事は以下のマガジンにあります。ぜひご覧ください!


この記事が気に入ったらサポートをしてみませんか?