特殊なPrompt指定

Last-modified: 2023-08-27 (日) 00:41:20

プロンプト構文のルールです。
Stable Diffusion web UIにおけるprompt指定方法の詳細な解説です。

プロンプト構文のルール

プロンプトの強弱

語句を( )、[ ]で囲むことでプロンプトの効果を強調、控えめにできます。

(abc)・・・abcへの注目度を1.1倍増加する。→ abcの効果を1.1倍する。
[abc]・・・abcへの注目度を1.1倍減少する。→ abcの効果を1/1.1倍=0.91倍する。

(school uniform:1.2)の様に空白を挟んでいても、括弧で括ってる範囲全部効きます。

 

倍率は数字入力により指定することができます。

(abc:3.12)・・・abcへの注目度を3.12倍増加する。
 

括弧を重ねると、重ねた回数だけ倍になります。

(…:1.10) = (…)
(…:1.21) = ((…))
(…:1.33) = (((…)))
(…:1.46) = ((((…))))
(…:1.61) = (((((…)))))

(…:0.91) = […]
(…:0.83) = [[…]]
(…:0.75) = [[[…]]]
(…:0.68) = [[[[…]]]]
(…:0.62) = [[[[[…]]]]]
 

文章を選択して「Ctrl」+上下キーを押すことで強弱変更できます。

例えば、abcを選択後またはabcを入力後、
「Ctrl+↑」を押す毎に
abc → (abc:1.1) → (abc:1.2) → 以降、0.1倍ずつ増加
「Ctrl+↓」を押す毎に
abc → (abc:0.9)  → (abc:0.8) → 以降、0.1倍ずつ減少
  • 変動量は、Settings→User interfaceで変更可能。

NovelAI用の呪文をStable Diffusion向けに変換する

NovelAI(NAI)のプロンプト強調の記述ルールは、Stable Diffusionと異なります。
匿名としあきの作成した素晴らしいブックマークレットがあるのでそちらを活用しましょう。
リンク⇒スレ閲覧時に便利なブックマークレット2

或いは Extensions からインストールできる novelai-2-local-prompt を使うのも良いかもしれません。

 
NAI手動変換

NAI手動変換

(…:1.0500) {…}
(…:1.1025) {{…}}
(…:1.1576) {{{…}}}
(…:1.2155) {{{{…}}}}
(…:1.2763) {{{{{…}}}}}

(…:0.9524) […]
(…:0.9070) [[…]]
(…:0.8638) [[[…]]]
(…:0.8227) [[[[…]]]]
(…:0.7835) [[[[[…]]]]]

スケジュール構文

指定stepを基準にプロンプトのON/OFFを切り替えることができます。

基本形
 [A:B:数字]
 [from:to:when]を意味する。

TIPS
Q:なぜ()ではなく[ ]を使うの?
A:(abc)と(abc:1.1),[abc]はすでに強調文として使われているかららしい。

詳しいPRはこちら
https://github.com/AUTOMATIC1111/stable-diffusion-webui/wiki/Features#prompt-editing

指定数字が0~1の場合 → 全ステップ数に対する割合で指定

 [A:B:0.5]
 [この語句から:この語句へ:このステップで切り替え]

Sampling Stepsが100の場合
 0~50step   :プロンプトAが適用される
 50~100step:プロンプトBが適用される
 [A:0.5]
 これは[B:A:0.5]のBが省略された形を意味します。

Sampling Stepsが100の場合
 0~50step   :なにもしない
 50~100step:プロンプトAが適用される
 [A::0.5]
 これは[A:B:0.5]のBが省略された形を意味します。

Sampling Stepsが100の場合
 0~50step   :プロンプトAが適用される
 50~100step:なにもしない

指定数字が1以上の整数の場合 → 変化するステップ数を直接指定

step数を直接指定する以外は、上記の割合で指示した場合と考え方は同じです。

例:

Sampling Stepsが100の場合
 [A:10]  =  [A:0.1]  = どちらも10step以降からAが有効
 [A:50]  =  [A:0.5]  = どちらも50step以降からAが有効

使用例

moutainとlake単独で存在するのではなく、moutainの中にlakeが内包する形で出力されやすくなります。先に実行されるプロンプトが絵の概要を生成し、後のプロンプトがディティールとして生成されます。そういった順番のノイズ除去が行われます。

moutain,lake[moutain:lake:20]
スケジュール構文使用例_moutain_lake単独.pngスケジュール構文使用例_[moutain:lake:20].png
山と池が生成される山の中に池が生成される
(平地の部分は大きな低山でしたが、一部が池になりました)

sampling steps : 60 , Seed:1 ,Sampler :Euler a ,512×512pixel,Clip skip 2 , CFG scale:7.5,model:anyloraCheckpoint_bakedvaeFtmseFp16NOT.safetensors

プロンプトの入れ子構造

公式が想定しているスケジュール構文の応用です。
スケジュール構文は、入れ子にして使用することができます。

応用例1

この呪文を見ていきましょう

[[red::0.2]:green:0.8]
上記の式を一般化すると、
[A:B:0.8]
A=[C::0.2]と同義です。

したがって、上記プロンプト構文の生成結果は、

全体の80%まで[red::0.2]
20%を過ぎるまでredが有効

20%を過ぎたらredが消え
そこから次のgreenが80%くらいで入ってくるまで何もなし

0→red→20%→無し→80%→green→100%の流れです。

応用例2

この呪文を見ていきましょう

