ComfyUI-PromptRandomChoice
実行のたびに「プロンプトガチャ」を爆速で回す、超軽量なランダム選択ノードじゃ!
「背景や天気を適当に変えて、一晩中回しておきたいのう……」
そんなおぬしの願いを、実行時間 0.010s(注:作者環境で速いとき)という瞬速の魔法で叶えて進ぜよう!
背景・時間帯・天気などを別々にランダム化したい時に便利じゃ。
フロー内に複数個置いても、それぞれ独立して動くぞ。
特徴
-
実行ごとにランダム選択
- キューを雑に100件積んでも、毎回候補を選び直すぞ。
-
区切りは
|または実際の改行|と改行の両方を区切りとして扱うので、混在していても動くぞ。- 区切り文字が連続して出現した場合は、候補から取り除かれることに注意じゃ。
- 明示的に空白文字列を候補として返却させたい場合は、明示的に
()と指定するのじゃ。
- 明示的に空白文字列を候補として返却させたい場合は、明示的に
-
候補の前後の
,と空白を自動で整理town,coffee shop,castle, fortress,のような書き方でも大丈夫じゃ。
-
現在の選択結果をタイトル表示
- 実行時にノードタイトルが
Choice: coffee shopのように更新されるぞ。 - KSamplerのプレビューと見比べやすいのじゃ。
- 実行時にノードタイトルが
-
複数設置に対応
- 背景用、時間帯用、天気用など、複数ノードを置いてそれぞれ別々に使えるぞ。
-
ファイル名向けの返り値
- ファイル名向けに安全化した文字列
selected_text_safeを出力するのじゃ。
- ファイル名向けに安全化した文字列
-
明示的な空候補
()に対応()が選ばれた場合、プロンプト向け出力は空文字に、ファイル名向け出力はemptyになるのじゃ。
導入方法
ComfyUIの custom_nodes ディレクトリで、以下のコマンドを打ち込むのじゃ!
git clone https://github.com/ruminar/ComfyUI-PromptRandomChoice.git
使い方
Prompt Random Choiceノードを置くoptions_textに候補を入れる (入力例を参照)- 必要に応じて
change_everyを選ぶ (NEW) selected_textをJoin String Multiなどの文字列結合ノードへ繋ぎ、ポジティブプロンプトへ足す- キューを好きなだけ積む
入力例
改行区切り (改行前の,は任意です)
town,
girl's room,
park,
lake,
flower garden,
castle, fortress,
forest,
grasslands,
sea,
snowy landscape,
mountain,
flower field,
starry sky,
coffee shop,
| 区切り
town|
girl's room|
park|
lake|
flower garden|
castle, fortress|
forest|
grasslands|
sea|
snowy landscape|
mountain|
flower field|
starry sky|
coffee shop|
何も追加しない候補
() は明示的な空候補として扱われます。
()|(full body:0.9)
この例では、何も追加しない場合と、(full body:0.9) を追加する場合をランダムに切り替えられます。
選ばれやすさを調整したい場合
同じ候補を複数回書けば、そのぶん選ばれやすくなります。
day|day|day|sunset|night
昼を多めに出したい、たまに夕方や夜も混ぜたい、という時に便利じゃ。
仕様
|または実際の改行で分割\nという文字列は区切りとして扱わない- 各候補の前後の空白と
,を trim - 空候補は無視
()は明示的な空候補として扱うchange_everyが 1 なら毎回選び直すchange_everyが 2 以上なら、その回数ぶん同じ候補を維持する- 実行時にタイトルへ
Choice: lakeやChoice: (empty) (2/3)のように表示する
出力
-
selected_text
trim後の選択文字列です。
()が選ばれた場合は空文字""になります。 -
selected_text_safe
ファイル名向けに安全化した出力です。
selected_textが空ならemptyを返します。
標準選択記法 {day|night|morning} との違いについて
-
ComfyUI標準にも、プロンプト候補をランダムに切り替える構文として
{a|b|c}記法があります。
この記法は、CLIP Text Encodeでプロンプトが処理される段階で解決されます。 -
一方、
PromptRandomChoiceはその前段で候補を1つに確定し、選ばれた文字列だけを通常のSTRINGとして出力します。
そのため、選ばれなかった候補は下流へ流れません。- この性質により、選択候補の中にLoRAのトリガーワードをより安全に含めることもできます。
選ばれた候補だけが後続ノードへ渡されるため、標準の{a|b|c}記法よりも、候補の確定状態をワークフロー上で明示しやすくなります。- ※ ただし、LoRA自体のロードON/OFFを切り替えるものではありません。
ここでいう安全性は、選ばれなかったトリガーワード文字列が下流へ流れない、という意味です。
- ※ ただし、LoRA自体のロードON/OFFを切り替えるものではありません。
- この性質により、選択候補の中にLoRAのトリガーワードをより安全に含めることもできます。
-
区切り文字は、標準の
{a|b|c}記法と同じ|を使えます。
そのため、標準記法から{}の中身を抜き出してPromptRandomChoiceに持ってきたり、逆にPromptRandomChoiceの中身を{}で括ってプロンプト文字列へ戻したりできます。
出入り自由です。 -
また、画像生成の比較では、1回ごとにプロンプト候補が変わると、差分を判断しづらい場合があります。
PromptRandomChoiceではchange_everyを使うことで、同じ候補を数回維持してから次の候補へ切り替えることができます。 -
さらに、
PromptRandomChoiceの段階で確定した候補はノードタイトルに表示されます。- KSamplerのプレビューと見比べながら、現在どの候補が使われているかを確認できます。
change_every指定時には、Choice: lake (2/3)のように進捗も表示されます。
ライセンス
GPL-3.0(ComfyUI本体の掟に従っておるぞ!)