Voice cloning
POST /v1/voices/clone creates a custom voice from recordings of one real person. We only create a voice when that person has given verified consent. No consent, no voice.
Consent requirements
Every clone request must include:
- A consent recording. The voice owner reads our consent statement aloud, in their own voice, in Swahili or English. We check that it is the same speaker as the samples.
- The voice owner's details. Full name and an email address. We email them a copy of what they agreed to and a link to withdraw.
- A stated use. One or two sentences on where the voice will be used, for example "IVR prompts for our customer line".
The Swahili consent statement:
"Mimi, [jina lako kamili], nakubali nakala ya kidijitali ya sauti yangu itengenezwe na kutumiwa na [jina la shirika] kupitia Waridi, kwa matumizi yaliyoelezwa. Ninaelewa kwamba ninaweza kusitisha ruhusa hii wakati wowote."
The English version:
"I, [your full name], agree that a digital copy of my voice may be created and used by [organisation name] through Waridi, for the use described. I understand I can withdraw this permission at any time."
We do not clone voices of public figures, politicians or anyone who has not personally recorded the statement. Attempts to get around these checks end in account suspension.
Recording samples
- 1 to 5 files, 1 to 5 minutes of speech in total.
- One speaker only, no music, quiet room, consistent microphone.
- Speak the way the voice will be used: calm and clear for a support line, livelier for ads.
- WAV or FLAC at 16 kHz or higher is best. MP3 at 128 kbps or more is accepted.
Request
from waridi import Waridi
client = Waridi()
voice = client.voices.clone(
name="Neema - support line",
language="sw-TZ",
samples=[open("neema_01.wav", "rb"), open("neema_02.wav", "rb")],
consent_recording=open("neema_consent.wav", "rb"),
owner_name="[Full name]",
owner_email="owner@example.com",
intended_use="Recorded prompts and agent replies for our customer support line.",
)
print(voice.id, voice.status) # vc_01J... pending_verification
import { Waridi } from "@waridi/sdk";
import { createReadStream } from "node:fs";
const client = new Waridi();
const voice = await client.voices.clone({
name: "Neema - support line",
language: "sw-TZ",
samples: [createReadStream("neema_01.wav"), createReadStream("neema_02.wav")],
consentRecording: createReadStream("neema_consent.wav"),
ownerName: "[Full name]",
ownerEmail: "owner@example.com",
intendedUse: "Recorded prompts and agent replies for our customer support line.",
});
console.log(voice.id, voice.status);
curl https://api.waridi.io/v1/voices/clone \
-H "Authorization: Bearer $WARIDI_API_KEY" \
-F name="Neema - support line" \
-F language=sw-TZ \
-F samples=@neema_01.wav \
-F samples=@neema_02.wav \
-F consent_recording=@neema_consent.wav \
-F owner_name="[Full name]" \
-F owner_email=owner@example.com \
-F intended_use="Recorded prompts and agent replies for our customer support line."
Response (202 Accepted):
{
"id": "vc_01J9ZD7Y3K",
"object": "voice",
"name": "Neema - support line",
"status": "pending_verification",
"language": "sw-TZ",
"created_at": "2026-10-14T11:02:00Z"
}
Voice status
| Status | Meaning |
|---|---|
pending_verification |
We are checking the consent recording against the samples. During early access a person on our team reviews every request |
training |
Consent verified. The voice is being built |
ready |
Use the id as voice in TTS, streaming or agents |
rejected |
Consent could not be verified. The reason is in status_reason |
revoked |
The owner withdrew consent. The voice can no longer be used |
Withdrawal and deletion
The voice owner can withdraw consent at any time from the link in their email, or by writing to hello@waridi.io. When that happens we stop generating with the voice within 24 hours and delete the samples and the model within 30 days. You can also delete a voice yourself from Studio.
Plan availability
Voice cloning is available on Builder, Business and Enterprise plans. It is not available in the Free sandbox.