Seedream 5.0 Pro 正式上線 | 在圖片生成器中體驗 →

Akool Video Face Swap

akool /

AKOOL Video Face Swap replaces faces in videos from a single image, supporting multiple faces for seamless, realistic swaps. Price starts at $0.05 per video second with a minimum charge of 10 seconds. Ready-to-use REST inference API, best performance, no coldstarts, affordable pricing.

portrait-transfer
輸入

就緒

$0.05每次運行·~20 / $1

示例查看全部

相關模型

README

Akool Video Face Swap

Akool Video Face Swap is a powerful AI-powered face swapping model that replaces faces in videos with new ones. Upload source faces and their corresponding target faces, provide a video, and the model seamlessly swaps each face — perfect for content creation, entertainment, and creative projects.

Why It Stands Out

  • Multi-face swapping: Swap multiple faces in a single video simultaneously.
  • Face-to-face mapping: Match each source face to its corresponding target face.
  • Face enhancement: Optional post-swap face quality enhancement for better results.
  • High-quality output: Produces realistic, seamless face replacements.
  • Long video support: Process videos up to 10 minutes (600 seconds).

Parameters

ParameterRequiredDescription
source_imageYesFace images to swap onto the video (multiple allowed).
target_imageYesFace images to be replaced in the video (multiple allowed).
videoYesVideo file to process (upload or public URL).
face_enhanceNoEnhance face quality after swapping (default: enabled).
enable_base64_outputNoReturn base64 string instead of URL (API only).

How to Use

  1. Upload source images — add face images that will appear in the final video.
  2. Upload target images — add face images to be replaced (match order with source images).
  3. Upload your video — provide the video containing faces to swap.
  4. Enable face enhancement (recommended) — improves face quality after swapping.
  5. Click Run and wait for processing.
  6. Preview and download the result.

Face Mapping

The model matches source and target faces by order:

Source ImageTarget ImageResult
Source 1Target 1Target 1's face replaced by Source 1
Source 2Target 2Target 2's face replaced by Source 2

Add multiple source/target pairs to swap multiple faces in the same video.

Best Use Cases

  • Content Creation — Create engaging face-swap videos for social media.
  • Entertainment — Produce fun videos with friends and family.
  • Film & Production — Replace faces for creative or practical purposes.
  • Marketing — Create personalized video content at scale.
  • Dubbing & Localization — Swap faces for regional content adaptation.

Pricing

DurationPrice
10 seconds$0.50
30 seconds$1.50
60 seconds$3.00

Billing Rules

  • Billed per second at $0.05
  • Minimum charge: 10 seconds
  • Maximum duration: 600 seconds (10 minutes)

Pro Tips for Best Quality

  • Use high-resolution, front-facing source images with clear facial features.
  • Ensure target images match the faces appearing in the video.
  • Keep face enhancement enabled for smoother, higher-quality results.
  • Videos with well-lit, forward-facing subjects produce the best swaps.
  • Match the number of source and target images correctly.

Notes

  • Ensure uploaded image and video URLs are publicly accessible.
  • Processing time varies based on video length and current queue load.
  • Please ensure your content complies with usage guidelines and respect individuals' likeness rights.
提示:本網站部分功能由第三方 AI 模型提供支援。

Video Face Swap API — Quick start

Grab a WaveSpeedAI API key, then call POST https://api.wavespeed.ai/api/v3/akool/video-face-swap with your input as JSON. The endpoint returns a prediction id. Start polling the result endpoint around every 2 seconds, increase the interval for long-running tasks, and stop on any terminal status. On completed, read output values from data.outputs. Examples for Video Face Swap below.

HTTP example
set -euo pipefail

: "${WAVESPEED_API_KEY:?Set WAVESPEED_API_KEY}"

