こんにちは、パレイド思想部です。
前回はLLMによる記事生成の流れを紹介しました。
第5回は「サムネイル」の話です。記事を書くたびに Canva を開いて、タイトルをコピペして、フォントを調整して、書き出してアップロードして——この作業、毎回やっていました。ai-editor の目的は「ブログ運営の全工程を自動化する」なので、当然ここにも手が届くはずです。
既に技術的な紹介はしていますので、ワークフロー効率化の視点を主に解説します。
ビフォー:毎回の Canva 作業
前提として、典型的な手作業での手順は下記の通りでした。
- Canva を開いてテンプレートを複製
- タイトルテキストを書き換え
- Magic 機能で AI で背景画像を生成
- PNG で書き出し
- WordPress メディアライブラリにアップロード
- 記事のアイキャッチに紐付け
一枚あたり 10〜15 分。月 20 本書けば累計 3〜4 時間が消える計算です。しかも「どのテンプレートを使ったか」の一貫性が崩れやすく、古い記事と新しい記事でデザインがバラバラになりがちでした。
アフター:ai-editor のサムネイル自動生成
現在の ai-editor では、記事のフロントマターとタイトルを渡すと、PNG を自動生成して WordPress にアップロードするところまで一気に行います。内部では次の流れが走ります。
LLM でキャッチコピー生成
↓
画像バックエンドで背景生成 (Diffusers or ComfyUI or ソリッドカラー)
↓
Pillow でテキストオーバーレイ合成
↓
WordPress REST API でメディアアップロード+アイキャッチ設定
技術選定:AI 生成と Pillow の役割分担
サムネイル画像を丸ごと AI に生成させる方法もありますが、文字が崩れたり、記事ごとに品質がばらつく問題があります。そこで 背景画像だけ AI(Stable Diffusion)で生成し、タイトル文字や装飾は Pillow で合成する 方式を採用しました。
(2026年3月追記) Nano Banana2 の登場で、文字や構造の崩れないサムネイル生成が現実的となりました。 この記事ではローカルLLMの利用をメリットとして、引き続き実践的な使用方法として紹介しています。
方式の比較
| 方式 | メリット | デメリット |
|---|---|---|
| AI で全部生成 | 1プロンプトで完結 | 文字が崩れる・品質が不安定 |
| Stable Diffusion等 で背景 + Pillow で文字 | 背景はリッチ、文字は確実に読める | VRAM 必要・起動が重い |
| ComfyUI で背景 + Pillow で文字 | ワークフロー再現性が高い | ComfyUI サーバーは別途必要 |
| Pillow のみ(テンプレート) | 依存ゼロ・高速・安定 | デザインの多様性は限られる |
ai-editor では ComfyUI で背景を生成し、Pillow でタイトル文字を合成する 方式を採用しています。ComfyUI は API 経由でワークフローを実行するため再現性が高く、モデル(realvisXL 等)を固定すればブランドに合った背景を安定して出力できます。Stable Diffusion等のAPI利用でも問題ありません。
ポイントは、文字を AI に描かせると崩れてしまう文字の配置・フォント・装飾は Pillow で確実に制御することです。
テンプレートを YAML で定義する
よく使うデザインのパラメータは YAML ファイルに切り出しています。 フォント、背景色等、以前の手作業でもやっていたルールに沿って設定していきます。
# tools/publish/thumbgen/templates/default.yaml
width: 1200
height: 630
bg_color: [30, 30, 40]
accent_color: [100, 180, 255]
font_path: assets/fonts/NotoSansJP-Bold.ttf
title_size: 64
subtitle_size: 32
logo: assets/logo_white.png
logo_pos: [80, 60]
# templates/tech.yaml ← 技術記事用
bg_color: [15, 25, 45]
accent_color: [80, 220, 160]
title_size: 56
記事のフロントマターに thumbnail_template: tech と書くだけで切り替わります。これが「自分のブログに合ったデザインをテンプレート化する」実態です。新しいカテゴリが増えたら YAML を一枚追加するだけでよく、コードは触りません。
LLM によるキャッチコピー生成
タイトルをそのまま載せると長すぎる場合があります。そこで LLM にサブタイトル(20 字程度のキャッチコピー)を生成させています。
def generate_subtitle(title: str, llm_client) -> str:
prompt = (
f"次のブログ記事タイトルに対して、サムネイル用の短いキャッチコピーを"
f"20文字以内で1行だけ出力してください。\nタイトル: {title}"
)
return llm_client.chat(prompt).strip()
モデルはローカル LLM の軽量モデル(’gemma3:4b’, qwen2.5:7b など)で十分です。コストを節約しながら、毎回サブタイトルの生成に使えます。
WordPress API を組み合わせればサムネイルの一括変換も
上記は1つの記事でのサムネイル処理ですが、当サイトでは WordPress API と組み合わせて、連載シリーズのサムネイルを一括で置換する、等の利用を行っています。 たとえば背景や構図の変更を複数の記事に適用したい場合、これまで1つずつ手作業で行わなければならなかった作業がほぼCLI一発で完了します。 これにより、時間を大幅に短縮しつつ、一定の品質が期待ができるようになりました。
| 項目 | ビフォー | アフター |
|---|---|---|
| 作業時間 | 5〜10 分/記事 | 10〜30 秒 |
| デザイン一貫性 | テンプレート管理が属人的 | YAML テンプレートで統一 |
| バックエンド | Canva(GUI) | Pillow + オプションで Diffusers |
まとめ
設計の核心は「AI 生成の多様性」より「テンプレートの再現性」を優先した点です。サムネイルはブランドの顔でもあるので、毎回同じクオリティで出力できることの方が、凝った一枚を作るより長期運用では価値があります。Diffusers や ComfyUI は「使いたいときに使う」オプションとして残しておくのがちょうどいいバランスでした。
次回予告: 第6回は「連載シリーズの管理」に踏み込みます。




