소개
한 이미지의 얼굴 특징을 다른 이미지 속 인물에게 옮깁니다. 옮겨지는 것은 얼굴 특징뿐입니다. 대상 이미지의 헤어스타일, 헤어라인, 머리 윤곽, 자세, 의상, 조명, 배경은 그대로 남습니다. 그래서 결과가 원본 사진 위에 얹힌 것이 아니라 사진 안에 자연스럽게 자리 잡습니다.
Face Swap Pro는 Face Swap 라인의 정밀 등급입니다. 엔진이 두 사진에서 얼굴 특징점을 스스로 찾아 한쪽을 다른 쪽에 대응시키고, 그 뒤에는 결과에 아무 처리도 더하지 않습니다. 요청은 이미지 URL 두 개가 전부입니다. 바꿀 사진은 image_url, 얼굴은 reference_image_url에 넣어 spicyapi/face-swap-pro-v1/edit로 보냅니다. 호출은 비동기로 처리됩니다. 작업 ID가 돌아오면 그 작업을 폴링하고, 요청당 이미지 한 장이 돌아오며 출력 이미지 단위로 과금합니다.
핵심 기능 및 하이라이트
특징점으로 얼굴을 대응시킵니다
Pro는 정밀한 작업을 위해 만들어졌습니다. 영역을 그대로 옮겨 붙이는 대신 두 사진에서 얼굴 특징점을 찾아 대응시키기 때문에, 눈과 코와 입이 대상 얼굴의 골격이 정한 자리에 놓입니다. 이 엔드포인트에서는 검출이 자동이라 이미지 두 장만 보내면 됩니다. 후처리 보정도 없어서 모공, 잔주름, 입자감이 남고 얼굴이 주변과 같은 선명도를 가집니다. 필터를 거친 합성보다 덜 예뻐 보일 수 있는 이유도 그것입니다. 정확성과 보정은 목표가 다릅니다.
이미지 URL 두 개, 틀릴 여지가 없습니다
이 카탈로그에서 두 이미지 외에는 아무것도 받지 않는 얼굴 합성 엔드포인트는 이것뿐입니다. 쓸 프롬프트도, 칠할 영역도, 조절할 강도도, 고정할 seed도 없습니다. 모호한 지시에서 오는 실패가 통째로 사라지고, 항목마다 판단할 필요 없이 쌍 목록을 그대로 흘려보낼 수 있어 일괄 처리도 간단합니다. 알 수 없는 키는 무시되지 않고 거부되므로, 필드 이름을 잘못 쓰면 기본값으로 조용히 넘어가지 않고 제출 단계에서 실패합니다. 정말 중요한 것은 어떤 URL을 어디에 넣느냐뿐입니다. 두 필드는 대칭이 아니어서, 바꿔 넣어도 유효한 요청으로 처리되지만 결과는 완전히 달라집니다.
대상 사진은 그대로 남습니다
| 레퍼런스에서 오는 것 | 대상 이미지에 남는 것 |
|---|---|
| 눈, 코, 입, 눈썹 | 헤어스타일, 헤어라인, 머리 윤곽 |
| 얼굴 자체의 비율 | 자세, 시선, 몸, 의상 |
| 얼굴 영역 안의 피부 디테일 | 배경, 프레이밍, 조명, 입자감 |
여기에는 화면비나 해상도 설정이 없습니다. 이미지를 새로 만드는 것이 아니라 기존 사진의 한 영역을 바꾸기 때문입니다. 그래서 이미 승인한 컷에도 쓸 수 있습니다. 얼굴 밖의 것은 아무것도 다시 흔들리지 않습니다.
요청 파라미터
| 파라미터 | 필수 | 설명 |
|---|---|---|
image_url | 예 | 바뀌는 이미지입니다. 이 사람의 두상, 머리, 헤어라인, 자세, 시선, 의상, 배경은 보존되고 이목구비만 교체됩니다. 1자 이상 |
reference_image_url | 예 | 이목구비를 제공하는 이미지입니다. 가져오는 것은 얼굴뿐이고 두상이나 머리는 가져오지 않으므로 이 사진 자체의 구도, 배경, 의상은 무시됩니다. 1자 이상 |
face_enhance | 아니요 | 바꾼 얼굴에 얼굴 보정 단계를 한 번 더 적용해 더 높은 해상도로 만듭니다. 기본값은 꺼짐입니다. 기본값: |
요금
$0.16 / 장
활용 사례
인쇄될 에디토리얼·캠페인 컷
매끈하게 다듬은 얼굴은 인쇄 크기에서 무너집니다. 선명한 의상과 배경 옆에서 피부가 플라스틱처럼 보이기 때문입니다. 원래 질감을 지키면 썸네일이 아니라 가까이에서 볼 때도 화면이 버팁니다.
이미 승인한 컷의 인물만 바꾸기
조명, 자세, 세트가 이미 맞춰져 있는데 화면 전체를 다시 만들면 그 모든 것이 원점으로 돌아갑니다. 대신 얼굴 하나만 그 컷에 옮기면 승인한 것은 전부 그 자리에 남습니다.
시리즈 전체에서 같은 인물 유지하기
장면은 어떤 모델로 생성해도 됩니다. 그다음 같은 얼굴을 모든 장면에 옮기면 시리즈 전체가 같은 사람으로 읽힙니다. 머리와 의상은 각 대상 이미지의 것이 남으므로 생성한 다양성도 사라지지 않습니다.
무검열 컷에서 기준은 소재가 아니라 동의입니다
SpicyAPI는 자체 콘텐츠 필터를 추가하지 않고 콘텐츠 플래그도 요구하지 않으므로, 프레임에 무엇이 담겨 있든 요청 본문은 같은 두 필드입니다. 완화되지 않는 것은 권한입니다. 묘사된 인물의, 그 특정 자료에서의 그 특정 얼굴에 대한 명시적이고 충분히 설명된 동의가 필요하며, 사진이 공개되어 있다는 사실만으로 동의가 추정되지는 않습니다.
프롬프트 가이드 및 실전 팁
프롬프트가 없으니 조정은 호출 전에 합니다
대부분의 이미지 엔드포인트에서는 결과가 아쉬우면 문장을 고쳐 씁니다. 여기서는 그럴 수 없습니다. 요청이 URL 두 개라서 바꿀 수 있는 변수는 보내는 사진뿐입니다. 한 장을 바꾸고 다른 한 장을 고정하면 무엇이 달라졌는지 정확히 알 수 있어 반복 작업을 따져 보기 쉽지만, 조합이 나쁘면 더 나은 지시로 구할 수도 없습니다.
대상 이미지와 레퍼런스 고르기
image_url은 바꿀 사진이고 reference_image_url은 얼굴을 제공하는 사진입니다. 둘 다 잘 보이는 얼굴 하나가 대체로 정면을 향하고, 초점이 맞고, 이목구비가 읽힐 만큼 크게 담긴 JPEG, PNG, WebP여야 합니다. 단체 사진은 먼저 한 사람으로 잘라 내십시오. 가장 효과가 큰 것은 조명 방향입니다. 대상과 대체로 같은 쪽에서 빛을 받은 레퍼런스를 고르십시오. 합성은 대상의 조명을 바꾸지 않으므로, 어긋나면 턱선을 따라 이음매가 보입니다.
결과가 원하는 대로 나오지 않을 때
| 보이는 증상 | 먼저 바꿀 것 |
|---|---|
| 턱이나 목에 이음매가 보임 | 같은 방향에서 빛을 받은 레퍼런스를 쓴다 |
| 이목구비가 흐릿하거나 대략적임 | 얼굴이 더 크고 선명한 레퍼런스를 쓴다 |
| 엉뚱한 사람이 바뀜 | 대상 이미지를 한 사람으로 잘라 낸다 |
| 요청이 아예 실패함 | 두 URL이 아직 이미지 파일을 돌려주는지 확인한다 |
| 다른 합성 도구보다 덜 매끈함 | 정상입니다. 보정이 없으므로 필요하면 나중에 직접 적용한다 |
작업에 맞는 엔드포인트 고르기
| 필요한 것 | 엔드포인트 |
|---|---|
| 특징점 정확도와 원래 질감, 조절 항목 없음 | 이 엔드포인트 |
| 피부 톤 보정과 파일 형식 선택 | Face Swap Plus |
| seed가 있는 기본 합성, 머리카락은 항상 그대로 | Face Swap |
| 머리카락을 포함한 머리 전체 | Head Swap |
| 움직이는 클립 전체에 얼굴 하나 | Video Face Swap |
일괄 처리로 돌리기
항목마다 판단할 것이 없으므로 일괄 처리는 쌍에 대한 반복문입니다. 생성 호출마다 Idempotency-Key를 붙이고, 작업 ID를 그 호출을 일으킨 레코드 옆에 저장하십시오. 연결이 끊겨도 같은 키로 다시 보내면 원래 작업이 돌아오고, 두 번째 과금이 붙는 두 번째 작업은 시작되지 않습니다. 몇 초마다 폴링한 뒤 결과를 각각 자체 저장소로 복사하십시오. 생성된 파일은 14일 뒤, 업로드한 원본 이미지는 하루 뒤에 삭제됩니다.
API 빠른 시작
# Generate the idempotency key once; reuse it when retrying after a lost response.
export SPICY_IDEMPOTENCY_KEY="${SPICY_IDEMPOTENCY_KEY:-$(uuidgen)}"
curl -X POST https://api.spicyapi.ai/api/v1/jobs/createTask \
-H "Authorization: Bearer $SPICY_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $SPICY_IDEMPOTENCY_KEY" \
-d '{
"model": "spicyapi/face-swap-pro-v1/edit",
"input": {
"image_url": "https://example.com/reference.png",
"reference_image_url": "https://example.com/reference.png"
}
}'
# Copy data.taskId from the response into TASK_ID, then poll the status.
TASK_ID="TASK_ID_FROM_RESPONSE"
curl "https://api.spicyapi.ai/api/v1/jobs/recordInfo?taskId=$TASK_ID" \
-H "Authorization: Bearer $SPICY_API_KEY"
인증, 전체 스키마, 폴링과 오류 처리는 API 레퍼런스에서 확인하세요.









