curl --request POST \
--url https://api.deapi.ai/api/v2/audio/speech \
--header 'Accept: <accept>' \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: multipart/form-data' \
--form 'text=A beautiful sunset over mountains' \
--form model=Kokoro \
--form lang=en-us \
--form speed=1 \
--form format=mp3 \
--form sample_rate=24000 \
--form mode=custom_voice \
--form voice=af_sky \
--form 'ref_audio=<string>' \
--form 'ref_text=<string>' \
--form 'instruct=<string>' \
--form webhook_url=https://your-server.com/webhooks/deapi \
--form webhook_secret=a1b2c3d4e5f60708091a2b3c4d5e6f7081920a1b2c3d4e5f60708091a2b3c4d5 \
--form ref_audio.0='@example-file' \
--form ref_audio.1='@example-file'import requests
url = "https://api.deapi.ai/api/v2/audio/speech"
files = {
"ref_audio.0": ("example-file", open("example-file", "rb")),
"ref_audio.1": ("example-file", open("example-file", "rb"))
}
payload = {
"text": "A beautiful sunset over mountains",
"model": "Kokoro",
"lang": "en-us",
"speed": "1",
"format": "mp3",
"sample_rate": "24000",
"mode": "custom_voice",
"voice": "af_sky",
"ref_audio": "<string>",
"ref_text": "<string>",
"instruct": "<string>",
"webhook_url": "https://your-server.com/webhooks/deapi",
"webhook_secret": "a1b2c3d4e5f60708091a2b3c4d5e6f7081920a1b2c3d4e5f60708091a2b3c4d5"
}
headers = {
"Accept": "<accept>",
"Authorization": "Bearer <token>"
}
response = requests.post(url, data=payload, files=files, headers=headers)
print(response.text)const form = new FormData();
form.append('text', 'A beautiful sunset over mountains');
form.append('model', 'Kokoro');
form.append('lang', 'en-us');
form.append('speed', '1');
form.append('format', 'mp3');
form.append('sample_rate', '24000');
form.append('mode', 'custom_voice');
form.append('voice', 'af_sky');
form.append('ref_audio', '<string>');
form.append('ref_text', '<string>');
form.append('instruct', '<string>');
form.append('webhook_url', 'https://your-server.com/webhooks/deapi');
form.append('webhook_secret', 'a1b2c3d4e5f60708091a2b3c4d5e6f7081920a1b2c3d4e5f60708091a2b3c4d5');
form.append('ref_audio.0', '{
"fileName": "example-file"
}');
form.append('ref_audio.1', '{
"fileName": "example-file"
}');
const options = {method: 'POST', headers: {Accept: '<accept>', Authorization: 'Bearer <token>'}};
options.body = form;
fetch('https://api.deapi.ai/api/v2/audio/speech', 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.deapi.ai/api/v2/audio/speech",
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=\"text\"\r\n\r\nA beautiful sunset over mountains\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"model\"\r\n\r\nKokoro\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"lang\"\r\n\r\nen-us\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"speed\"\r\n\r\n1\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"format\"\r\n\r\nmp3\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"sample_rate\"\r\n\r\n24000\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"mode\"\r\n\r\ncustom_voice\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"voice\"\r\n\r\naf_sky\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"ref_audio\"\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=\"instruct\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"webhook_url\"\r\n\r\nhttps://your-server.com/webhooks/deapi\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"webhook_secret\"\r\n\r\na1b2c3d4e5f60708091a2b3c4d5e6f7081920a1b2c3d4e5f60708091a2b3c4d5\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"ref_audio.0\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n{\r\n \"fileName\": \"example-file\"\r\n}\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"ref_audio.1\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n{\r\n \"fileName\": \"example-file\"\r\n}\r\n-----011000010111000001101001--",
CURLOPT_HTTPHEADER => [
"Accept: <accept>",
"Authorization: Bearer <token>",
"Content-Type: multipart/form-data"
],
]);
$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.deapi.ai/api/v2/audio/speech"
payload := strings.NewReader("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"text\"\r\n\r\nA beautiful sunset over mountains\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"model\"\r\n\r\nKokoro\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"lang\"\r\n\r\nen-us\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"speed\"\r\n\r\n1\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"format\"\r\n\r\nmp3\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"sample_rate\"\r\n\r\n24000\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"mode\"\r\n\r\ncustom_voice\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"voice\"\r\n\r\naf_sky\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"ref_audio\"\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=\"instruct\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"webhook_url\"\r\n\r\nhttps://your-server.com/webhooks/deapi\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"webhook_secret\"\r\n\r\na1b2c3d4e5f60708091a2b3c4d5e6f7081920a1b2c3d4e5f60708091a2b3c4d5\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"ref_audio.0\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n{\r\n \"fileName\": \"example-file\"\r\n}\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"ref_audio.1\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n{\r\n \"fileName\": \"example-file\"\r\n}\r\n-----011000010111000001101001--")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Accept", "<accept>")
req.Header.Add("Authorization", "Bearer <token>")
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.deapi.ai/api/v2/audio/speech")
.header("Accept", "<accept>")
.header("Authorization", "Bearer <token>")
.body("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"text\"\r\n\r\nA beautiful sunset over mountains\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"model\"\r\n\r\nKokoro\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"lang\"\r\n\r\nen-us\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"speed\"\r\n\r\n1\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"format\"\r\n\r\nmp3\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"sample_rate\"\r\n\r\n24000\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"mode\"\r\n\r\ncustom_voice\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"voice\"\r\n\r\naf_sky\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"ref_audio\"\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=\"instruct\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"webhook_url\"\r\n\r\nhttps://your-server.com/webhooks/deapi\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"webhook_secret\"\r\n\r\na1b2c3d4e5f60708091a2b3c4d5e6f7081920a1b2c3d4e5f60708091a2b3c4d5\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"ref_audio.0\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n{\r\n \"fileName\": \"example-file\"\r\n}\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"ref_audio.1\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n{\r\n \"fileName\": \"example-file\"\r\n}\r\n-----011000010111000001101001--")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.deapi.ai/api/v2/audio/speech")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Accept"] = '<accept>'
request["Authorization"] = 'Bearer <token>'
request.body = "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"text\"\r\n\r\nA beautiful sunset over mountains\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"model\"\r\n\r\nKokoro\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"lang\"\r\n\r\nen-us\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"speed\"\r\n\r\n1\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"format\"\r\n\r\nmp3\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"sample_rate\"\r\n\r\n24000\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"mode\"\r\n\r\ncustom_voice\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"voice\"\r\n\r\naf_sky\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"ref_audio\"\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=\"instruct\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"webhook_url\"\r\n\r\nhttps://your-server.com/webhooks/deapi\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"webhook_secret\"\r\n\r\na1b2c3d4e5f60708091a2b3c4d5e6f7081920a1b2c3d4e5f60708091a2b3c4d5\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"ref_audio.0\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n{\r\n \"fileName\": \"example-file\"\r\n}\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"ref_audio.1\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n{\r\n \"fileName\": \"example-file\"\r\n}\r\n-----011000010111000001101001--"
response = http.request(request)
puts response.read_body{
"data": {
"request_id": "c08a339c-73e5-4d67-a4d5-231302fbff9a"
}
}{
"data": {},
"message": "<string>",
"errors": [
"<unknown>"
],
"statusCode": 123
}{
"data": {},
"message": "<string>",
"errors": [
"<unknown>"
],
"statusCode": 123
}{
"message": "The selected model does not support Text To Image.",
"errors": {
"model": [
"The selected model does not support Text To Image."
]
}
}{
"message": "Too Many Attempts."
}Text-to-Speech
Generate speech audio from text. Supports three TTS modes: custom_voice (default, preset speakers), voice_clone (clone from reference audio), voice_design (create voice from description).
curl --request POST \
--url https://api.deapi.ai/api/v2/audio/speech \
--header 'Accept: <accept>' \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: multipart/form-data' \
--form 'text=A beautiful sunset over mountains' \
--form model=Kokoro \
--form lang=en-us \
--form speed=1 \
--form format=mp3 \
--form sample_rate=24000 \
--form mode=custom_voice \
--form voice=af_sky \
--form 'ref_audio=<string>' \
--form 'ref_text=<string>' \
--form 'instruct=<string>' \
--form webhook_url=https://your-server.com/webhooks/deapi \
--form webhook_secret=a1b2c3d4e5f60708091a2b3c4d5e6f7081920a1b2c3d4e5f60708091a2b3c4d5 \
--form ref_audio.0='@example-file' \
--form ref_audio.1='@example-file'import requests
url = "https://api.deapi.ai/api/v2/audio/speech"
files = {
"ref_audio.0": ("example-file", open("example-file", "rb")),
"ref_audio.1": ("example-file", open("example-file", "rb"))
}
payload = {
"text": "A beautiful sunset over mountains",
"model": "Kokoro",
"lang": "en-us",
"speed": "1",
"format": "mp3",
"sample_rate": "24000",
"mode": "custom_voice",
"voice": "af_sky",
"ref_audio": "<string>",
"ref_text": "<string>",
"instruct": "<string>",
"webhook_url": "https://your-server.com/webhooks/deapi",
"webhook_secret": "a1b2c3d4e5f60708091a2b3c4d5e6f7081920a1b2c3d4e5f60708091a2b3c4d5"
}
headers = {
"Accept": "<accept>",
"Authorization": "Bearer <token>"
}
response = requests.post(url, data=payload, files=files, headers=headers)
print(response.text)const form = new FormData();
form.append('text', 'A beautiful sunset over mountains');
form.append('model', 'Kokoro');
form.append('lang', 'en-us');
form.append('speed', '1');
form.append('format', 'mp3');
form.append('sample_rate', '24000');
form.append('mode', 'custom_voice');
form.append('voice', 'af_sky');
form.append('ref_audio', '<string>');
form.append('ref_text', '<string>');
form.append('instruct', '<string>');
form.append('webhook_url', 'https://your-server.com/webhooks/deapi');
form.append('webhook_secret', 'a1b2c3d4e5f60708091a2b3c4d5e6f7081920a1b2c3d4e5f60708091a2b3c4d5');
form.append('ref_audio.0', '{
"fileName": "example-file"
}');
form.append('ref_audio.1', '{
"fileName": "example-file"
}');
const options = {method: 'POST', headers: {Accept: '<accept>', Authorization: 'Bearer <token>'}};
options.body = form;
fetch('https://api.deapi.ai/api/v2/audio/speech', 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.deapi.ai/api/v2/audio/speech",
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=\"text\"\r\n\r\nA beautiful sunset over mountains\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"model\"\r\n\r\nKokoro\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"lang\"\r\n\r\nen-us\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"speed\"\r\n\r\n1\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"format\"\r\n\r\nmp3\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"sample_rate\"\r\n\r\n24000\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"mode\"\r\n\r\ncustom_voice\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"voice\"\r\n\r\naf_sky\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"ref_audio\"\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=\"instruct\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"webhook_url\"\r\n\r\nhttps://your-server.com/webhooks/deapi\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"webhook_secret\"\r\n\r\na1b2c3d4e5f60708091a2b3c4d5e6f7081920a1b2c3d4e5f60708091a2b3c4d5\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"ref_audio.0\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n{\r\n \"fileName\": \"example-file\"\r\n}\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"ref_audio.1\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n{\r\n \"fileName\": \"example-file\"\r\n}\r\n-----011000010111000001101001--",
CURLOPT_HTTPHEADER => [
"Accept: <accept>",
"Authorization: Bearer <token>",
"Content-Type: multipart/form-data"
],
]);
$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.deapi.ai/api/v2/audio/speech"
payload := strings.NewReader("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"text\"\r\n\r\nA beautiful sunset over mountains\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"model\"\r\n\r\nKokoro\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"lang\"\r\n\r\nen-us\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"speed\"\r\n\r\n1\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"format\"\r\n\r\nmp3\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"sample_rate\"\r\n\r\n24000\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"mode\"\r\n\r\ncustom_voice\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"voice\"\r\n\r\naf_sky\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"ref_audio\"\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=\"instruct\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"webhook_url\"\r\n\r\nhttps://your-server.com/webhooks/deapi\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"webhook_secret\"\r\n\r\na1b2c3d4e5f60708091a2b3c4d5e6f7081920a1b2c3d4e5f60708091a2b3c4d5\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"ref_audio.0\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n{\r\n \"fileName\": \"example-file\"\r\n}\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"ref_audio.1\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n{\r\n \"fileName\": \"example-file\"\r\n}\r\n-----011000010111000001101001--")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Accept", "<accept>")
req.Header.Add("Authorization", "Bearer <token>")
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.deapi.ai/api/v2/audio/speech")
.header("Accept", "<accept>")
.header("Authorization", "Bearer <token>")
.body("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"text\"\r\n\r\nA beautiful sunset over mountains\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"model\"\r\n\r\nKokoro\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"lang\"\r\n\r\nen-us\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"speed\"\r\n\r\n1\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"format\"\r\n\r\nmp3\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"sample_rate\"\r\n\r\n24000\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"mode\"\r\n\r\ncustom_voice\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"voice\"\r\n\r\naf_sky\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"ref_audio\"\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=\"instruct\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"webhook_url\"\r\n\r\nhttps://your-server.com/webhooks/deapi\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"webhook_secret\"\r\n\r\na1b2c3d4e5f60708091a2b3c4d5e6f7081920a1b2c3d4e5f60708091a2b3c4d5\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"ref_audio.0\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n{\r\n \"fileName\": \"example-file\"\r\n}\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"ref_audio.1\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n{\r\n \"fileName\": \"example-file\"\r\n}\r\n-----011000010111000001101001--")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.deapi.ai/api/v2/audio/speech")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Accept"] = '<accept>'
request["Authorization"] = 'Bearer <token>'
request.body = "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"text\"\r\n\r\nA beautiful sunset over mountains\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"model\"\r\n\r\nKokoro\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"lang\"\r\n\r\nen-us\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"speed\"\r\n\r\n1\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"format\"\r\n\r\nmp3\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"sample_rate\"\r\n\r\n24000\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"mode\"\r\n\r\ncustom_voice\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"voice\"\r\n\r\naf_sky\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"ref_audio\"\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=\"instruct\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"webhook_url\"\r\n\r\nhttps://your-server.com/webhooks/deapi\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"webhook_secret\"\r\n\r\na1b2c3d4e5f60708091a2b3c4d5e6f7081920a1b2c3d4e5f60708091a2b3c4d5\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"ref_audio.0\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n{\r\n \"fileName\": \"example-file\"\r\n}\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"ref_audio.1\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n{\r\n \"fileName\": \"example-file\"\r\n}\r\n-----011000010111000001101001--"
response = http.request(request)
puts response.read_body{
"data": {
"request_id": "c08a339c-73e5-4d67-a4d5-231302fbff9a"
}
}{
"data": {},
"message": "<string>",
"errors": [
"<unknown>"
],
"statusCode": 123
}{
"data": {},
"message": "<string>",
"errors": [
"<unknown>"
],
"statusCode": 123
}{
"message": "The selected model does not support Text To Image.",
"errors": {
"model": [
"The selected model does not support Text To Image."
]
}
}{
"message": "Too Many Attempts."
}request_id for status polling.
slug and the per-model voice catalog.POST /v1/audio/speech at https://oai.deapi.ai/v1. The six OpenAI voice aliases (alloy, echo, fable, onyx, nova, shimmer) are supported on Kokoro. See OpenAI Compatibility.Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Headers
application/json Body
Audio generation parameters. Supports three TTS modes: custom_voice (default, preset speakers), voice_clone (clone from reference audio), voice_design (create voice from description).
Text to be converted to speech
"A beautiful sunset over mountains"
The model to use for speech generation. Available models can be retrieved via the GET /api/v1/client/models endpoint.
"Kokoro"
Language to be used during audio generation
"en-us"
Generated audio speech speed
1
Audio output format
"mp3"
Sample rate of generated audio
24000
TTS mode: custom_voice (default), voice_clone, or voice_design. Determines which fields are required.
custom_voice, voice_clone, voice_design "custom_voice"
Name of the voice to be used. Required for custom_voice mode.
"af_sky"
Reference audio file for voice cloning. Supported formats: mp3, ogg, m4a. Max 10MB. Duration must be between 3-10 seconds (model-specific limits may apply). Required for voice_clone mode.
Optional transcript of the reference audio for improved voice cloning accuracy.
Natural language voice description for voice_design mode (e.g. "A warm female voice with a British accent"), or style/emotion control in custom_voice mode.
Optional HTTPS URL to receive webhook notifications for job status changes (processing, completed, failed). Must be HTTPS. Max 2048 characters. See Webhook Documentation for payload structure and authentication details.
2048"https://your-server.com/webhooks/deapi"
Optional per-request HMAC secret (min. 32 chars) used to sign the webhook callback. When present, overrides the account-default webhook secret. Requires webhook_url to also be set.
32 - 255"a1b2c3d4e5f60708091a2b3c4d5e6f7081920a1b2c3d4e5f60708091a2b3c4d5"
Response
ID of the inference request.
Information from success endpoint
Show child attributes
Show child attributes
Was this page helpful?