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

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


# Stable Diffusionとは

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

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

https://qiita.com/phyblas/items/00f750b8277f66fb9b13

ただしその記事では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については割愛しますが、これら動画はおすすめです。私も最初はこの動画から学んできました。

https://www.youtube.com/watch?v=6glVXdqenIA

https://www.youtube.com/watch?v=wiYYIZFlvcI

https://www.youtube.com/watch?v=VO8LPeY2Djo

https://www.youtube.com/watch?v=6V9Uqft96tk

以下は既にComfyUI及び[ComfyUI Manager](https://github.com/ltdrdata/ComfyUI-Manager)をインストールしたという前提で説明していきます。


# GUIの日本語化

まずはComfyUIの表示を日本語にする方法です。これは[AIGODLIKE-COMFYUI-TRANSLATION](https://github.com/AIGODLIKE/AIGODLIKE-COMFYUI-TRANSLATION)というプラグインでできます。

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

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

![comfyui01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202903/7266bbed-e62c-9027-3f0c-f35c9fa5bdca.png)

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

![comfyui02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202903/9f6c9842-06fc-1ae7-788b-f585f6dc7bcd.png)

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

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

![comfyui03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202903/48329371-acd6-3045-da9d-49c67e65d4b5.png)

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


# AlekPetで自動翻訳プロンプト

## インストール

次は本題である、日本語のプロンプトを入力することができるようにする方法です。これは[AlekPet](https://github.com/AlekPet/ComfyUI_Custom_Nodes_AlekPet)というプラグインでできます。

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

![comfyui04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202903/2398f5f4-3258-11e3-0b94-98588e241dbd.png)

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


## ノードの作成

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

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

![comfyui05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202903/ae5d7afa-58dd-fac9-46e2-0074fb48fff9.png)

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

![comfyui06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202903/3dfb8a3c-3755-8489-6d97-107bac34aabd.png)

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

![comfyui07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202903/23b5eea3-498d-36e9-5dfc-2d7088f4d54f.png)


## 生成してみよう

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

https://civitai.com/models/93191?modelVersionId=130630

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

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

![comfyui08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202903/19aaebf9-746f-0c36-0cd0-a6e423431533.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で公開されています。

https://civitai.com/models/108723/comfyui-sdxl-japanese-ver

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

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

しかし[UltimateSDUpscale](https://github.com/ssitu/ComfyUI_UltimateSDUpscale)というノードがないという表記が出てきてしまいます。

![comfyui09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202903/7670b2e0-6a6a-6027-114f-93853868869e.png)

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

![comfyui10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202903/84eaced8-7c32-071a-a062-72623fef5c9a.png)


## 複雑なノード

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

![comfyui11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202903/dc865018-195d-2c32-3229-8e34f0af6791.png)

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

![comfyui12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202903/c47ac60c-0f44-f6b8-f6f1-aeea7fd71ed7.png)

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

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

![comfyui13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202903/12878300-8274-4194-4674-ba725850d49c.png)

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

![comfyui14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202903/5c164f9f-3f60-0fe1-d7ba-c573e343f832.png)

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

https://civitai.com/models/119012/bluepencil-xl

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

![comfyui15.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202903/cb7acf3c-0ae3-8be5-1a84-58d6bf457b3a.jpeg)

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

一応ちゃんと指のことをネガティブプロンプトで指定しているのに、やはり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"
  }
}
```

# 参考＆もっと読む

- [ComfyUI 解説](https://comfyui.creamlab.net/)
- [🦊雑に学ぶComfyUI](https://scrapbox.io/work4ai/🦊雑に学ぶComfyUI)
- [【初心者向け】ComfyUIをインストールする3つの方法](https://sorenuts.jp/7107/)
- [【ComfyUI】無料かつ無制限で画像を生成できるAIツール！使い方と注意点を徹底解説](https://weel.co.jp/media/innovator/comfyui/)
- [ComfyUIの導入方法・使い方！画像生成をもっと快適にしよう！](https://romptn.com/article/34122)
- [【手トリ】ComfyUI の導入と基本解説【足トリ】](https://note.com/hcanadli12345/n/nc3b95d3e1764)
- [comfyui　日本語でプロンプトを入力するノード](https://note.com/fine_pansy244/n/n7ba8e0a18f24)
- [ComfyUIでまとめて画像加工する](https://note.com/closer0502/n/nfcb7e7ae09fa)
- [コピペで始める ComfyUI 導入](https://qiita.com/alisan802/items/f40206562ecda34d1e9b)
- [WindowsPC に Stable Diffusion ComfyUI をインストールする方法](https://qiita.com/zono_0/items/ea370c24a34284e07d03)
- [ComfyUI・SDXL・AnimateDiffの高解像度・高フレームレートの動画作成](https://qiita.com/kongo-jun/items/0478a9961ebfc90df7fe)
- [Comfy UIインストールとサンプル作成](https://qiita.com/amano-kiyoyuki/items/3d98d7222c28f9fab4c1)
- [ComfyUIをApple M1で試してみる](https://qiita.com/TaitoOtani/items/be2298582e8e0b5d1a32)
- [3分越えの戦闘アニメ作画を生成AIで制作する方法 (ComfyUI)](https://qiita.com/ontokyo/items/b89b669bd7526f885d17)
- [Stable Diffusion 3 mediumをローカルで動かすまで](https://qiita.com/supertnk48/items/7c468f42ae7c5698abd3)
- [RadeonでkritaAIを動かす備忘録](https://qiita.com/hikisari/items/bae429cd530606324041)