Skip to main content
Professional Voice Clone is a paid feature. Each voice occupies a purchased professional voice clone slot. Buy slots on the Usage page before creating a voice; a request with no free slot returns 400 resource_limit_reached.
A professional clone trains a dedicated HeyGen Voice adapter from one or more recordings of the same speaker. It is the highest-fidelity clone HeyGen offers. To make a voice from one short recording in seconds, use the Instant Voice Clone on the same endpoint with "mode": "instant".
  1. Create a voice, or retrain an existing one with new recordings.
  2. Poll until the voice is ACTIVE.
  3. Generate speech, completed or streamed.

Set up with an agent

Not technical? Let your coding agent do it with you. Paste this into Claude Code, Codex, or Cursor and it walks you through every step on this page, one at a time, in your own terminal.
Prompt for your agent

Before you start

Slots and training allowance

  • Voices belong to the workspace of the API key that created them. Create the key in the workspace that should own the voice.
  • One purchased slot per voice. Retraining reuses the voice’s slot.
  • Each slot provides five pooled trainings per monthly billing period, initial training included. Failed trainings are free.
  • If the workspace later exceeds its slot limit, for example when a slot add-on lapses, the surplus voices return voice_expired on synthesis until you add a slot or delete another professional voice. The voice and its data stay intact.

Prepare the recordings

Provide 1–10 recordings of the same speaker totaling at least 20 minutes. Duration is measured including silence, so trim dead air, background noise, and overlapping speech. Upload local files with the Assets API and pass the returned asset_id values:
Size limits per recording: 32 MB for a public URL, 16 MB for inline base64 after decoding, 200 MB for a completed asset_id. For larger files use the direct upload flow.

1. Create a voice

POST /v3/models/audio/voices returns 202 Accepted while training runs.
Response
Every recording is validated and staged before the voice is created, so undecodable audio, an unreachable URL, or fewer than 20 minutes in total returns 400 invalid_parameter with no voice_id. Idempotency-Key is optional. Reusing a key within 24 hours returns the original response; a duplicate that arrives while the original is still being accepted returns 409 request_in_progress. Without the header, repeated requests create separate voices.

Retrain a voice

Send "mode": "professional", the existing voice_id, and replacement audio. The ID, name, and language are kept. The voice becomes PENDING until training completes, and a failed retraining restores the previously active voice.

2. Poll training status

Poll GET /v3/models/audio/voices/{voice_id} with backoff until the status is terminal.
Response
created_at is a Unix timestamp in seconds.

3. Generate speech

Pass the ACTIVE voice to Text to Speech: POST /v3/models/audio/tts for one completed WAV, or POST /v3/models/audio/tts/stream for audio parts as they are generated.

Manage voices

GET /v3/models/audio/voices lists the workspace’s instant and professional voices, newest first, with mode telling them apart, with limit (1–100, default 10) and cursor token. Pass the returned next_token while has_more is true. type=public lists HeyGen’s public voices instead. An ACTIVE professional voice has a preview_audio_url, a WAV of the voice reading a short preview script, made right after training. It can be null for a few minutes after a voice turns ACTIVE, and for a voice whose preview could not be made yet. DELETE /v3/models/audio/voices/{voice_id} removes an ACTIVE or FAILED voice and frees its slot. Wait for a PENDING voice to finish training first.

Errors

Synthesis errors, including voice_expired, are listed on Text to Speech. The full catalog is in Error Codes.