VoiceMaker

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

ConstraintValueNotes
Max audio / video duration30 secondsLonger clips are rejected.
Credit cost50 credits per secondA 30-second video ≈ 1,500 credits.
Output formatsmp4, webmDefault 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

ParameterTypeStatusDescription
image_urlstringRequiredURL of the portrait image to animate.
audio_urlstringRequiredURL of the audio clip to lip-sync (≤ 30s).
output_formatstringOptionalmp4 or webm. Default mp4.
cURL
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"
  }'
Python
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

JSON
{
  "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
curl -X GET https://api.myvoicemaker.ai/dev/v1/animate/anim_1a2b3c4d5e6f7g8h9i0j \
  -H "Authorization: Bearer vmk_live_a1b2c3d4e5f6_8h9i0jKLmnOPqrSt"

Response — 200 Completed

JSON
{
  "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
}