1. 프로젝트 개요 및 환경 구축
1.1. 프로젝트 목표 및 기술 정의
항목설명
| 목표 | 오디오 파일을 입력받아, 단일 인물 이미지에 사실적인 립싱크(Lip-sync)와 표정 애니메이션을 적용하는 SadTalker의 로컬 실행 환경 구축 및 고급 기능(참조 눈 깜빡임) 적용. |
| 핵심 기술 | Audio-Driven Talking Head Generation (오디오 기반 말하는 얼굴 생성) |
| 내부 원리 | **3D Morphable Model (3DMM, 3차원 변형 모델)**을 사용하여 2D 이미지의 포즈, 표정, 입 모양 계수를 추출하고 오디오에 맞춰 구동함. |
1.2. 로컬 서버 환경 사양
항목상세 사양
| 운영체제(OS) | Linux (Ubuntu) |
| 하드웨어 | NVIDIA GeForce RTX 2070 (총 VRAM 8GB) |
| 가상 환경 | Conda 환경 (sadtalker, Python 3.8) |
| 주요 라이브러리 | PyTorch (CUDA 11.3), SadTalker Core, FFmpeg |
2. 초기 설치 및 5단계 장애 조치 (디버깅 기록)
로컬 환경 구축 과정에서 발생한 5가지 주요 오류 및 해결책은 다음과 같습니다. 특히 VRAM 부족 문제는 하드웨어 제약으로 인해 가장 중요한 해결 과제였습니다.
2.1. Gradio API 버전 충돌 및 해결
장애 유형오류 내용원인 분석조치 사항
| Gradio 4.x 충돌 | AttributeError: 'Row' object has no attribute 'style' | requirements.txt 미지정으로 최신 Gradio (4.x) 설치. SadTalker 코드는 3.x 버전의 API 사용. | Gradio 다운그레이드: pip install gradio==3.41.2 |
2.2. TTS 모듈 종속성 충돌 및 해결
장애 유형오류 내용원인 분석조치 사항
| Dependency Hell | ResolutionTooDeep: 200000 (TTS 라이브러리 설치 시) | TTS 라이브러리가 SadTalker의 핵심 라이브러리(Torch, Gradio)와 버전 충돌. | app_sadtalker.py 파일 내 TTS 관련 import 및 UI 생성 코드 블록 전체 주석 처리하여 기능 비활성화. |
2.3. Gradio UI 비디오 표시 오류 및 해결
장애 유형오류 내용원인 분석조치 사항
| Frontend 렌더링 실패 | 콘솔에서는 성공했으나 웹 UI에 "Error" 표시. | Gradio 3.41.2 버전의 비디오 컴포넌트 버그 추정. | Gradio 업데이트: pip install gradio==3.48.0 (안정 버전 사용) |
2.4. [Critical] CUDA 메모리 부족 (OOM) 문제
장애 유형오류 내용원인 분석해결책 (Gradio UI 기준)
| RuntimeError | CUDA out of memory. Tried to allocate 512.00 MiB (GPU 0; ... 299.19 MiB free) | 모델 가중치 및 데이터 로딩으로 VRAM 5GB 이상 사용. 추가 할당 공간 부족 (RTX 2070 한계). | Batch Size 1로 설정 및 Resolution 256 유지 (VRAM 사용량 최소화). |
2.5. inference.py 입력 경로 오류
장애 유형오류 내용원인 분석조치 사항
| ValueError | input_path must be a valid path... | Gradio 종료로 인해 /tmp/gradio/... 임시 파일이 삭제되거나, 사용자가 지정한 --ref_eyeblink 경로의 파일명을 잘못 입력함. | 안정적인 상대 경로 사용: source_image 및 ref_eyeblink 경로를 SadTalker 폴더 내의 실제 존재하는 파일 경로로 수정. |
3. 고급 기능 (inference.py) 적용 및 최적화
웹 UI가 아닌, 터미널 명령줄 스크립트(inference.py)를 통해 참조 비디오 눈 깜빡임 및 립싱크 세밀화 기능을 적용했습니다.
3.1. 참조 비디오 눈 깜빡임 (--ref_eyeblink) 적용
이 기능은 오디오 분석 결과와 별개로, 지정된 참조 비디오의 눈 깜빡이는 타이밍과 스타일만 추출하여 애니메이션에 적용합니다.
- 사용 옵션: --ref_eyeblink <비디오 경로>
- 사용 목적: 오디오만으로 생성되는 부자연스러운 눈 깜빡임을 개선하여 사실감을 높임.
3.2. 입 모양(립싱크) 세밀화 (--enhancer) 적용
립싱크의 디테일을 높이기 위해, 생성된 영상의 얼굴 영역을 개선 모델로 후처리합니다.
- 사용 옵션: --enhancer gfpgan
- 사용 목적: 입술의 경계선과 질감을 고화질로 복원하여, 립싱크의 정확도와 시각적 만족도를 높임.
3.3. 최종 최적화 명령어 (RTX 2070 환경)
아래 명령어는 참조 눈 깜빡임, 입 모양 세밀화 기능을 모두 활성화하며, VRAM 부족을 회피하도록 성능이 최적화된 최종 실행 구문입니다.
# OOM 방지를 위해 모든 옵션이 필수적으로 포함됨.
python inference.py --driven_audio ./examples/driven_audio/CosyVoice_women_1_1.wav \
--source_image ./examples/source_image/anchor_img_women_2.png \
--ref_eyeblink ./examples/ref_video/my_ref_blink.mp4 \
--result_dir ./results_eyeblink_detailed_lip \
--size 256 \
--preprocess full \
--still \
--enhancer gfpgan
옵션설정 목적
| --size 256 | VRAM 최소 사용 해상도 지정 (OOM 방지) |
| --preprocess full --still | 정적인 모드(still) 활성화하여 머리 움직임을 줄여 VRAM 절약 |
| --enhancer gfpgan | 입술 및 얼굴 디테일 복원(립싱크 세밀화) |
| --ref_eyeblink ... | 참조 비디오의 눈 깜빡임 스타일 복사 |
4. 결론 및 향후 과제
SadTalker 로컬 환경 구축은 성공적으로 완료되었으며, Gradio 버전 충돌, 종속성 문제, 그리고 하드웨어(VRAM) 한계로 인한 오류를 모두 해결했습니다. 특히 RTX 2070 환경에서 OOM 없이 안정적으로 작동하는 명령어 구문이 확보되었습니다.
향후 과제:
- 참조 비디오 교체: 현재는 예시 비디오를 사용하고 있지만, 더 다양한 눈 깜빡임 스타일을 테스트하기 위해 새로운 참조 비디오를 수집하여 테스트해야 합니다.
- 머리 포즈 수동 제어: --input_yaw, --input_pitch, --input_roll 옵션을 사용하여 오디오의 움직임이 아닌, 사용자가 의도한 시퀀스대로 머리 움직임을 연출하는 테스트를 진행할 수 있습니다.
'메모' 카테고리의 다른 글
| API 명세서 해석 (1) | 2025.11.11 |
|---|---|
| FastAPI 프로젝트 환경 설정 및 서버 공유 (0) | 2025.11.10 |
| SadTalker 오류 해결사항 (Gradio API 버전 충돌, TTS pip._vendor.resolvelib.resolvers.ResolutionTooDeep: 200000) (0) | 2025.11.05 |
| Conda(Anaconda)는 무엇일까? (0) | 2025.11.05 |
| GPT-SoVITS - RuntimeError: Could not load libtorchcodec 에러관해 (0) | 2025.11.05 |