Voice Cloning API

Create a voice from a short sample, then synthesize with it

Voice cloning creates a synthetic version of a specific voice from a short sample, then synthesizes any text in that voice. It is part of the Build API: you create a voice, get an ID, and use it on the same speech endpoints as any catalog voice.

Cloning happens in two legs. The consent leg proves the speaker agreed: a challenge phrase, read aloud, recorded. The cloning leg, this page, turns the sample plus that proof into a voice. The Consent page covers the first leg in full - the challenge lifecycle, the recording rules, and every verification refusal - and the sequence diagram shows how the two calls fit together.

There is no create path that skips consent: consent_challenge_id and consent_recording are required fields, and the recording is retained as the consent record for the voice.

The previous cloning flow is deprecated and will be switched off; the date will be announced in the changelog ahead of time. If your integration sends a consent form field (a JSON string with fullName and email) to POST /v1/voices, migrate to the consent-challenge flow on this page and re-pin Speechify-Version: 2026-09-13. Existing cloned voices are unaffected and keep working. Blocked or need more time? Contact support and we will work out an extension for your workspace.

1

Set your API key

$export SPEECHIFY_API_KEY="your-api-key-here"
2

Prepare a sample

Record 10-30 seconds of clean speech, under a minute and under 5MB, with no background noise. Sample quality is the biggest factor in the result.

4

Create the voice

Send the sample, the recording, and the challenge id to POST /v1/voices as multipart form data:

POST
/v1/voices
1curl -X POST https://api.speechify.ai/v1/voices \
2 -H "Authorization: Bearer <token>" \
3 -H "Content-Type: multipart/form-data" \
4 -F avatar=@<file1> \
5 -F consent_challenge_id="string" \
6 -F consent_recording=@string \
7 -F gender="male" \
8 -F name="string" \
9 -F sample=@string

The response is the created voice; its id is what you pass as voice_id when synthesizing. Send an Idempotency-Key header on the create so a retry of a create that completed but whose response was lost replays the stored result instead of consuming a fresh challenge.

5

Synthesize with the cloned voice

Pass the voice_id to POST /v1/audio/speech exactly like a catalog voice:

POST
/v1/audio/speech
1curl -X POST https://api.speechify.ai/v1/audio/speech \
2 -H "Authorization: Bearer <token>" \
3 -H "Content-Type: application/json" \
4 -d '{
5 "input": "Hello! This is the Speechify text-to-speech API.",
6 "voice_id": "geffen_32",
7 "audio_format": "mp3",
8 "model": "simba-3.2"
9}'

Required fields

FieldRequiredNotes
nameYesA label for the voice.
genderYesmale, female, or not_specified.
sampleYesThe 10-30s voice sample the clone is built from (binary).
consent_challenge_idYesThe id from POST /v1/voices/consent-challenges. Single use.
consent_recordingYesThe speaker reading the challenge phrase (binary).
localeNoDefaults to en-US.
avatarNoAvatar image for the voice (binary).

When verification fails

A create refused on consent grounds returns a consent_* error code, and three of them share 422, so branch on the code rather than the status. Every code, what it means, and the fix is in When verification fails on the Consent page. One rule to build around: a refused create still spends the challenge, so every retry starts with a new challenge and a new phrase.

Versioning

This flow ships on Speechify-Version: 2026-09-13; it is callable now by pinning that version, and it becomes the default for new workspaces on that date. Workspaces pinned to earlier versions get the previous shape, where POST /v1/voices instead takes a consent form field (a JSON string with fullName and email) and no challenge. That flow is deprecated as of 13 August 2026 and will be switched off on a date announced in the changelog, deliberately sooner than the standard 12-month sunset because the unverified flow is a safety liability rather than just an old shape. A pinned default never moves on its own, so migrating means re-pinning 2026-09-13.

Model support

Cloned voices run self-serve on simba-3.0, simba-english and simba-multilingual. Use simba-multilingual to speak a cloned voice across 30+ languages from one voice ID.

simba-3.2 also serves cloned voices, currently as a limited release enabled per workspace — contact Speechify to have it enabled. Each voice’s models array in GET /v1/voices reflects what your workspace can actually synthesize, so branch on that rather than assuming. simba-3.2 is English only: a cloned voice with a non-English locale returns 400 there.

Next steps