[(partially [[blue:green:0.2]:red:0.35] hair:1.2):0.1]

上記プロンプト構文の生成結果は、

10%を過ぎた段階でこの呪文の読み込み開始。(それまでは無)
20%くらいまでpartially blue hairの1.2倍に
20%過ぎたらpartially green hairの1.2倍に
35%以降でpartially red hair の1.2倍に
となっています。

スタート→無→10%→partially blue hair 1.2倍→20%→partially green hair 1.2倍→35%→partially red hair 1.2倍→100%終了

うまく使えば、メッシュやインナーカラーに使えるらしい。他には瞳の色など。

複雑なpromptが正常に機能しているかわからなくなったとき

プログラムを書き換えて、プロンプトの実行状況を表示する方法がある。

もっと見る

★プログラムのバックアップを取ってから実行してね
これするともしかしたらgit pull時にerror: Your local changes to the following files would be overwritten by merge:みたいなエラー出るかも↑みて解消
\modules\prompt_parser.pyを開き
60~80行目付近にある文章を編集する。

■変更前

    def get_schedule(prompt):
        tree = parser.parse(prompt)
        return [[t, at_step(t, tree)] for t in collect_steps(steps, tree)]

    promptdict = {prompt: get_schedule(prompt) for prompt in set(prompts)}
    return [promptdict[prompt] for prompt in prompts]


ScheduledPromptConditioning = namedtuple("ScheduledPromptConditioning", ["end_at_step", "cond"])
ScheduledPromptBatch = namedtuple("ScheduledPromptBatch", ["shape", "schedules"]

■変更後

   def get_schedule(prompt):
        tree = parser.parse(prompt)
        return [[t, at_step(t, tree)] for t in collect_steps(steps, tree)]

    res = [get_schedule(prompt) for prompt in prompts]
    for t in res:
        print(t)
    return res


ScheduledPromptConditioning = namedtuple("ScheduledPromptConditioning", ["end_at_step", "cond"])
ScheduledPromptBatch = namedtuple("ScheduledPromptBatch", ["shape", "schedules"]

その状態で生成を実行すると、例えば下記のpromptをSampling Steps100で入れた場合
[(partially [[blue:green:0.2]:red:0.35] hair:1.2):0.1]
コマンドプロンプト上に

[[100, '']]
[[10, ''], [20, '(partially blue hair:1.2)'], [35, '(partially green hair:1.2)'], [100, '(partially red hair:1.2)']]

と表示されます。
ここでは
[Sampling step,'プロンプト']の形式で書かれていますので、
つまり
スタート→無→step10→partially blue hair 1.2倍→step20→partially green hair 1.2倍→step35→partially red hair 1.2倍→step100終了

Sampling Stepsが50の場合には

[[50, '']]
[[5, ''], [10, '(partially blue hair:1.2)'], [17, '(partially green hair:1.2)'], [50, '(partially red hair:1.2)']]

と表示されます。
この場合も上記と同じですが、今回は50が最大なので1%=0.5stepとなります。
よって10%=step5,20%=step10,35%=step17,100%=step50となり
そのため
スタート→無→step5→partially blue hair 1.2倍→step10→partially green hair 1.2倍→step17→partially red hair 1.2倍→step50終了
という意味になります。

Sampling Stepsが20の場合には

[[20, '']]
[[2, ''], [4, '(partially blue hair:1.2)'], [7, '(partially green hair:1.2)'], [20, '(partially red hair:1.2)']]

と表示されます。
この場合最大stepが20で1%=0.2stepのため
10%=step2,20%=step4,35%=step7,100%=step20となります。
スタート→無→step2→partially blue hair 1.2倍→step10→partially green hair 1.2倍→step17→partially red hair 1.2倍→step20終了
という意味になります。

エスケープ処理

\(hogehoge\) とか ¥(hogehoge¥) とかあるのって何?

その \ とか ¥ はエスケープ処理ってやつだ。
例えば1111で toshiaki (futaba), って入力したいとする。
するとfutabaの前後にカッコがあるから、futabaが1.1倍に強調されちゃうよね。
そこで toshiaki \(futaba\), という入力にすることで強調効果を回避できる仕組みが、1111には用意されてる。
このように「特別な意味がある文字や記号を別の文字に置き換えること」をプログラミング界隈ではエスケープ処理と呼ぶ…って庭に来たジュウシマツがゆってた。

AND

補足

  • 2022/10/06より追加された機能
  • サンプラーによってはAND構文は使えないことがある。
    • Euler aは対応済み。DDIM, PLMS and UniPCは1111のVer.1.6.0で対応した*1
  • AND文を使用すると生成に通常より時間がかかります。
    本来呪文は75token(AIの認識できる75個の言葉まで)ですが、AND以降はまた文字カウントがリセットになります。

BREAK

  • BREAKは1111で利用できる特殊なキーワード。
    公式wikiにごく短い説明がある。
  • breakではなくBREAK
  • BREAKを入力すると75トークンまで空のトークンまで自動的に埋めて、次の区切りに移行する。
    つまり、BREAKを境界として、お互いの干渉を起こしにくくする。
    例えば色移りの防止などに利用できる。

注意点

BREAKの使用例

240 無念 Name としあき 23/02/19(日)16:24:46 ID:qLW8bEds No.1068513211 del そうだねx6

>AND構文とBREAK構文の違いがわからない

白い猫BREAK黒い犬

 →白い猫と黒い犬が描かれる