Skip to main content
POST
/
voice_clones
/
from_upload
JavaScript
import Telnyx from 'telnyx';

const client = new Telnyx({
  apiKey: process.env['TELNYX_API_KEY'], // This is the default and can be omitted
});

const response = await client.voiceClones.createFromUpload({
  audio_file: fs.createReadStream('path/to/file'),
  language: 'lkf-Lz1vLbBu-9uDh-9AHaOS2D-Cbf',
  name: 'name',
});

console.log(response.data);
import os
from telnyx import Telnyx

client = Telnyx(
api_key=os.environ.get("TELNYX_API_KEY"), # This is the default and can be omitted
)
response = client.voice_clones.create_from_upload(
audio_file=b"Example data",
language="lkf-Lz1vLbBu-9uDh-9AHaOS2D-Cbf",
name="name",
)
print(response.data)
package main

import (
"bytes"
"context"
"fmt"
"io"

"github.com/team-telnyx/telnyx-go"
"github.com/team-telnyx/telnyx-go/option"
)

func main() {
client := telnyx.NewClient(
option.WithAPIKey("My API Key"),
)
response, err := client.VoiceClones.NewFromUpload(context.TODO(), telnyx.VoiceCloneNewFromUploadParams{
AudioFile: io.Reader(bytes.NewBuffer([]byte("Example data"))),
Language: "lkf-Lz1vLbBu-9uDh-9AHaOS2D-Cbf",
Name: "name",
})
if err != nil {
panic(err.Error())
}
fmt.Printf("%+v\n", response.Data)
}
package com.telnyx.sdk.example;

import com.telnyx.sdk.client.TelnyxClient;
import com.telnyx.sdk.client.okhttp.TelnyxOkHttpClient;
import com.telnyx.sdk.models.voiceclones.VoiceCloneCreateFromUploadParams;
import com.telnyx.sdk.models.voiceclones.VoiceCloneCreateFromUploadResponse;
import java.io.ByteArrayInputStream;

public final class Main {
private Main() {}

public static void main(String[] args) {
TelnyxClient client = TelnyxOkHttpClient.fromEnv();

VoiceCloneCreateFromUploadParams params = VoiceCloneCreateFromUploadParams.builder()
.audioFile(new ByteArrayInputStream("Example data".getBytes()))
.language("lkf-Lz1vLbBu-9uDh-9AHaOS2D-Cbf")
.name("name")
.build();
VoiceCloneCreateFromUploadResponse response = client.voiceClones().createFromUpload(params);
}
}
require "telnyx"

telnyx = Telnyx::Client.new(api_key: "My API Key")

response = telnyx.voice_clones.create_from_upload(
audio_file: StringIO.new("Example data"),
language: "lkf-Lz1vLbBu-9uDh-9AHaOS2D-Cbf",
name: "name"
)

puts(response)
telnyx voice-clones create-from-upload \
--api-key 'My API Key' \
--audio-file 'Example data' \
--language lkf-Lz1vLbBu-9uDh-9AHaOS2D-Cbf \
--name name
curl --request POST \
--url https://api.telnyx.com/v2/voice_clones/from_upload \
--header 'Content-Type: multipart/form-data' \
--form audio_file='@example-file' \
--form 'name=<string>' \
--form 'language=<string>' \
--form 'ref_text=<string>' \
--form 'label=<string>' \
--form provider=telnyx
<?php

$curl = curl_init();

curl_setopt_array($curl, [
CURLOPT_URL => "https://api.telnyx.com/v2/voice_clones/from_upload",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"audio_file\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"name\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"language\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"ref_text\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"label\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"provider\"\r\n\r\ntelnyx\r\n-----011000010111000001101001--",
CURLOPT_HTTPHEADER => [
"Content-Type: multipart/form-data; boundary=---011000010111000001101001"
],
]);

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}
{
  "data": {
    "record_type": "voice_clone",
    "id": "660f9511-f3ac-52e5-b827-557766551111",
    "source_voice_design_id": "550e8400-e29b-41d4-a716-446655440000",
    "source_voice_design_version": 1,
    "name": "clone-narrator",
    "language": "en",
    "gender": "male",
    "label": "Speak in a warm, friendly tone",
    "created_at": "2024-01-01T00:00:00Z",
    "updated_at": "2024-01-01T00:00:00Z",
    "provider": "Telnyx",
    "provider_supported_models": [
      "Qwen3TTS"
    ],
    "provider_voice_id": "660f9511-f3ac-52e5-b827-557766551111"
  }
}
{
"errors": [
{
"code": "10005",
"title": "Resource not found",
"detail": "Voice design not found"
}
]
}
{
"errors": [
{
"code": "10005",
"title": "Resource not found",
"detail": "Voice design not found"
}
]
}
{
"errors": [
{
"code": "10005",
"title": "Resource not found",
"detail": "Voice design not found"
}
]
}
{
"errors": [
{
"code": "10005",
"title": "Resource not found",
"detail": "Voice design not found"
}
]
}

Body

multipart/form-data

Multipart form data for creating a voice clone from a direct audio upload.

audio_file
file
required

Audio file to clone the voice from. Supported formats: WAV, MP3, FLAC, OGG, M4A. For best quality, provide 5–10 seconds of clear, uninterrupted speech. Maximum size: 5MB for Telnyx, 20MB for Minimax.

name
string
required

Name for the voice clone.

Maximum string length: 255
language
string
required

ISO 639-1 language code (e.g. en, fr) or auto for automatic detection.

Pattern: ^([Aa]uto|[a-z]{2,3}(-[A-Za-z0-9]{2,8})*)$
gender
enum<string>

Gender of the voice clone.

Available options:
male,
female,
neutral
ref_text
string

Optional transcript of the audio file. Providing this improves clone quality.

label
string

Optional custom label describing the voice style. If omitted, falls back to the source design's prompt text.

provider
enum<string>
default:telnyx

Voice synthesis provider. Case-insensitive. Defaults to telnyx.

Available options:
telnyx,
minimax,
Telnyx,
Minimax

Response

Voice clone created successfully from the uploaded audio.

Response envelope for a single voice clone.

data
object

A voice clone object.