Next.js와 Replicate를 활용한 프레임 인식 GIF 얼굴 교체(Face Swap) 파이프라인 구축
요약
Next.js, Replicate, Supabase를 사용하여 비동기식 GIF 얼굴 교체(Face Swap) 파이프라인을 구축하는 방법을 설명합니다. 긴 실행 시간이 필요한 미디어 작업을 웹훅과 폴링 방식으로 처리하여 안정적인 사용자 경험을 제공하는 데 중점을 둡니다.
핵심 포인트
- Replicate 웹훅을 활용한 비동기 AI 추론 처리
- Supabase를 이용한 작업 상태 및 크레딧 관리
- FFmpeg WASM을 활용한 브라우저 측 미디어 처리
- WebP 변환을 통한 UI 성능 및 사이트 속도 최적화
- 실패 복구와 상태 관리가 실제 제품화의 핵심
저는 애니메이션 GIF와 얼굴 이미지를 입력받아 새로운 GIF를 반환하는 브라우저 기반의 gif face swap 도구를 구축했습니다.
어려웠던 점은 AI 모델을 시작하는 것이 아니었습니다. 요청을 차단하거나 상태를 잃지 않으면서 장시간 실행되는 미디어 작업(media job)을 처리하는 것이었습니다.
스택 (Stack)
- Next.js 및 TypeScript
- AI 추론 (inference)을 위한 Replicate
- 작업 및 크레딧 기록을 위한 Supabase
- 브라우저 측 GIF 유틸리티를 위한 FFmpeg WASM
- 가벼운 미리보기를 위한 Animated WebP
비동기 생성 (Async generation)
하나의 HTTP 요청 내에서 추론 (inference)을 기다리는 대신, Replicate 예측 (prediction)을 생성하고 웹훅 (webhook)을 통해 결과를 받습니다:
export async function createPrediction(
targetGifUrl: string,
faceImageUrl: string,
...
각 Supabase 작업은 예측 ID (prediction ID)와 다섯 가지 상태 중 하나를 저장합니다:
type JobStatus =
| "queued"
| "processing"
...
프론트엔드는 작업 엔드포인트(job endpoint)를 폴링 (polling)하고, 웹훅 (webhook)은 최종 결과를 업데이트합니다. 이를 통해 사용자는 활성화된 생성 작업을 잃지 않고 페이지를 새로고침할 수 있습니다.
사이트 속도 유지하기
원본 GIF는 처리를 위해 계속 사용할 수 있도록 유지되지만, 템플릿 미리보기는 애니메이션 WebP로 변환됩니다:
pnpm asset:gif-to-webp input.gif preview.webp
이렇게 하면 얼굴 교체 (face-swap) 파이프라인으로 전송되는 소스 애니메이션을 수정하지 않고도 UI를 더 가볍게 유지할 수 있습니다.
주요 교훈: AI 미디어 도구에서 추론 (inference)은 작업의 절반에 불과합니다. 작업 상태 (job state), 웹훅 (webhooks), 파일 처리, 그리고 실패 복구 (failure recovery)가 데모를 실제 제품처럼 느껴지게 만드는 핵심입니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기