コミックマスター — ツール
comic-master のコンパニオンスキルです。comic-masterが「良いページとは何か」を定義するのに対し、このスキルはそれを実現するためのツールをカバーします。文字入れが下手なのは、ほとんどの場合ツールが悪いからです。手書きのラスター楕円、システムフォント、アートの上にフラットに貼り付けられたテキストなどが原因です。
1. ComfyUIによるパネルアート
ComfyUI自体の実行方法(モデルのインストール、起動、テンプレートとワークフローの実行)は、このリポジトリのルートにある vendor/comfy-cli-skills/ 内の汎用ComfyUIスキルに属します。このセクションでは、それらをコミックで使用する方法を説明します。
1.1 コミックプロジェクトの生成設定
- プロジェクトごとに2つのワークフロー: 新しいパネル用のテキスト→画像と、連続性の修正、ショットの一致、小道具テキスト用の画像編集。これらを1つのモデルと固定設定で一度選択し、プロジェクトバイブルに記録します。
- 1パネル = 1ジョブ = 1保存画像。 これにより、すべてのパネルをプロンプト、シード、設定に遡って追跡できます。
- 各レンダリングのサイズは、レイアウトから決定し、その逆は行いません。 サムネイルからパネルのボックスを取得し、そのアスペクト比で約1メガピクセルでレンダリングします(例:幅1408×704、高さ768×1024、ストリップ1536×640)。次に、ストーリー上重要な詳細が切り取り端から離れるように拡大縮小または切り取ってボックスに収めます。
- ページ単位ではなく、シーン単位でバッチ処理 することで、シーン内のパネル間でライト、パレット、背景の一貫性を保ちます。
1.2 一貫性
- まずモデルシートを作成。 各キャラクターのターンアラウンドと表情シートを生成し、最適なものを選び、それを参照画像として再利用します(IP-Adapter、画像編集入力、またはキャラクターローラ(訓練可能な場合))。
- 固定アンカー(comic-master
comic-characters.md§4.5)をすべてのプロンプトに一字一句、左から右に列挙します。プロジェクト全体で1つのスタイルアンカーを使用します。 - シード: 承認されたすべてのパネルのシードを記録し、再生成やバリエーション作成が可能になるようにします。
- ポーズ制御: ブロッキングが重要な場合(話者順序、アイライン、180度ルール)は、OpenPoseまたは深度ControlNetを使用します。
1.3 有効なプロンプトルール
- ネガティブプロンプトが機能するかどうかを把握する。 蒸留モデル(FLUX.2 klein、Z-Image-Turbo)はCFG 1で動作するため、通常ネガティブプロンプトを無視します。これらのモデルでは、望むものを肯定的に記述します(「正確に4人」、「リラックスした滑らかな眉」)。ネガティブプロンプトは実際のCFGで実行されるモデルでのみ使用するか、ネガティブガイダンスノード(例:NAG)を追加します。
- モデルの言語でプロンプトする。 FLUXやQwen/Z-Imageは自然な文章を読み取り、SDXLはカンマ区切りのタグを読み取ります。文章モデルでは、固定順序を使用します:ショットとアングル → 各人物とその位置(左から右) → 1つのアクション → 解剖学的表現 → 設定 → 光 → スタイル。
- 表現は解剖学的に、名前では決して指定しない。 「退屈」はしばしばしかめ面を生成します。代わりに「上まぶたが半分下がり、眉は高く平らで、口は閉じた平らな線」のように記述します。ネガティブプロンプトが機能する場合、失敗パターン(「眉をひそめ、しかめ面」)もネガティブプロンプトに追加します。
- 衣装の色は、その体の部位を指定する節の中に記述する(「肩にかけてのネイビーボディスーツ」)。クローズアップは汎用的な色に流れがちなので、流れる色をネガティブプロンプトに追加します。
- 重複禁止: フィギュアごとに1つのアンカー、明示的な数と順序(「正確に3人:左から、...」)、そしてネガティブプロンプトが機能する場合は「重複キャラクター、クローン、余分な人々」をネガティブに追加します。
- プロンプトにテキストスペースを確保する(「上部3分の1は空の平らな壁」)。クリーンで文字のない画像を要求します(「テキストなし、文字なし、吹き出しなし」を、機能する場合はネガティブに、そうでない場合は「文字入れのないクリーンな画像」と肯定的に表現)。ただし、意図的な小道具テキスト編集パスは除きます。
- サムネイルから段階的に進める。 サムネイルをラフなブロックアウト(棒人間、家具のボックス)に変換し、ポーズ、ラインアート、または深度制御画像として供給することで、キャスト配置、スケール、誰が部屋にいるかが計画通りになります。
- いくつか生成し、1つを選ぶ。 パネルごとに3~4シードをレンダリングし、文字入れ前にパネルのGOALとアンカーに対して選択します。
1.4 再生成ではなく編集
既存のパネルを入力として画像編集ワークフローを使用します:
- パネルの一致(同じ部屋、ギャグの繰り返し、リアクションショット):新しいパネルをゼロから生成する代わりに、以前のパネルを新しいパネルにグレーディングします。
- 削除は再配置よりもうまくいく。 「テーブルにいる2人目の人物を削除」は機能します。「彼を椅子の後ろに移動」は通常失敗します。
- 連続性の修正: 迷い込んだエキストラ、間違った衣装の色、間違った手にある小道具。その領域のみをインペイントまたは編集します。
- 小道具テキスト(§4):バッジや看板に書かれた短い単語で、等倍で確認します。
1.5 文字入れ前のレビュー
- 各レンダリングをアンカーとパネルのGOALと比較します:顔、衣装の色、小道具と手、光の方向、余分な人、迷い込んだグリフ、空のテキストゾーン。
- パネルごとにログを保持します(プロンプト、シード、設定、承認または却下の理由)。これにより修正が再現可能になります。
1.6 推奨モデル設定
8 GB VRAM(実用的なデフォルト):
| ジョブ | モデルとファイル | 備考 |
|---|---|---|
| パネルと編集 | FLUX.2 [klein] 4B fp8 (flux-2-klein-4b-fp8) + qwen_3_4b テキストエンコーダ + flux2-vae | ~4ステップ、CFG 1。編集モードでは参照画像(モデルシート)を入力として、キャラクターを正確に再現。Apache-2.0。 |
| 高品質単一パネル、小道具テキスト | Z-Image-Turbo int8 (z_image_turbo_int8_convrot) + qwen_3_4b_fp8_mixed + ae.safetensors | テンプレート image_z_image_turbo_int8;~8ステップ。テキストと指示の追従に優れる。参照画像編集は不可。ポーズ/深度制御はZ-Image-Turbo Fun Union ControlNetテンプレート経由。Apache-2.0。 |
| ステージング制御 | SDXL + OpenPose ControlNet + IP-Adapter | 8GBで最も成熟したポーズとレイアウト制御。結果をKleinで微調整。 |
| キャラクター切り抜き | comfyui-rmbg(BiRefNet toonout(漫画・イラスト向け)またはRMBG-2.0) | 以下のレイヤーワークフロー用。 |
| アップスケーリング | 4x-UltraSharp、タイル | 約1MPでレンダリング後、印刷サイズにアップスケール。 |
8GBの場合:fp8/int8/GGUFウェイトを使用。テキストエンコーダをCPUまたは第2GPUに移動(メモリが逼迫した場合)。大きな画像にはタイル化VAEデコード。一度に読み込むモデルは1つ。ローカルLLMは別のGPUに配置。
レイヤー化キャラクター: 各キャラクターをフラットな無地の背景で生成し、切り抜き(BiRefNet toonout)、シーンごとに共通の背景の上に合成します。これにより、プロンプトだけでは解決できないステージング、スケール、誰が部屋にいるかの問題を修正し、パネル間で小道具のサイズを一定に保つことができます。
より多くのVRAMがある場合: FLUX.2 [klein] 9B(~20 GB;非商用)、Qwen-Image-2.1(~24 GB;参照画像10枚、透明RGBA出力、マスク編集可能;研究ライセンス)、FLUX.2 [dev](fp8で24GB以上;最高品質、複数参照;非商用)。商用利用前に各モデルカードのライセンスを確認してください。上記の8GBスタックはすべてApache-2.0です。
2. 文字入れエンジン:ピクセルではなくベクターを描画
2.0 文字入れツールを使用する(デフォルト)
文字入れコードを自分で書かないでください。このスキルのフォルダ内(このSKILL.mdの隣)に同梱されている scripts/letterer.py を使用してください。一緒に scripts/README.md、scripts/styles.json、および承認されたフォントが scripts/fonts/ に含まれています。パスはこのSKILL.mdを基準に解決し、リポジトリがクローンされた場所に関係なく機能します。スクリプトをプロジェクトにコピーしないでください。このセクションのすべてのルールに従い、§5のQAチェックを自動的に実行します。必要条件:Python 3.9+、Pillow、numpy(pip install -r scripts/requirements.txt);mediapipe を推奨。これにより自動顔チェック(バルーンは顔の上に配置してはいけない)と "tail_to": "auto" が有効になります。
ワークフロー:
python scripts/letterer.py grid --image panel_or_page.png --out grid.pngを実行し、オーバーレイを確認します。各パネルの矩形、各話者の頭部ボックスと口、および空き領域を読み取ります。次に、comic-mastercomic-lettering.md§12.2の配置ルールと§12.7のステップバイステップ手順に従って、各バルーンの位置とテールの狙い点を選択します:頭部に近い空きスペースにバルーンを配置し、テールは口に向けますが、頭部の外で終了します。すべての座標は相対値(0.0~1.0、左上原点)です。- 項目を読み順で記述したページスペック(JSON)を記述します:
{
"image": "strip.png", "out": "strip_lettered.png",
"panels": [[0.0125,0.03,0.329,0.97], [0.342,0.03,0.658,0.97], [0.671,0.03,0.988,0.97]],
"avoid": "faces_mask.png",
"items": [
{"style": "declaration", "text": "The city calls. I answer.", "zone": [0.03,0.06,0.31,0.24]},
{"style": "speech", "text": "Did anyone else|hear that noise?", "at": [0.46,0.30], "tail_to": [0.52,0.52]},
{"style": "sfx-micro", "text": "bzzt bzzt", "at": [0.39,0.62]},
{"style": "sfx", "text": "KA-CHUNK", "at": [0.80,0.88], "size": 2.4, "rotate": -8}
]
}
python scripts/letterer.py page spec.jsonを実行します。終了コード0はすべてのQAチェックに合格したことを意味します。1はレンダリングされたがQAに失敗したことを意味するので、表示された失敗を読み、スペックを修正し(バルーンを話者に近づける、ゾーンを拡大する、単語を減らす、|で改行を入れる)、再実行します。2はエラー(未知のスタイル、フォント欠落、不正なスペック)を意味します。- PNGをフルサイズとサムネイルで確認します。SVG(編集可能)と
_qa.json(測定値)をページと一緒に保存します。
項目フィールド: style;text(| は強制改行、それ以外は自動的にダイヤモンド形状に折り返します;_word_ は強調のためのアンダーライン);at [x,y] 中心点 または zone [x0,y0,x1,y1] 領域内に収める;tail_to [x,y] 狙い点:口そのものではなく、バルーンから口に向かう線上で頭部のすぐ外側、顔から約1文字幅(ch)離れた空きスペースの点を指定します(ツールはその少し手前で停止するため、テールは話者を狙いますが触れません)。"no_tail": true で省略;"auto" は使用しないでください:唇そのものを返します;オプションで panel インデックス、size 乗数、rotate(度単位、時計回り)、fill(背景色)、ink(輪郭色)、text_color、font、tail_bend、link(同じ話者による以前のバルーンのインデックス:2つを結合)、bleed(true で意図的にパネル境界を破る)、seed。
ページフィールド(基本以外): defaults ですべての項目の色とフォントを設定({"fill": "#FDF6E3", "ink": "#2B2B2B", "text_color": "#1F3A7A"});styles でこのページの1つのスタイルをオーバーライド({"speech": {"fill": "#FFF7D6"}});avoid のデフォルトは "auto"(検出された顔が保護されます)、またはマスク画像、または false。
アセンブルされたページまたはストリップ全体を1回の page 実行で文字入れし、パネルごとに行わないでください。 1回の実行で文字入れサイズがパネル間で同一になり、QAがページ全体の読み順と重なりをチェックできるようになります。
ページフィールド: image、out/svg/qa パス、panels(強く推奨:端の隙間、読み順、文字入れサイズに使用)、ch(cap height in px;デフォルトは中央値のパネルの短辺 ÷ 30、全ページで同じ)、avoid(白=顔、手、または主要なアクションで、バルーンを避ける必要がある領域;セグメンテーションパスから構築)、direction(ltr、またはマンガの場合は rtl)。
スタイル(python scripts/letterer.py styles で現在のリストと1行での使用法を表示):
- 台詞:
speech、speech-hand(手描き風、イタリック、曲線テール)、emphasis(大きな線;_word_でアンダーライン)、whisper(破線)、strain(震える輪郭、淡い黄色:歯を食いしばっての言葉)、electronic(ジグザグテール)。 - 思考:
thought-1(=thought、ふわふわ雲)、thought-2(細かいスカラップ)、thought-3(滑らかな楕円と泡)。迷ったらthought-1を使用:詳細が指定されていない思考バルーンのデフォルトです。思考トレイルには、バルーンと狙い点の間に少なくとも2.5文字幅の空きスペースが必要です。そうでないとQAが失敗します。comic-mastercomic-lettering.md§12.8を参照。 - 大声:
shout、shout-2(手描きのバースト)、burst(テールなし)。 - ボックス:
caption、caption-hand、declaration、declaration-hand(引用されたナレーション;ページ下に複数積み重ねてモノローグに)、locator、narrator。 - SFX:
sfx(発生源に、細い白い外側輪郭線あり)、sfx-micro(小さな音)、sfx-stack(繰り返し音を発生源の横に積み重ねる:"wub|wub|wub")。
1冊の本では、1つの台詞ルックを維持します:プレーンスタイルか -hand スタイルのいずれか。シーン内で混在させないでください。すべてのスタイルを並べて表示したものは、リポジトリルートの examples/styles/sheet_lettered.png を参照してください。新しいスタイルを追加するには、新しい描画コードを書くのではなく、styles.json にエントリを追加します。
クイック単一項目: python scripts/letterer.py bubble --image in.png --out out.png --text "GET DOWN!" --style shout --at 0.17,0.25 --tail-to 0.155,0.47 --panel 0.0125,0.03,0.329,0.97
ツールがない場合は、以下のルールに従って同等のものを構築し、同じQA数値を生成します。
- 文字入れをSVGとして構築し、resvg、cairosvg、またはヘッドレスChromium(Playwright)でレンダリングします。ベクターは滑らかな曲線、適切なカーニング、クリーンなストローク、編集可能なレイヤーを提供します。ラスターの楕円呼び出しでバルーンを描かないでください。
- 実際のコミックフォントを使用します。
- 台詞:Comic Neue、Patrick Hand、Anime Ace、または他の手書き風書体。すべて大文字。作品全体で1つのフォントを使用します。
- SFXとタイトル:Bangersなどの太いディスプレイ書体。
- システムサンセリフ(Arial、Helvetica、DejaVu)は決して使用しないでください。フォントファイルがない場合は、サイレントにフォールバックするのではなく、明確にエラーを出力します。
- 台詞とキャプションには、プレーンで直立した手書き風書体のみを使用します。 人が読むべき単語に、ディスプレイ、テクノ、未来的、ステンシル、ホラー、または新奇なフォントは使用しないでください。クロスバーが欠けていたり、E/A/Mの形が様式化された文字は、読みにくくなり、トーンを変えます。装飾的な書体はSFX、タイトル、ロゴのみに使用します。
- 承認済みリストをプロジェクトバイブルに保持し(例:台詞:Comic Neue BoldまたはAnime Ace;SFX:Bangers)、リストにないフォントは拒否します。
- バルーンはテキストに合わせます:
- テキストをダイヤモンド形状に折り返します:短い最上行、最も幅広い中央、短い最下行。最後の行は1語にしないでください。
- テキストブロックを測定し、その周りに丸みを帯びた楕円またはスーパー楕円を描画します。
- テキストのすべての角が少なくとも1文字幅離れるまで壁を成長させます。
- 固定楕円にテキストを詰め込まないでください。
- テールは曲線で先細りのパスであり、三角形ではありません:
- 基部はバルーン幅の約1/8(少なくとも約0.8文字幅以上)、話者に最も近い側に配置します。
- 長さはバルーンの高さの約半分まで(小さなバルーンの場合は2.5文字幅)、口に向かって曲線を描き...