Stable Diffusion WebUI APIの使い方|起動からPython自動化まで

※本記事にはプロモーション(広告・アフィリエイトリンク)を含みます。
Stable Diffusion WebUI に --api オプションをつけて起動すると、HTTP リクエストだけで画像生成を呼び出せるようになります。この記事では、API の有効化から /sdapi/v1/txt2img を Python で叩いて画像を受け取るまでの手順と、Apple Silicon でのメモリエラー回避、LCM-LoRA を使った高速生成の設定を実際に動かして確認した内容でまとめています。
--api オプションで WebUI を起動する
通常の起動コマンドに --api を追加するだけで API が有効になります。
# Windows / Linux
python launch.py --api
# Mac(Apple Silicon)—— 大きなサイズを生成するなら
python launch.py --api --opt-split-attention
起動後、ブラウザで http://127.0.0.1:7860/docs を開くと Swagger UI が表示されます。利用可能なエンドポイントと各パラメータの型をここで確認できます。
なぜ
--opt-split-attentionか
Apple Silicon で 1024×1536 などの大きなサイズを生成しようとすると、--opt-sdp-attentionではバッファ確保に失敗してエラーになることがありました。--opt-split-attentionに変えることで回避できました。どちらが適切かは環境によって異なります。
/sdapi/v1/txt2img を叩いて画像を受け取る
最小限のリクエストは以下のとおりです。
import requests, base64
url = "http://127.0.0.1:7860/sdapi/v1/txt2img"
payload = {
"prompt": "a cat sitting on a wooden floor, photorealistic",
"negative_prompt": "blurry, low quality",
"steps": 20,
"cfg_scale": 7,
"width": 512,
"height": 512,
"sampler_name": "DPM++ 2M Karras",
"seed": -1
}
res = requests.post(url, json=payload)
data = res.json()
with open("output.png", "wb") as f:
f.write(base64.b64decode(data["images"][0]))
レスポンスの images キーに Base64 エンコードされた PNG が配列で返ってきます。parameters キーには実際に使われた設定値が入っているので、デバッグ時に確認すると便利です。
主なリクエストパラメータ
| パラメータ | 型 | 説明 |
|---|---|---|
prompt |
string | 生成プロンプト |
negative_prompt |
string | ネガティブプロンプト |
steps |
int | サンプリングステップ数 |
cfg_scale |
float | プロンプト忠実度(通常 5〜12) |
width / height |
int | 出力サイズ(px) |
sampler_name |
string | サンプラー名 |
seed |
int | -1 でランダム |
batch_size |
int | 1リクエストで生成する枚数 |
利用できるサンプラー名の一覧は GET /sdapi/v1/samplers で取得できます。
Apple Silicon でのメモリエラーと高解像度生成の回避策
Apple Silicon の統合メモリ環境では、Hires fix を使って一括で大きなサイズを生成しようとするとメモリ不足でエラーが出ることがありました。3ステップに分割する方法で対処しています。
- txt2img で小サイズを生成 — 512×768 などで通常生成
- Real-ESRGAN で2倍に拡大 —
/sdapi/v1/extra-single-imageか外部の Real-ESRGAN を使う - img2img でディテールを強化 —
denoising_strengthを 0.3〜0.45 程度に抑えて構図を崩さずテクスチャを整える
# ステップ3: img2img でディテールを強化する例
img2img_payload = {
"init_images": [upscaled_b64], # Real-ESRGAN 後の画像(Base64)
"prompt": prompt,
"negative_prompt": negative_prompt,
"denoising_strength": 0.35,
"steps": 20,
"cfg_scale": 7,
"width": 1024,
"height": 1536,
"sampler_name": "DPM++ 2M Karras"
}
res = requests.post("http://127.0.0.1:7860/sdapi/v1/img2img", json=img2img_payload)
denoising_strength は 0.5 を超えると構図が大きく変わることがあるので、小さめから試すとよいと考えられます。
LCM-LoRA で高速生成する設定
LCM-LoRA を読み込むと、ステップ数を大幅に減らして生成できます。実際に使っている設定は次のとおりです。
| 項目 | 設定値 |
|---|---|
| サンプラー | LCM |
| Steps | 6 |
| CFG Scale | 1.5 |
lcm_payload = {
"prompt": "a red dress, product photo, white background",
"steps": 6,
"cfg_scale": 1.5,
"sampler_name": "LCM",
"width": 512,
"height": 768
}
LCM-LoRA は通常の LoRA と同じようにプロンプト内に <lora:lcm_lora_sdv1-5:1> の形で指定するか、追加ネットワーク拡張から読み込みます。CFG を 2 以上に上げると色が過飽和になりやすいため、1.0〜1.8 の範囲で調整するのがよいと考えられます。
Python スクリプトでバッチ処理する
WebUI API は HTTP なので、ループで複数プロンプトを順番に投げるだけでバッチ処理になります。
import requests, base64, time
from pathlib import Path
ENDPOINT = "http://127.0.0.1:7860/sdapi/v1/txt2img"
OUT_DIR = Path("./outputs")
OUT_DIR.mkdir(exist_ok=True)
prompts = [
"a red dress, product photo, white background",
"a blue jacket, product photo, white background",
"a green coat, product photo, white background",
]
base_payload = {
"negative_prompt": "blurry, low quality, shadow, watermark",
"steps": 6,
"cfg_scale": 1.5,
"sampler_name": "LCM",
"width": 512,
"height": 768,
"seed": -1
}
for i, prompt in enumerate(prompts):
payload = {**base_payload, "prompt": prompt}
res = requests.post(ENDPOINT, json=payload)
img_b64 = res.json()["images"][0]
out_path = OUT_DIR / f"output_{i:03d}.png"
out_path.write_bytes(base64.b64decode(img_b64))
print(f"saved: {out_path}")
time.sleep(0.5)
time.sleep(0.5) は WebUI 側の後処理が落ち着くまでの待機です。生成の進捗は GET /sdapi/v1/progress で確認でき、完了を待ってから次のリクエストを送る実装にすることも可能です。
このようなスクリプトを他のツールから呼び出してさらに自動化を進める方法については、Claude Code CLIで生成AIブログ記事を自動生成する手順も参考になります。
まとめ
Stable Diffusion WebUI API の基本的な流れは「--api で起動 → /sdapi/v1/txt2img に JSON でリクエスト → Base64 を decode してファイルに書く」の3ステップです。Apple Silicon でのメモリエラーは --opt-split-attention と3段階分割で回避でき、LCM-LoRA(Steps 6・CFG 1.5)を組み合わせれば高速生成も実現できます。
まず http://127.0.0.1:7860/docs の Swagger UI を開いて、手元の環境で利用できるサンプラー名とモデル名を確認してから、この記事のコードをそのままコピーして試してみてください。
よくある質問
Stable Diffusion WebUI のAPIはデフォルトでどのURLで動きますか?
デフォルトは `http://127.0.0.1:7860` です。`--listen` オプションをつけると LAN 内の他端末からもアクセスできますが、認証なしで外部に公開しないよう注意が必要です。エンドポイント一覧は `/docs` の Swagger UI で確認できます。
APIで生成した画像はどんな形式で返ってきますか?
レスポンスの `images` キーに Base64 エンコードされた PNG が配列で返ってきます。`base64.b64decode()` でデコードしてバイト列にしてから、ファイルに書き込んだり PIL / Pillow で読み込んで処理できます。
LCM-LoRA を使うときの CFG Scale はどのくらいが適切ですか?
実際に使っている設定は CFG Scale 1.5 です。2 以上に上げると色が過飽和になりやすいため、1.0〜1.8 の範囲で試すとよいと考えられます。通常のサンプラーとは適切な値の範囲が大きく異なります。