curl --request POST \
--url https://api.vmeg.ai/openapi/v1/app/task/clone-voice/create \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'X-Idempotency-Key: <x-idempotency-key>' \
--data '
{
"voiceName": "<string>",
"sampleText": "<string>",
"provider": "V1",
"refAudio": "<string>",
"sampleLanguage": "zh-CN",
"refAudioMaterialId": "<string>"
}
'import requests
url = "https://api.vmeg.ai/openapi/v1/app/task/clone-voice/create"
payload = {
"voiceName": "<string>",
"sampleText": "<string>",
"provider": "V1",
"refAudio": "<string>",
"sampleLanguage": "zh-CN",
"refAudioMaterialId": "<string>"
}
headers = {
"X-Idempotency-Key": "<x-idempotency-key>",
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'X-Idempotency-Key': '<x-idempotency-key>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
voiceName: '<string>',
sampleText: '<string>',
provider: 'V1',
refAudio: '<string>',
sampleLanguage: 'zh-CN',
refAudioMaterialId: '<string>'
})
};
fetch('https://api.vmeg.ai/openapi/v1/app/task/clone-voice/create', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.vmeg.ai/openapi/v1/app/task/clone-voice/create",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'voiceName' => '<string>',
'sampleText' => '<string>',
'provider' => 'V1',
'refAudio' => '<string>',
'sampleLanguage' => 'zh-CN',
'refAudioMaterialId' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json",
"X-Idempotency-Key: <x-idempotency-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.vmeg.ai/openapi/v1/app/task/clone-voice/create"
payload := strings.NewReader("{\n \"voiceName\": \"<string>\",\n \"sampleText\": \"<string>\",\n \"provider\": \"V1\",\n \"refAudio\": \"<string>\",\n \"sampleLanguage\": \"zh-CN\",\n \"refAudioMaterialId\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-Idempotency-Key", "<x-idempotency-key>")
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.vmeg.ai/openapi/v1/app/task/clone-voice/create")
.header("X-Idempotency-Key", "<x-idempotency-key>")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"voiceName\": \"<string>\",\n \"sampleText\": \"<string>\",\n \"provider\": \"V1\",\n \"refAudio\": \"<string>\",\n \"sampleLanguage\": \"zh-CN\",\n \"refAudioMaterialId\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.vmeg.ai/openapi/v1/app/task/clone-voice/create")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-Idempotency-Key"] = '<x-idempotency-key>'
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"voiceName\": \"<string>\",\n \"sampleText\": \"<string>\",\n \"provider\": \"V1\",\n \"refAudio\": \"<string>\",\n \"sampleLanguage\": \"zh-CN\",\n \"refAudioMaterialId\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"code": 200,
"message": "",
"data": {
"voiceId": "<string>",
"name": "<string>",
"provider": "<string>",
"exampleLanguage": "<string>",
"content": "<string>",
"audio": "<string>",
"createTime": "<string>",
"updateTime": "<string>"
}
}Clone voice from sample audio (sync)
Clone a voice from a reference recording. The call is synchronous and returns when cloning finishes, which can take tens of seconds, so use a generous client timeout (for example 120 s). The voice is saved to My voices on the website and returned as cv_*; use it in voiceSpeakers.selectedVoicesList. sampleLanguage defaults to en-US; the engine is chosen automatically when provider is omitted. Requires a plan with voice cloning (403 otherwise).
curl --request POST \
--url https://api.vmeg.ai/openapi/v1/app/task/clone-voice/create \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'X-Idempotency-Key: <x-idempotency-key>' \
--data '
{
"voiceName": "<string>",
"sampleText": "<string>",
"provider": "V1",
"refAudio": "<string>",
"sampleLanguage": "zh-CN",
"refAudioMaterialId": "<string>"
}
'import requests
url = "https://api.vmeg.ai/openapi/v1/app/task/clone-voice/create"
payload = {
"voiceName": "<string>",
"sampleText": "<string>",
"provider": "V1",
"refAudio": "<string>",
"sampleLanguage": "zh-CN",
"refAudioMaterialId": "<string>"
}
headers = {
"X-Idempotency-Key": "<x-idempotency-key>",
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'X-Idempotency-Key': '<x-idempotency-key>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
voiceName: '<string>',
sampleText: '<string>',
provider: 'V1',
refAudio: '<string>',
sampleLanguage: 'zh-CN',
refAudioMaterialId: '<string>'
})
};
fetch('https://api.vmeg.ai/openapi/v1/app/task/clone-voice/create', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.vmeg.ai/openapi/v1/app/task/clone-voice/create",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'voiceName' => '<string>',
'sampleText' => '<string>',
'provider' => 'V1',
'refAudio' => '<string>',
'sampleLanguage' => 'zh-CN',
'refAudioMaterialId' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json",
"X-Idempotency-Key: <x-idempotency-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.vmeg.ai/openapi/v1/app/task/clone-voice/create"
payload := strings.NewReader("{\n \"voiceName\": \"<string>\",\n \"sampleText\": \"<string>\",\n \"provider\": \"V1\",\n \"refAudio\": \"<string>\",\n \"sampleLanguage\": \"zh-CN\",\n \"refAudioMaterialId\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-Idempotency-Key", "<x-idempotency-key>")
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.vmeg.ai/openapi/v1/app/task/clone-voice/create")
.header("X-Idempotency-Key", "<x-idempotency-key>")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"voiceName\": \"<string>\",\n \"sampleText\": \"<string>\",\n \"provider\": \"V1\",\n \"refAudio\": \"<string>\",\n \"sampleLanguage\": \"zh-CN\",\n \"refAudioMaterialId\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.vmeg.ai/openapi/v1/app/task/clone-voice/create")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-Idempotency-Key"] = '<x-idempotency-key>'
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"voiceName\": \"<string>\",\n \"sampleText\": \"<string>\",\n \"provider\": \"V1\",\n \"refAudio\": \"<string>\",\n \"sampleLanguage\": \"zh-CN\",\n \"refAudioMaterialId\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"code": 200,
"message": "",
"data": {
"voiceId": "<string>",
"name": "<string>",
"provider": "<string>",
"exampleLanguage": "<string>",
"content": "<string>",
"audio": "<string>",
"createTime": "<string>",
"updateTime": "<string>"
}
}Authorizations
Send your API Key in the Authorization header (Bearer <api_key>). See Authentication.
Headers
Required on mutating POST requests that create tasks or change persisted data (max 64 characters). See Idempotency.
64Body
Display name for the cloned voice in your asset library
Transcript of the reference audio (required)
Clone engine (V1–V5). See Supported clone methods.
V1, V2, V3, V4, V5 "V1"
HTTPS reference audio URL (use refAudioMaterialId for uploaded files). Provide exactly one of the two.
Sample language locale (BCP-47). See Supported languages.
"zh-CN"
Material ID of an uploaded audio/video file

