Skip to main content
To make a photo talk through the Percify API, call POST /v1/run with modelId set to infinitetalk-fast or infinitetalk, an image URL of a face and an audio URL of the speech. Percify returns a generation id, and the finished lip-synced video appears in output.urls when the generation succeeds. It is billed per second of audio.

Which model should I use?

Body

string
required
infinitetalk-fast or infinitetalk.
string
required
Public https URL of the face to animate, such as a .jpg or .png portrait with a clearly visible face. The video keeps this image’s aspect ratio.
string
required
Public https URL of the speech, as .mp3 or .wav. Percify reads the file’s length to price the run, so it must be reachable.
string
default:"720p"
infinitetalk only: 480p or 720p. infinitetalk-fast ignores it.
integer
default:"-1"
Random seed. -1 picks a random one.
string
Optional https URL to receive the result. See Webhooks.
Send an Idempotency-Key header too, so a retry never charges twice.

Example

Then wait for it with GET /v1/generations/{id}?wait=45. When it succeeds:
Succeeded (trimmed)
mediaDurationSec is the audio length Percify measured and billed, and creditsSpent holds the credits charged.

How much does lip-sync cost?

Both models are billed per second of the audio you send, and infinitetalk at 720p costs twice its 480p price. For the exact credits, send the same body to POST /v1/estimate first; it measures your audio file and never charges. Credits are refunded if the run fails.

Errors specific to lip-sync

Long clips take longer to render. A generation fails and refunds if it is still running after 15 minutes plus 5 seconds per second of audio, or after 30 minutes at most. See Async jobs.

Talking avatar pipeline

Generate the face and the voice too.

Voice cloning and speech

Make the audio track with zonos2.

Get a generation

Wait for the video URL.

Lip-sync troubleshooting

When the mouth does not match the audio.
Last modified on September 16, 2026