コンテンツにスキップ

AI漫画 - 日本語テキスト崩れ防止 調査レポート

📁 docs/ai-manga/artifact/20260312_日本語テキスト崩れ防止_調査レポート.md

日付: 2026-03-12 Issue: #193 対象: SD WebUI Forge (RTX 5070 Ti / torch 2.7.0+cu128 / waiNSFWIllustrious_v150)


現状分析

項目 現状
セリフ描画方法 Pillow(page_composer.py)でSD生成後に重ねる
使用フォント Meiryo / YuGothic(Windows標準)
ControlNetモデル 未インストール(拡張は組み込み済み)
ADetailer 未インストール

セリフ自体はSDに生成させていないため「SDによる文字崩れ」は発生しないが、 吹き出しの見た目(フォント品質・縁取り・キャラとの配置調整) に改善余地がある。


手法1: ControlNet (Text/Scribble) - 吹き出し領域をSDに伝える

目的

吹き出し予定領域をSDに事前通知し、キャラクターがバブル下に隠れないよう構図を誘導する。

実装状況

  • src/text_guide.py を新規作成(ガイド画像生成ユーティリティ)
  • src/sd_client.pygenerate_with_controlnet() を追加
  • モデル未インストール時は通常生成に自動フォールバック

必要なモデルのダウンロード

SDXL/Illustrious系(現在の環境に合致):

モデル名: controlnet-scribble-sdxl-1.0
DL先: https://huggingface.co/xinsir/controlnet-scribble-sdxl-1.0
保存先: D:/Kazuma_Teramachi/kaz_dev_stable-diffusion-webui-forge/models/ControlNet/

SD1.5系(参考):

モデル名: control_v11p_sd15_scribble
DL先: https://huggingface.co/lllyasviel/control_v11p_sd15_scribble

使用方法

from src.sd_client import SDWebUIClient
from src.text_guide import TextGuideGenerator

client = SDWebUIClient()
guide  = TextGuideGenerator(1024, 1536)

# 吹き出し予約領域ガイド画像を生成
bubble_img = guide.create_bubble_mask(
    bubble_x=700, bubble_y=50, bubble_w=280, bubble_h=200
)
img_b64 = guide.encode_to_base64(bubble_img)

# ControlNet Scribble で生成
images, seed = client.generate_with_controlnet(
    positive="1girl, dialogue scene, ...",
    negative="...",
    controlnet_units=[{
        "image":   img_b64,
        "model":   "controlnet-scribble-sdxl-1.0",
        "module":  "none",   # ガイド画像はそのまま使用
        "weight":  0.5,      # 強すぎると構図が固定される
        "control_mode": 0,   # Balanced
    }]
)

評価

観点 評価
効果 ★★★★☆ キャラが吹き出し下に隠れにくくなる
導入コスト ★★★☆☆ モデルDL(約1GB)が必要
互換性 ✅ Forge組み込み、APIサポート済み

手法2: 日本語フォントLoRA - フォント形状を学習させて文字品質向上

目的

SD生成画像内に日本語テキストが混入する場合(背景の看板・タイトル等)の文字崩れを抑制する。

調査結果

現状のパイプライン(Pillowで文字を後から重ねる)にはLoRAは不要。 SDがテキストを生成するシナリオ(タイトルページ・背景に文字が入る場面)でのみ有効。

利用可能なフォントLoRA

LoRA名 用途 入手先
日本語フォントLoRA各種 背景テキスト CivitAI (検索: "Japanese font lora")
筆文字LoRA タイトル等 CivitAI

注意事項

  • waiNSFWIllustrious_v150 との相性は未検証(SDXL系なので SD1.5向けLoRAは非対応)
  • Illustrious系対応のフォントLoRAは現状少ない(2026-03現在)

評価

観点 評価
効果 ★★☆☆☆ 現パイプラインでは用途限定的
導入コスト ★★★☆☆ LoRA探索・検証が必要
互換性 ⚠️ Illustrious系対応LoRAが少ない

手法3: ADetailer - 顔・手の自動補正(間接的に品質向上)

目的

セリフ担当キャラの顔崩れを自動修正し、全体的なコマ品質を向上させる。

実装状況

  • src/sd_client.pygenerate_with_adetailer() を追加
  • 未インストール時は自動フォールバック(422エラーを検知)

インストール手順

Forge Web UI → Extensions タブ
→ Install from URL:
   https://github.com/Bing-su/adetailer
→ Apply and restart UI

使用方法

from src.sd_client import SDWebUIClient

client = SDWebUIClient()

# ADetailer で顔を自動補正しながら生成
images, seed = client.generate_with_adetailer(
    positive="1girl, close-up, ...",
    negative="...",
    ad_model="face_yolov8n.pt",    # 顔検出(高速)
    ad_confidence=0.3,
    ad_denoising_strength=0.4,     # 修正強度
)

評価

観点 評価
効果 ★★★★★ 顔崩れ修正は劇的に向上
導入コスト ★★☆☆☆ 拡張インストールのみ
互換性 ✅ Forge対応版あり

フォント改善(実装済み)

問題

Windows標準フォント(Meiryo)はマンガ的な見た目に最適化されていない。

実装した改善

page_composer.py縁取り(stroke) を追加(issue #193 実装済み): - STROKE_WIDTH = 2 で白縁取り追加 - 黒テキスト + 白縁 → マンガらしいセリフ表現

推奨フォント(無料・商用利用可)

フォント名 特徴 ダウンロード先
源真ゴシック マンガに最適な等幅ゴシック https://osdn.net/projects/mgenplus/
Noto Sans CJK JP Google製・高品質 https://fonts.google.com/noto/specimen/Noto+Sans+JP
源ノ角ゴシック Adobe製・可読性高い https://fonts.adobe.com/fonts/source-han-sans

インストール後、C:/Windows/Fonts/ にコピーすれば page_composer.py が自動認識する。


推奨実装順

Priority 1 (即効性高)
  └── フォント改善: 縁取り実装済み ✅ + 源真ゴシックDL推奨

Priority 2 (品質大幅向上)
  └── ADetailer インストール: Forge UI から 5分で完了
      → config.yaml の adetailer.enabled = true に変更

Priority 3 (構図最適化)
  └── ControlNet Scribble モデルDL (~1GB)
      → controlnet.auto_apply_scribble = true で自動適用

Priority 4 (用途限定)
  └── フォントLoRA: 背景テキストが必要な場面で使用

実装ファイル一覧

ファイル 変更内容
src/text_guide.py 新規: ControlNet ガイド画像生成ユーティリティ
src/sd_client.py 追加: generate_with_controlnet(), generate_with_adetailer(), get_controlnet_models()
src/page_composer.py 変更: フォントパス優先順改善、テキスト縁取り(stroke)追加
config/config.yaml 追加: controlnet, adetailer, text_rendering セクション
docs/extension_recommendations.yaml 既存: ADetailer 記載済み