TL;DR: 技術ブログの画像作成にかかる時間を、外部有料APIを一切使わずにローカル完結で削減できます。本記事では AUTOMATIC1111(Stable Diffusion)・ComfyUI・Remotion の3ツールを用途別に使い分け、OGP画像・アイキャッチ・図解を自動生成するワークフローを紹介します。
はじめに:技術ブログの画像問題と外部APIに頼らない解決策
技術ブログを継続運営している方なら、記事ごとのアイキャッチ・OGP画像の作成が意外に時間を食うことを実感しているはずです。「DALL-E で生成したらコストがかかった」「Canva で毎回手作業するのが面倒」という声は珍しくありません。
このブログ自体では Remotion を使ったOGP・アイキャッチの自動生成を本番運用しています(pnpm render:article-images コマンド一発で全記事分の画像を再生成できます)。その経験をベースに、外部有料API不要・ローカル完結で技術ブログ用画像を量産するワークフローをまとめました。
動作確認環境:
- macOS 14.x / Ubuntu 22.04
- Python 3.10〜3.11
- Node.js 20.x / pnpm 9.x
- GPU: NVIDIA RTX 3060 以上推奨(CPU only でも動作可・後述)
ツール選択ガイド:用途別・環境別の最適解
まず全体像を把握するために、主要3ツールの特徴を比較します。
| ツール | 得意な用途 | GPU要否 | セットアップ難易度 | ランニングコスト |
|---|---|---|---|---|
| AUTOMATIC1111 | イラスト・アート系アイキャッチ | 推奨(CPU可) | 中 | 無料 |
| ComfyUI | 図解・ノードワークフロー制御 | 推奨(CPU可) | 高 | 無料 |
| Remotion | OGP・テキスト合成・ブランド画像 | 不要 | 低〜中 | 無料 |
| Canva API | デザインテンプレート自動化 | 不要 | 低 | 無料枠あり・有料枠も |
ユースケース別の推奨選択:
- OGP画像(1200×630): Remotion 一択。React でコンポーネントを書けばブランドの一貫性を保ちながら量産できます。
- アイキャッチ(イラスト・写真風): AUTOMATIC1111。プロンプトを固定してバッチ生成するのが最速。
- 図解・フロー図: ComfyUI の ControlNet + 手書きスケッチ入力が有効。
- テキスト合成バナー: Remotion または AUTOMATIC1111(ただしAI生成文字は不安定なのでRemotionが無難)。
Stable Diffusion(AUTOMATIC1111):API経由での画像バッチ生成
インストール
公式リポジトリ(github.com/AUTOMATIC1111/stable-diffusion-webui)の手順に従います。
# Linux/macOS
git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui
cd stable-diffusion-webui
# webui.sh 起動時に --api フラグを付けて REST API を有効化
./webui.sh --api --nowebui
モデルファイル(.safetensors)は models/Stable-diffusion/ に配置します。技術ブログ用途であれば Realistic Vision や DreamShaper などの汎用モデルが使いやすいです(Civitai で公開されている無料モデルを利用可)。
Python スクリプトでバッチ生成
AUTOMATIC1111 は --api フラグを付けて起動すると http://localhost:7860 にREST APIが立ち上がります。以下のスクリプトで記事タイトルのリストからアイキャッチをバッチ生成できます。
# generate_thumbnails.py
import requests
import base64
import json
from pathlib import Path
API_URL = "http://localhost:7860"
def generate_image(prompt: str, output_path: Path) -> None:
payload = {
"prompt": prompt,
"negative_prompt": "text, watermark, blurry, low quality",
"steps": 20,
"width": 1200,
"height": 630,
"cfg_scale": 7,
"sampler_name": "DPM++ 2M Karras",
}
response = requests.post(f"{API_URL}/sdapi/v1/txt2img", json=payload)
response.raise_for_status()
image_data = response.json()["images"][0]
image_bytes = base64.b64decode(image_data)
output_path.write_bytes(image_bytes)
print(f"Generated: {output_path}")
# 記事スラッグとプロンプトのマッピング
articles = [
{
"slug": "ai-image-generation-blog",
"prompt": (
"futuristic tech blog header, neural network visualization, "
"blue purple gradient, minimalist, high quality"
),
},
# ... 追加記事
]
for article in articles:
out_dir = Path(f"content/posts/{article['slug']}")
out_dir.mkdir(parents=True, exist_ok=True)
generate_image(article["prompt"], out_dir / "thumbnail.png")
# 依存パッケージ
pip install requests
# AUTOMATIC1111 が起動した状態で実行
python generate_thumbnails.py
GPU なし環境(CPU only)での注意点
GPUがない環境では --use-cpu all オプションで起動できます(公式ドキュメント 参照)。ただし生成速度は GPU の10〜30倍以上遅くなります(経験則)。512×512 で1枚あたり5〜20分程度を見込んでください。OGP用途(1200×630)は現実的ではないため、その場合は後述の Remotion を優先してください。
# CPU only 起動(CUDA不要、公式値)
./webui.sh --api --nowebui --use-cpu all --precision full --no-half
ComfyUI:ノードワークフローで図解・アイキャッチを量産
ComfyUI(github.com/comfyanonymous/ComfyUI)はノードベースのUIで、AUTOMATIC1111 より細かいパイプライン制御が可能です。
インストール
git clone https://github.com/comfyanonymous/ComfyUI
cd ComfyUI
pip install -r requirements.txt
# GPU あり
python main.py
# CPU only
python main.py --cpu
API 経由でのバッチ実行
ComfyUI もWebSocketベースのAPIを持ちます。ワークフローをJSON形式でエクスポートし、以下のようにプログラムから投入できます(公式サンプル より)。
# comfyui_batch.py
import websocket
import json
import uuid
import urllib.request
SERVER = "127.0.0.1:8188"
CLIENT_ID = str(uuid.uuid4())
def queue_prompt(workflow: dict) -> dict:
payload = json.dumps({"prompt": workflow, "client_id": CLIENT_ID}).encode()
req = urllib.request.Request(
f"http://{SERVER}/prompt",
data=payload,
headers={"Content-Type": "application/json"},
)
return json.loads(urllib.request.urlopen(req).read())
# workflow.json は ComfyUI の "Save (API Format)" で書き出したもの
with open("workflow.json") as f:
workflow = json.load(f)
# プロンプトノードのテキストを動的に差し替える
# ノードIDは workflow.json を確認して適宜変更
workflow["6"]["inputs"]["text"] = "tech blog diagram, clean minimal, white background"
result = queue_prompt(workflow)
print(f"Queued: {result}")
技術ブログ用途では ControlNet + Canny を使うと、手書きのスケッチやスクリーンショットを元に整ったダイアグラム風画像を生成できます。構成図や比較フローの「元ネタ」をざっくり描き、それをAIで清書するイメージです。
Remotion:ReactでOGP画像・アイキャッチを静止画出力
Remotion(remotion.dev)は React でビデオ・静止画を生成するライブラリです。外部APIが不要で、フォント・カラー・レイアウトを完全にコードで管理できるため、ブランドの一貫性を保ちたい OGP 画像の量産に最適です。
AI ペアプログラミングや Codex CLI を活用した開発効率化についてはAIペアプログラミングのパターン集も参考にしてください。
セットアップ
# 既存プロジェクトへの追加
pnpm add remotion @remotion/bundler @remotion/renderer
OGP画像コンポーネント(最小実装例)
// remotion/compositions/OgpImage.tsx
import { AbsoluteFill } from "remotion";
import React from "react";
interface OgpProps {
title: string;
category: string;
slug: string;
}
export const OgpImage: React.FC<OgpProps> = ({ title, category }) => {
return (
<AbsoluteFill
style={{
background: "linear-gradient(135deg, #1e1e2e 0%, #2d2d44 100%)",
display: "flex",
flexDirection: "column",
justifyContent: "center",
padding: "60px 80px",
fontFamily: "'Noto Sans JP', sans-serif",
}}
>
<p>
{category}
</p>
<h1
style={{
color: "#ffffff",
fontSize: 64,
fontWeight: 700,
lineHeight: 1.3,
margin: 0,
}}
>
{title}
</h1>
</AbsoluteFill>
);
};
// remotion/Root.tsx
import { Composition } from "remotion";
import { OgpImage } from "./compositions/OgpImage";
export const RemotionRoot: React.FC = () => (
<Composition
id="OgpImage"
component={OgpImage}
durationInFrames={1}
fps={1}
width={1200}
height={630}
defaultProps={{ title: "記事タイトル", category: "AI", slug: "example" }}
/>
);
複数記事分をバッチ出力するスクリプト
// scripts/render-ogp.ts
import { bundle } from "@remotion/bundler";
import { renderStill } from "@remotion/renderer";
import path from "path";
import { readdirSync, readFileSync } from "fs";
import matter from "gray-matter";
async function renderOgpImages() {
const bundled = await bundle({
entryPoint: path.resolve("remotion/index.ts"),
webpackOverride: (config) => config,
});
const postsDir = path.resolve("content/posts");
const slugs = readdirSync(postsDir);
for (const slug of slugs) {
const mdPath = path.join(postsDir, slug, "index.md");
const raw = readFileSync(mdPath, "utf8");
const { data } = matter(raw);
const outputPath = path.join(postsDir, slug, "ogp-main.png");
await renderStill({
composition: {
id: "OgpImage",
width: 1200,
height: 630,
fps: 1,
durationInFrames: 1,
defaultProps: {},
},
serveUrl: bundled,
output: outputPath,
inputProps: {
title: data.title ?? slug,
category: data.category ?? "",
slug,
},
});
console.log(`Rendered: ${outputPath}`);
}
}
renderOgpImages().catch(console.error);
# 実行(Node.js 20以上)
pnpm tsx scripts/render-ogp.ts
このブログのデザインシステム設計についてはAIデザインシステム設計で詳しく解説しています。Remotion の詳細な使い方は Remotion 公式ドキュメント を参照してください。
3ツールの組み合わせワークフロー:記事公開フローへの組み込み
実際の記事公開フローに組み込む例を示します。
記事執筆完了
↓
[OGP画像] Remotion スクリプトを実行(pnpm render:article-images <slug>)
↓
[アイキャッチ・本文挿入用イラスト] AUTOMATIC1111 API でバッチ生成
↓
[図解・フロー図] ComfyUI ワークフローで生成(必要な記事のみ)
↓
WebP 変換(cwebp コマンドまたは sharp)
↓
記事ファイルに画像パスを記載 → PR 作成 → 公開
CI/CD への組み込みについては Codex CLIガイド2026 で解説している自動化パターンが参考になります。
WebP 変換の自動化
PNG で生成した画像を WebP に変換することでファイルサイズを削減できます。
# cwebp(Google製、無料)を使う場合
find content/posts -name "*.png" -exec cwebp {} -o {}.webp \;
// scripts/convert-to-webp.ts(sharp を使う場合)
import sharp from "sharp";
import { glob } from "glob";
const files = await glob("content/posts/**/*.png");
for (const file of files) {
await sharp(file)
.webp({ quality: 85 })
.toFile(file.replace(".png", ".webp"));
console.log(`Converted: ${file}`);
}
pnpm add sharp
pnpm tsx scripts/convert-to-webp.ts
GPU なし環境での代替手段
GPUがない環境(MacBook Air 等)でも以下の方法で対応できます。
| 手段 | 仕組み | 品質 | 速度 |
|---|---|---|---|
| Stable Diffusion CPU mode | --use-cpu all フラグ | 高 | 非常に遅い(経験則: 5〜20分/枚) |
| stable-diffusion.cpp | C++実装で軽量化 | 中〜高 | 中(1〜3分/枚) |
| Remotion | React描画のみ | テキスト合成特化 | 高速(数秒) |
| headless Chrome + HTML | Puppeteer/Playwright | テキスト合成特化 | 高速(数秒) |
GPU なし環境では OGP・バナー系は Remotion、写真・イラスト系はstable-diffusion.cpp かクラウドサービスに限定するという割り切りが現実的です。stable-diffusion.cpp(github.com/leejet/stable-diffusion.cpp)は ARM Mac でもそれなりの速度で動作するため、試す価値があります。
まとめ
技術ブログ用画像の量産において、外部有料APIを使わないローカル完結ワークフローのまとめです。
- OGP・バナー: Remotion(React)でブランド一貫性を保ちながら高速量産
- アイキャッチ・イラスト: AUTOMATIC1111 API でバッチ生成、GPU推奨
- 図解・フロー: ComfyUI + ControlNet で手書きスケッチを清書
- GPU なし: Remotion + headless Chrome に絞る
各ツールは公式ドキュメントが充実しているため、本記事のコードをベースに自分の記事フローに合わせてカスタマイズしてください。
関連記事:
- AIデザインシステム設計:デザイントークンの管理と自動化
- AIペアプログラミングのパターン集:Codex・Claude を使った開発効率化
FAQ
Q1. Stable Diffusion で商用利用できるモデルはどれですか?
使用するモデルのライセンスによります。Civitai で配布されているモデルはライセンス種別が記載されていますので、商用利用の場合は「商用利用可」のモデルを選択してください(Civitai の公式フィルタ機能で絞り込めます)。Stability AI 公式モデルは Stability AI ライセンスページ を確認してください。
Q2. OGP画像のサイズは何ピクセルが最適ですか?
1200×630 px が業界標準です(Twitter・Facebook・Slack での展開に対応)。Remotion のコンポーザブル設定で width={1200} height={630} を指定するだけで正しいサイズで出力されます。
Q3. Remotion と headless Chrome の違いは何ですか?
Remotion は内部で headless Chromium を使っていますが、React コンポーネントをそのまま記述できる点が大きな違いです。headless Chrome + HTML/CSS テンプレートで同様のことはできますが、React エコシステム(TypeScript・デザイントークン)と統合する場合は Remotion の方が管理しやすいです。
Q4. ComfyUI は AUTOMATIC1111 と何が違うのですか?
AUTOMATIC1111 はUIが使いやすく手軽に始められますが、ノードの処理順序や分岐制御がしにくいです。ComfyUI はノードグラフで処理フローを視覚的に構築でき、ControlNet・LoRA・インペイントの組み合わせを細かく制御できます。API 経由での自動化のしやすさは ComfyUI の方が高いです(ComfyUI 公式ドキュメント)。
Q5. 生成した画像のファイルサイズが大きすぎる場合の対処法は?
sharp ライブラリ(Node.js)または cwebp(Google製CLI)で WebP 変換するのが最も効果的です(PNG比 25〜35%のファイルサイズ削減、公式値)。本記事の「WebP変換の自動化」セクションのスクリプトを参照してください。
References
- AUTOMATIC1111 公式リポジトリ: https://github.com/AUTOMATIC1111/stable-diffusion-webui
- ComfyUI 公式リポジトリ: https://github.com/comfyanonymous/ComfyUI
- Remotion 公式ドキュメント: https://www.remotion.dev/docs
- Stability AI ライセンス: https://stability.ai/license
- stable-diffusion.cpp: https://github.com/leejet/stable-diffusion.cpp
- WebP 変換ツール cwebp: https://developers.google.com/speed/webp/docs/cwebp
