---
title: Voice cloning
description: Create a private voice from a recording.
---

Create a private voice from a recording you have permission to use. A successful clone costs **$0.01** and returns a ready voice ID. Generating speech with that voice is charged separately.

## Create a voice

```bash
curl --fail --show-error https://api.sawtakarabi.ai/v1/voices \
  -H "Authorization: Bearer $SAWTAK_API_KEY" \
  -F "name=My voice" \
  -F 'labels={"dialect":"saudi-najdi"}' \
  -F "files=@reference.wav"
```

Send multipart form data, with a total size of at most 35 MiB:

| Field | Required | Description |
| --- | --- | --- |
| `files` | Yes | One nonempty reference audio file, at most 20 MiB. We use the first 30 seconds and retain the original privately until the voice is deleted. |
| `name` | Yes | Display name, 1–80 characters. |
| `labels` | Yes | JSON string containing a supported `dialect` code. |
| `description` | No | Up to 180 characters. |

The `labels` object accepts:

| Property | Values | Default |
| --- | --- | --- |
| `dialect` | Supported code, such as `saudi-najdi` | Required |
| `gender` | `male`, `female`, `neutral` | `male` |
| `age` | `young`, `middle`, `old` | `middle` |
| `use_case` | `conversational`, `narration`, `advertisement`, or `""` | `""` |

Find dialect codes in the [voice catalog](/docs/voices) or with the [agent skill](/docs/agent-skill).

The request waits for processing and returns HTTP `201`:

```json
{
  "object": "voice",
  "id": "<voice-id>",
  "status": "ready"
}
```

Use this ID immediately with [Text to speech](/docs/text-to-speech); no readiness polling is needed.

Use an [idempotency key](/docs/operations#prevent-duplicate-submissions) to protect against duplicate uploads. If the request times out and you received an operation ID, inspect it before submitting another clone. If no ID was received, retry with the same key.

## Update a voice

Only the owner can update or delete a voice. Send the fields you want to change:

```http
PATCH /v1/voices/{id}
Authorization: Bearer <API_KEY>
Content-Type: application/json

{
  "name": "Updated name",
  "labels": {"use_case": "narration"}
}
```

Accepts `name`, `description`, and `labels` using the limits above. Set `description` to `null` to clear it. Returns `200` with `{"ok":true}`.

## Delete a voice

```http
DELETE /v1/voices/{id}
Authorization: Bearer <API_KEY>
```

Returns `204` with no body. The deleted voice can no longer be used for synthesis.

For failures and upload limits, see [Errors](/docs/errors) and [Request limits](/docs/limits).
