ComfyUI-Custom-ScriptsのPlaySound🐍ノードで「on empty queue」モードが使えたり使えなかったりするのを解消する
導入方法
- ComfyUI\custom_nodes\ComfyUI-Custom-Scripts\web\js\playSound.js を下記のコードに変更してComfyUIを再起動
- これで、PlaySound ノードの mode を "on empty queue" に設定すると、最後のキューのみ音が鳴る。(はず)
プランA
AIによるコードの解説
- playSound(node) 関数の分離: 音を鳴らすロジックを独立した関数にしました。これによりコードが読みやすくなり、always モードと on empty queue モードの両方から呼び出せるようになりました。
- onExecuted のオーバーライド:
- const mode = this.widgets[0].value; で、ノードのドロップダウンメニューで選択された値("always" または "on empty queue")を取得します。
- if (mode === "always") の場合は、従来通り無条件で playSound(this) を呼び出します。
- キューのチェックロジック (on empty queue モード):
- const api_url = new URL("/queue", window.location.origin);: window.location.origin (例: http://127.0.0.1:8188) を使って、APIのURLを動的に生成します。これにより、ComfyUIを異なるアドレスやポートで起動しても正しく動作します。
- await fetch(api_url): 生成したURLに対して fetch APIでリクエストを送信します。
- const queueData = await response.json();: レスポンスをJSONとして解析します。
- if (queueData.queue_pending.length === 0): 取得したデータの中から queue_pending 配列の長さをチェックし、0(空)であれば、playSound(this) を呼び出して音を鳴らします。
- try...catch: fetch が失敗した場合(サーバーがオフラインなど)にコンソールにエラーを出力し、スクリプト全体が停止するのを防ぎます。
プランB(別方式)
- PlaySoundノードの処理が完了します。
- on empty queueが設定されているか確認します。
- 設定されている場合、その瞬間のapp.ui.lastQueueSizeの値を見ます。
- もし値が 2 以上なら、「まだ後ろにタスクが控えている」と判断し、returnで即座に処理を中断します。音は鳴りません。
- もし値が 1 または 0 なら、このif文の条件(> 1)には当てはまらないため、処理は中断されずにそのまま下の音声再生コードに進みます。そして音が鳴ります。