問題の概要:プロンプトウェイト構文のエラーと意図しない生成結果
Stable Diffusionで画像生成を行う際、プロンプト(指示文)に特定のキーワードの強弱を付けたい場面は多々あります。例えば、「赤いドレスを着た女性」というプロンプトで、ドレスは赤くしてほしいが、女性の髪や背景まで赤く染まってしまう、あるいは「(cat:1.2) and dog」のような構文を使ったらSyntaxError: invalid syntaxやUnexpected tokenといったエラーが発生し、画像が生成できないといった経験はないでしょうか。
これらの問題は、プロンプトウェイト(重み付け)構文の理解不足や、使用するWeb UI(AUTOMATIC1111、ComfyUI等)やスクリプトによる実装の違いが原因で発生します。本記事では、プロンプトウェイト構文の基本から応用、そして発生するエラーの解決法までを完全ガイドします。
原因の解説:構文の違いとパーサーの仕様
プロンプトウェイト構文でエラーや意図しない結果が生じる主な原因は以下の3つです。
1. UI/バックエンドによる構文の違い
Stable Diffusionのフロントエンドによって、サポートされているウェイト構文が異なります。AUTOMATIC1111のWebUIで使える(keyword:1.3)という構文が、別のUIや直接diffusersライブラリを叩くスクリプトでは解釈されないことがあります。
2. 構文のパースエラー
括弧のネストが深すぎる、閉じ括弧がない、コロンの後に数字がないなど、文法が不正な場合にパーサーがエラーを吐きます。例えば、((cat:1.5)(括弧が閉じられていない)や(cat:)(ウェイト値がない)は典型的なエラー例です。
3. ウェイト値の極端な指定による不安定さ
特定の要素に極端に高いウェイト(例: (cat:2.5))を設定したり、ネガティブプロンプトに極端に低いウェイト(例: (blurry:-1.5))を設定すると、画像の構成が崩壊したり、意味のないノイズのような画像が生成されることがあります。これはモデルが極端な指示を適切に解釈できないためです。
解決方法:ステップバイステップで構文をマスターする
ステップ1:基本構文の理解と確認
まず、使用しているUIがどの構文をサポートしているか確認します。最も一般的なのは以下の2種類です。
- 括弧とコロンによる明示的指定:
(keyword:weight)(例:(cat:1.3)) - 括弧の多重度による強調/減衰:
(keyword)で1.1倍、((keyword))で1.1^2=1.21倍。[keyword]で0.9倍。
AUTOMATIC1111 WebUIでは両方とも使用可能です。コマンドラインやカスタムスクリプトでは、diffusersライブラリのデフォルトでは後者の括弧方式のみを解釈する場合が多いです。
ステップ2:エラー構文の修正
エラーメッセージに基づいて、以下のように修正します。
エラー例1: スクリプト実行時に ValueError: too many values to unpack が出る。
# エラーが起きる可能性のあるコード例(diffusersライブラリ使用)
prompt = "a (cat:1.5) on a mat"
# 修正: diffusersのデフォルトパーサーは `(cat:1.5)` を解釈しない。
prompt = "a (cat) on a mat" # 括弧方式に変更
# または、Compelなどの特殊なパーサーライブラリを導入する。
エラー例2: WebUIで SyntaxError in prompt と表示される。
# 誤った構文
prompt = "a ((cat:1.2) on a mat" # 括弧の対応が取れていない
# 正しい構文
prompt = "a (cat:1.2) on a mat" # 括弧を閉じる
# または
prompt = "a ((cat)) on a mat" # 括弧の多重度を使用
ステップ3:効果的なウェイト調整の実践
ウェイトは微調整が肝心です。1.1から1.5の範囲で調整するのが安全です。ネガティブプロンプトでは、(keyword:0.8)のように1以下の値でその要素を弱めます。
# 良い例: バランスの取れた調整
Positive Prompt: "portrait of a (woman:1.2) with (red hair:1.3), wearing a (black leather jacket:1.4), detailed eyes, studio lighting"
Negative Prompt: "(blurry:0.8), (deformed:1.2), (bad anatomy:1.1)"
# 悪い例: 極端な値は避ける
Positive Prompt: "portrait of a (woman:3.0) with (red hair:0.1)" # 人物は極端に強調、髪はほぼ無視→不自然な画像になる
ステップ4:高度な構文と代替手法
複雑な調整には、AND 演算子やブレンディングが有効です。
# AUTOMATIC1111 WebUI での AND 演算子とウェイトの組み合わせ
prompt = "(cat:1.2) AND (dog:1.1) on a meadow"
# これは「猫」と「犬」を別々の概念として扱い、それぞれにウェイトを適用します。
# ブレンディング(時間軸に沿ったプロンプト変更)の例(WebUIのスケジューラー使用)
[cat:dog:0.3] on a meadow
# これは生成プロセスの最初の30%は「cat」、残りは「dog」をプロンプトとして使用することを意味します。
コード例・コマンド例
diffusersライブラリで明示的ウェイト構文を使う方法
diffusersライブラリの標準StableDiffusionPipelineは(cat:1.5)構文をサポートしていません。サポートするには、Compelのようなプロンプト重み付けパーサーを組み合わせます。
from diffusers import StableDiffusionPipeline
import torch
from compel import Compel
pipe = StableDiffusionPipeline.from_pretrained("runwayml/stable-diffusion-v1-5", torch_dtype=torch.float16).to("cuda")
compel = Compel(tokenizer=pipe.tokenizer, text_encoder=pipe.text_encoder)
# Compelを使ったプロンプトのエンコード
prompt = "a (beautiful cat:1.3) on a (wooden table:0.9)"
conditioning = compel.build_conditioning_tensor(prompt)
negative_prompt = "blurry, ugly"
negative_conditioning = compel.build_conditioning_tensor(negative_prompt)
# 画像生成
image = pipe(prompt_embeds=conditioning, negative_prompt_embeds=negative_conditioning, height=512, width=512).images[0]
image.save("weighted_cat.png")
AUTOMATIC1111 WebUIのAPIを叩く例
import requests
import json
url = "http://127.0.0.1:7860/sdapi/v1/txt2img"
payload = {
"prompt": "masterpiece, best quality, 1girl, (crimson red dress:1.4), (in a library:1.2)",
"negative_prompt": "(low quality, worst quality:1.3), (blurry:0.8)",
"steps": 20,
"cfg_scale": 7,
"width": 512,
"height": 768,
"sampler_name": "Euler a",
}
response = requests.post(url, json=payload)
r = response.json()
# 画像データを保存
import base64
from PIL import Image
import io
image_data = base64.b64decode(r['images'][0])
image = Image.open(io.BytesIO(image_data))
image.save("output.png")
まとめ・補足情報
プロンプトウェイトはStable Diffusionの表現力を飛躍的に高める強力なツールですが、そのパワーを引き出すには「使用環境の確認」「基本構文の正確な理解」「値の調整は慎重に」の3原則が不可欠です。
主要ポイントのまとめ:
- 環境確認: 使っているUI/ライブラリがどの構文をサポートしているか最初に確認する。
- エラー対応: エラーはほとんどが括弧の対応ミスや未サポート構文。メッセージをよく読む。
- 調整のコツ: ウェイト値は1.0から±0.5の範囲で微調整から始める。ネガティブプロンプトの強すぎる抑制(例: -1.0以下)は逆効果になりがち。
- 代替手段: 単一プロンプト内でのウェイト調整が難しい場合は、
AND演算子やImg2Imgを活用したブレンディング、複数回の生成と合成を検討する。
プロンプトエンジニアリングは試行錯誤の連続です。本ガイドを参考に、様々なウェイト値を試して、思い通りの画像生成を実現してください。また、新しいUIやカスタムスクリプトを使用する際は、そのドキュメントでプロンプトパーサーの仕様を必ず確認する習慣をつけましょう。