A common request from people building product demos, course intros and social clips: “I have a photo of the presenter and a voiceover I already recorded. Make the person in the photo say exactly that.” P-Video-2 Pro Reference from Pruna AI does this in one API call. You send the photo as a reference, your audio file, and keep_audio: true; the model generates the video around your track, with lips and head movement following the words. This guide shows the exact request, what it costs, and a real clip we generated while writing it.
What P-Video-2 Pro Reference does
It is a reference-to-video model. Instead of describing everything in text, you give it material to work from:
- Reference images (up to 9): what a character or product looks like, or a style.
- Reference videos (up to 3, 2 to 15 seconds each, 15 seconds combined): motion or scene to follow.
- Audio (up to 3 files, 15 seconds combined).
- A text prompt that ties it together: where the person is and what they are doing.
Output is a 5 to 15 second clip with sound, at 480p or 768p, in Speed or Cost mode, with aspect ratios from 16:9 to 9:16 or “adaptive” (follow the references). At least one image or video reference is required.
keep_audio: your voice, your words
The audio input has two very different meanings, and keep_audio switches between them:
- Without
keep_audio(the default), audio is only a sample. The model imitates the voice or sound, but your file is not placed in the clip and the words may differ. - With
keep_audio: trueand exactly one audio file, that file becomes the soundtrack. Same voice, same words; the video (motion, lips) is generated to match it.
How the track length interacts with duration: if your audio is shorter than the duration, it plays first and the model generates the rest; if it is longer, it is cut to the duration; if it is within one second of the duration, the clip follows the audio’s length. So pick a duration close to your voiceover. keep_audio does not change the price.
Price
The clip is priced per generation from three things: output seconds (by mode and resolution), plus each reference image, plus reference video and audio seconds. The cheapest combination is 480p in Cost mode. The full tier table is on the P-Video-2 Pro Reference model page.
Because the price depends on your exact inputs, ask for a quote before you generate. The quote endpoint is free and returns a quoteId you can pin the job to:
curl https://getvibeapi.com/api/media/price \
-H "Authorization: Bearer $GETVIBE_API_KEY" \
-H "Content-Type: application/json" \
-d @request.json
# Our quote on October 22, 2026 for the request below
# (7 s, 480p, Cost mode, 1 photo, 1 audio track, keep_audio):
{"ok":true,"priceUsd":0.165625,"isEstimate":false,"chargeBasis":"quote","quoteId":"mq_…","quoteTtlSeconds":900}
The quote is a ceiling: references are not measured before submission, so it assumes the full allowance (for example the whole 15 seconds of reference audio when any audio is sent). Our job was charged exactly the quoted amount.
Step by step: photo + voiceover → talking clip
1. Prepare two public files
You need a public HTTPS URL for the portrait (a clear, front-facing head-and-shoulders shot works best) and one for the voiceover (MP3 or WAV). For our test we generated a fictional presenter with Nano Banana 2.1 and a 7.3-second English voiceover with gpt-4o-mini-tts, both through the same API key. Any recording of your own works the same way.
2. Submit the job
import os, time, requests
API = "https://getvibeapi.com"
HEADERS = {"Authorization": f"Bearer {os.environ['GETVIBE_API_KEY']}"}
body = {
"model": "p-video-2-pro-reference",
"prompt": "The woman from the reference photo talks warmly to the camera in a cozy bakery, "
"natural head movement, lips in sync with the voiceover",
"opts": {
"mode": "cost", # cheapest mode; "speed" is faster
"resolution": "480p", # or "768p"
"duration": "7", # close to the voiceover length (7.3 s)
"aspect_ratio": "16:9",
"reference_image_urls": ["https://your-cdn.example/presenter.jpg"],
"reference_audio_urls": ["https://your-cdn.example/voiceover.mp3"],
"keep_audio": True, # use this track as the soundtrack, not as a sample
},
}
job = requests.post(f"{API}/api/media/generate", json=body, headers=HEADERS).json()
print(job["jobId"], job["status"], job["priceRub"])
The field is called priceRub for historical reasons; on getvibeapi.com it carries US dollars, the same number the quote returned.
3. Poll for the result
while True:
r = requests.get(f"{API}/api/media/jobs/{job['jobId']}", headers=HEADERS).json()
if r["status"] in ("success", "fail"):
break
time.sleep(10)
print(r["status"], r["resultUrls"])
For production batches, use a webhook instead of polling; see media webhooks. Result links expire after about a week, so copy the file to your own storage.
What we got
Our job finished in a few minutes with status success. The result was an MP4: 832×480, 7.33 seconds, with an audio track. Checks we ran on it:
- The voice is ours. We compared the clip’s soundtrack with the original voiceover sample by sample: correlation 0.99998 at zero offset. The model kept the file, not a re-voiced imitation.
- The face is kept. Frames at 1, 3 and 5 seconds show the same woman as the reference photo (hair, earrings, green linen shirt), now in a bakery as the prompt asked, talking with visible mouth movement.
- Length follows the track. A 7.3-second voiceover with
duration: "7"produced a 7.33-second clip, as the within-one-second rule predicts.
480p in Cost mode is fine for previews and small social formats. For a final cut, run the same request at 768p once you are happy with the prompt.
Tips and limits
- Send exactly one audio file with
keep_audio; with two or three, the request is rejected with a clear error. - Keep the voiceover at or under 15 seconds. For longer scripts, split into several clips and join them.
- Every reference image is billed, including
first_frame_urlandlast_frame_url. One good portrait is usually enough. - Describe the setting and the manner of speaking in the prompt (“calm, explaining”, “smiling, energetic”); the words come from your audio.
- Only use photos and voices you have the rights to. Do not impersonate real people without their consent.
Other video models, including text-to-video and image-to-video options, are listed on the models page, and image, video and voice through one API explains the media job flow in general. Full request reference: media generation docs.
Where this is useful
Talking clips built from a still photo and a ready voiceover fit any workflow where the words are fixed and the face is the same every time:
- Product and feature announcements. Record a 10-second script once, and have your presenter deliver it in front of different backgrounds by changing only the prompt.
- Course and onboarding intros. A consistent host for every lesson without booking a studio for each one.
- Localized versions. Record or synthesize the voiceover in another language and generate a matching clip; the lips follow the new audio.
- Customer support snippets. Short “here is how to do X” clips where accuracy of the wording matters more than cinematic motion.
Two things it is not: a long-form avatar tool (each generation is at most 15 seconds) and a way to edit an existing video. For changing the look of footage you already have, see Kling 3.0 Omni Transformation.
FAQ
Can I make a photo talk with my own recorded voice?
Yes. Send the photo in reference_image_urls, your recording as the single item in reference_audio_urls, and keep_audio: true. The recording becomes the clip’s soundtrack and the lips are generated to match it.
What happens without keep_audio?
The audio is used only as a sample to imitate. Your file is not in the output, and the speech in the clip may be different.
How long can the clip be?
5 to 15 seconds per generation. Reference audio is limited to 15 seconds combined.
How much does a talking clip cost?
It depends on duration, resolution, mode and the references you send. Get an exact figure from the free /api/media/price endpoint before generating; our 7-second 480p Cost-mode clip with one photo and one audio track is shown above. Live tiers are on the model page.
Is the output watermarked?
We did not see any watermark on our clip.
