curl --request POST \
--url https://open.skills.video/api/v1/generation/fal-ai/minimax/speech-2.8-hd \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data @- <<EOF
{
"prompt": "Hello world! Welcome to MiniMax's new text to speech model <#0.1#> Speech 2.8 HD (laughs) now available on Fal!"
}
EOFimport requests
url = "https://open.skills.video/api/v1/generation/fal-ai/minimax/speech-2.8-hd"
payload = { "prompt": "Hello world! Welcome to MiniMax's new text to speech model <#0.1#> Speech 2.8 HD (laughs) now available on Fal!" }
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({
prompt: 'Hello world! Welcome to MiniMax\'s new text to speech model <#0.1#> Speech 2.8 HD (laughs) now available on Fal!'
})
};
fetch('https://open.skills.video/api/v1/generation/fal-ai/minimax/speech-2.8-hd', 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/minimax/speech-2.8-hd",
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([
'prompt' => 'Hello world! Welcome to MiniMax\'s new text to speech model <#0.1#> Speech 2.8 HD (laughs) now available on Fal!'
]),
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/minimax/speech-2.8-hd"
payload := strings.NewReader("{\n \"prompt\": \"Hello world! Welcome to MiniMax's new text to speech model <#0.1#> Speech 2.8 HD (laughs) now available on Fal!\"\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/minimax/speech-2.8-hd")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"prompt\": \"Hello world! Welcome to MiniMax's new text to speech model <#0.1#> Speech 2.8 HD (laughs) now available on Fal!\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://open.skills.video/api/v1/generation/fal-ai/minimax/speech-2.8-hd")
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 \"prompt\": \"Hello world! Welcome to MiniMax's new text to speech model <#0.1#> Speech 2.8 HD (laughs) now available on Fal!\"\n}"
response = http.request(request)
puts response.read_bodyimport Foundation
let parameters = ["prompt": "Hello world! Welcome to MiniMax's new text to speech model <#0.1#> Speech 2.8 HD (laughs) now available on Fal!"] as [String : Any?]
let postData = try JSONSerialization.data(withJSONObject: parameters, options: [])
let url = URL(string: "https://open.skills.video/api/v1/generation/fal-ai/minimax/speech-2.8-hd")!
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."
}MiniMax Speech 2.8 HD
curl --request POST \
--url https://open.skills.video/api/v1/generation/fal-ai/minimax/speech-2.8-hd \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data @- <<EOF
{
"prompt": "Hello world! Welcome to MiniMax's new text to speech model <#0.1#> Speech 2.8 HD (laughs) now available on Fal!"
}
EOFimport requests
url = "https://open.skills.video/api/v1/generation/fal-ai/minimax/speech-2.8-hd"
payload = { "prompt": "Hello world! Welcome to MiniMax's new text to speech model <#0.1#> Speech 2.8 HD (laughs) now available on Fal!" }
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({
prompt: 'Hello world! Welcome to MiniMax\'s new text to speech model <#0.1#> Speech 2.8 HD (laughs) now available on Fal!'
})
};
fetch('https://open.skills.video/api/v1/generation/fal-ai/minimax/speech-2.8-hd', 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/minimax/speech-2.8-hd",
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([
'prompt' => 'Hello world! Welcome to MiniMax\'s new text to speech model <#0.1#> Speech 2.8 HD (laughs) now available on Fal!'
]),
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/minimax/speech-2.8-hd"
payload := strings.NewReader("{\n \"prompt\": \"Hello world! Welcome to MiniMax's new text to speech model <#0.1#> Speech 2.8 HD (laughs) now available on Fal!\"\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/minimax/speech-2.8-hd")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"prompt\": \"Hello world! Welcome to MiniMax's new text to speech model <#0.1#> Speech 2.8 HD (laughs) now available on Fal!\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://open.skills.video/api/v1/generation/fal-ai/minimax/speech-2.8-hd")
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 \"prompt\": \"Hello world! Welcome to MiniMax's new text to speech model <#0.1#> Speech 2.8 HD (laughs) now available on Fal!\"\n}"
response = http.request(request)
puts response.read_bodyimport Foundation
let parameters = ["prompt": "Hello world! Welcome to MiniMax's new text to speech model <#0.1#> Speech 2.8 HD (laughs) now available on Fal!"] as [String : Any?]
let postData = try JSONSerialization.data(withJSONObject: parameters, options: [])
let url = URL(string: "https://open.skills.video/api/v1/generation/fal-ai/minimax/speech-2.8-hd")!
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
Text to convert to speech. Use <#x#> for pauses (x = 0.01-99.99 seconds). Supports interjection tags: (laughs), (sighs), (coughs), (clears throat), (gasps), (sniffs), (groans), (yawns).
1 - 10000"Hello world! Welcome to MiniMax's new text to speech model <#0.1#> Speech 2.8 HD (laughs) now available on Fal!"
Predefined voice ID or preset name.
Wise_Woman, Friendly_Person, Inspirational_girl, Deep_Voice_Man, Calm_Woman, Casual_Guy, Lively_Girl, Patient_Man, Young_Knight, Determined_Man, Lovely_Girl, Decent_Boy, Imposing_Manner, Elegant_Man, Abbess, Sweet_Girl_2, Exuberant_Girl "Wise_Woman"
"Friendly_Person"
"Calm_Woman"
Speech speed (0.5 - 2.0).
0.5 <= x <= 2Volume (0.01 - 10).
0.01 <= x <= 10Voice pitch (-12 to 12).
-12 <= x <= 12Emotion style of generated speech.
happy, sad, angry, fearful, disgusted, surprised, neutral Enables English text normalization to improve number reading performance, with a slight increase in latency.
Enhance recognition of specified languages and dialects.
auto, Chinese, Chinese,Yue, English, Arabic, Russian, Spanish, French, Portuguese, German, Turkish, Dutch, Ukrainian, Vietnamese, Indonesian, Japanese, Italian, Korean, Thai, Polish, Romanian, Greek, Czech, Finnish, Hindi, Bulgarian, Danish, Hebrew, Malay, Slovak, Swedish, Croatian, Hungarian, Norwegian, Slovenian, Catalan, Nynorsk, Afrikaans Sample rate of generated audio.
Bitrate of generated audio.
Audio format.
mp3, pcm, flac Number of audio channels (1=mono, 2=stereo).
Enable loudness normalization for the audio.
Target loudness in LUFS (default -18.0).
-70 <= x <= -10Target loudness range in LU (default 8.0).
0 <= x <= 20Target peak level in dBTP (default -0.5).
-3 <= x <= 0Pitch adjustment in semitones. Range: -100 to 100. Positive values raise pitch, negative values lower it.
-100 <= x <= 100Intensity or energy of the voice. Range: -100 to 100. Higher values create more energetic speech.
-100 <= x <= 100Timbre adjustment. Range: -100 to 100. Affects the tonal quality of the voice.
-100 <= x <= 100Response
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.