メインコンテンツへスキップ
Code & Craft
AI活用 約9分で読めます

Stable Diffusion を Web 開発で活用する方法|画像生成 API 統合ガイド

Stable Diffusion をWebアプリに統合する方法を解説。Replicate API、Stability AI API、セルフホスティングの選択肢、実装例まで完全網羅。

Stable Diffusion は、オープンソースの画像生成 AI モデルです。ブログ記事のアイキャッチ、商品画像、アイコン、プロフィール画像など、Web アプリで様々な用途に活用できます。この記事では、Stable Diffusion を Web アプリに統合する方法を、3つのアプローチで解説します。

Stable Diffusion とは

Stable Diffusion は、Stability AI が 2022 年に公開したテキストから画像を生成する AI モデルです。

主な特徴:

  • オープンソース: 商用利用も可能
  • 高品質: DALL-E、Midjourney と同等レベル
  • カスタマイズ可能: 独自モデルでファインチューニング
  • 多様なスタイル: リアル、アニメ、アート等
  • 多くのツール: Web UI、API、セルフホスト対応

Web アプリへの統合方法

Stable Diffusion を Web アプリで使う方法は 3 つあります。

  1. マネージド API(Replicate、Stability AI 等)
  2. セルフホスティング
  3. オンデバイス実行(WebGPU)

各アプローチの特徴を比較します。

項目マネージド APIセルフホストWebGPU
初期コスト高(GPU 必須)
運用コスト従量課金固定費ユーザー負担
速度速い最速遅い
カスタマイズ
セットアップ簡単複雑中程度

方法1: Replicate API を使う

Replicate は、オープンソース AI モデルを API として提供するサービスです。クレジットカード登録だけで即座に使えます。

料金

  • Stable Diffusion XL: 約 $0.005 / 画像
  • Flux 1 Pro: 約 $0.04 / 画像
  • 最大 1 秒課金: 使った分だけ

100 枚生成しても $0.5〜$4 程度の低コストです。

セットアップ

npm install replicate
# .env
REPLICATE_API_TOKEN=r8_...

画像生成

import Replicate from 'replicate';

const replicate = new Replicate({
  auth: process.env.REPLICATE_API_TOKEN,
});

async function generateImage(prompt: string) {
  const output = await replicate.run(
    'stability-ai/stable-diffusion-xl:39ed52f2a78e934b3ba6e2a89f5b1c712de7dfea535525255b1aa35c5565e08b',
    {
      input: {
        prompt: prompt,
        negative_prompt: 'blurry, low quality, distorted',
        width: 1024,
        height: 1024,
        num_outputs: 1,
      },
    }
  );

  return output[0] as string; // 画像の URL
}

const imageUrl = await generateImage('A cute cat in a wizard hat, fantasy art style');
console.log(imageUrl);

Next.js での統合

// app/api/generate/route.ts
import { NextRequest } from 'next/server';
import Replicate from 'replicate';

const replicate = new Replicate({ auth: process.env.REPLICATE_API_TOKEN });

export async function POST(req: NextRequest) {
  const { prompt } = await req.json();

  const output = await replicate.run(
    'stability-ai/stable-diffusion-xl:...',
    { input: { prompt } }
  );

  return Response.json({ imageUrl: output[0] });
}
'use client';

import { useState } from 'react';

export default function ImageGenerator() {
  const [prompt, setPrompt] = useState('');
  const [imageUrl, setImageUrl] = useState('');
  const [loading, setLoading] = useState(false);

  const handleGenerate = async () => {
    setLoading(true);
    const res = await fetch('/api/generate', {
      method: 'POST',
      body: JSON.stringify({ prompt }),
    });
    const data = await res.json();
    setImageUrl(data.imageUrl);
    setLoading(false);
  };

  return (
    <div>
      <input
        value={prompt}
        onChange={(e) => setPrompt(e.target.value)}
        placeholder="画像の説明を入力"
      />
      <button onClick={handleGenerate} disabled={loading}>
        {loading ? '生成中...' : '生成'}
      </button>
      {imageUrl && <img src={imageUrl} alt="Generated" />}
    </div>
  );
}

