
ComfyUI에서 애니메이션 립싱크 구축하기: 탐지 유도형 확산 파이프라인 (Detection-Guided Diffusion Pipeline)
요약
ComfyUI를 활용하여 애니메이션 캐릭터의 자연스러운 립싱크를 구현하는 다단계 파이프라인 구축 방법을 소개합니다. YOLO 탐지, 확산 모델, ControlNet 등을 결합하여 애니메이션 특유의 단순화된 얼굴 구조에서도 안정적인 입 모양을 생성합니다.
핵심 포인트
- 애니메이션 특화 립싱크를 위한 다단계 파이프라인 설계
- YOLO와 Diffusion을 결합한 정교한 입 모양 생성
- 중립, 반개방, 완전 개방의 세 가지 입 상태 카테고리 활용
- ComfyUI 커스텀 노드를 통한 워크플로우 자동화

ComfyUI를 위한 Anime Lip Sync 커스텀 노드는 이 문제를 제어된 다단계 파이프라인 (multi-stage pipeline)으로 접근합니다. 하나의 모델에게 오디오 정렬 (audio alignment), 얼굴 편집 (face editing), 입 생성 (mouth generation), 세그멘테이션 (segmentation), 트래킹 (tracking), 그리고 합성 (compositing)을 한꺼번에 해결하도록 요구하는 대신, 각 문제를 전문화된 구성 요소에 할당합니다.
그 결과 음소 분석 (phoneme analysis), YOLO 탐지 (YOLO detection), 확산 (diffusion), ControlNet 가이드 (ControlNet guidance), BEN2 배경 제거 (BEN2 background removal), 해부학적 검증 (anatomical validation), 시간적 캐싱 (temporal caching), 그리고 최종 비디오 합성 (final video composition)을 결합한 워크플로우가 만들어집니다.
핵심 아이디어
이 노드는 오디오 트랙, 비디오 프레임 배치 (batch of video frames), 그리고 확산 (diffusion)에 필요한 모델들을 입력받습니다. 그런 다음 세 가지 입 상태를 생성합니다:
neutral_closed(중립적 폐쇄)half_open(반개방)fully_open(완전 개방)
이것들은 의도적으로 넓게 분류된 카테고리입니다. 애니메이션 애니메이션은 종종 적은 수의 입 모양 어휘로 대화를 전달하므로, 모든 음소 (phoneme)에 대해 고유한 입을 합성하려고 시도하는 것보다 재사용 가능한 안정적인 상태 세트를 생성하는 것이 더 일관성 있게 보일 수 있습니다.
파이프라인은 네 가지 단계로 구성됩니다:
- 얼굴을 탐지하고 준비합니다.
- 확산 (diffusion)을 통해 필요한 입 상태를 생성합니다.
- 생성된 입을 분리하고 트래킹 (track)합니다.
- 입을 합성하고 최종 비디오를 구축합니다.
단계 0: 깨끗한 얼굴 준비하기
첫 번째 단계는 커스텀 YOLO 모델을 사용하여 얼굴 영역을 식별합니다. 현재의 해부학적 검증기 (anatomical validator)는 다음과 같은 클래스 (classes)를 기대합니다:
Model Link: https://huggingface.co/israelmarmar/anime_face_mouth/tree/main
0 = face (얼굴)
1 = mouth (입)
2 = nose (코)
...
얼굴 경계 상자 (bounding box)는 작업용 크롭 (crop) 영역을 정의합니다. 입 제거 (mouth removal) 기능이 활성화되면, 원래의 입을 탐지하여 마스킹 (masking)하고 인페인팅 (inpainting)합니다. 이를 통해 나중에 새로 생성된 입을 입힐 수 있는 깨끗한 베이스 프레임 (base frame)이 만들어집니다.
여러 캐릭터가 등장하는 장면의 경우, 이 노드는 선택적으로 Florence-2 phrase grounding을 사용할 수 있습니다. the girl with blue hair와 같은 텍스트 쿼리 (text query)를 사용하면 YOLO가 얼굴을 검색하기 전에 대상 캐릭터를 식별합니다. 이는 단순히 특정 얼굴의 탐지 점수 (detection score)가 더 높다는 이유로 파이프라인이 다른 캐릭터로 전환되는 것을 방지합니다.
모든 중간 에셋 (intermediate assets)은 디스크 기반 저장소 (disk-backed store)를 통해 기록됩니다. 원본 프레임, 입 마스크 (mouth masks), 얼굴 마스크 (face masks), 경계 상자 (bounding boxes), 생성된 얼굴, 입 크롭 (mouth crops), 그리고 출력 프레임은 각각 분리되어 유지됩니다. 이러한 구조는 VRAM 압박을 제한하고 파이프라인을 더 쉽게 검사할 수 있게 합니다.
1단계: 오디오 구동 확산 (Audio-Driven Diffusion)
오디오는 Allosaurus를 통해 분석됩니다. 탐지된 소리는 침묵 시의 중립적인 다문 상태 (neutral closed state)를 포함하여 세 가지 입 카테고리에 매핑됩니다. 그런 다음 노드는 시각적으로 유사한 얼굴 크롭들을 그룹화하여, 모든 비디오 프레임에 대해 확산 (diffusion) 과정을 독립적으로 실행할 필요가 없도록 합니다.
얼굴 유사도는 단순히 색상만이 아니라 얼굴 구조와 낙서 같은 윤곽선 (scribble-like contours)을 기반으로 합니다. HED 가이드 (guidance)는 확산 과정이 입을 변경할 수 있도록 허용하면서도 중요한 애니메이션 선화 (line work), 머리 포즈 (head pose), 그리고 실루엣 (silhouette)을 보존합니다. 생성된 얼굴은 Qwen Image DiffSynth ControlNet 워크플로우 (workflow)를 통해 조건화 (conditioned)되며 Z-Image Turbo로 샘플링됩니다.
각 입 상태 (mouth state)는 각각 다음을 사용할 수 있습니다:
- 프롬프트 (prompt) 또는 외부 조건화 (external conditioning)
- LoRA
- 스텝 수 (step count)
- CFG 값
- 디노이즈 강도 (denoise strength)
- ControlNet 강도
- 샘플러 (sampler) 및 스케줄러 (scheduler)
이는 입을 다문 상태와 완전히 벌린 상태가 서로 다른 생성 문제이기 때문에 중요합니다. 다문 입은 선명하고 절제된 선이 필요한 반면, 벌린 입은 내부가 보이도록 생성할 수 있는 충분한 디노이징 자유도 (denoising freedom)가 필요합니다.
잘못된 생성을 캐싱하지 마세요
확산 (Diffusion) 모델은 확률적 (stochastic)입니다. 강력한 프롬프트 (prompt)와 LoRA가 있더라도, 요청한 다문 입이 약간 벌어진 상태로 나타나거나 아예 사용할 수 없는 입이 생성될 수 있습니다. 해당 결과를 캐싱하면 그 실패가 많은 프레임으로 확산될 것입니다.
따라서 이 노드는 생성된 모든 얼굴을 히스토리 캐시 (history cache)에 저장하기 전에 검증합니다. YOLO 모델이 입을 검색하지만, 신뢰도 (confidence)만으로는 충분하지 않습니다. 애니메이션의 속눈썹이나 눈의 윤곽이 객체 탐지기 (object detector)에게는 다문 입처럼 보일 수 있기 때문입니다.
검증기 (validator)는 탐지된 코와 턱을 사용하여 해부학적인 입 영역을 구축합니다. 입 후보는 반드시 다음과 같아야 합니다:
- 탐지된 얼굴 내부
- 코 아래
- 턱 위
- 코 및 턱과 수평 정렬
가장 높은 신뢰도를 가진 후보가 눈 근처에 있다면 거부됩니다. 노드는 유효한 영역 내에서 다른 후보를 찾기 위해 더 낮은 신뢰도 임계값 (confidence threshold)과 더 큰 추론 해상도 (inference resolution)를 사용하여 두 번째 YOLO 패스 (pass)를 수행합니다.
해부학적으로 유효한 입이 발견되지 않으면, KSampler가 새로운 시드 (seed)로 다시 실행됩니다. mouth_regen_attempts 옵션은 추가로 생성할 수 있는 샘플의 횟수를 제어합니다.
진정으로 다문 입 검증하기
다문 입 탐지에는 더 엄격한 규칙이 필요합니다. 입은 가시성을 확보할 수 있을 만큼 충분히 넓어야 하고, 가로 형태여야 하며, 채워진 빈 공간이라기보다는 입술 윤곽처럼 보일 만큼 충분히 얇아야 합니다.
neutral_closed의 경우, 검증기는 다음 사항을 확인합니다:
- 상대적 너비 (relative width)
- 상대적 높이 (relative height)
- 너비 대비 높이 종횡비 (width-to-height aspect ratio)
- 탐지된 면적 (detected area)
- 내부 채움 (internal fill)
- 전경 두께 (foreground thickness)
- 단단한 내부 코어의 존재 여부
최종 점검 단계에서는 탐지된 입 경계 상자 (mouth bounding box) 내부의 픽셀을 분석합니다. 얇은 입술 선은 내부 채움 (internal fill)이 낮고 침식된 코어 (eroded core)가 거의 없거나 존재하지 않습니다. 약간 벌어진 입은 보통 더 두꺼운 어두운 색 또는 붉은색 영역을 포함합니다. 해당 채워진 영역이 허용된 임계값 (thresholds)을 초과하면, 후보는 거부되며 확산 (diffusion) 샘플링을 다시 수행합니다.
닫힌 입이 검증을 통과하면, 국소 대비 향상 (local contrast enhancement)을 통해 입술 윤곽을 더 읽기 쉽게 만듭니다. CLAHE 및 가벼운 샤프닝 (sharpening)은 수락된 해부학적 입 영역 주변에만 적용되어 얼굴의 나머지 부분은 보존합니다.
2단계: BEN2를 이용한 입 추출
생성된 얼굴이 검증을 통과하면, 최종 프레임에 색상이 다른 피부 사각형이 포함되지 않도록 입을 분리해야 합니다.
해당 노드는 ComfyUI-Easy-Use에서 사용하는 것과 동일한 easy imageRemBg 커스텀 노드를 호출합니다:
rem_mode = BEN2
add_background = none
refine_foreground = false
반환된 RGBA 이미지는 직접 사용됩니다. 이는 BEN2 알파 (alpha) 값을 추가적인 휴리스틱 마스크 (heuristic masks)와 곱할 경우 입이 불필요하게 투명해질 수 있기 때문에 중요합니다. BEN2는 전경의 입을 주변 피부로부터 분리하는 책임을 유지하며, 폴백 마스킹 (fallback masking)은 커스텀 노드를 사용할 수 없는 경우에만 사용됩니다.
최종 입 탐지기 또한 코와 턱 해부학적 선택기 (nose-and-chin anatomical selector)를 사용합니다. 이를 통해 1단계에서 올바른 입을 검증했음에도 불구하고, 2단계에서 더 높은 신뢰도 점수를 가진 속눈썹을 크롭(crop)하는 상황을 방지합니다.
얼굴 대비 입 위치 추적
비디오에서는 절대 좌표만으로는 충분하지 않습니다. 캐릭터가 오른쪽으로 이동하면, 캐시된 입은 이전 화면 위치에 머무는 대신 얼굴과 함께 이동해야 합니다.
입 캐시 (mouth cache)는 얼굴 경계 상자 (face bounding box)에 대한 상대적 정규화 좌표를 저장합니다:
rx, ry = 상대적 입 위치 (relative mouth position)
rw, rh = 상대적 입 크기 (relative mouth size)
시각적으로 유사한 얼굴이 다른 위치나 크기(scale)로 나타나면, 노드는 해당 정규화된 값들을 새로운 얼굴 경계 상자(bounding box)로 투영합니다. 이를 통해 생성된 입 상태(mouth state)를 머리 움직임을 따라가면서도 재사용할 수 있습니다.
이전 입 데이터가 더 이상 안전하지 않을 정도로 얼굴의 외형이나 움직임이 크게 변하면 캐시 에포크(Cache epochs)가 업데이트됩니다. 또한, 전체 실행 시간(runtime)을 단축하기 위해 파이프라인은 확산(diffusion) 과정과 입 추출(mouth extraction) 및 합성(composition)을 동시에 처리할 수 있습니다.
3단계: 합성 및 비디오 출력 (Compositing and Video Output)
생성된 RGBA 입은 추적된 대상 크기에 맞춰 조정되며, 인페인팅(inpainted)된 프레임 위에 알파 합성(alpha-composited)됩니다. 헤일로(halo) 현상과 피부 오염을 줄이기 위해 약한 잔여 알파 값(residual alpha values)은 제거됩니다. 그 후 출력 프레임 시퀀스는 FFmpeg로 인코딩되어 원본 오디오와 결합됩니다.
노드는 다음을 반환합니다:
- 최종 비디오 경로
- VHS 호환 비디오 정보
- 선택 사항인 영구 디버그 디렉토리 (persistent debug directory)
파이프라인 디버깅 (Debugging the Pipeline)
save_debug_folder를 활성화하면 정리(cleanup) 작업 전에 임시 작업 디렉토리가 ComfyUI 출력 폴더로 복사됩니다. 이를 통해 다음 항목에 접근할 수 있습니다:
- 원본 및 인페인팅된 프레임
- 얼굴 및 입 마스크 (face and mouth masks)
- 얼굴 경계 상자 (face bounding boxes)
- 생성된 확산 얼굴 (generated diffusion faces)
- 생성된 입 히스토리 (generated mouth history)
- BEN2 RGBA 입 캐시
- 최종 합성된 프레임
- 검증 메타데이터 (validation metadata)
히스토리 JSON 파일에는 생성된 입이 검증을 통과했는지 여부와 신뢰도(confidence), 해부학적 구조(anatomy), 크기(dimensions), 윤곽(contour) 지표를 포함하는 메시지가 포함됩니다. 입 캐시 메타데이터에는 알파 소스(alpha source)도 기록되어, BEN2와 함께 easy imageRemBg가 사용되었는지 확인할 수 있습니다.
실전 튜닝 (Practical Tuning)
가장 유용한 제어 항목은 다음과 같습니다:
- 탐지기 민감도를 위한
mouth_conf - 생성 검증을 활성화하기 위한
verify_generated_mouth - 확산 재시도(diffusion retries)를 위한
mouth_regen_attempts - 얼굴 그룹화를 위한
sim_threshold - 캐시 무효화(cache invalidation)를 위한
motion_variance_factor - 상태별 디노이즈(denoise) 및 컨트롤넷(ControlNet) 강도
- 상태별 입 패딩(mouth padding) 및 밝기
- 최종 블렌딩을 위한
compose_feather_px
낮은 입(mouth) 신뢰도는 미세한 닫힌 선을 복구할 수도 있지만, 오탐(false positives)을 증가시킬 수 있습니다. 해부학적 검증(Anatomical validation)은 더 낮은 임계값(threshold)을 실용적으로 사용할 수 있도록 도와줍니다. 재생 생성(regeneration) 횟수를 높이면 추론 시간(inference time)이 늘어나는 대신, 유효한 입 모양을 얻을 확률이 높아집니다.
사용자의 브라우저가 비디오 태그를 지원하지 않습니다. 사용자의 브라우저가 비디오 태그를 지원하지 않습니다.
이 아키텍처가 애니메이션에 효과적인 이유
이 파이프라인은 하나의 신경망(neural network)이 항상 올바른 결정을 내릴 것이라고 가정하지 않습니다. 대신 피드백 루프(feedback loop) 내에서 생성 모델(generative model)과 판별 모델(discriminative model)을 결합합니다:
- 오디오(audio)가 요청된 입 상태를 선택합니다.
- 확산(diffusion) 모델이 시각적 결과를 제안합니다.
- YOLO가 결과에 그럴듯한 입이 포함되어 있는지 확인합니다.
- 코(nose) 및 턱(chin) 탐지가 위치를 검증합니다.
- 픽셀 분석(pixel analysis)이 닫힌 입이 실제로 닫혀 있는지 확인합니다.
- BEN2가 수락된 입을 추출합니다.
- 얼굴 상대적 추적(face-relative tracking)이 시간이 지남에 따라 일관되게 위치를 배치합니다.
이러한 계층적 접근 방식은 스타일화된 애니메이션(stylized animation)에 특히 유용합니다. 애니메이션에서는 작은 선 하나가 입을 나타낼 수 있고, 속눈썹이 동일한 선처럼 보일 수 있으며, 단 몇 픽셀만으로 표정이 올바르게 읽히는지 여부가 결정될 수 있기 때문입니다.
커스텀 노드(custom node)는 입의 모양을 정교화하고 깜빡임(flickering)을 방지하기 위해 위치를 안정화하는 등 여전히 개선이 필요합니다. 개선을 위한 모든 제안을 환영합니다.
Repository: https://github.com/israelmarmar/anime-lipsync
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기