Wprowadzenie
Przenosi twarz z jednego obrazu na osobę na innym i przy okazji wyrównuje między nimi odcień skóry. O zakresie przeniesienia decyduje silnik: wtapia samą twarz albo całą głowę, zależnie od tego, co w danej parze wygląda naturalniej, więc linia włosów nie zawsze zostaje nietknięta. Poza, strój, światło i tło obrazu docelowego zostają bez zmian.
Face Swap Plus to sterowalny poziom linii Face Swap. Oprócz dwóch obrazów przyjmuje krótkie polecenie tekstowe, format pliku wyjściowego i seed, a wysyła się go do spicyapi/face-swap-v1-plus/edit. Wywołanie jest asynchroniczne: zwraca identyfikator zadania, ty odpytujesz to zadanie, a każde żądanie zwraca jeden obraz, rozliczany za obraz wyjściowy niezależnie od wybranego formatu.
Najważniejsze funkcje
Odcień skóry wyrównuje się sam
Zamiana twarzy najczęściej zdradza się na granicy: referencja zrobiona w ciepłym świetle, wstawiona do obrazu w chłodnym świetle, zostawia obwódkę wokół żuchwy i szyję, która nie pasuje już do głowy. Ten silnik wyrównuje odcień obu zdjęć w trakcie przenoszenia, więc para podobna, ale nie identyczna, zwykle wypada dobrze bez ręcznej korekty koloru. Kierunek światła nadal ma znaczenie — twarz oświetlona z drugiej strony wciąż wygląda źle — ale najczęstsza niezgodność jest już załatwiona.
Głębokość wtopienia zapada osobno dla każdej pary
To inteligentna zamiana głowy: dla każdej pary silnik ocenia, czy naturalniej wypadnie wtopienie samej twarzy, czy całej głowy, i nie ma ustawienia, które wymusiłoby jedno albo drugie. Na tym polega praktyczna różnica wobec reszty linii, w której linia włosów zawsze zostaje z obrazu docelowego. Dlatego też wynik może wrócić z nieco inną linią włosów, niż się spodziewałeś — silnik uznał pełniejsze wtopienie za bardziej wiarygodne.
Parametry żądania
| Parametr | Wymagane | Uwaga |
|---|---|---|
image_url | Tak | Obraz, który się zmienia. od 1 znaków |
reference_image_url | Tak | Obraz dostarczający rysy twarzy. od 1 znaków |
prompt | Nie | Pole opcjonalne, ale buduj tak, jakby go nie było. do 200 znaków |
output_format | Nie | Format pliku zwracanego obrazu. Bez ustawienia używany jest JPEG; wybierz PNG, gdy potrzebujesz pliku bezstratnego do dalszej obróbki, a WebP, gdy wynik idzie prosto do sieci. |
output_quality | Nie | Żądana jakość obrazu wynikowego, od 10 do 100 (domyślnie 95). Nie wpływa na cenę. |
seed | Nie | Użyj tego samego ziarna ponownie, żeby porównać dwa przebiegi na tej samej parze obrazów przy identycznym losowaniu: wtedy rusza się tylko ta jedna rzecz, którą zmieniłeś. |
Cennik
$0.16 / obraz
Zastosowania
Masowe pipeline’y awatarów i zdjęć profilowych
Lista par obraz docelowy–referencja przechodzi przez endpoint programowo, jedno wywołanie na parę. Przypnij seed dla pary, gdy ponowna próba ma być porównywalna z pierwszą, i wybierz WebP, gdy wyniki trafiają prosto do sieci.
Funkcje konsumenckie za formularzem przesyłania
Cała interakcja to jedno zdjęcie od użytkownika i jeden obraz, który dostarczasz ty. Użytkownik nie ma nic do ustawienia ani promptu do napisania, więc cała funkcja to jedno pole formularza i zadanie w tle.
Katalogi i szablony
Ta sama twarz referencyjna na serii przygotowanych obrazów daje spójną serię bez generowania któregokolwiek od nowa. Ustawienie formatu wyjściowego dostarcza pliki w postaci, której twój pipeline już oczekuje; akcesorium wymagane przez szablon musi być w obrazie przed zamianą.
Kadry bez cenzury: granicą jest zgoda, nie temat
SpicyAPI nie dodaje własnego filtra treści i nie wymaga flagi dojrzałości, więc treść żądania zawiera te same pola, niezależnie od tego, co pokazuje kadr. Nie łagodzi się natomiast wymogu uprawnień: potrzebujesz wyraźnej, świadomej zgody przedstawionej osoby na użycie tej konkretnej twarzy w tym konkretnym materiale, a publiczne zdjęcie nigdy nie oznacza zgody.
Wskazówki
Pole polecenia nic tu nie robi
Model bazowy przyjmuje prompt z limitem 200 znaków, ale nie udało nam się nim niczego zmienić.
| Co wysłaliśmy | Co wróciło |
|---|---|
add mirrored aviator sunglasses | Bez okularów przeciwsłonecznych; tak samo jak bez polecenia |
wearing black sunglasses | Bez okularów przeciwsłonecznych; tak samo jak bez polecenia |
restyle the hair into a sleek straight bob | Włosy bez zmian |
soften the expression into a faint half smile | Mina bez zmian |
a wide open-mouthed laugh | Mina bez zmian |
Pięć prawdziwych wywołań 20 września 2026 r., każde porównane z tym samym żądaniem z pustym polem. Nie ma błędu ani ostrzeżenia, więc z odpowiedzi nie da się poznać, że wartość została zignorowana. Projektuj bez tego pola — jeśli potrzebujesz akcesorium albo innej miny, umieść je w obrazie docelowym przed zamianą.
Co silnik decyduje za ciebie
Dwa przebiegi przez ten endpoint wróciły z przeciwnymi decyzjami i to najlepiej pokazuje zasadę:
| Obraz docelowy | Co zostało przeniesione |
|---|---|
| Ciasny czarny kucyk | Cała głowa — rude włosy z referencji przyszły razem z rysami |
| Mokre, zaczesane do tyłu włosy | Sama twarz — włosy z obrazu docelowego zostały dokładnie takie jak na zdjęciu |
Jeśli potrzebowałeś akcesorium albo innej miny
Pole polecenia cię tam nie doprowadzi, więc zmiana musi istnieć przed zamianą:
| Czego chciałeś | Gdzie to zrobić zamiast tego |
|---|---|
| Okulary przeciwsłoneczne, kapelusz, biżuteria | Załóż je osobie na obrazie docelowym przed wywołaniem |
| Inna mina albo inna fryzura | Sfotografuj lub wygeneruj tak obraz docelowy; zamiana zachowa jedno i drugie |
Wybór formatu wyjściowego i seeda
Ustaw output_format, gdy typ pliku ma znaczenie na dalszym etapie, bo późniejsza konwersja oznacza ponowne kodowanie: PNG dla bezstratnego pliku do dalszej edycji, WebP dla wyników trafiających prosto do sieci, JPEG, gdy nic nie podasz. Żaden z trzech nie zmienia ceny, więc wybierz ten, którego potrzebuje twój pipeline, a nie ten, który wydaje się tańszy. Przypinaj seed tylko wtedy, gdy chcesz porównywać przebiegi: dwa przebiegi na tej samej parze dostają to samo losowanie, więc zmienia się tylko jedna zmieniona zmienna. To narzędzie porównawcze, a nie obietnica obrazu identycznego co do bajta. W produkcji zwykle chcesz za każdym razem nowego losowania.
Gdy wynik nie jest taki, jak chciałeś
| Co widzisz | Co zmienić najpierw |
|---|---|
| Szew na żuchwie mimo wyrównania odcienia | Użyj referencji oświetlonej z tego samego kierunku — odcień jest wyrównywany, kierunek nie |
| Zmieniła się linia włosów, a chciałeś ją zachować | Tu to normalne; użyj Face Swap albo Face Swap Pro |
| Polecenie nie dało widocznego efektu | To normalne — pole tu nie działa; zmień raczej obraz docelowy |
| Zmieniła się niewłaściwa osoba | Przytnij obraz docelowy do jednej osoby |
| Rysy są miękkie lub przybliżone | Użyj referencji z większą i ostrzejszą twarzą |
Wybór właściwego endpointu
| Czego potrzebujesz | Endpoint |
|---|---|
| Dopasowania odcienia skóry i wyboru formatu pliku | Ten endpoint |
| Precyzji punktów twarzy i oryginalnej tekstury, bez ustawień | Face Swap Pro |
| Prostej zamiany z seedem, włosy zawsze nietknięte | Face Swap |
| Całej głowy razem z włosami, za każdym razem | Head Swap |
| Jednej twarzy w całym ruchomym klipie | Video Face Swap |
Uruchamianie wsadowe
Dwa pola wymagane i trzy wartości domyślne sprawiają, że wsad to zwykła pętla po parach. Wysyłaj każde wywołanie tworzące z nagłówkiem Idempotency-Key i zapisuj identyfikator zadania obok rekordu, który je wywołał; gdy połączenie się zerwie, powtórzenie żądania z tym samym kluczem zwróci pierwotne zadanie zamiast uruchamiać drugie z drugą opłatą. Odpytuj co kilka sekund, a każdy wynik kopiuj do własnego magazynu — wygenerowane pliki są usuwane po 14 dniach, a przesłane obrazy źródłowe po jednym dniu.
Szybki start z 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-v1-plus/edit",
"input": {
"image_url": "https://example.com/reference.png",
"output_format": "jpeg",
"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"
Uwierzytelnianie, pełny schemat, odpytywanie i obsługę błędów opisuje dokumentacja API.









