ComfyUI Text Replace 프롬프트를 원하는대로 단어만 바꾸기

ComfyUI는 마치 프로그래밍을 하듯 여러 노드의 기능을 조합해 특정 조건에 부합하는 특정 작업을 마음대로 만들어낼 수 있습니다. 오늘은 ComfyUI에서 Text Replace, 즉, 프롬프트 내에서 특정 단어를 다른 단어로 치환하는 방법에 대해 살펴보고자 합니다.

준비사항

사실 Text Replace 자체는 매우 간단히 구성할 수 있지만, 실제로 이 기능을 사용하기 위해서는 ComfyUI 기본 노드에는 없는 기능을 사용해야 합니다. 본문에서는 아래 3개의 커스텀 노드를 설치하고 함께 조합하여 사용하고자 합니다.

직접 깃 클론으로 설치하거나, ComfyUI Manager를 이용해 검색 및 설치를 진행하면 됩니다. 커스텀노드 설치 방법에 대해 익숙하지 않은 분들께서는 아래 글을 참고해주시기 바랍니다.

Text Replace 워크플로우 구성

소개드린 3개의 커스텀 노드를 모두 설치하셨다면, 아래와 같이 간단한 워크플로우를 구성해봅니다.

Text Replace 워크플로우 구성

위 워크플로우를 구성하는 각 노드의 역할을 각각 살펴보면 다음과 같습니다.

  • SDXL Prompt Styler : 프롬프트를 작성하고, 필요시 스타일 프롬프트를 추가함
  • Text Find and Replace : 입력한 텍스트에서 사용자가 지정한 특정 단어(find)를 다른 특정단어(replace)로 치환하여 출력함
  • Show Text : 입력된 텍스트를 시각적으로 보여줌

SDXL Prompt Styler에는 “A girl is standing in front of the door”라는 프롬프트를 작성하고, Text Find and Replace 노드에서는 find 값에 “girl”replace 값에 “boy”를 작성했습니다.이 상태로 Queue Prompt 버튼을 눌러 워크플로우를 실행하면 Show Text 노드에 “A boy is standing in front of the door”라는 결과 텍스트가 작성됩니다. 즉, 우리가 작성한 프롬프트 중 “girl”이란 단어가 “boy”로 치환된 것입니다.

Prompt Style과 함께 Text Replace 사용하기

위에서는 base style, 즉, 사용자의 프롬프트 자체를 그대로 사용했지만, 이번에는 Prompt Styler의 도움을 받아 스타일 프롬프트가 적용된 상태에서 특정 단어를 치환하는 작업을 해보겠습니다. 사용자가 입력한 프롬프트에 추가적인 스타일을 덧붙여주는 SDXL Prompt Styler 노드에 대해 조금 더 자세한 정보가 필요하신 분들은 아래 글을 참고하시기 바랍니다.

워크플로우 구성은 위와 동일하지만, 프롬프트 스타일러의 설정값 중 스타일 부분을 sai-photographic으로 바꿔보겠습니다.

Text Replace 워크플로우 예시 01

스타일을 바꾼 뒤 바로 Queue Prompt를 실행하면 위와 같은 결과를 얻을 수 있습니다.

“Cinematic photo A boy is standing in front of the door, . 35mm photograph, film, bokeh, professional, 4k, highly detailed”

“Cinematic photo A boy is standing in front of the door, . 35mm photograph, film, bokeh, professional, 4k, highly detailed”

입력한 프롬프트와, 치환할 단어는 변경하지 않았지만, 프롬프트 스타일러에서 photograpic 스타일이 추가됨으로써 결과 텍스트가 조금 더 디테일하게 작성된 모습입니다. 역시 “girl”로 작성한 부분이 “boy”로 잘 변경된 모습이지만, 스타일 프롬프트가 붙으면서 프롬프트 자체가 문법적으로 조금 이상해졌습니다. Show Text를 통해 바로 확인했으므로 아래와 같이 입력 프롬프트에 조금 변화를 주면 조금 더 프롬프트를 자연스럽게 고칠 수 있습니다.

Text Replace 워크플로우 예시 02

of a girl is standing in front of the door, 라고 작성해준 뒤 다시 워크플로우를 실행하자 결과 텍스트가 다음과 같이 변경되었습니다.

“Cinematic photo of a boy standing in front of the door. 35mm photograph, film, bokeh, professional, 4k, highly detailed”

이처럼 본문의 예시에서는 girl이란 단어를 boy로 치환하는 방법을 살펴보았습니다. 여기까지 보신 분들 중 일부는 “그래서 이 기능이 뭐가 좋은데?”라고 반문하실 수 있습니다. 그런데 ComfyUI를 자주 다루시는 분들 중 프로그래밍을 하시거나, 코드를 조금이라도 다뤄보신 분들은 이 기능이 굉장히 막강하다는 것을 알 수 있습니다. 왜냐하면 Text FInd and Replace 노드의 find 값을 girl이 아닌 xxx 등 특정 문자열로 지정하면, ComfyUI 프론트 엔드에서 문자열 변수(String variable)을 바로 사용할 수 있는 상태가 되기 때문입니다.

Text Replace 활용 예시

text replace 응용 예시 워크플로우

간단하게 Text Replace를 활용한 예시를 살펴보겠습니다. 위 워크플로우는 Text Find and Replace 노드를 2개 연이어 붙이고, 앞서 말씀드린 것처럼, XXX, YYY를 변수로 사용한 상태입니다. 각 변수 XXX, YYY에는 WAS Node Suite의 Text String 노드(좌하단 파란 노드)를 이용해 girl, an apple을 각각 할당해줬으며 그 결과 스타일링된 프롬프트는 다음과 같습니다.

“Cinematic photo of a girl, an apple is placed on the table. 35mm photograph, film, bokeh, professional, 4k, highly detailed”

여기까지는 앞서 살펴본 예시에서 단지 변수를 2개로 바꾸고, 프롬프트를 살짝 수정한 수준인데요, 치환할 단어인 girl과 an apple을 밖으로 빼놓은 것이 중요합니다. 스타일링 된 프롬프트가 완성되었으므로 이 상태로 그림을 생성하자, 의도한대로 테이블 위에 놓인 사과 1개와 여성이 같이 나타납니다.

text replace 응용 예시

이렇게 생성된 이미지에서 만약 여성과 사과를 따로 추출하고 싶다면 여러분은 어떻게 작업하실 계획이신가요? 예시에서는 아까 따로 빼둔 Text String 노드를 Segment Anything에 연결했습니다. 이로써 Queue prompt 버튼을 단 한 번만 클릭하면, 이미지를 생성 및 해당 이미지에 그리고자 했던 Object(girl, an apple) 분리(선택)까지 자동으로 진행되게 됩니다. 단지 Text Replace 하나를 활용했을 뿐인데, 워크플로우를 중간에 멈추지 않고, 이미지 생성부터, 레이어 분리까지 진행했습니다. 여기서 더 활용하면 사실 마스크 이미지를 만들고, 이를 적용해 이미지를 다시 수정하는 등의 연장 작업이 가능해집니다. 예시에서는 맛보기로 이만큼만 보여드렸지만, 필요에 따라 잘 활용만 하신다면 엄청난 효율로 무궁무진한 워크플로우 구성이 가능하겠죠?