curl --request POST \
--url https://api.goenhance.ai/api/v1/audio/generations \
--header 'Content-Type: application/json' \
--data @- <<EOF
{
"model": "qwen3-tts",
"text": "Welcome to GoEnhance. Let's build something great today.",
"voice": "Serena",
"style": "warm and upbeat",
"language": "english"
}
EOFimport requests
url = "https://api.goenhance.ai/api/v1/audio/generations"
payload = {
"model": "qwen3-tts",
"text": "Welcome to GoEnhance. Let's build something great today.",
"voice": "Serena",
"style": "warm and upbeat",
"language": "english"
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
model: 'qwen3-tts',
text: 'Welcome to GoEnhance. Let\'s build something great today.',
voice: 'Serena',
style: 'warm and upbeat',
language: 'english'
})
};
fetch('https://api.goenhance.ai/api/v1/audio/generations', 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.goenhance.ai/api/v1/audio/generations",
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([
'model' => 'qwen3-tts',
'text' => 'Welcome to GoEnhance. Let\'s build something great today.',
'voice' => 'Serena',
'style' => 'warm and upbeat',
'language' => 'english'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$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.goenhance.ai/api/v1/audio/generations"
payload := strings.NewReader("{\n \"model\": \"qwen3-tts\",\n \"text\": \"Welcome to GoEnhance. Let's build something great today.\",\n \"voice\": \"Serena\",\n \"style\": \"warm and upbeat\",\n \"language\": \"english\"\n}")
req, _ := http.NewRequest("POST", url, payload)
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.goenhance.ai/api/v1/audio/generations")
.header("Content-Type", "application/json")
.body("{\n \"model\": \"qwen3-tts\",\n \"text\": \"Welcome to GoEnhance. Let's build something great today.\",\n \"voice\": \"Serena\",\n \"style\": \"warm and upbeat\",\n \"language\": \"english\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.goenhance.ai/api/v1/audio/generations")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"model\": \"qwen3-tts\",\n \"text\": \"Welcome to GoEnhance. Let's build something great today.\",\n \"voice\": \"Serena\",\n \"style\": \"warm and upbeat\",\n \"language\": \"english\"\n}"
response = http.request(request)
puts response.read_bodyQwen3 TTS
Natural text-to-speech from Qwen with 9 preset voices — including Beijing and Sichuan dialect voices — and plain-language control over tone, emotion and pace through style. Speaks Chinese, English, Japanese, Korean, German, French, Russian, Portuguese, Spanish and Italian. Returns an mp3 (default) or WAV URL (24 kHz, mono).
Every voice can speak every supported language; each sounds most natural in its native language:
| Voice | Character | Native language |
|---|---|---|
Vivian | bright young female voice with a slight edge | Chinese |
Serena | warm, gentle young female voice | Chinese |
Uncle_Fu | seasoned male voice with a low, mellow timbre | Chinese |
Dylan | youthful male voice with a Beijing accent | Chinese (Beijing dialect) |
Eric | lively, slightly husky male voice with a Sichuan accent | Chinese (Sichuan dialect) |
Ryan | dynamic male voice with strong rhythm | English |
Aiden | sunny American male voice | English |
Ono_Anna | playful, light female voice | Japanese |
Sohee | warm female voice with rich emotion | Korean |
Pricing — billed by text length, not by audio duration:
| Unit | Tokens | USD |
|---|---|---|
| every 200 characters (rounded up) | 1 | $0.02 |
A 350-character request is billed as 2 units (2 tokens = $0.04). Anything from 1 to 200 characters costs 1 unit.
Returns an img_uuid; poll GET /api/v1/jobs/detail (or use custom_callback_url) to get the generated audio. The result arrives as a json array item with type: "audio" and the audio URL in value. If generation fails, the task ends as failed and the tokens are refunded automatically.
curl --request POST \
--url https://api.goenhance.ai/api/v1/audio/generations \
--header 'Content-Type: application/json' \
--data @- <<EOF
{
"model": "qwen3-tts",
"text": "Welcome to GoEnhance. Let's build something great today.",
"voice": "Serena",
"style": "warm and upbeat",
"language": "english"
}
EOFimport requests
url = "https://api.goenhance.ai/api/v1/audio/generations"
payload = {
"model": "qwen3-tts",
"text": "Welcome to GoEnhance. Let's build something great today.",
"voice": "Serena",
"style": "warm and upbeat",
"language": "english"
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
model: 'qwen3-tts',
text: 'Welcome to GoEnhance. Let\'s build something great today.',
voice: 'Serena',
style: 'warm and upbeat',
language: 'english'
})
};
fetch('https://api.goenhance.ai/api/v1/audio/generations', 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.goenhance.ai/api/v1/audio/generations",
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([
'model' => 'qwen3-tts',
'text' => 'Welcome to GoEnhance. Let\'s build something great today.',
'voice' => 'Serena',
'style' => 'warm and upbeat',
'language' => 'english'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$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.goenhance.ai/api/v1/audio/generations"
payload := strings.NewReader("{\n \"model\": \"qwen3-tts\",\n \"text\": \"Welcome to GoEnhance. Let's build something great today.\",\n \"voice\": \"Serena\",\n \"style\": \"warm and upbeat\",\n \"language\": \"english\"\n}")
req, _ := http.NewRequest("POST", url, payload)
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.goenhance.ai/api/v1/audio/generations")
.header("Content-Type", "application/json")
.body("{\n \"model\": \"qwen3-tts\",\n \"text\": \"Welcome to GoEnhance. Let's build something great today.\",\n \"voice\": \"Serena\",\n \"style\": \"warm and upbeat\",\n \"language\": \"english\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.goenhance.ai/api/v1/audio/generations")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"model\": \"qwen3-tts\",\n \"text\": \"Welcome to GoEnhance. Let's build something great today.\",\n \"voice\": \"Serena\",\n \"style\": \"warm and upbeat\",\n \"language\": \"english\"\n}"
response = http.request(request)
puts response.read_bodyHeaders
Body
Model name. Must be qwen3-tts.
qwen3-tts Text to synthesize. Required. Max 5000 characters. Billing is based on this length. Long texts are read in sentence-sized parts and joined into one file, so a single request can cover a whole article.
1 - 5000Preset voice. Optional — defaults to Vivian. Case-insensitive. See the voice table above for what each one sounds like.
Vivian, Serena, Uncle_Fu, Dylan, Eric, Ryan, Aiden, Ono_Anna, Sohee Optional. A short natural-language instruction for the delivery — tone, emotion or pace, e.g. speak in a cheerful, excited tone, 用特别愤怒的语气说, speaking slowly and calmly. Leave it out for a natural read. There is no speed parameter; describe the pace here instead.
500Language of text. Optional — defaults to auto. Case-insensitive; the two-letter codes are accepted too. Supported: Chinese, English, Japanese, Korean, German, French, Russian, Portuguese, Spanish and Italian. Setting it explicitly when you know the language gives the most stable result.
auto, chinese, english, japanese, korean, german, french, russian, portuguese, spanish, italian, zh, en, ja, ko, de, fr, ru, pt, es, it Audio format. Optional — mp3 (default, 128 kbps) or wav (16-bit). Both are 24 kHz mono.
mp3, wav Optional. A publicly accessible HTTPS URL. When the task status changes (processing / success / failed), GoEnhance sends a POST request to this URL. The request body is identical to the response of GET /api/v1/jobs/detail. If your server does not respond with HTTP 200, the notification is retried up to 3 times, with a 3-second timeout per attempt.
"https://your-server.com/goenhance/callback"
