# MiniMax Speech 2.8 HD (audio) > Multilingual text-to-speech with 239 preset voices across 24 languages, or a saved cloned voice. HD is the cleaner studio read. Status: roasOS API v1.1. Catalog `model-catalog@2026-10-06.v5`, pricing `customer-pricing@2026-11-05.v15`. The endpoint `POST /v1/audio/minimax-speech-hd` is live. `POST /v1/generations` stays for one minor version as a deprecated alias (see "Today"). ## Endpoint POST https://api.roasos.com/v1/audio/minimax-speech-hd Auth: Authorization: Bearer roasos_sk_… (scope api:write). Idempotency-Key required. quote_only / quote_id / webhook_url as in https://docs.roasos.com/llms.txt. ## 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 Unit: characters. Pricing key: `minimax-speech-hd`. | request | credits | |---|---| | `1000_characters` | 2 | | `2000_characters` | 3 | | `5000_characters` | 6 | Credits come from the roasOS pricing table (`MODEL_COSTS`) through the catalog. No other field changes the price. ## 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 returns `400 unsupported_option`. Field names are the roasOS role names, one name per role across every family. ## Media - `voice_id` — a saved voice clone - 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 returns `400 unsupported_option`. - Every URL must be an immutable object on `https://cdn.roasos.com/…` that your workspace owns; any other URL is `400 reference_media_not_workspace_owned`. Upload with `POST /v1/uploads` (direct POST of the bytes to `put_url`, or a `source_url` import), then use the returned CDN URL. ## 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 `language` to the language of the text; it boosts recognition. Mixed-language text: pick the dominant one. - Use `emotion` for a whole-clip mood; use punctuation and tags for a local beat. - Set `english_normalization: true` for prices, dates, and phone numbers in English. - Keep `speed` between 0.9 and 1.15 for ad reads; large changes sound synthetic. ## Not exposed - `voice_setting.vol`: pinned to `1`. - `output_format`: pinned to `url`. - `audio_setting`: pinned to `sample_rate, bitrate, format and channel`. - `pronunciation_dict`: not accepted by this public endpoint. - `normalization_setting`: pinned to `enabled, target_loudness, target_range and target_peak`. - `voice_modify`: pinned to `pitch, intensity and timbre, each -100 to 100`. - `language_boost`: values not exposed — `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 Result kind `audio`. Always present: `url`. Present when the run produces it: `timestamps`. ```json { "data": { "id": "gen_…", "kind": "audio", "model": "minimax-speech-hd", "status": "completed", "result": {"timestamps":[{}],"url":"https://cdn.roasos.com/workspaces/ws_01/result"} } } ``` Files live on `https://cdn.roasos.com` and are immutable; a result URL can be a media input to the next call. Poll `GET /v1/jobs/{id}/status` → `{ id, status, updated_at }`, then `GET /v1/jobs/{id}/result` (`409 run_not_completed` until the job is `completed`, `failed` or `canceled`). Statuses: `queued → processing → completed | failed | canceled`. ## Example ```bash # 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 — the same body and the same Idempotency-Key, quote_id instead 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_…", "kind": "audio", "model": "minimax-speech-hd", "status": "queued", "credits_reserved": 2, "links": { "status": "/v1/jobs/gen_…/status", "result": "/v1/jobs/gen_…/result" } } } # 3. poll 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_…" ``` ## Today `POST /v1/audio/minimax-speech-hd` is the endpoint. `POST /v1/generations` still works with `{ "type": "audio", "model": "minimax-speech-hd", "prompt": "", "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 https://docs.roasos.com/models/audio/minimax-speech-hd · https://api.roasos.com/v1/catalog/audio/minimax-speech-hd · fal-ai/minimax/speech-2.8-hd