8
4
生成AIに関する記事を書こう!
Qiita Engineer Festa20242024年7月17日まで開催中!

ComfyUIで日本語プロンプトを入力して画像生成してみよう

Last updated at Posted at 2024-06-30

この記事ではComfyUIを通じてStable Diffusionを使う時に日本語プロンプトで画像生成できるようにする方法について説明します。

Stable Diffusionとは

Stable Diffusionは画像生成AIの一つです。完全無料で思い通りに画像もビデオも生成できるから有名です。

私がStable Diffusionの入門の記事を書きましたので、これを読んでいただけたら嬉しいです。

ただしその記事ではdiffusersというPythonライブラリーを使うという方法ですが、今回はそれと違ってComfyUIというGUIでStable Diffusionを使う方法に関する内容になります。

Stable Diffusionを使う時に普段「プロンプト」という呪文を書いて欲しいものを記述する必要がありますね。でもそのプロンプトは基本的に英語で書かなければならないのです。それはやはりちょっとしんどいですね。

だから私は入門の記事でも最後にdiffusersで日本語のプロンプトが使えるようにする方法について紹介しましたが、今回はComfyUIを使う場合の説明となります。

ComfyUIとは

ComfyUIはStable Diffusionを使うためのGUIの一つです。Stable Diffusionの各部品をノードとして扱って初心者にとって最初は複雑に見えるけど、ちゃんと理解して使いこなせたら便利に感じて、人気のAUTOMATIC1111 Stable Diffusion web UIよりも使い勝手がいいと評価されています。

ComfyUIの入門はQiitaではまだないですが、youtubeなどでは沢山紹介されています。

ここではComfyUIについては割愛しますが、これら動画はおすすめです。私も最初はこの動画から学んできました。

以下は既にComfyUI及びComfyUI Managerをインストールしたという前提で説明していきます。

GUIの日本語化

まずはComfyUIの表示を日本語にする方法です。これはAIGODLIKE-COMFYUI-TRANSLATIONというプラグインでできます。

ただし正直翻訳がいまいちだったりおかしかったりなぜか一部中国語になったりするから、使っていたら違和感があります。それでも使ってみますね。

ComfyUI Managerで検索してインストールします。

comfyui01.png

そして右上の歯車をクリックして設定に入ってAGLTranslation-langualge(なぜかスペルミスってる!?)の項目で日本語を選択します。

comfyui02.png

これで色々日本語になります。

デフォルトのノードを読み込んでみたら表記も日本語になっています。ただしやっぱり中途半端って感じです。

comfyui03.png

とりあえずこうやって日本語化ができました。

AlekPetで自動翻訳プロンプト

インストール

次は本題である、日本語のプロンプトを入力することができるようにする方法です。これはAlekPetというプラグインでできます。

まずはComfyUI Managerで検索してインストールします。

comfyui04.png

インストールが終わったら次は新しいノードが使えるようになります。

ノードの作成

このプラグインは色んな機能が付いていますが、今回使うのは翻訳のための機能です。

ダブルクリックして「deep」などでノードを検索してDeepTranslatorCLIPTextEncodeNodeを選択します。なお日本語化のおかげでノードの名前も翻訳されているようですが、なんかおかしい気もします。

comfyui05.png

又は右クリックしてメニューから選択することもできます。

comfyui06.png

作成したら日本語から英語に翻訳すると設定します。

comfyui07.png

生成してみよう

では次は使ってみましょう。まずチェックポイントモデルも決めておきます。今回はアニメ風モデルのCOCOtiFaCuteを使いたいと思います。

プロンプトとネガティブプロンプトに使っていたデフォルトのCLIPTextEncodeのところの代わりに新しく作ったDeepTranslatorCLIPTextEncodeNodeを入れます。

接続を入れ替えたらキュープロンプトボタンを押して生成を開始します。

comfyui08.png

結果は日本語で書いた通りに生成されて成功です。

jsonワークフロー

今後使うために以上ノードを入れ替えた後のワークフローを.jsonファイルとして保存しておいたので、ここにも載せておきます。これをコピーして保存してComfyUIの画面に投げたらすぐ使えます。

