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(関数冒頭の説明文)に記述しています。
model、n、response_formatは、DALL·E 3の使用とファイル保存に適した形式を指定しています。
詳細は公式ドキュメントをご参照ください。
生成結果の扱いは次のとおりです。
生成された画像と改訂後のプロンプトを画面に表示します。
作成日時を含むファイル名でGoogleドライブ上の出力先フォルダに保存します。このとき、改訂後プロンプトも画像のメタデータに加えます。
■ 画像生成と保存(関数の実行)
プロンプトを指定し、関数を実行します。プロンプトは改訂されるので、日本語で指定しても問題ありません。
# プロンプトを指定
prompt = "アニメ風のイラスト。黒いローブを着た魔女の女の子。黒猫。夜。"
# 関数を実行
generate_image(client, prompt)
画像の品質、サイズ、スタイルを変更するには、引数を指定します。
generate_image(client, prompt, quality="hd", size="1792x1024", style="natural")
生成結果はGoogle Colabの画面に表示され、Googleドライブに保存されます。以下は出力結果の例です。
▍おまけ:画像のメタデータ
改訂後のプロンプトは画面に表示するとともに、出力する画像(png)のメタデータにも加えています。
残念ながら、Googleドライブ上ではこのメタデータは表示されません。PythonならPILライブラリ、WebサービスならMetadata2Goなどで表示できます。また、Stable Diffusion WebUIなど、PNG Infoを表示するツールでも確認できます。「PNG Info」で探すのが一番手っ取り早いかもしれません。
▍おわりに
この記事では、Google ColabでDALL·E 3のAPIを利用し、生成画像をGoogleドライブに保存する方法を紹介しました。
生成した画像と改訂後プロンプトを保存するので、DALL·E 3を繰り返し利用する際にお役立ていただけると思います。
最後までご精読いただき、ありがとうございました!
私たちのデジタル技術活用の記事は以下のマガジンにあります。ぜひご覧ください!