方法2: Stability AI API を使う

Stability AI 公式 API は、Stable Diffusion の開発元が提供する API です。

セットアップ

npm install axios

画像生成

import axios from 'axios';
import fs from 'fs';

async function generateWithStability(prompt: string) {
  const response = await axios.post(
    'https://api.stability.ai/v2beta/stable-image/generate/sd3',
    {
      prompt,
      aspect_ratio: '16:9',
      output_format: 'png',
    },
    {
      headers: {
        Authorization: `Bearer ${process.env.STABILITY_API_KEY}`,
        Accept: 'image/*',
      },
      responseType: 'arraybuffer',
    }
  );

  return Buffer.from(response.data);
}

const imageBuffer = await generateWithStability('A futuristic city at sunset');
fs.writeFileSync('generated.png', imageBuffer);

料金

  • Stable Diffusion 3: 約 $0.065 / 画像
  • Stable Image Core: 約 $0.03 / 画像
  • Stable Image Ultra: 約 $0.08 / 画像

Replicate より少し高めですが、モデルの更新が早く、最新機能を使えます。

方法3: セルフホスティング

GPU サーバーを持っている場合は、自前でホストするのが最も経済的です。

ComfyUI + API モード

# ComfyUI のインストール
git clone https://github.com/comfyanonymous/ComfyUI.git
cd ComfyUI
pip install -r requirements.txt

# モデルのダウンロード
cd models/checkpoints
wget https://huggingface.co/stabilityai/stable-diffusion-xl-base-1.0/resolve/main/sd_xl_base_1.0.safetensors

# 起動
python main.py --listen

API 経由での画像生成

async function generateLocal(prompt: string) {
  const response = await fetch('http://localhost:8188/prompt', {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({
      prompt: {
        // ComfyUI のワークフロー JSON
        nodes: [
          {
            class_type: 'CLIPTextEncode',
            inputs: { text: prompt, clip: ['model', 1] },
          },
          // ... その他のノード
        ],
      },
    }),
  });

  return response.json();
}

セルフホスティングは初期投資が大きいですが、大量の画像を生成する場合は長期的にコストを抑えられます。

必要なハードウェア

  • GPU: NVIDIA RTX 3090 (24GB) 以上推奨
  • RAM: 32GB 以上
  • ストレージ: 500GB 以上(モデル + 生成画像)

GPU クラウド(Lambda Labs、RunPod 等)を使う場合、月 $200-500 程度です。

プロンプトの書き方

良い画像を生成するには、プロンプトが重要です。

基本構造

[主題], [詳細], [スタイル], [品質指定], [カメラ設定]

良い例

A majestic white cat sitting on a wooden table,
fluffy fur, blue eyes, sunlight streaming through window,
soft bokeh background, photorealistic, 8k, professional photography,
Canon EOS R5, 85mm lens

悪い例

白い猫

ネガティブプロンプト

生成してほしくない要素を指定:

negative_prompt: "blurry, low quality, distorted faces, extra limbs, bad anatomy, watermark, signature"

プロンプトのコツ

  • 具体的に: 「美しい風景」より「夕日の海辺、岩場、波しぶき」
  • スタイルを指定: 「写実的」「アニメ風」「油絵」等
  • 品質キーワード: 「8k」「high resolution」「masterpiece」
  • カメラ設定: 「85mm lens」「depth of field」

実務での活用例

例1: ブログ記事のアイキャッチ自動生成

async function generateCoverImage(articleTitle: string, category: string) {
  const stylePrompts = {
    'web-development': 'code on screen, modern tech aesthetic, blue color scheme',
    'ai': 'neural network visualization, futuristic, purple tones',
    'design': 'colorful abstract, creative workspace, warm tones',
  };

  const prompt = `${articleTitle}, ${stylePrompts[category]}, minimalist, professional, 16:9 aspect ratio, blog cover image`;

  return await generateImage(prompt);
}

例2: 商品画像のバリエーション生成

