> ## Documentation Index
> Fetch the complete documentation index at: https://developers.telnyx.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Clone from Audio — Quickstart

> Clone a voice step-by-step — upload a file, record in the browser, or use the API.

## Upload a file

<Steps>
  <Step title="Choose a provider">
    Select **Telnyx** or **Minimax** using the provider toggle.
  </Step>

  <Step title="Upload audio">
    In the [Voice Design Lab](https://portal.telnyx.com/#/app/ai/voice-design-lab), click **Upload Audio** and choose your file or drag and drop it.
  </Step>

  <Step title="Set voice details">
    Enter a name for the voice and select the gender.
  </Step>

  <Step title="Clone">
    Click **Clone Voice**. The system processes the audio and creates a voice clone, typically in a few seconds.
  </Step>
</Steps>

## Record directly in the browser

<Steps>
  <Step title="Switch to Record mode">
    Click **Upload Audio**, then select the **Record** tab.
  </Step>

  <Step title="Choose a language">
    Select the language you'll speak in. The system generates a reading script optimized for voice cloning.
  </Step>

  <Step title="Read the script">
    Click **Start Recording** and read the script clearly. It's designed to capture the full range of phonemes.
  </Step>

  <Step title="Review and submit">
    Listen to your recording. Re-record if needed, then click **Clone Voice**.
  </Step>
</Steps>

## Using the API

### Clone with Telnyx (default)

```http theme={null}
POST /v2/voice_clones/from_upload
Content-Type: multipart/form-data

audio_file: recording.wav
name: My Custom Voice
language: en
gender: female
```

### Clone with Minimax

Supports longer audio (up to 5 minutes):

```http theme={null}
POST /v2/voice_clones/from_upload
Content-Type: multipart/form-data

audio_file: recording.wav
name: My Custom Voice
language: en
gender: female
provider: minimax
```

### Clone with Ultra model

Ultra clones use the higher-quality `Ultra` model. The request returns `202 Accepted` — poll the clone's status until it becomes `active`.

```http theme={null}
POST /v2/voice_clones/from_upload
Content-Type: multipart/form-data

audio_file: recording.wav
name: My Ultra Voice
language: en
gender: female
provider: telnyx
model_id: Ultra
```

Response (`202 Accepted`):

```json theme={null}
{
  "data": {
    "id": "uuid",
    "status": "pending",
    ...
  }
}
```

Poll with `GET /v2/voice_clones` until `status` is `active`.

## SDK Examples

### Clone with Telnyx (default)

<CodeGroup>
  ```python Python theme={null}
  import telnyx

  client = telnyx.Telnyx(api_key="YOUR_TELNYX_API_KEY")

  clone = client.voice_clones.create_from_upload(
      params={
          "audio_file": open("recording.wav", "rb"),
          "name": "My Custom Voice",
          "language": "en",
          "gender": "female",
          "provider": "telnyx",
      }
  )

  print("Voice Clone Created:", clone.data)
  ```

  ```javascript Node.js theme={null}
  import Telnyx from 'telnyx';
  import fs from 'fs';

  const client = new Telnyx({ apiKey: 'YOUR_TELNYX_API_KEY' });

  const clone = await client.voiceClones.createFromUpload({
    params: {
      audio_file: fs.createReadStream('recording.wav'),
      name: 'My Custom Voice',
      language: 'en',
      gender: 'female',
      provider: 'telnyx',
    },
  });

  console.log('Voice Clone Created:', clone.data);
  ```
</CodeGroup>

### Clone with Minimax

Minimax supports longer audio (up to 20MB) and uses the `speech-2.8-turbo` model.

<CodeGroup>
  ```python Python theme={null}
  import telnyx

  client = telnyx.Telnyx(api_key="YOUR_TELNYX_API_KEY")

  clone = client.voice_clones.create_from_upload(
      params={
          "audio_file": open("recording.wav", "rb"),
          "name": "My Custom Voice",
          "language": "en",
          "gender": "female",
          "provider": "minimax",
      }
  )

  print("Voice Clone Created:", clone.data)
  ```

  ```javascript Node.js theme={null}
  import Telnyx from 'telnyx';
  import fs from 'fs';

  const client = new Telnyx({ apiKey: 'YOUR_TELNYX_API_KEY' });

  const clone = await client.voiceClones.createFromUpload({
    params: {
      audio_file: fs.createReadStream('recording.wav'),
      name: 'My Custom Voice',
      language: 'en',
      gender: 'female',
      provider: 'minimax',
    },
  });

  console.log('Voice Clone Created:', clone.data);
  ```
</CodeGroup>

### Clone with Ultra model

Ultra clones return `202 Accepted` and require polling until the status is `active`.

<CodeGroup>
  ```python Python theme={null}
  import telnyx
  import time

  client = telnyx.Telnyx(api_key="YOUR_TELNYX_API_KEY")

  # Create the clone (returns 202 Accepted)
  clone = client.voice_clones.create_from_upload(
      params={
          "audio_file": open("recording.wav", "rb"),
          "name": "My Ultra Voice",
          "language": "en",
          "gender": "female",
          "provider": "telnyx",
          "model_id": "Ultra",
      }
  )

  print("Clone submitted:", clone.data.id, "— status:", clone.data.status)

  # Poll until active
  while True:
      clones = client.voice_clones.list()
      for c in clones:
          if c.id == clone.data.id:
              if c.status == "active":
                  print("Clone ready!")
                  break
      else:
          time.sleep(5)
          continue
      break
  ```

  ```javascript Node.js theme={null}
  import Telnyx from 'telnyx';
  import fs from 'fs';

  const client = new Telnyx({ apiKey: 'YOUR_TELNYX_API_KEY' });

  // Create the clone (returns 202 Accepted)
  const clone = await client.voiceClones.createFromUpload({
    params: {
      audio_file: fs.createReadStream('recording.wav'),
      name: 'My Ultra Voice',
      language: 'en',
      gender: 'female',
      provider: 'telnyx',
      model_id: 'Ultra',
    },
  });

  console.log('Clone submitted:', clone.data.id, '— status:', clone.data.status);

  // Poll until active
  while (true) {
    const clones = await client.voiceClones.list();
    const found = clones.data.find((c) => c.id === clone.data.id);
    if (found?.status === 'active') {
      console.log('Clone ready!');
      break;
    }
    await new Promise((r) => setTimeout(r, 5000));
  }
  ```
</CodeGroup>

Once saved, see [Using Custom Voices](/docs/voice/voice-design-lab/using-custom-voices) for how to use it in AI Assistants, Call Control, and the TTS API.
