問題の概要:プロンプトウェイト構文のエラーと意図しない生成結果
Stable Diffusionで画像生成を行う際、プロンプトに特定の要素を強調したり弱めたりするためにウェイト(重み)構文を使用します。しかし、この構文の使い方を誤ると、システムがプロンプトを正しく解釈できず、以下のような問題が発生します。
- エラーメッセージが表示されて画像が全く生成されない
- 意図した強調・弱化が反映されず、期待通りの画像が得られない
- 括弧のネストが複雑で、どの要素にどの重みがかかっているか分からなくなる
具体的なエラーの例としては、Automatic1111のWebUIで以下のようなメッセージが見られます。
Error: Unmatched parentheses in prompt.
Error parsing prompt: invalid weight format.
これらのエラーは、プロンプトエンジニアリングの基本であるウェイト調整が正しく行えないことを意味し、画像のクオリティや構図の制御に直接的な悪影響を及ぼします。
原因の解説:構文ルールの誤解と実装の違い
問題の根本原因は、主に以下の3点に集約されます。
1. 括弧の不一致とネストの過剰
Stable Diffusionのウェイト構文は、基本的に(word:weight)または(word)、[word]の形式を取ります。開き括弧と閉じ括弧の数が一致していない場合、パーサーがプロンプトを解釈できずにエラーが発生します。また、複雑なネスト(例: ((masterpiece:1.2)), best quality)は、使用するUIやスクリプトによって解釈が異なり、予期せぬ結果を生む原因となります。
2. 使用するツールやUIによる構文の差異
Stable Diffusionには、Automatic1111 WebUI、ComfyUI、Stable Diffusion WebUI Forge、コマンドラインインターフェースなど様々な実行環境があります。これらの間で、ウェイト構文の細かい実装やサポート範囲に違いがあります。例えば、あるUIでは(word:1.5)が有効でも、別の環境では小数点の扱いが異なる場合があります。
3. 数値の範囲とフォーマットの誤り
ウェイトの数値は通常、0.1から100までの範囲が推奨されますが、極端な値(例: (cat:1000))を指定すると、モデルの注意力が特定のトークンに集中しすぎて画像が崩壊したり、エラーを引き起こしたりすることがあります。また、(word: 1.2)(コロンの後にスペース)のようなフォーマットの誤りも、パースエラーの原因となります。
解決方法:ステップバイステップで学ぶ正しいウェイト構文
ここからは、具体的な解決手順と正しい構文の使い方を説明します。
ステップ1:基本構文のマスター
まずは、以下の3つの基本形を完全に理解しましょう。
- 強調(増強):
(word)または(word:1.1)。デフォルトの重みは約1.1倍とされています。より強く強調するには((word))や(word:1.3)とします。 - 重みの明示的指定:
(word:1.5)。コロンに続いて数値を指定します。1.0が基準です。 - 弱化(減衰):
[word]または(word:0.9)。デフォルトで約0.9倍に弱められます。
# 良い例
prompt = "a (beautiful:1.3) sunset over the [calm] ocean, (highly detailed:1.2)"
# 美しい(beautiful)を1.3倍強調、穏やか(calm)を弱め、非常に詳細(highly detailed)を1.2倍強調。
ステップ2:複合的な重み付けとネストのルール
複数の単語にまとめて重みを付けたり、ネスト構造を使う場合は、括弧の対応に細心の注意を払います。
# 良い例:複数単語のグループ化
prompt = "(golden retriever puppy:1.4) playing in the park"
# 「golden retriever puppy」というフレーズ全体を1.4倍に強調。
# 良い例:シンプルなネスト
prompt = "a portrait of a ((beautiful elf)) with long hair"
# 「beautiful elf」を二重括弧で強く強調。
# 悪い例:複雑で不要なネスト(エラーの元)
prompt = "(((masterpiece))), best quality, (detailed eyes:1.2)), (intricate background"
# 括弧の対応が乱れており、最後の`(intricate background`が閉じられていない。
ステップ3:エラー発生時のデバッグ手順
エラーメッセージが表示されたら、以下の手順で問題を切り分けます。
- 括弧の数を数える: プロンプト内の
(と)の数が一致しているか確認します。テキストエディタの検索機能を使うと簡単です。 - 構文を単純化する: 一度にすべてのウェイトを調整しようとすると混乱します。まずはウェイトを全て削除し、一段階ずつ追加していきます。
- UI/ツールのドキュメントを確認する: 使用しているフロントエンド(特にAutomatic1111とComfyUIは構文拡張がある)の公式WikiやREADMEで、サポートされている構文を再確認します。
- 数値の範囲をチェックする: 重みの値を1.5や0.7など穏やかな値から始め、効果を見ながら調整します。
コード例・コマンド例
実際のプロンプト例と、コマンドラインからStable Diffusionを実行する際の例を示します。
プロンプトの実践例
# 例1:キャラクターの属性を調整
プロンプト: "1girl, (long silver hair:1.2), (blue eyes:1.1), [smile:0.8], wearing a (detailed leather armor:1.3), in a fantasy forest"
# 銀髪を強め、青い目を少し強調、笑顔を弱め、革鎧のディテールを強く指定。
# 例2:アートスタイルと被写体のバランス
プロンプト: "(cinematic lighting:1.4), a (lonely astronaut:1.3) floating in [space:0.9], (trending on artstation:1.2), (8k resolution:1.1)"
# 映画的な照明と宇宙飛行士を強く、空間は少し弱めて主体を際立たせ、画質関連タグも強調。
コマンドライン実行時の注意点
txt2img.pyなどのスクリプトを直接使う場合、プロンプト内の特殊文字がシェルによって解釈されないよう、適切にクォートで囲む必要があります。
# BashやZshでの実行例(プロンプトをシングルクォートで囲む)
python scripts/txt2img.py
--prompt 'a (magnificent castle:1.4) on a (cloudy mountain peak:1.2), fantasy art, (by greg rutkowski:1.3)'
--ddim_steps 50
--scale 7.5
# WindowsのコマンドプロンプトやPowerShellではダブルクォートを使用(シングルクォートが使えない場合)
python scripts/txt2img.py
--prompt "a (magnificent castle:1.4) on a (cloudy mountain peak:1.2)"
--ddim_steps 50
まとめ・補足情報
Stable Diffusionのプロンプトウェイト構文は、生成画像を精密にコントロールするための最も強力なツールの一つです。習得のコツは「シンプルから始める」ことです。最初は単一の単語に()や[]を適用することから始め、効果を確認しながら、徐々に複雑なグループ化や数値指定に進んでください。
重要な補足事項:
- Attention/Emphasisの仕組み: この構文は、モデルがプロンプトの各トークン(単語片)に割り当てる「注意力」を機械的に調整しています。重みが高すぎると、そのトークンが画像内で過剰に表現されたり、他の要素が消えたりする可能性があります。
- BREAKキーワード: Automatic1111 WebUIなどでは、
BREAKという特殊キーワードを使用してプロンプトの解釈順序を分離できます。これにより、重みの影響範囲をより明確に区切ることが可能です。例:(sunflower:1.5) BREAK (field:0.8) - Alternate Words: 一部のUIでは
[cat|dog]のような構文で、catとdogを一定の割合で混合する高度な表現も可能です。これは上級者向けの機能となります。
プロンプトウェイトは「画像生成のプログラミング言語」のようなものです。正しい構文を身につけ、エラーを恐れずに実験を重ねることで、あなたのイメージを正確に画像として具現化するスキルが確実に向上していくでしょう。