Create cloned voice
curl --request POST \
--url https://supertoneapi.com/v1/custom-voices/cloned-voice \
--header 'Content-Type: multipart/form-data' \
--header 'x-sup-api-key: <api-key>' \
--form files='@example-file' \
--form 'name=<string>' \
--form 'description=<string>'import requests
url = "https://supertoneapi.com/v1/custom-voices/cloned-voice"
files = { "files": ("example-file", open("example-file", "rb")) }
payload = {
"name": "<string>",
"description": "<string>"
}
headers = {"x-sup-api-key": "<api-key>"}
response = requests.post(url, data=payload, files=files, headers=headers)
print(response.text)const form = new FormData();
form.append('files', '<string>');
form.append('name', '<string>');
form.append('description', '<string>');
const options = {method: 'POST', headers: {'x-sup-api-key': '<api-key>'}};
options.body = form;
fetch('https://supertoneapi.com/v1/custom-voices/cloned-voice', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://supertoneapi.com/v1/custom-voices/cloned-voice"
payload := strings.NewReader("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"files\"; 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=\"description\"\r\n\r\n<string>\r\n-----011000010111000001101001--")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-sup-api-key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://supertoneapi.com/v1/custom-voices/cloned-voice",
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=\"files\"; 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=\"description\"\r\n\r\n<string>\r\n-----011000010111000001101001--",
CURLOPT_HTTPHEADER => [
"Content-Type: multipart/form-data",
"x-sup-api-key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}HttpResponse<String> response = Unirest.post("https://supertoneapi.com/v1/custom-voices/cloned-voice")
.header("x-sup-api-key", "<api-key>")
.body("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"files\"; 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=\"description\"\r\n\r\n<string>\r\n-----011000010111000001101001--")
.asString();{
"voice_id": "voice_123456789"
}{
"status": "error",
"message": "Invalid request data"
}{
"status": "error",
"message": {
"message": "Invalid API Key",
"error": "Unauthorized"
}
}{
"status": "error",
"message": {
"message": "Permission denied",
"error": "Forbidden"
}
}{
"status": "error",
"message": {
"message": "Voice not found",
"error": "Not Found"
}
}{
"status": "error",
"message": {
"message": "File too large",
"error": "Payload Too Large"
}
}{
"status": "error",
"message": "Unsupported audio format. Supported formats: WAV, MP3. Received: application/json"
}{
"status": "error",
"message": {
"message": "rate limit exceeded",
"error": "Too Many Requests"
}
}{
"status": "error",
"message": {
"message": "Failed to convert text to speech",
"error": "Internal Server Error"
}
}Custom voices
Create cloned voice
샘플 오디오 파일을 업로드하여 새 커스텀 보이스를 등록합니다.
POST
/
v1
/
custom-voices
/
cloned-voice
Create cloned voice
curl --request POST \
--url https://supertoneapi.com/v1/custom-voices/cloned-voice \
--header 'Content-Type: multipart/form-data' \
--header 'x-sup-api-key: <api-key>' \
--form files='@example-file' \
--form 'name=<string>' \
--form 'description=<string>'import requests
url = "https://supertoneapi.com/v1/custom-voices/cloned-voice"
files = { "files": ("example-file", open("example-file", "rb")) }
payload = {
"name": "<string>",
"description": "<string>"
}
headers = {"x-sup-api-key": "<api-key>"}
response = requests.post(url, data=payload, files=files, headers=headers)
print(response.text)const form = new FormData();
form.append('files', '<string>');
form.append('name', '<string>');
form.append('description', '<string>');
const options = {method: 'POST', headers: {'x-sup-api-key': '<api-key>'}};
options.body = form;
fetch('https://supertoneapi.com/v1/custom-voices/cloned-voice', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://supertoneapi.com/v1/custom-voices/cloned-voice"
payload := strings.NewReader("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"files\"; 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=\"description\"\r\n\r\n<string>\r\n-----011000010111000001101001--")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-sup-api-key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://supertoneapi.com/v1/custom-voices/cloned-voice",
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=\"files\"; 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=\"description\"\r\n\r\n<string>\r\n-----011000010111000001101001--",
CURLOPT_HTTPHEADER => [
"Content-Type: multipart/form-data",
"x-sup-api-key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}HttpResponse<String> response = Unirest.post("https://supertoneapi.com/v1/custom-voices/cloned-voice")
.header("x-sup-api-key", "<api-key>")
.body("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"files\"; 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=\"description\"\r\n\r\n<string>\r\n-----011000010111000001101001--")
.asString();{
"voice_id": "voice_123456789"
}{
"status": "error",
"message": "Invalid request data"
}{
"status": "error",
"message": {
"message": "Invalid API Key",
"error": "Unauthorized"
}
}{
"status": "error",
"message": {
"message": "Permission denied",
"error": "Forbidden"
}
}{
"status": "error",
"message": {
"message": "Voice not found",
"error": "Not Found"
}
}{
"status": "error",
"message": {
"message": "File too large",
"error": "Payload Too Large"
}
}{
"status": "error",
"message": "Unsupported audio format. Supported formats: WAV, MP3. Received: application/json"
}{
"status": "error",
"message": {
"message": "rate limit exceeded",
"error": "Too Many Requests"
}
}{
"status": "error",
"message": {
"message": "Failed to convert text to speech",
"error": "Internal Server Error"
}
}이 문서는 영어 원문을 기반으로 자동 번역되었습니다. 표현이 어색하거나 모호한 부분이 있을 수 있으니, 정확한 내용은 영어 원문을 함께 확인해 주세요.
voice_id는 프리셋 보이스와 동일한 TTS 엔드포인트로 즉시 호출할 수 있습니다.
API를 통한 보이스 클로닝은 Free 티어에서 제공되지 않습니다. Free 티어 계정은 Supertone Play에서 클로닝할 수 있습니다.
엔드포인트
POST https://supertoneapi.com/v1/custom-voices/cloned-voice
multipart/form-data로 전송해 주십시오.
요청 본문
| Field | Required | Description |
|---|---|---|
files | ✅ | 클로닝할 오디오 샘플입니다. WAV 또는 MP3, 3MB 미만이어야 합니다. |
name | ✅ | 보이스 이름입니다. 최대 100자. |
description | — | 자유 형식 설명입니다. |
샘플 품질 팁
최상의 클론 품질을 위해서는:- 배경 잡음이 적고 단일 화자만 녹음된 깨끗한 오디오를 사용해 주십시오.
- 일반적으로 5~30초면 충분합니다.
- 모노를 권장하며, 샘플레이트는 높아도 무방합니다.
응답
할당된voice_id를 포함한 새 커스텀 보이스 객체를 반환합니다. ID를 저장해 두었다가 Create speech에 전달하여 보이스를 사용해 주십시오.
오류
| Status | Cause |
|---|---|
400 Bad Request | files 또는 name이 누락되었거나, name이 너무 깁니다. |
413 Payload Too Large | 오디오 파일이 3MB를 초과합니다. |
415 Unsupported Media Type | 파일이 WAV 또는 MP3가 아닙니다. |
403 Forbidden | Free 티어 계정입니다(API를 통한 클로닝이 허용되지 않습니다). |
함께 보기
Docs: Custom voices
SDK 예제와 함께 보는 라이프사이클 가이드입니다.
Custom voice example
클론, 나열, 호출까지 엔드 투 엔드 예제입니다.
Authorizations
Body
multipart/form-data
Audio file and voice metadata
Response
Successfully created cloned voice
Unique identifier for the created voice
Example:
"voice_123456789"
⌘I