curl --request POST \
--url https://open.skills.video/api/v1/generation/fal-ai/qwen-3-tts/text-to-speech/1.7b \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"text": "I am solving the equation x = (-b +/- sqrt(b^2-4ac)) / 2a. Nobody can, it is a disaster and very sad."
}
'import requests
url = "https://open.skills.video/api/v1/generation/fal-ai/qwen-3-tts/text-to-speech/1.7b"
payload = { "text": "I am solving the equation x = (-b +/- sqrt(b^2-4ac)) / 2a. Nobody can, it is a disaster and very sad." }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
text: 'I am solving the equation x = (-b +/- sqrt(b^2-4ac)) / 2a. Nobody can, it is a disaster and very sad.'
})
};
fetch('https://open.skills.video/api/v1/generation/fal-ai/qwen-3-tts/text-to-speech/1.7b', 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://open.skills.video/api/v1/generation/fal-ai/qwen-3-tts/text-to-speech/1.7b",
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([
'text' => 'I am solving the equation x = (-b +/- sqrt(b^2-4ac)) / 2a. Nobody can, it is a disaster and very sad.'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"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://open.skills.video/api/v1/generation/fal-ai/qwen-3-tts/text-to-speech/1.7b"
payload := strings.NewReader("{\n \"text\": \"I am solving the equation x = (-b +/- sqrt(b^2-4ac)) / 2a. Nobody can, it is a disaster and very sad.\"\n}")
req, _ := http.NewRequest("POST", url, payload)
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://open.skills.video/api/v1/generation/fal-ai/qwen-3-tts/text-to-speech/1.7b")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"text\": \"I am solving the equation x = (-b +/- sqrt(b^2-4ac)) / 2a. Nobody can, it is a disaster and very sad.\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://open.skills.video/api/v1/generation/fal-ai/qwen-3-tts/text-to-speech/1.7b")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"text\": \"I am solving the equation x = (-b +/- sqrt(b^2-4ac)) / 2a. Nobody can, it is a disaster and very sad.\"\n}"
response = http.request(request)
puts response.read_bodyimport Foundation
let parameters = ["text": "I am solving the equation x = (-b +/- sqrt(b^2-4ac)) / 2a. Nobody can, it is a disaster and very sad."] as [String : Any?]
let postData = try JSONSerialization.data(withJSONObject: parameters, options: [])
let url = URL(string: "https://open.skills.video/api/v1/generation/fal-ai/qwen-3-tts/text-to-speech/1.7b")!
var request = URLRequest(url: url)
request.httpMethod = "POST"
request.timeoutInterval = 10
request.allHTTPHeaderFields = [
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
]
request.httpBody = postData
let (data, _) = try await URLSession.shared.data(for: request)
print(String(decoding: data, as: UTF8.self)){
"id": "gen_123",
"status": "IN_QUEUE",
"input": {
"prompt": "lofi piano with soft rain ambience",
"duration": 15
},
"usage": {
"total": 20,
"subscription": 20,
"permanent": 0
}
}{
"error": "TTS_GENERATION_INVALID_INPUT",
"code": "TTS_GENERATION_INVALID_INPUT",
"message": "'prompt' parameter is required"
}{
"error": "UNAUTHORIZED",
"code": "UNAUTHORIZED",
"message": "Unauthorized"
}{
"error": "INSUFFICIENT_CREDITS",
"code": "TTS_GENERATION_INSUFFICIENT_CREDITS",
"message": "Insufficient credits for this generation."
}{
"error": "WORKSPACE_FORBIDDEN",
"code": "WORKSPACE_FORBIDDEN",
"message": "You do not have access to this workspace."
}{
"error": "TEMPLATE_NOT_FOUND",
"code": "TEMPLATE_NOT_FOUND",
"message": "Template not found."
}{
"error": "TTS_GENERATION_CONTENT_REJECTED",
"code": "TTS_GENERATION_CONTENT_REJECTED",
"message": "Request content was rejected by the moderation policy."
}{
"error": "TTS_GENERATION_RATE_LIMITED",
"code": "TTS_GENERATION_RATE_LIMITED",
"message": "Rate limit exceeded. Please retry later."
}{
"error": "TTS_GENERATION_FAILED",
"code": "TTS_GENERATION_FAILED",
"message": "Generation failed."
}{
"error": "TTS_GENERATION_FAILED",
"code": "TTS_GENERATION_FAILED",
"message": "Generation failed."
}{
"error": "TTS_GENERATION_PROVIDER_UNAVAILABLE",
"code": "TTS_GENERATION_PROVIDER_UNAVAILABLE",
"message": "Upstream generation provider is temporarily unavailable."
}{
"error": "TTS_GENERATION_TIMEOUT",
"code": "TTS_GENERATION_TIMEOUT",
"message": "Generation timed out."
}Qwen 3 TTS 1.7B
curl --request POST \
--url https://open.skills.video/api/v1/generation/fal-ai/qwen-3-tts/text-to-speech/1.7b \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"text": "I am solving the equation x = (-b +/- sqrt(b^2-4ac)) / 2a. Nobody can, it is a disaster and very sad."
}
'import requests
url = "https://open.skills.video/api/v1/generation/fal-ai/qwen-3-tts/text-to-speech/1.7b"
payload = { "text": "I am solving the equation x = (-b +/- sqrt(b^2-4ac)) / 2a. Nobody can, it is a disaster and very sad." }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
text: 'I am solving the equation x = (-b +/- sqrt(b^2-4ac)) / 2a. Nobody can, it is a disaster and very sad.'
})
};
fetch('https://open.skills.video/api/v1/generation/fal-ai/qwen-3-tts/text-to-speech/1.7b', 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://open.skills.video/api/v1/generation/fal-ai/qwen-3-tts/text-to-speech/1.7b",
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([
'text' => 'I am solving the equation x = (-b +/- sqrt(b^2-4ac)) / 2a. Nobody can, it is a disaster and very sad.'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"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://open.skills.video/api/v1/generation/fal-ai/qwen-3-tts/text-to-speech/1.7b"
payload := strings.NewReader("{\n \"text\": \"I am solving the equation x = (-b +/- sqrt(b^2-4ac)) / 2a. Nobody can, it is a disaster and very sad.\"\n}")
req, _ := http.NewRequest("POST", url, payload)
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://open.skills.video/api/v1/generation/fal-ai/qwen-3-tts/text-to-speech/1.7b")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"text\": \"I am solving the equation x = (-b +/- sqrt(b^2-4ac)) / 2a. Nobody can, it is a disaster and very sad.\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://open.skills.video/api/v1/generation/fal-ai/qwen-3-tts/text-to-speech/1.7b")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"text\": \"I am solving the equation x = (-b +/- sqrt(b^2-4ac)) / 2a. Nobody can, it is a disaster and very sad.\"\n}"
response = http.request(request)
puts response.read_bodyimport Foundation
let parameters = ["text": "I am solving the equation x = (-b +/- sqrt(b^2-4ac)) / 2a. Nobody can, it is a disaster and very sad."] as [String : Any?]
let postData = try JSONSerialization.data(withJSONObject: parameters, options: [])
let url = URL(string: "https://open.skills.video/api/v1/generation/fal-ai/qwen-3-tts/text-to-speech/1.7b")!
var request = URLRequest(url: url)
request.httpMethod = "POST"
request.timeoutInterval = 10
request.allHTTPHeaderFields = [
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
]
request.httpBody = postData
let (data, _) = try await URLSession.shared.data(for: request)
print(String(decoding: data, as: UTF8.self)){
"id": "gen_123",
"status": "IN_QUEUE",
"input": {
"prompt": "lofi piano with soft rain ambience",
"duration": 15
},
"usage": {
"total": 20,
"subscription": 20,
"permanent": 0
}
}{
"error": "TTS_GENERATION_INVALID_INPUT",
"code": "TTS_GENERATION_INVALID_INPUT",
"message": "'prompt' parameter is required"
}{
"error": "UNAUTHORIZED",
"code": "UNAUTHORIZED",
"message": "Unauthorized"
}{
"error": "INSUFFICIENT_CREDITS",
"code": "TTS_GENERATION_INSUFFICIENT_CREDITS",
"message": "Insufficient credits for this generation."
}{
"error": "WORKSPACE_FORBIDDEN",
"code": "WORKSPACE_FORBIDDEN",
"message": "You do not have access to this workspace."
}{
"error": "TEMPLATE_NOT_FOUND",
"code": "TEMPLATE_NOT_FOUND",
"message": "Template not found."
}{
"error": "TTS_GENERATION_CONTENT_REJECTED",
"code": "TTS_GENERATION_CONTENT_REJECTED",
"message": "Request content was rejected by the moderation policy."
}{
"error": "TTS_GENERATION_RATE_LIMITED",
"code": "TTS_GENERATION_RATE_LIMITED",
"message": "Rate limit exceeded. Please retry later."
}{
"error": "TTS_GENERATION_FAILED",
"code": "TTS_GENERATION_FAILED",
"message": "Generation failed."
}{
"error": "TTS_GENERATION_FAILED",
"code": "TTS_GENERATION_FAILED",
"message": "Generation failed."
}{
"error": "TTS_GENERATION_PROVIDER_UNAVAILABLE",
"code": "TTS_GENERATION_PROVIDER_UNAVAILABLE",
"message": "Upstream generation provider is temporarily unavailable."
}{
"error": "TTS_GENERATION_TIMEOUT",
"code": "TTS_GENERATION_TIMEOUT",
"message": "Generation timed out."
}Authorizations
API Key for API endpoints
Body
The text to be converted to speech.
"I am solving the equation x = (-b +/- sqrt(b^2-4ac)) / 2a. Nobody can, it is a disaster and very sad."
Optional prompt to guide the style of generated speech. Ignored when speaker embedding is provided.
"Very happy."
Preset voice for synthesis. Ignored when speaker embedding is provided.
Vivian, Serena, Uncle_Fu, Dylan, Eric, Ryan, Aiden, Ono_Anna, Sohee "Vivian"
The language of the voice.
Auto, English, Chinese, Spanish, French, German, Italian, Japanese, Korean, Portuguese, Russian "English"
URL to a speaker embedding safetensors file from fal-ai/qwen-3-tts/clone-voice. If provided, cloned voice is used instead of predefined voices.
"https://storage.googleapis.com/falserverless/example_outputs/qwen3-tts/clone_out.safetensors"
Optional reference text used when creating the speaker embedding. This can improve quality when using cloned voice.
"Okay. Yeah. I resent you. I love you. I respect you. But you know what? You blew it!"
Top-k sampling parameter.
0 <= x <= 9007199254740991Top-p sampling parameter.
0 <= x <= 1Sampling temperature; higher means more random output.
0 <= x <= 1Penalty to reduce repeated tokens/codes.
x >= 0Sampling switch for the sub-talker.
Top-k sampling for the sub-talker.
0 <= x <= 9007199254740991Top-p for sub-talker sampling.
0 <= x <= 1Temperature for sub-talker sampling.
0 <= x <= 1Maximum number of new codec tokens to generate.
1 <= x <= 8192Response
Generation submission accepted
Generation id.
Queue status
IN_QUEUE, IN_PROGRESS, COMPLETED, FAILED, CANCELED Normalized input payload for the generation task.
Show child attributes
Show child attributes
Credit usage breakdown for the request
Show child attributes
Show child attributes
Machine-readable generation error code. Present when status is FAILED.
Sanitized human-readable failure message. Present when status is FAILED.