Make a photo sing with an API

One portrait, one vocal track, one request. This is how we made a painted portrait sing two choruses of a song for a music video, what it cost, and the mistakes that cost us retries.

Models: kling-ai-avatar-v2

Price per image

Size and qualityKling AI Avatar v2 on KeelRouterList price
standard$0.065$0.0562
pro$0.13$0.115

Per image, before reference-image charges. List price: the same image at the model maker's published token rates. Checked 2026-11-12.

Which model, and why

We tried five ways to make the same portrait sing the same 5-second line: Kling AI Avatar v2 Standard and Pro, OmniHuman 1.5, VEED Fabric, and a video model with the song as reference audio. Kling AI Avatar v2 Standard gave the right mouth shapes, kept the face, and was among the cheapest. Pro looked the same to us at twice the price.

A video model with reference audio is the trap. Seedance 2.0 given our song as a reference sang its own garbled version of the line, so the mouth followed its singing, not ours. If you must keep your own recording, use a model that is driven by your audio, like this one.

The request

POST /v1/video/generations with an image_url and an audio_url, then poll GET /v1/video/generations?task_id= until state is completed. The video is as long as the audio, up to 300 seconds. duration is the audio length in whole seconds, rounded up: we hold that much from your balance when the job starts and charge what the provider actually bills when it finishes.

Calm singer, Standard

Standard, $0.065 a second. Made on KeelRouter on 2026-11-08: a 5-second chorus took about 4 minutes and was billed $0.33.

A painted portrait of a young woman by a river, mouth slightly open mid-word, calm expression
A frame from the 5-second clip, Kling AI Avatar v2 Standard, 1264×720.

POST /v1/video/generations

POST /v1/video/generations
{
  "model": "kling-ai-avatar-v2",
  "image_url": "https://example.com/portrait.jpg",
  "audio_url": "https://example.com/chorus-vocals.mp3",
  "prompt": "A tired young woman sings quietly to the camera with a calm, serious, slightly sad expression. No smile. Small natural lip and jaw movement, almost no head movement.",
  "duration": 6
}

Pro tier

Same fields plus mode. $0.13 a second.

POST /v1/video/generations

POST /v1/video/generations
{
  "model": "kling-ai-avatar-v2",
  "mode": "pro",
  "image_url": "https://example.com/portrait.jpg",
  "audio_url": "https://example.com/chorus-vocals.mp3",
  "duration": 6
}

The prompt sets the face

The audio drives the mouth; the prompt drives everything else. Our first prompt said she sings with confidence, and our character, whose life was not a happy one, grinned through the whole chorus. The model even added fake captions. Saying calm, serious, slightly sad, no smile fixed both. Write the mood you want in plain words, and say no smile if you mean it.

Prepare the audio

Send mp3 or wav. Some audio models reject m4a outright.

Cut the clip to exactly the lines you want sung, and silence everything before the first word and after the last. With silence there, the mouth stays shut until she starts; with the backing track there, it moves to the drums.

Make one clip per line, even when a chorus repeats. We reused the first chorus for the second and it was visibly out of sync: the singer phrased the same words differently the second time.

FAQ

How much does a singing clip cost?
Standard is $0.065 a second of output and Pro $0.13. A 30-second verse on Standard is about $1.9500000000000002. You pay what the provider bills for the actual length, not the duration you send.
Can I use a drawing or an AI-generated face?
Yes. Our test used a painted portrait made with an image model. A clear, front-facing face works best.
Does it sing in other languages?
The mouth follows the sounds in the audio, so any language works. Check the first seconds of a long song before paying for all of it.

More guides

KeelRouter is an independent service and is not affiliated with Kuaishou. Model names are trademarks of their owners, used here only to name the model a request runs on.