MiniMax Speech 2.8 HD
Multilingual text-to-speech with 239 preset voices across 24 languages, or a saved cloned voice. HD is the cleaner studio read.
audio · model minimax-speech-hd · catalog model-catalog@2026-10-06.v5 · pricing customer-pricing@2026-11-05.v15.Endpoint
POST https://api.roasos.com/v1/audio/minimax-speech-hdSend your API key as a bearer token. The key needs the scope api:write. Every paid request also needs an Idempotency-Key header.
The envelope fields quote_only, quote_id, webhook_url and wait_timeout_seconds behave the same on each model endpoint. Refer to Jobs and Quotes and credits.
Good at
The multilingual workhorse: 239 presets, 24 languages, and it holds an accent in every one of them. HD is the studio-quality tier; use Turbo for drafts and long scripts. It is one of two models that accept a cloned voice_id from POST /v1/voices, so it is the choice for a brand voice that must stay the same across many ads. Pause syntax <#x#> and interjection tags such as (laughs) give a natural read. Set language when the text is not English. It accepts no image, video, or audio media; the clone sample belongs to /v1/voices.
Pricing
The unit is one characters. Pricing key: minimax-speech-hd.
| Request | Credits |
|---|---|
1000_characters | 2 |
2000_characters | 3 |
5000_characters | 6 |
The credits come from the roasOS pricing table. No other field changes the price. To get the exact price of your request, send it with quote_only: true first.
Modes
text-to-speech
Provider endpoints: fal-ai/minimax/speech-2.8-hd.
Request fields
| Field | Type | Required | Default | Rule |
|---|---|---|---|---|
emotion | enum | no | auto | auto, neutral, happy, sad, angry, fearful, disgusted, surprised |
english_normalization | boolean | no | false | — |
language | enum | no | — | af, ar, bg, ca, cs, da, de, el, en, es, fi, fr, he, hi, hr, hu, id, it, ja, ko, ms, nl, no, pl, pt, ro, ru, sk, sl, sv, th, tr, uk, vi, yue, zh, zh-yue |
pitch | integer | no | 0 | -12–12 |
quote_id | string | no | — | UUID |
quote_only | boolean | no | false | — |
speed | number | no | 1 | 0.5–2 |
text | string | yes | — | ≥ 1 character; ≤ 10,000 characters |
voice | enum | no | — | English_expressive_narrator, English_radiant_girl, English_magnetic_voiced_man, English_compelling_lady1, English_Aussie_Bloke, English_captivating_female1, English_Upbeat_Woman, English_Trustworth_Man, English_CalmWoman, English_UpsetGirl, English_Gentle-voiced_man, English_Whispering_girl, English_Diligent_Man, English_Graceful_Lady, English_ReservedYoungMan, English_PlayfulGirl, English_ManWithDeepVoice, English_MaturePartner, English_FriendlyPerson, English_MatureBoss, English_Debator, English_LovelyGirl, English_Steadymentor, English_Deep-VoicedGentleman, English_Wiselady, English_CaptivatingStoryteller, English_DecentYoungMan, English_SentimentalLady, English_ImposingManner, English_SadTeen, English_PassionateWarrior, English_WiseScholar, English_Soft-spokenGirl, English_SereneWoman, English_ConfidentWoman, English_PatientMan, English_Comedian, English_BossyLeader, English_Strong-WilledBoy, English_StressedLady, English_AssertiveQueen, English_AnimeCharacter, English_Jovialman, English_WhimsicalGirl, English_Kind-heartedGirl, Chinese (Mandarin)_Reliable_Executive, Chinese (Mandarin)_News_Anchor, Chinese (Mandarin)_Unrestrained_Young_Man, Chinese (Mandarin)_Mature_Woman, Arrogant_Miss, Robot_Armor, Chinese (Mandarin)_Kind-hearted_Antie, Chinese (Mandarin)_HK_Flight_Attendant, Chinese (Mandarin)_Humorous_Elder, Chinese (Mandarin)_Gentleman, Chinese (Mandarin)_Warm_Bestie, Chinese (Mandarin)_Stubborn_Friend, Chinese (Mandarin)_Sweet_Lady, Chinese (Mandarin)_Southern_Young_Man, Chinese (Mandarin)_Wise_Women, Chinese (Mandarin)_Gentle_Youth, Chinese (Mandarin)_Warm_Girl, Chinese (Mandarin)_Male_Announcer, Chinese (Mandarin)_Kind-hearted_Elder, Chinese (Mandarin)_Cute_Spirit, Chinese (Mandarin)_Radio_Host, Chinese (Mandarin)_Lyrical_Voice, Chinese (Mandarin)_Straightforward_Boy, Chinese (Mandarin)_Sincere_Adult, Chinese (Mandarin)_Gentle_Senior, Chinese (Mandarin)_Crisp_Girl, Chinese (Mandarin)_Pure-hearted_Boy, Chinese (Mandarin)_Soft_Girl, Chinese (Mandarin)_IntellectualGirl, Chinese (Mandarin)_Warm_HeartedGirl, Chinese (Mandarin)_Laid_BackGirl, Chinese (Mandarin)_ExplorativeGirl, Chinese (Mandarin)_Warm-HeartedAunt, Chinese (Mandarin)_BashfulGirl, Japanese_IntellectualSenior, Japanese_DecisivePrincess, Japanese_LoyalKnight, Japanese_DominantMan, Japanese_SeriousCommander, Japanese_ColdQueen, Japanese_DependableWoman, Japanese_GentleButler, Japanese_KindLady, Japanese_CalmLady, Japanese_OptimisticYouth, Japanese_GenerousIzakayaOwner, Japanese_SportyStudent, Japanese_InnocentBoy, Japanese_GracefulMaiden, Cantonese_GentleLady, Cantonese_PlayfulMan, Cantonese_CuteGirl, Cantonese_KindWoman, Korean_AirheadedGirl, Korean_AthleticGirl, Korean_AthleticStudent, Korean_BraveAdventurer, Korean_BraveFemaleWarrior, Korean_BraveYouth, Korean_CalmGentleman, Korean_CalmLady, Korean_CaringWoman, Korean_CharmingElderSister, Korean_CharmingSister, Korean_CheerfulBoyfriend, Korean_CheerfulCoolJunior, Korean_CheerfulLittleSister, Korean_ChildhoodFriendGirl, Korean_CockyGuy, Korean_ColdGirl, Korean_ColdYoungMan, Korean_ConfidentBoss, Korean_ConsiderateSenior, Korean_DecisiveQueen, Korean_DominantMan, Korean_ElegantPrincess, Korean_EnchantingSister, Korean_EnthusiasticTeen, Korean_FriendlyBigSister, Korean_GentleBoss, Korean_GentleWoman, Korean_HaughtyLady, Korean_InnocentBoy, Korean_IntellectualMan, Korean_IntellectualSenior, Korean_LonelyWarrior, Korean_MatureLady, Korean_MysteriousGirl, Korean_OptimisticYouth, Korean_PlayboyCharmer, Korean_PossessiveMan, Korean_QuirkyGirl, Korean_ReliableSister, Korean_ReliableYouth, Korean_SassyGirl, Korean_ShyGirl, Korean_SoothingLady, Korean_StrictBoss, Korean_SweetGirl, Korean_ThoughtfulWoman, Korean_WiseElf, Korean_WiseTeacher, Spanish_SereneWoman, Spanish_MaturePartner, Spanish_CaptivatingStoryteller, Spanish_Narrator, Spanish_WiseScholar, Spanish_Kind-heartedGirl, Spanish_DeterminedManager, Spanish_BossyLeader, Spanish_ReservedYoungMan, Spanish_ConfidentWoman, Spanish_ThoughtfulMan, Spanish_Strong-WilledBoy, Spanish_SophisticatedLady, Spanish_RationalMan, Spanish_AnimeCharacter, Spanish_Deep-tonedMan, Spanish_Fussyhostess, Spanish_SincereTeen, Spanish_FrankLady, Spanish_Comedian, Spanish_Debator, Spanish_ToughBoss, Spanish_Wiselady, Spanish_Steadymentor, Spanish_Jovialman, Spanish_SantaClaus, Spanish_Rudolph, Spanish_Intonategirl, Spanish_Arnold, Spanish_Ghost, Spanish_HumorousElder, Spanish_EnergeticBoy, Spanish_WhimsicalGirl, Spanish_StrictBoss, Spanish_ReliableMan, Spanish_SereneElder, Spanish_AngryMan, Spanish_AssertiveQueen, Spanish_CaringGirlfriend, Spanish_PowerfulSoldier, Spanish_PassionateWarrior, Spanish_ChattyGirl, Spanish_RomanticHusband, Spanish_CompellingGirl, Spanish_PowerfulVeteran, Spanish_SensibleManager, Spanish_ThoughtfulLady, Portuguese_SentimentalLady, Portuguese_BossyLeader, Portuguese_Wiselady, Portuguese_Strong-WilledBoy, Portuguese_Deep-VoicedGentleman, Portuguese_UpsetGirl, Portuguese_PassionateWarrior, Portuguese_AnimeCharacter, Portuguese_ConfidentWoman, Portuguese_AngryMan, Portuguese_CaptivatingStoryteller, Portuguese_Godfather, Portuguese_ReservedYoungMan, Portuguese_SmartYoungGirl, Portuguese_Kind-heartedGirl, Portuguese_Pompouslady, Portuguese_Grinch, Portuguese_Debator, Portuguese_SweetGirl, Portuguese_AttractiveGirl, Portuguese_ThoughtfulMan, Portuguese_PlayfulGirl, Portuguese_GorgeousLady, Portuguese_LovelyLady, Portuguese_SereneWoman, Portuguese_SadTeen, Portuguese_MaturePartner, Portuguese_Comedian, Portuguese_Narrator, Portuguese_ToughBoss, Portuguese_Fussyhostess, Portuguese_Dramatist, Portuguese_Steadymentor, Portuguese_Jovialman, Portuguese_CharmingQueen, Portuguese_SantaClaus, Portuguese_Rudolph, Portuguese_Arnold, Portuguese_CharmingSanta, Portuguese_CharmingLady, Portuguese_Ghost, Portuguese_HumorousElder, Portuguese_CalmLeader, Portuguese_GentleTeacher, Portuguese_EnergeticBoy, Portuguese_ReliableMan, Portuguese_SereneElder, Portuguese_GrimReaper, Portuguese_AssertiveQueen, Portuguese_WhimsicalGirl, Portuguese_StressedLady, Portuguese_FriendlyNeighbor, Portuguese_CaringGirlfriend, Portuguese_PowerfulSoldier, Portuguese_FascinatingBoy, Portuguese_RomanticHusband, Portuguese_StrictBoss, Portuguese_InspiringLady, Portuguese_PlayfulSpirit, Portuguese_ElegantGirl, Portuguese_CompellingGirl, Portuguese_PowerfulVeteran, Portuguese_SensibleManager, Portuguese_ThoughtfulLady, Portuguese_TheatricalActor, Portuguese_FragileBoy, Portuguese_ChattyGirl, Portuguese_Conscientiousinstructor, Portuguese_RationalMan, Portuguese_WiseScholar, Portuguese_FrankLady, Portuguese_DeterminedManager, French_Male_Speech_New, French_Female_News Anchor, French_CasualMan, French_MovieLeadFemale, French_FemaleAnchor, French_MaleNarrator, Indonesian_SweetGirl, Indonesian_ReservedYoungMan, Indonesian_CharmingGirl, Indonesian_CalmWoman, Indonesian_ConfidentWoman, Indonesian_CaringMan, Indonesian_BossyLeader, Indonesian_DeterminedBoy, Indonesian_GentleGirl, German_FriendlyMan, German_SweetLady, German_PlayfulMan, Russian_HandsomeChildhoodFriend, Russian_BrightHeroine, Russian_AmbitiousWoman, Russian_ReliableMan, Russian_CrazyQueen, Russian_PessimisticGirl, Russian_AttractiveGuy, Russian_Bad-temperedBoy, Italian_BraveHeroine, Italian_Narrator, Italian_WanderingSorcerer, Italian_DiligentLeader, Dutch_kindhearted_girl, Dutch_bossy_leader, Vietnamese_kindhearted_girl, Arabic_CalmWoman, Arabic_FriendlyGuy, Turkish_CalmWoman, Turkish_Trustworthyman, Ukrainian_CalmWoman, Ukrainian_WiseScholar, Thai_male_1_sample8, Thai_male_2_sample2, Thai_female_1_sample1, Thai_female_2_sample2, Polish_male_1_sample4, Polish_male_2_sample3, Polish_female_1_sample1, Polish_female_2_sample3, Romanian_male_1_sample2, Romanian_male_2_sample1, Romanian_female_1_sample4, Romanian_female_2_sample1, greek_male_1a_v1, Greek_female_1_sample1, Greek_female_2_sample3, czech_male_1_v1, czech_female_5_v7, czech_female_2_v2, finnish_male_3_v1, finnish_male_1_v2, finnish_female_4_v1, hindi_male_1_v2, hindi_female_2_v1, hindi_female_1_v2 |
voice_id | string | no | — | UUID |
wait_timeout_seconds | integer | no | 0 | 0–60 |
webhook_url | string | no | — | https URL; ≤ 4,096 characters |
The schema is strict. A field that is not in this table gets 400 unsupported_option. The field names are the roasOS role names. One role has one name in every family.
Media
This endpoint accepts these media roles:
voice_id— a saved voice clone
Every other role is refused: avatar_id, elements, product_id, product_images, references, reference_images, image_url, end_image_url, scene_id, scene_image, video_urls, video_url, audio_urls, audio_url. A refused role gets 400 unsupported_option.
https://cdn.roasos.com that your workspace owns. Any other URL gets 400 reference_media_not_workspace_owned. Refer to Reference media and uploads to learn how to put a file there.Prompt
text limit 10,000 characters. roasOS adds no wrapper; the trimmed text is sent unchanged.
- Pause syntax:
<#1.5#>inserts a 1.5 s pause (0.01–99.99). - Interjection tags:
(laughs),(sighs),(coughs),(clears throat),(gasps),(sniffs),(groans),(yawns). - Set
languageto the language of the text; it boosts recognition. Mixed-language text: pick the dominant one. - Use
emotionfor a whole-clip mood; use punctuation and tags for a local beat. - Set
english_normalization: truefor prices, dates, and phone numbers in English. - Keep
speedbetween 0.9 and 1.15 for ad reads; large changes sound synthetic.
Not exposed
These catalog entries describe omitted inputs, pinned values and source constraints. They do not imply that the provider accepts every listed field.
voice_setting.vol— pinned to1.output_format— pinned tourl.audio_setting— pinned tosample_rate, bitrate, format and channel.pronunciation_dict— not accepted by this public endpoint.normalization_setting— pinned toenabled, target_loudness, target_range and target_peak.voice_modify— pinned topitch, intensity and timbre, each -100 to 100.language_boost— these values are not available:Nynorsk,auto.references— not accepted by this public endpoint.avatar_id— not accepted by this public endpoint.product_id— not accepted by this public endpoint.audio_urls— not accepted by this public endpoint.image_url— not accepted by this public endpoint.temperature— not accepted by this public endpoint.style_instruction— not accepted by this public endpoint.
Result
The result kind is audio. Always present: url. Present when the run makes it: timestamps.
{
"data": {
"id": "gen_…",
"kind": "audio",
"model": "minimax-speech-hd",
"status": "completed",
"result": {
"timestamps": [
{}
],
"url": "https://cdn.roasos.com/workspaces/ws_01/result"
}
}
}The files are immutable objects on https://cdn.roasos.com. A result URL is a valid media input for your next request.
Example
The three steps are always the same: quote, run, poll.
# 1. Quote. Nothing is spent.
curl -X POST https://api.roasos.com/v1/audio/minimax-speech-hd \
-H "Authorization: Bearer roasos_sk_live_..." \
-H "Idempotency-Key: 0f1c9e2a-minimax-speech-hd-0001" \
-H "Content-Type: application/json" \
-d '{"quote_only":true,"text":"Two drops, morning and night. That is the whole routine."}'
# 200 { "data": { "kind": "quote", "quote_id": "q_7Hk...", "credits": 2, "expires_at": "...",
# "confirmation": { "model": "minimax-speech-hd", "example": "1000_characters" } } }
# 2. Run. Same body, same Idempotency-Key, quote_id in place of quote_only.
curl -X POST https://api.roasos.com/v1/audio/minimax-speech-hd \
-H "Authorization: Bearer roasos_sk_live_..." \
-H "Idempotency-Key: 0f1c9e2a-minimax-speech-hd-0001" \
-H "Content-Type: application/json" \
-d '{"quote_id":"q_7Hk...","text":"Two drops, morning and night. That is the whole routine."}'
# 201 { "data": { "id": "gen_...", "status": "queued", "credits_reserved": 2 } }
# 3. Poll, then read the result.
curl https://api.roasos.com/v1/jobs/gen_.../status -H "Authorization: Bearer roasos_sk_live_..."
curl https://api.roasos.com/v1/jobs/gen_.../result -H "Authorization: Bearer roasos_sk_live_..."The deprecated path
POST /v1/generations still reaches this model for one minor version. It is deprecated. This is how it maps:
POST /v1/audio/minimax-speech-hd is the endpoint. POST /v1/generations still works with { "type": "audio", "model": "minimax-speech-hd", "prompt": "<text>", "options": { "voice": "English_expressive_narrator", "speed": 1.05, "pitch": 0, "emotion": "happy", "english_normalization": true, "language": "fr" } }; there the script goes in prompt. voice_id names a saved clone from POST /v1/voices on both surfaces. options.stability must be 0.5 and options.similarity_boost must be 0.75 (no-op).
See also
llms.txtfor this model — the same facts as one plain-text file for an agent.GET https://api.roasos.com/v1/catalog/minimax-speech-hd— the machine-readable form: enums, defaults, limits and prices. Refer to the API reference.- Jobs — how to poll a job and read its result.
- Provider endpoints:
fal-ai/minimax/speech-2.8-hd.
Gemini 3.1 Flash TTS
Text-to-speech on Google Gemini 3.1 Flash TTS, with 30 preset voices and 87 languages. It is best at a voice-over that you direct in plain words: tone, pace, accent, and emotion. It is the lowest per-character voice price in the catalog.
MiniMax Speech 2.8 Turbo
Multilingual text-to-speech with 239 preset voices across 24 languages, or a saved cloned voice. Turbo is the faster, cheaper read for drafts and long scripts.