Animate
Create lip-sync videos by combining a static portrait image with audio. Upload an image and audio clip, and VoiceMaker generates a talking-head video. Animation runs asynchronously: submit a job, then poll for the result or receive a webhook.
Audio comes first
The Animate module accepts audio files only — not text. To animate from text,
generate speech with Text-to-Speech first, then pass the
resulting audio_url here.
Constraints
| Constraint | Value | Notes |
|---|---|---|
| Max audio / video duration | 30 seconds | Longer clips are rejected. |
| Credit cost | 50 credits per second | A 30-second video ≈ 1,500 credits. |
| Output formats | mp4, webm | Default mp4. |
Supported input formats
- Image — JPG, PNG (portrait, publicly accessible URL).
- Audio — MP3, WAV, OGG (publicly accessible URL), 30 seconds or less.
Generate an animation
POST/dev/v1/animate/generate
Requires the TRANSCRIPTIONS_WRITE scope.
Request parameters
| Parameter | Type | Status | Description |
|---|---|---|---|
image_url | string | Required | URL of the portrait image to animate. |
audio_url | string | Required | URL of the audio clip to lip-sync (≤ 30s). |
output_format | string | Optional | mp4 or webm. Default mp4. |
curl -X POST https://api.myvoicemaker.ai/dev/v1/animate/generate \
-H "Authorization: Bearer vmk_live_a1b2c3d4e5f6_8h9i0jKLmnOPqrSt" \
-H "Content-Type: application/json" \
-d '{
"image_url": "https://example.com/speaker-portrait.jpg",
"audio_url": "https://media.myvoicemaker.ai/.../tts-api.wav",
"output_format": "mp4"
}'from myvoicemaker import VoiceMaker
client = VoiceMaker(api_key="vmk_live_a1b2c3d4e5f6_8h9i0jKLmnOPqrSt")
job = client.animate.generate(
image_url="https://example.com/speaker-portrait.jpg",
audio_url="https://media.myvoicemaker.ai/.../tts-api.wav",
output_format="mp4",
)
print(job.job_id, job.estimated_credits)Response — 202 Processing
{
"requestId": "8f1c2d3e-4a5b-6c7d-8e9f-0a1b2c3d4e5f",
"job_id": "anim_1a2b3c4d5e6f7g8h9i0j",
"status": "queued",
"estimated_credits": 1500,
"created_at": "2026-03-03T10:30:00Z"
}Get an animation result
GET/dev/v1/animate/{job_id}
Poll until status is completed or failed. Requires the TRANSCRIPTIONS_READ
scope.
curl -X GET https://api.myvoicemaker.ai/dev/v1/animate/anim_1a2b3c4d5e6f7g8h9i0j \
-H "Authorization: Bearer vmk_live_a1b2c3d4e5f6_8h9i0jKLmnOPqrSt"Response — 200 Completed
{
"requestId": "9a8b7c6d-5e4f-3a2b-1c0d-9e8f7a6b5c4d",
"job_id": "anim_1a2b3c4d5e6f7g8h9i0j",
"status": "completed",
"video_url": "https://media.myvoicemaker.ai/animate/.../result.mp4",
"duration_seconds": 12.5,
"credits_used": 625,
"created_at": "2026-03-03T10:30:00Z",
"completed_at": "2026-03-03T10:33:40Z",
"error": null
}