workflow.json
{
  "1": {
    "inputs": {
      "ckpt_name": "cocotifacute_v20.safetensors"
    },
    "class_type": "CheckpointLoaderSimple"
  },
  "2": {
    "inputs": {
      "width": 512,
      "height": 512,
      "batch_size": 1
    },
    "class_type": "EmptyLatentImage"
  },
  "3": {
    "inputs": {
      "from_translate": "japanese",
      "to_translate": "english",
      "add_proxies": false,
      "service": "GoogleTranslator",
      "text": "日本のお城を背景とする庭園の中に座っている和服の紫髪狐耳少女",
      "clip": ["1", 1]
    },
    "class_type": "DeepTranslatorCLIPTextEncodeNode"
  },
  "4": {
    "inputs": {
      "from_translate": "japanese",
      "to_translate": "english",
      "add_proxies": false,
      "service": "GoogleTranslator",
      "text": "低品質、ブス",
      "clip": ["1", 1]
    },
    "class_type": "DeepTranslatorCLIPTextEncodeNode"
  },
  "5": {
    "inputs": {
      "seed": 666666,
      "steps": 20,
      "cfg": 8,
      "sampler_name": "euler",
      "scheduler": "normal",
      "denoise": 1,
      "model": ["1", 0],
      "positive": ["3", 0],
      "negative": ["4", 0],
      "latent_image": ["2", 0]
    },
    "class_type": "KSampler"
  },
  "6": {
    "inputs": {
      "samples": ["5", 0],
      "vae": ["1", 2]
    },
    "class_type": "VAEDecode"
  },
  "7": {
    "inputs": {
      "filename_prefix": "ComfyUI",
      "images": ["6", 0]
    },
    "class_type": "SaveImage"
  }
}

SDXL+refinerのワークフロー

ワークフローのダウンロード

SDXLモデルを使って高品質で大きい画像を生成するためのこのワークフローがcivitaiで公開されています。

このワークフローについて紹介して日本語プロンプトで入力できるように書き換える方法も説明します。

このリンクでワークフローをダウンロードしてComfyUIにドラッグしてみます。

しかしUltimateSDUpscaleというノードがないという表記が出てきてしまいます。

comfyui09.png

そうなると又ComfyUI Managerを開いてインストールすればいいです。

comfyui10.png

複雑なノード

ノードをインストールした後、漸く全部のワークフローが表示できるようになります。全体を見たらこれはかなり複雑ですね。

comfyui11.png

他の部分については割愛しますが、ここで注目して欲しいのはプロンプトを入れる部分です。3つありますね。下の赤の方がネガティブプロンプトですが、上の緑は普段のプロンプトです。左の方は欲しいものを長文で表記するところであり、右の方は追加条件です。

comfyui12.png

日本語のプロンプトが使えるようにノードを入れ替える

これを自動翻訳のノードに入れ替えます。ただし今回使うのはDeepTranslatorCLIPTextEncodeNodeではなく、DeepTranslatorTextNodeの方です。殆ど似ていますが、DeepTranslatorTextNodeは入力の接続がなく、出力しかないのです。

comfyui13.png

これをもとのPrimitiveNodeに入れ替えます。

comfyui14.png

そしてこのように書いて生成してみます。今回使うモデルはblue_pencil-XLにします。

するとこのような可愛い少女ができます。

comfyui15.jpg

書いた通りの綺麗な画像ができましたね。因みに指が上手くいかない可能性が高いです。実は私は何回もやり直して漸く指が崩壊しない画像ができました。

一応ちゃんと指のことをネガティブプロンプトで指定しているのに、やはりAIは指を描くのが苦手なので上手くいくかどうかは結局ガチャです。後で直してもいいですが、これは別の話ですね。

jsonワークフロー

改善した後のこのワークフローもここに載せておきます。

