Pythonで作るAI画像生成の自動化ツール解説|Stable DiffusionとGemini APIを活用する方法

前回の記事では、AIストック画像の自動化についての構想をご紹介しましたが、今回は実際に手を動かしてみた記録です。

AI × 自動化で構築するストックビジネス|画像素材販売の仕組み化に挑戦中

最近は言語学習の時間が取れなかったため、ひとまずPythonで動く自動化ツールを組んでみました。

Stable DiffusionとGoogle Gemini APIを連携させ、画像生成を効率化する仕組みです。

本記事では、コードの流れを分かりやすく解説します。

これからAI画像生成を自動化したい方に参考になる内容です。

基本設定とライブラリのインポート

まずは必要なライブラリをインポートし、環境を整えます。

ここでは、リクエスト処理用のrequests、進捗バー表示用のtqdm、画像処理のためのPILなどを読み込んでいます。

さらにStable DiffusionのAPIエンドポイントや画像の保存先ディレクトリを定義し、Gemini APIのキーやモデル名を設定しています。

import argparse
import base64
import datetime
import io
import os
import signal
import subprocess
import time

import requests
import tqdm
from PIL import Image, PngImagePlugin
from google import genai
from google.genai.errors import ServerError
from pydantic import BaseModel

SD_ENDPOINT = "http://127.0.0.1:7860"
IMAGE_OUTPUT_PATH = "画像の出力先を設定"
GEMINI_API_KEY = 'GeminiのAPIキーを設定'
MODEL_2_5_FLASH = 'gemini-2.5-flash'

ここで環境変数を整理しておくことで、後の処理をスムーズに行うことができます。

プロンプトのリクエスト処理

次に、Gemini APIにリクエストを送り、プロンプトを取得する関数を定義しています。

レスポンスのスキーマとしてPromptクラスを用意し、生成されたテキストを構造化データとして扱えるようにしています。

class Prompt(BaseModel):
    prompt_description: str
    prompt: str

def request_prompt() -> list[Prompt]:
    client = genai.Client(api_key=GEMINI_API_KEY)
    prompt = "任意のプロンプトを設定"
    config = {
        "response_mime_type": "application/json",
        "response_schema": list[Prompt],
    }
    response = client.models.generate_content(
        model=MODEL_2_5_FLASH,
        contents=prompt,
        config=config,
    )
    return response.parsed

この部分は、単なる文字列を返すのではなく、整理された形式で複数のプロンプトを受け取れる点がポイントです。

画像生成と保存処理

Stable DiffusionのAPIに対して画像生成をリクエストし、返却されたBase64データを画像ファイルとして保存する処理です。

生成時のパラメータ(幅・高さ、ステップ数、バッチ数など)を指定し、出力先フォルダに時刻ベースのファイル名で保存します。

def create_image(prompt: Prompt):
    body = {
        "prompt": prompt.prompt,
        "negative_prompt": "任意のネガティブプロンプトを設定",
        "batch_size": 4,
        "n_iter": 5,
        "steps": 20,
        "width": 960,
        "height": 540,
        "eta": 31337,
    }

    os.makedirs(IMAGE_OUTPUT_PATH, exist_ok=True)
    response = requests.post(url=f'{SD_ENDPOINT}/sdapi/v1/txt2img', json=body)
    json = response.json()

    for i in json['images']:
        image = Image.open(io.BytesIO(base64.b64decode(i.split(",", 1)[0])))

        png_payload = {"image": "data:image/png;base64," + i}
        response2 = requests.post(url=f'{SD_ENDPOINT}/sdapi/v1/png-info', json=png_payload)

        pnginfo = PngImagePlugin.PngInfo()
        pnginfo.add_text("parameters", response2.json().get("info"))

        now = datetime.datetime.now().strftime("%Y%m%d%H%M%S%f")
        file_name = os.path.join(IMAGE_OUTPUT_PATH, now) + '.png'
        image.save(file_name, pnginfo=pnginfo)
        image.close()

保存時にプロンプトや生成パラメータをメタデータとして付加しておくと、後で検証・再利用する際に非常に便利です。

実行部分と処理時間の計測

最後にメイン処理として、プロンプトを複数回リクエストし、その都度画像を生成します。進捗状況をtqdmで可視化し、処理終了後には経過時間を「時・分・秒」で表示する仕組みです。

if __name__ == '__main__':
    start = time.time()
    for i in tqdm.tqdm(range(10)):
        prompts = request_prompt()
        for prompt in tqdm.tqdm(prompts, desc='画像生成', leave=False):
            create_image(prompt)
    end = time.time()

    elapsed = int(end - start)
    hours = elapsed // 3600
    minutes = (elapsed % 3600) // 60
    seconds = elapsed % 60

    print('done.')
    print(f"処理時間: {hours:02d}:{minutes:02d}:{seconds:02d}")

このように処理時間を計測することで、環境やパラメータの違いによる性能差を把握できます。

最後に

今回は、Stable DiffusionとGoogle Gemini APIを活用し、PythonでAI画像生成を自動化するコードを紹介しました。

ライブラリの組み合わせやAPIの扱い方を理解すれば、ストック画像の量産やワークフローの効率化が実現可能です。

今後はプロンプト設計の精度を高めつつ、言語学習と並行して開発を進めていく予定です。

AIを活用した画像制作や自動化に関心がある方は、前回の記事もぜひご覧ください。

AI × 自動化で構築するストックビジネス|画像素材販売の仕組み化に挑戦中

以上です。