Skip to main content
pixverse avatar

PixVerse Lip Sync API

pixverse/lipsync

Re-sync a talking-head video's mouth to a new audio track and get it back at the exact frame size and frame rate you sent, with the speech already muxed in.

edit
0.04 per second of output video

Model Input

Input

URL of the source video to re-sync. The result keeps this clip's frame size and frame rate exactly: no rescale and no frame-rate normalisation. Source video running past the end of the audio is trimmed to the speech; there is no setting for the reverse case, where the audio outruns the clip.

URL of the speech track the speaker should appear to say. Required. The delivered video carries this track as its soundtrack, so a silent source clip comes back playable. A source clip longer than this track is trimmed to it; there is no setting for the reverse case, where the track outruns the clip. PixVerse documents support for multiple languages and for audio types beyond dialogue — including singing and advertisement reads — and a 60-second maximum on both inputs.

You need to be logged in to run this model and view results.
Log in

Model Output

Output

Loading
Generated in 36.855 seconds
Logs (1 lines)

Model Example Requests

Examples

Example output 1Example output 2

PixVerse Lip Sync API

PixVerse Lip Sync is a video-to-video AI model by pixverse. On ModelRunner it runs through a REST API or via MCP from any AI assistant, at $0.04 per second of video.

POST https://queue.modelrunner.run/pixverse/lipsync

cURL

# Submit a request to the queue. Input fields go at the top level of the
# body. The optional reserved "metadata" object holds your own flat string
# tags — stored on the request, never sent to the model; filter later with
# GET https://queue.modelrunner.run/requests?metadata=<url-encoded JSON>.
curl -X POST https://queue.modelrunner.run/pixverse/lipsync \
  -H "Authorization: Key $MRUN_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "audio_url": "https://media.modelrunner.ai/RhJnozRe7Vf3J1mSdbyrh.wav",
    "video_url": "https://media.modelrunner.ai/SFFJHAnFJaG7lFgQ9Ie95.mp4",
    "metadata": {
      "project": "my-project"
    }
  }'
# → { "request_id": "...", "status_url": "...", "response_url": "..." }

# Poll status_url until "COMPLETED", then fetch the result
curl "https://queue.modelrunner.run/pixverse/lipsync/requests/$REQUEST_ID/status" \
  -H "Authorization: Key $MRUN_API_KEY"
curl "https://queue.modelrunner.run/pixverse/lipsync/requests/$REQUEST_ID" \
  -H "Authorization: Key $MRUN_API_KEY"

JavaScript

import { modelrunner } from "@modelrunner/client";

const result = await modelrunner.subscribe("pixverse/lipsync", {
  input: {
    "audio_url": "https://media.modelrunner.ai/RhJnozRe7Vf3J1mSdbyrh.wav",
    "video_url": "https://media.modelrunner.ai/SFFJHAnFJaG7lFgQ9Ie95.mp4"
  },
});
console.log(result);

Python

import os
import requests

headers = {"Authorization": f"Key {os.environ['MRUN_API_KEY']}"}

submitted = requests.post(
    "https://queue.modelrunner.run/pixverse/lipsync",
    headers=headers,
    json={
      "audio_url": "https://media.modelrunner.ai/RhJnozRe7Vf3J1mSdbyrh.wav",
      "video_url": "https://media.modelrunner.ai/SFFJHAnFJaG7lFgQ9Ie95.mp4"
    },
).json()

# Poll submitted["status_url"] until "COMPLETED", then:
result = requests.get(submitted["response_url"], headers=headers).json()

Input parameters

Input parameters of PixVerse Lip Sync
NameTypeRequiredDescription
video_urlstring (uri)yesURL of the source video to re-sync. The result keeps this clip's frame size and frame rate exactly: no rescale and no frame-rate normalisation. Source video running past the end of the audio is trimmed to the speech; there is no setting for the reverse case, where the audio outruns the clip.
audio_urlstring (uri)yesURL of the speech track the speaker should appear to say. Required. The delivered video carries this track as its soundtrack, so a silent source clip comes back playable. A source clip longer than this track is trimmed to it; there is no setting for the reverse case, where the track outruns the clip. PixVerse documents support for multiple languages and for audio types beyond dialogue — including singing and advertisement reads — and a 60-second maximum on both inputs.

Machine-readable: OpenAPI schema · llms.txt

Use PixVerse Lip Sync from Claude & Cursor (MCP)

Point Claude Code, Claude Desktop, Cursor, or any MCP client at the ModelRunner MCP server and PixVerse Lip Sync becomes a tool your assistant can call directly — it authorizes via OAuth (no API key in config) and runs this model with the run_model tool using the endpoint pixverse/lipsync.

MCP client config (Claude Desktop, Cursor)

{
  "mcpServers": {
    "modelrunner": {
      "command": "npx",
      "args": ["-y", "mcp-remote", "https://mcp.modelrunner.run/mcp"]
    }
  }
}

Claude Code

claude mcp add --transport http modelrunner https://mcp.modelrunner.run/mcp

Then ask your assistant, for example: “Run pixverse/lipsync on ModelRunner to generate video”. MCP setup guide.

Model Details

Model Details

PixVerse Lip Sync takes a talking-head video and a separate speech track and re-animates the speaker's mouth to match the new audio. The clip comes back at exactly the frame size and frame rate you sent — no rescale, no frame-rate normalisation — with the supplied speech already muxed in, so the file plays as-is even when the source footage was silent. A measured run returned 6.4 seconds from a 7.0-second source clip driven by a 6.3-second track, trimming the surplus video. PixVerse documents support for multiple languages and for audio types beyond dialogue, including singing and advertisement reads.

## Best for - Dubbing a talking-head clip into another language so the mouth matches the translated voiceover - Re-voicing an interview, tutorial, or ad read with a cleaner re-recorded take - Syncing a performance clip to a sung vocal or another non-dialogue audio track - Vertical, square, or unusual-format footage that must come back at its original size and cadence - Turning silent footage plus a voice file into a ready-to-post clip

## Choose another model when - You need control over how a video/audio length mismatch is reconciled — this endpoint has none; `sync/lipsync/v2` exposes `sync_mode` (cut-off, loop, bounce, silence, remap) - You are starting from a still photo rather than footage — use an audio-driven image-to-video model such as `wan-video/wan/v2.7/image-to-video/audio-driven` - You still need to produce the speech — this endpoint takes an existing audio file, so run a text-to-speech model first and feed its output here - Cost per delivered second is the deciding factor on long-form work — `bytedance/latentsync` is the catalog's lowest-priced lip sync

## Tips - Keep the audio no longer than the source clip: surplus video is trimmed to the speech, and there is no setting for the reverse case - Crop and resize before the run, not after — frame size and frame rate are carried through unchanged - The delivered MP4 carries the speech as an audio stream, so no re-mux is needed - PixVerse's guidance is that the audio must be clear, so supply a clean recording of the speech track

## Limitations - PixVerse documents a 60-second maximum on both inputs; longer material has not been verified here - There is no prompt or style control — the two file inputs are the whole interface

To run via the ModelRunner JavaScript client: ```js import { modelrunner } from "@modelrunner/client";

const result = await modelrunner.subscribe("pixverse/lipsync", { input: { video_url: "https://media.modelrunner.ai/NLaN6i1oQvbd8Mn4oEDXs.mp4", audio_url: "https://media.modelrunner.ai/lZfxwe6ZN6ZikXQhVtiq7.wav", }, }); ```