workflow_sdxl.json
{
  "1": {
    "inputs": {
      "ckpt_name": "sdxl_refiner_pruned_no-ema.safetensors"
    },
    "class_type": "CheckpointLoaderSimple"
  },
  "2": {
    "inputs": {
      "ckpt_name": "bluePencilXL_v700.safetensors"
    },
    "class_type": "CheckpointLoaderSimple"
  },
  "3": {
    "inputs": {
      "width": 1024,
      "height": 1024,
      "batch_size": 1
    },
    "class_type": "EmptyLatentImage"
  },
  "4": {
    "inputs": {
      "from_translate": "japanese",
      "to_translate": "english",
      "add_proxies": false,
      "service": "GoogleTranslator",
      "text": "春の神社の桜の木の下でカメラを持ってこっちに向いて恥ずかしそうな顔をしている銀髪狐耳巫女"
    },
    "class_type": "DeepTranslatorTextNode"
  },
  "5": {
    "inputs": {
      "from_translate": "japanese",
      "to_translate": "english",
      "add_proxies": false,
      "service": "GoogleTranslator",
      "text": "傑作、高品質"
    },
    "class_type": "DeepTranslatorTextNode"
  },
  "6": {
    "inputs": {
      "from_translate": "japanese",
      "to_translate": "english",
      "add_proxies": false,
      "service": "GoogleTranslator",
      "text": "低品質、ブス、悪い指、悪い手、指が足りない"
    },
    "class_type": "DeepTranslatorTextNode"
  },
  "7": {
    "inputs": {
      "model_name": "4x-UltraSharp.pth"
    },
    "class_type": "UpscaleModelLoader"
  },
  "9": {
    "inputs": {
      "ascore": 6,
      "width": 4096,
      "height": 4096,
      "text": ["4", 0],
      "clip": ["1", 1]
    },
    "class_type": "CLIPTextEncodeSDXLRefiner"
  },
  "10": {
    "inputs": {
      "width": 4096,
      "height": 4096,
      "crop_w": 0,
      "crop_h": 0,
      "target_width": 4096,
      "target_height": 4096,
      "text_g": ["4", 0],
      "text_l": ["5", 0],
      "clip": ["2", 1]
    },
    "class_type": "CLIPTextEncodeSDXL"
  },
  "11": {
    "inputs": {
      "ascore": 1,
      "width": 4096,
      "height": 4096,
      "text": ["6", 0],
      "clip": ["1", 1]
    },
    "class_type": "CLIPTextEncodeSDXLRefiner"
  },
  "12": {
    "inputs": {
      "width": 4096,
      "height": 4096,
      "crop_w": 0,
      "crop_h": 0,
      "target_width": 4096,
      "target_height": 4096,
      "text_g": ["6", 0],
      "text_l": ["6", 0],
      "clip": ["2", 1]
    },
    "class_type": "CLIPTextEncodeSDXL"
  },
  "13": {
    "inputs": {
      "add_noise": "enable",
      "noise_seed": 174231105089235,
      "steps": 20,
      "cfg": 7.5,
      "sampler_name": "ddim",
      "scheduler": "ddim_uniform",
      "start_at_step": 0,
      "end_at_step": 13,
      "return_with_leftover_noise": "enable",
      "model": ["2", 0],
      "positive": ["10", 0],
      "negative": ["12", 0],
      "latent_image": ["3", 0]
    },
    "class_type": "KSamplerAdvanced"
  },
  "14": {
    "inputs": {
      "add_noise": "disable",
      "noise_seed": 872213832759731,
      "steps": 20,
      "cfg": 8.8,
      "sampler_name": "ddim",
      "scheduler": "ddim_uniform",
      "start_at_step": 13,
      "end_at_step": 20,
      "return_with_leftover_noise": "disable",
      "model": ["1", 0],
      "positive": ["9", 0],
      "negative": ["11", 0],
      "latent_image": ["13", 0]
    },
    "class_type": "KSamplerAdvanced"
  },
  "15": {
    "inputs": {
      "samples": ["14", 0],
      "vae": ["1", 2]
    },
    "class_type": "VAEDecode"
  },
  "16": {
    "inputs": {
      "filename_prefix": "Refiner",
      "images": ["15", 0]
    },
    "class_type": "SaveImage"
  },
  "17": {
    "inputs": {
      "upscale_by": 2,
      "seed": 813407484989940,
      "steps": 20,
      "cfg": 7.5,
      "sampler_name": "ddim",
      "scheduler": "ddim_uniform",
      "denoise": 0.08,
      "mode_type": "Linear",
      "tile_width": 512,
      "tile_height": 512,
      "mask_blur": 8,
      "tile_padding": 32,
      "seam_fix_mode": "None",
      "seam_fix_denoise": 1,
      "seam_fix_width": 64,
      "seam_fix_mask_blur": 8,
      "seam_fix_padding": 16,
      "force_uniform_tiles": true,
      "tiled_decode": false,
      "image": ["15", 0],
      "model": ["1", 0],
      "positive": ["9", 0],
      "negative": ["11", 0],
      "vae": ["1", 2],
      "upscale_model": ["7", 0]
    },
    "class_type": "UltimateSDUpscale"
  },
  "18": {
    "inputs": {
      "filename_prefix": "Upscaled",
      "images": ["17", 0]
    },
    "class_type": "SaveImage"
  }
}

参考&もっと読む

8
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
4