WaveSpeedAI Face Swapper
by @chengzeyi
Swap faces in images and videos using WaveSpeed AI. Supports image face swap and video face swap with multi-face targeting. Produces watermark-free results w...
clawhub install wavespeed-face-swapperπ About This Skill
name: wavespeed-face-swapper description: Swap faces in images and videos using WaveSpeed AI. Supports image face swap and video face swap with multi-face targeting. Produces watermark-free results with automatic lighting and skin tone adaptation. Use when the user wants to replace a face in an image or video with another face. metadata: author: wavespeedai version: "1.0"
WaveSpeedAI Face Swapper
Swap faces in images and videos using WaveSpeed AI. Produces watermark-free results with automatic lighting and skin tone adaptation. Supports targeting specific faces when multiple people are present.
Authentication
export WAVESPEED_API_KEY="your-api-key"
Get your API key at wavespeed.ai/accesskey.
Quick Start
Image Face Swap
import wavespeed from 'wavespeed';// Upload local images to get URLs
const imageUrl = await wavespeed.upload("/path/to/target-photo.png");
const faceUrl = await wavespeed.upload("/path/to/reference-face.png");
const output_url = (await wavespeed.run(
"wavespeed-ai/image-face-swap",
{
image: imageUrl,
face_image: faceUrl
}
))["outputs"][0];
Video Face Swap
import wavespeed from 'wavespeed';// Upload local files to get URLs
const videoUrl = await wavespeed.upload("/path/to/video.mp4");
const faceUrl = await wavespeed.upload("/path/to/reference-face.png");
const output_url = (await wavespeed.run(
"wavespeed-ai/video-face-swap",
{
video: videoUrl,
face_image: faceUrl
}
))["outputs"][0];
You can also pass existing URLs directly:
const output_url = (await wavespeed.run(
"wavespeed-ai/image-face-swap",
{
image: "https://example.com/target-photo.jpg",
face_image: "https://example.com/reference-face.jpg"
}
))["outputs"][0];
API Endpoints
Image Face Swap
Model ID: wavespeed-ai/image-face-swap
Replace a face in an image with a reference face.
#### Parameters
| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| image | string | Yes | -- | URL of the image containing the face to replace |
| face_image | string | Yes | -- | URL of the reference face image to swap in |
| target_index | integer | No | 0 | Which face to replace (0 = largest face, 1-10 for others) |
| output_format | string | No | jpeg | Output format. One of: jpeg, png, webp |
#### Example
import wavespeed from 'wavespeed';const imageUrl = await wavespeed.upload("/path/to/group-photo.png");
const faceUrl = await wavespeed.upload("/path/to/reference-face.png");
const output_url = (await wavespeed.run(
"wavespeed-ai/image-face-swap",
{
image: imageUrl,
face_image: faceUrl,
target_index: 0,
output_format: "png"
}
))["outputs"][0];
#### Targeting a Specific Face
When multiple people are in the image, use target_index to select which face to replace:
// Replace the second-largest face in the image
const output_url = (await wavespeed.run(
"wavespeed-ai/image-face-swap",
{
image: imageUrl,
face_image: faceUrl,
target_index: 1
}
))["outputs"][0];
Video Face Swap
Model ID: wavespeed-ai/video-face-swap
Replace a face in a video with a reference face. Supports videos up to 10 minutes.
#### Parameters
| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| video | string | Yes | -- | URL of the video containing the face to replace. Must be publicly accessible. Max 10 minutes. |
| face_image | string | Yes | -- | URL of the reference face image to swap in |
| target_index | integer | No | 0 | Which face to replace (0 = largest face, 1-10 for others) |
#### Example
import wavespeed from 'wavespeed';const videoUrl = await wavespeed.upload("/path/to/video.mp4");
const faceUrl = await wavespeed.upload("/path/to/reference-face.png");
const output_url = (await wavespeed.run(
"wavespeed-ai/video-face-swap",
{
video: videoUrl,
face_image: faceUrl,
target_index: 0
}
))["outputs"][0];
Advanced Usage
Sync Mode (Image Face Swap only)
const output_url = (await wavespeed.run(
"wavespeed-ai/image-face-swap",
{
image: imageUrl,
face_image: faceUrl
},
{ enableSyncMode: true }
))["outputs"][0];
Custom Client with Retry Configuration
import { Client } from 'wavespeed';const client = new Client("your-api-key", {
maxRetries: 2,
maxConnectionRetries: 5,
retryInterval: 1.0,
});
const output_url = (await client.run(
"wavespeed-ai/image-face-swap",
{
image: imageUrl,
face_image: faceUrl
}
))["outputs"][0];
Error Handling with runNoThrow
import { Client, WavespeedTimeoutException, WavespeedPredictionException } from 'wavespeed';const client = new Client();
const result = await client.runNoThrow(
"wavespeed-ai/image-face-swap",
{
image: imageUrl,
face_image: faceUrl
}
);
if (result.outputs) {
console.log("Output URL:", result.outputs[0]);
console.log("Task ID:", result.detail.taskId);
} else {
console.log("Failed:", result.detail.error.message);
if (result.detail.error instanceof WavespeedTimeoutException) {
console.log("Request timed out - try increasing timeout");
} else if (result.detail.error instanceof WavespeedPredictionException) {
console.log("Prediction failed");
}
}
Pricing
| Operation | Cost | |-----------|------| | Image face swap | $0.01 per image | | Video face swap | $0.01 per second (minimum $0.05 / 5 seconds) |
Video face swap supports videos up to 10 minutes.
Tips
target_index to select specific faces when multiple people are present (0 = largest face)Security Constraints
WAVESPEED_API_KEY securely. Do not hardcode it in source files or commit it to version control. Use environment variables or secret management systems.π‘ Examples
import wavespeed from 'wavespeed';const imageUrl = await wavespeed.upload("/path/to/group-photo.png");
const faceUrl = await wavespeed.upload("/path/to/reference-face.png");
const output_url = (await wavespeed.run(
"wavespeed-ai/image-face-swap",
{
image: imageUrl,
face_image: faceUrl,
target_index: 0,
output_format: "png"
}
))["outputs"][0];
#### Targeting a Specific Face
When multiple people are in the image, use target_index to select which face to replace:
// Replace the second-largest face in the image
const output_url = (await wavespeed.run(
"wavespeed-ai/image-face-swap",
{
image: imageUrl,
face_image: faceUrl,
target_index: 1
}
))["outputs"][0];
Video Face Swap
Model ID: wavespeed-ai/video-face-swap
Replace a face in a video with a reference face. Supports videos up to 10 minutes.
#### Parameters
| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| video | string | Yes | -- | URL of the video containing the face to replace. Must be publicly accessible. Max 10 minutes. |
| face_image | string | Yes | -- | URL of the reference face image to swap in |
| target_index | integer | No | 0 | Which face to replace (0 = largest face, 1-10 for others) |
#### Example
import wavespeed from 'wavespeed';const videoUrl = await wavespeed.upload("/path/to/video.mp4");
const faceUrl = await wavespeed.upload("/path/to/reference-face.png");
const output_url = (await wavespeed.run(
"wavespeed-ai/video-face-swap",
{
video: videoUrl,
face_image: faceUrl,
target_index: 0
}
))["outputs"][0];
π Tips & Best Practices
target_index to select specific faces when multiple people are present (0 = largest face)