REQUEST_BODY=$(cat <<'JSON'
{
    "source_image": [
        "https://interactive-examples.mdn.mozilla.net/media/cc0-images/painted-hand-298-332.jpg"
    ],
    "target_image": [
        "https://interactive-examples.mdn.mozilla.net/media/cc0-images/painted-hand-298-332.jpg"
    ],
    "video": "https://interactive-examples.mdn.mozilla.net/media/cc0-videos/flower.mp4",
    "face_enhance": false
}
JSON
)

# 1. Submit the prediction.
SUBMIT_RESPONSE=$(curl --silent --show-error --fail-with-body \
  -X POST "https://api.wavespeed.ai/api/v3/akool/video-face-swap" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $WAVESPEED_API_KEY" \
  -d "$REQUEST_BODY")

TASK=$(printf '%s' "$SUBMIT_RESPONSE" | jq 'if has("data") then .data else . end')
PREDICTION_ID=$(printf '%s' "$TASK" | jq -r '.id')
if [ -z "$PREDICTION_ID" ] || [ "$PREDICTION_ID" = "null" ]; then
  printf 'Submission response did not contain a prediction id
' >&2
  exit 1
fi
RESULT_URL=$(printf '%s' "$TASK" | jq -r '.urls.get // empty')
if [ -z "$RESULT_URL" ]; then
  RESULT_URL="https://api.wavespeed.ai/api/v3/predictions/$PREDICTION_ID/result"
fi

# 2. Poll until the prediction finishes.
while true; do
  RESPONSE=$(curl --silent --show-error --fail-with-body "$RESULT_URL" \
    -H "Authorization: Bearer $WAVESPEED_API_KEY")
  RESULT=$(printf '%s' "$RESPONSE" | jq 'if has("data") then .data else . end')
  STATUS=$(printf '%s' "$RESULT" | jq -r '.status')
  case "$STATUS" in
    completed) printf '%s\n' "$RESULT" | jq '.outputs'; break ;;
    failed|cancelled|timeout) printf '%s\n' "$RESULT" | jq . >&2; exit 1 ;;
    created|processing) sleep 2 ;;
    *) printf 'Unexpected status: %s
' "$STATUS" >&2; exit 1 ;;
  esac
done
Node.js example
const submitUrl = "https://api.wavespeed.ai/api/v3/akool/video-face-swap";
const apiKey = process.env.WAVESPEED_API_KEY;
if (!apiKey) throw new Error('Set WAVESPEED_API_KEY');

async function requestJson(url, options = {}) {
  const response = await fetch(url, options);
  if (!response.ok) throw new Error(await response.text());
  return response.json();
}

// 1. Submit the prediction.
const body = await requestJson(submitUrl, {
  method: "POST",
  headers: {
    "Authorization": `Bearer ${apiKey}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
        "source_image": [
                "https://interactive-examples.mdn.mozilla.net/media/cc0-images/painted-hand-298-332.jpg"
        ],
        "target_image": [
                "https://interactive-examples.mdn.mozilla.net/media/cc0-images/painted-hand-298-332.jpg"
        ],
        "video": "https://interactive-examples.mdn.mozilla.net/media/cc0-videos/flower.mp4",
        "face_enhance": false
}),
});
const task = body.data ?? body;
if (!task.id) throw new Error("Submission response did not contain a prediction id");
const resultUrl = task.urls?.get ||
  `https://api.wavespeed.ai/api/v3/predictions/${task.id}/result`;

// 2. Poll until the prediction finishes.
while (true) {
  const resultBody = await requestJson(resultUrl, {
    headers: { "Authorization": `Bearer ${apiKey}` },
  });
  const result = resultBody.data ?? resultBody;
  if (result.status === "completed") {
    console.log(result.outputs);
    break;
  }
  if (["failed", "cancelled", "timeout"].includes(result.status)) throw new Error(JSON.stringify(result));
  if (!["created", "processing"].includes(result.status)) throw new Error("Unexpected status: " + result.status);
  await new Promise(resolve => setTimeout(resolve, 2000));
}
Python example
import json
import os
import time
from urllib.request import Request, urlopen

api_key = os.environ["WAVESPEED_API_KEY"]
headers = {"Authorization": f"Bearer {api_key}", "Content-Type": "application/json"}
payload = {
    "source_image": [
        "https://interactive-examples.mdn.mozilla.net/media/cc0-images/painted-hand-298-332.jpg"
    ],
    "target_image": [
        "https://interactive-examples.mdn.mozilla.net/media/cc0-images/painted-hand-298-332.jpg"
    ],
    "video": "https://interactive-examples.mdn.mozilla.net/media/cc0-videos/flower.mp4",
    "face_enhance": False
}

def request_json(url, data=None):
    request = Request(url, data=data, headers=headers, method="POST" if data else "GET")
    with urlopen(request) as response:
        return json.load(response)

# 1. Submit the prediction.
body = request_json("https://api.wavespeed.ai/api/v3/akool/video-face-swap", json.dumps(payload).encode())
task = body.get("data", body)
if not task.get("id"):
    raise RuntimeError("Submission response did not contain a prediction id")
result_url = task.get("urls", {}).get("get") or f"https://api.wavespeed.ai/api/v3/predictions/{task['id']}/result"

# 2. Poll until the prediction finishes.
while True:
    result_body = request_json(result_url)
    result = result_body.get("data", result_body)
    status = result.get("status")
    if status == "completed":
        print(result.get("outputs", []))
        break
    if status in {"failed", "cancelled", "timeout"}:
        raise RuntimeError(result)
    if status not in {"created", "processing"}:
        raise RuntimeError(f"Unexpected status: {status}")
    time.sleep(2)

Video Face Swap API — Frequently asked questions

What is the Video Face Swap API?

Video Face Swap is a Akool model for AI inference, exposed as a REST API on WaveSpeedAI. AKOOL Video Face Swap replaces faces in videos from a single image, supporting multiple faces for seamless, realistic swaps. Price starts at $0.05 per video second with a minimum charge of 10 seconds. Ready-to-use REST inference API, best performance, no coldstarts, affordable pricing. You can call it programmatically or try it from the playground above.

How do I call the Video Face Swap API?

POST your input parameters to the model's REST endpoint (shown in the API tab of this playground) with your WaveSpeedAI API key in the Authorization header. Submission returns a prediction ID. Poll the result endpoint starting around every 2 seconds, increase the interval for long-running tasks, and stop on any terminal status. The playground generates production-oriented Python, JavaScript, and cURL examples with timeouts, transient-error handling, and safe GET retries. Full request/response shape is documented at https://wavespeed.ai/docs/docs-api/akool/akool-video-face-swap.

How much does Video Face Swap cost per run?

Video Face Swap starts at $0.050 per run. That figure is the base price — the final charge scales with the parameters you set in the form (output size, length, count, references, or whatever knobs this model exposes), so a higher-quality or larger output costs more than a minimal one. The exact cost for your current input is shown live next to the Generate button before you submit, and the actual per-call charge is recorded on the prediction afterwards.

What inputs does Video Face Swap accept?

Key inputs: `video`, `enable_base64_output`, `face_enhance`, `source_image`, `target_image`. The full JSON schema (types, defaults, allowed values) is rendered above the Generate button and mirrored in the API reference at https://wavespeed.ai/docs/docs-api/akool/akool-video-face-swap.

How long does Video Face Swap take to generate?

Median end-to-end generation time on WaveSpeedAI is around 283 seconds per request, based on recent successful runs. Queue time varies with global demand; live status is visible in the prediction record.

Can I use Video Face Swap outputs commercially?

Commercial usage rights depend on the model's license, set by its provider (Akool). The license summary appears on the model card above; see WaveSpeedAI's Terms of Service for platform-level conditions.

Akool Video Face Swap | AI Portrait Transfer API | WaveSpeedAI