Sync Lipsync 3
Playground
Try it on WavespeedAI!Sync Lipsync 3 synchronizes lip movements in any video to supplied audio using zero-shot lip-sync technology. Supports multiple sync modes for handling duration mismatches, works with live-action, 3D characters, and AI-generated avatars. Ready-to-use REST inference API, best performance, no coldstarts, affordable pricing.
Features
LipSync-3
LipSync-3 is Sync’s advanced lip synchronization model. Upload a video and an audio track — the model automatically syncs the speaker’s lip movements to the new audio with high accuracy and natural motion. Supports multiple sync modes to handle length mismatches between video and audio.
Why Choose This?
-
High-accuracy lip synchronization Precisely maps audio phonemes to lip movements for natural, believable sync across a wide range of speakers and languages.
-
Flexible sync mode control Choose how the model handles video-audio length mismatches — loop, bounce, cut off, silence, or remap — to fit your specific use case.
-
Broad video compatibility Works on talking head videos, interviews, presentations, and any footage with visible facial movement.
-
Simple two-input workflow Just a video and an audio file — no manual keyframing, no masking, no technical setup required.
Parameters
| Parameter | Required | Description |
|---|---|---|
| video | Yes | Input video to apply lip sync to (URL or file upload). |
| audio | Yes | Audio track to sync the lip movements to (URL, file upload, or microphone recording). |
| sync_mode | No | How to handle video-audio length mismatches. Options: bounce, loop, cut_off (default), silence, remap. |
Sync Mode Options
- cut_off — Cuts the output at whichever is shorter, video or audio.
- loop — Loops the video to match the length of the audio.
- bounce — Plays the video forward then backward repeatedly to match audio length.
- silence — Pads the shorter input with silence or a still frame to match the longer one.
- remap — Remaps the video timing to match the audio duration.
How to Use
- Upload your video — provide the talking head or speaker video via URL or drag-and-drop.
- Upload your audio — provide the replacement audio track via URL, file upload, or microphone recording.
- Select sync_mode (optional) — choose how to handle length differences between the video and audio.
- Submit — generate, preview, and download your lip-synced video.
Pricing
$0.134 per second of input video.
Best Use Cases
- Dubbing & Localization — Replace the original audio with a translated voiceover and sync lip movements to match.
- Voice Replacement — Swap out a speaker’s audio while maintaining natural facial animation.
- AI Avatar Video — Generate talking head videos with custom audio for virtual presenters and digital avatars.
- Content Repurposing — Update or correct existing video audio without reshooting.
- Accessibility — Create lip-synced versions of content for accessibility and localization workflows.
Pro Tips
- Use clean, well-lit talking head footage with a clearly visible face for the most accurate sync results.
- Minimize background noise in your audio track — cleaner audio produces better phoneme mapping.
- If your audio is shorter than your video, use cut_off or silence mode depending on whether you want the video trimmed or padded.
- For seamless looping content, bounce or loop modes work well when the video is shorter than the audio.
Notes
- Both video and audio are required fields.
- Pricing is based on the duration of the input video at $0.134 per second.
- Ensure video and audio URLs are publicly accessible if using links rather than direct uploads.
Authentication
For authentication details, please refer to the Authentication Guide.
API Endpoints
Submit Task & Query Result
# Submit the task
curl --location --request POST "https://api.wavespeed.ai/api/v3/sync/lipsync-3" \
--header "Content-Type: application/json" \
--header "Authorization: Bearer ${WAVESPEED_API_KEY}" \
--data-raw '{
"sync_mode": "cut_off"
}'
# Get the result
curl --location --request GET "https://api.wavespeed.ai/api/v3/predictions/${requestId}/result" \
--header "Authorization: Bearer ${WAVESPEED_API_KEY}"
Parameters
Task Submission Parameters
Request Parameters
| Parameter | Type | Required | Default | Range | Description |
|---|---|---|---|---|---|
| video | string | Yes | - | The video to be used for generation | |
| audio | string | Yes | - | - | The audio to be used for generation |
| sync_mode | string | No | cut_off | bounce, loop, cut_off, silence, remap | Defines how to handle duration mismatches between video and audio inputs. See the Media Content Tips guide https://docs.sync.so/compatibility-and-tips/media-content-tips#sync-mode-options for a brief overview, or the SyncMode enum below for detailed explanations of each option. |
Response Parameters
| Parameter | Type | Description |
|---|---|---|
| code | integer | HTTP status code (e.g., 200 for success) |
| message | string | Status message (e.g., “success”) |
| data.id | string | Unique identifier for the prediction, Task Id |
| data.model | string | Model ID used for the prediction |
| data.outputs | array | Array of URLs to the generated content (empty when status is not completed) |
| data.urls | object | Object containing related API endpoints |
| data.urls.get | string | URL to retrieve the prediction result |
| data.has_nsfw_contents | array | Array of boolean values indicating NSFW detection for each output |
| data.status | string | Status of the task: created, processing, completed, or failed |
| data.created_at | string | ISO timestamp of when the request was created (e.g., “2023-04-01T12:34:56.789Z”) |
| data.error | string | Error message (empty if no error occurred) |
| data.timings | object | Object containing timing details |
| data.timings.inference | integer | Inference time in milliseconds |
Result Request Parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| id | string | Yes | - | Task ID |
Result Response Parameters
| Parameter | Type | Description |
|---|---|---|
| code | integer | HTTP status code (e.g., 200 for success) |
| message | string | Status message (e.g., “success”) |
| data | object | The prediction data object containing all details |
| data.id | string | Unique identifier for the prediction, the ID of the prediction to get |
| data.model | string | Model ID used for the prediction |
| data.outputs | string | Array of URLs to the generated content (empty when status is not completed). |
| data.urls | object | Object containing related API endpoints |
| data.urls.get | string | URL to retrieve the prediction result |
| data.status | string | Status of the task: created, processing, completed, or failed |
| data.created_at | string | ISO timestamp of when the request was created (e.g., “2023-04-01T12:34:56.789Z”) |
| data.error | string | Error message (empty if no error occurred) |
| data.timings | object | Object containing timing details |
| data.timings.inference | integer | Inference time in milliseconds |