async function generateProductVariations(productName: string) {
  const angles = ['front view', 'side view', 'top view'];
  const backgrounds = ['white background', 'natural wood', 'marble surface'];

  const images = [];
  for (const angle of angles) {
    for (const bg of backgrounds) {
      const prompt = `${productName}, ${angle}, ${bg}, professional product photography, studio lighting`;
      const url = await generateImage(prompt);
      images.push({ angle, bg, url });
    }
  }

  return images;
}

例3: アバター生成サービス

async function generateAvatar(description: string, style: 'anime' | 'realistic' | 'cartoon') {
  const stylePrompt = {
    anime: 'anime style, clean lineart, vibrant colors',
    realistic: 'photorealistic portrait, natural lighting, detailed',
    cartoon: 'cartoon style, simple, colorful, friendly',
  };

  const prompt = `Portrait of a person, ${description}, ${stylePrompt[style]}, centered composition, professional headshot`;

  return await generateImage(prompt);
}

画像の保存と配信

生成した画像は、Cloudflare R2AWS S3 に保存するのが一般的です。

import { S3Client, PutObjectCommand } from '@aws-sdk/client-s3';

const s3 = new S3Client({
  region: 'auto',
  endpoint: process.env.R2_ENDPOINT,
  credentials: {
    accessKeyId: process.env.R2_ACCESS_KEY!,
    secretAccessKey: process.env.R2_SECRET_KEY!,
  },
});

async function uploadImage(imageBuffer: Buffer, key: string) {
  await s3.send(
    new PutObjectCommand({
      Bucket: 'my-generated-images',
      Key: key,
      Body: imageBuffer,
      ContentType: 'image/png',
    })
  );

  return `https://cdn.example.com/${key}`;
}

Cloudflare R2Egress(帯域)料金が無料のため、画像配信に最適です。

注意点とベストプラクティス

1. 著作権への配慮

Stable Diffusion はオープンソースですが、生成した画像の著作権は曖昧な部分があります。

  • 商用利用: 基本的に可能(モデルのライセンス次第)
  • 学習データの問題: 一部のモデルは議論がある
  • 著名人の生成: 肖像権に注意

2. 不適切コンテンツのフィルタリング

ユーザー入力を受け付ける場合、セーフティフィルタが必要です。

const BANNED_WORDS = ['explicit', 'violence', '...'];

function isPromptSafe(prompt: string): boolean {
  return !BANNED_WORDS.some(word => prompt.toLowerCase().includes(word));
}

if (!isPromptSafe(userPrompt)) {
  throw new Error('不適切なプロンプトです');
}

3. レート制限

// Upstash Ratelimit を使った制限
const ratelimit = new Ratelimit({
  redis: Redis.fromEnv(),
  limiter: Ratelimit.slidingWindow(5, '1 h'), // 1時間に5回
});

const { success } = await ratelimit.limit(userId);
if (!success) {
  return Response.json({ error: 'Rate limit exceeded' }, { status: 429 });
}

4. コスト管理

async function generateWithBudget(prompt: string, userId: string) {
  const userCost = await getUserMonthlyCost(userId);

  if (userCost > MONTHLY_LIMIT) {
    throw new Error('月額上限に達しました');
  }

  const result = await generateImage(prompt);
  await recordUsage(userId, 0.005); // 使用量記録
  return result;
}

他の画像生成 AI との比較

サービス料金品質カスタマイズ
Stable Diffusion安い
DALL-E 3最高
Midjourney最高
Flux

用途別の選択:

  • 自由度重視: Stable Diffusion
  • 品質重視: DALL-E 3、Midjourney
  • 最新トレンド: Flux

まとめ

Stable Diffusion を Web アプリに統合することで、以下のような機能が実現できます。

  • ブログ記事のアイキャッチ自動生成
  • 商品画像のバリエーション作成
  • アバター・プロフィール画像生成
  • 広告クリエイティブの量産
  • プロトタイプのビジュアル作成

始めるならまず Replicate API が最もハードルが低く、すぐに試せます。数百円で大量の画像を生成できるため、まずは試してみて、手応えを感じたら本格導入を検討しましょう。

参考リンク

#Stable Diffusion #画像生成 #AI #API #Web開発
シェア: