{
  "aboutHtml": "<p>MAI-Voice-2.1-Flash on Microsoft AI:n kehotteilla ohjattava tekstistä puheeksi -malli nopeasti reagoivaan puhuttuun vuorovaikutukseen. Valmistaja tarjoaa sitä ääniavustajille, asiakastukikeskusteluihin ja puhelinvalikoihin. Se generoi luontevaa, ilmaisullista puhetta kahdellakymmenelläkolmella kielellä ja mahdollistaa sävyn sekä esityksen ohjauksen. Flash on suoraan vasteeseen suunnattu versio; erikseen nimetty MAI-Voice-2.1 asettaa etusijalle yksityiskohtaisen ilmaisun ja uskollisuuden pidemmässä sisällössä.</p><h4>Teksti, puhuja ja kieli</h4><p>Syöte on puhuttava puheteksti sekä valittu ääni ja valinnaiset SSML-ilmaisuohjeet. Hallittu äänivalikoima erottaa puhujan, kielialueen ja malliversion. Harper ja Grant ovat esimerkkejä nimetyistä puhujista, joilla on kielikohtaiset merkinnät. Käytä tarkoitettua kohdekielistä tekstiä ja valitse sopiva kielialue; valmisteltu englanninkielinen tervehdys ja espanjankielinen selitys ovat erillisiä puhuttuja katkelmia omine sanamuotoineen.</p><p>Mallikortti dokumentoi yhtenäisen ääni-identiteetin tuetuilla kielillä ja useita puhujia vuoropuheluun. Tämä voi tukea sovellusta, joka tarvitsee yhden tunnistettavan kertojan lokalisoituihin ohjeisiin tai lyhyen vuoropuhelun erillisillä rooleilla. Anna repliikit tarkoitetuille puhujille nimenomaisesti ja pidä jako vakaana. Ääni on kyseisen käsikirjoituksen puhuttu versio eikä avoimesta kysymyksestä laadittu uusi vastaus.</p><h4>Sävy ja puhetyyli</h4><p>Microsoft dokumentoi tunteen ja esityksen lause- sekä vuorokohtaisen ohjauksen SSML:n avulla. Käytettävissä olevat tyylit riippuvat valitusta äänestä. Hallittu valikoima sisältää tehtävätyylejä, kuten narrator, educational ja customer_call_center, sekä tiettyjen puhujien ilmaisullisia tyylejä. Esimerkiksi Yhdysvaltain Harper-merkintä sisältää joyful- ja relieved-tyylit. Valitse äänen tukema tyyli sen sijaan, että olettaisit jokaisen puhujan hyväksyvän saman valikoiman.</p><p>Käytännön tukirepliikki on: ”Voin auttaa löytämään oikean asiakirjan. Kerro sen nimi tai kuvaile aihetta.” Pidä pyyntö riittävän lyhyenä, jotta kuulija voi toimia sen mukaan, ja valitse vuorovaikutukseen sopiva rauhallinen tai rohkaiseva esitystapa. Kirjoita oppimistehtävän selitys ja seuraava kysymys erillisiksi puhutuiksi yksiköiksi. Ilmaisullisuus palvelee merkitystä, kun käsikirjoitus tekee tarkoituksen muutoksen selväksi.</p><h4>Suoratoisto ja äänen toimitus</h4><p>Flash-mallikortti dokumentoi nimenomaisesti suoratoistotulosteen suoraan vuoropuheluun, mukaan lukien työnkulut, jotka käsittelevät kuulijan puhumista vastauksen päälle. Sovellus voi toistaa ääntä sen saapuessa ja koordinoida keskeytyksen sekä seuraavan vuoron. Näin puhutun viestin ajoitus on osa vuorovaikutusta sen sijaan, että jokainen vastaus pitäisi ensin valmistella kokonaiseksi tallenteeksi.</p><p>Valmistaja antaa synteesityönkulun määrittää tulostemuodon. Julkaistu esimerkki tuottaa mono-MP3-tiedoston 24 kHz:n taajuudella ja 160 kbit/s:n bittinopeudella. Tämä on yksi dokumentoitu tulostekonfiguraatio, ei kiinteä natiivimuodon rajoitus. Valitse äänen esitysmuoto, jonka aiottu toistopolku hyväksyy, ja pidä puhuja sekä puhuttu sanamuoto saatavilla tuloksen tarkistamiseen.</p><h4>Valinnainen viiteäänen tila</h4><p>Microsoftin mukautetun äänen tila voi jäljitellä suostumuksensa antanutta puhujaa 5–60 sekunnin viiteleikkeestä ilman hienosäätöä. Mallikortti suosittelee luontevaa keskustelunomaista esitystä maltillisella energialla, sillä viite vaikuttaa generoituun esitykseen. Tilalla on erillinen valmistajan hyväksyntä- ja tallennetun suostumuksen prosessi; valmiit kirjastoäänet muodostavat erillisen valmistelupolun.</p><p>Käytä brändikertojan määrittävään viitteeseen puhdasta, edustavaa katkelmaa ja päätä, minkä esitystavan tulee siirtyä uuteen käsikirjoitukseen. Valmistele valmiilla äänellä tehtävään puheeseen varsinaiset nimet, komennot ja kohdekieliset ilmaukset, joita sovellus käyttää. Kuuntele katkelmat valitulla äänellä ja tarkista vuorojen välinen siirtymä. Hyödyllinen tulos on ilmaisullinen puhuttu vuorovaikutus, jossa on harkittu puhuja, selkeä teksti ja kuulijan toistoympäristöön sopiva ääni.</p>",
  "aboutText": "MAI-Voice-2.1-Flash on Microsoft AI:n kehotteilla ohjattava tekstistä puheeksi -malli nopeasti reagoivaan puhuttuun vuorovaikutukseen. Valmistaja tarjoaa sitä ääniavustajille, asiakastukikeskusteluihin ja puhelinvalikoihin. Se generoi luontevaa, ilmaisullista puhetta kahdellakymmenelläkolmella kielellä ja mahdollistaa sävyn sekä esityksen ohjauksen. Flash on suoraan vasteeseen suunnattu versio; erikseen nimetty MAI-Voice-2.1 asettaa etusijalle yksityiskohtaisen ilmaisun ja uskollisuuden pidemmässä sisällössä.\n\n### Teksti, puhuja ja kieli\n\nSyöte on puhuttava puheteksti sekä valittu ääni ja valinnaiset SSML-ilmaisuohjeet. Hallittu äänivalikoima erottaa puhujan, kielialueen ja malliversion. Harper ja Grant ovat esimerkkejä nimetyistä puhujista, joilla on kielikohtaiset merkinnät. Käytä tarkoitettua kohdekielistä tekstiä ja valitse sopiva kielialue; valmisteltu englanninkielinen tervehdys ja espanjankielinen selitys ovat erillisiä puhuttuja katkelmia omine sanamuotoineen.\n\nMallikortti dokumentoi yhtenäisen ääni-identiteetin tuetuilla kielillä ja useita puhujia vuoropuheluun. Tämä voi tukea sovellusta, joka tarvitsee yhden tunnistettavan kertojan lokalisoituihin ohjeisiin tai lyhyen vuoropuhelun erillisillä rooleilla. Anna repliikit tarkoitetuille puhujille nimenomaisesti ja pidä jako vakaana. Ääni on kyseisen käsikirjoituksen puhuttu versio eikä avoimesta kysymyksestä laadittu uusi vastaus.\n\n### Sävy ja puhetyyli\n\nMicrosoft dokumentoi tunteen ja esityksen lause- sekä vuorokohtaisen ohjauksen SSML:n avulla. Käytettävissä olevat tyylit riippuvat valitusta äänestä. Hallittu valikoima sisältää tehtävätyylejä, kuten narrator, educational ja customer_call_center, sekä tiettyjen puhujien ilmaisullisia tyylejä. Esimerkiksi Yhdysvaltain Harper-merkintä sisältää joyful- ja relieved-tyylit. Valitse äänen tukema tyyli sen sijaan, että olettaisit jokaisen puhujan hyväksyvän saman valikoiman.\n\nKäytännön tukirepliikki on: ”Voin auttaa löytämään oikean asiakirjan. Kerro sen nimi tai kuvaile aihetta.” Pidä pyyntö riittävän lyhyenä, jotta kuulija voi toimia sen mukaan, ja valitse vuorovaikutukseen sopiva rauhallinen tai rohkaiseva esitystapa. Kirjoita oppimistehtävän selitys ja seuraava kysymys erillisiksi puhutuiksi yksiköiksi. Ilmaisullisuus palvelee merkitystä, kun käsikirjoitus tekee tarkoituksen muutoksen selväksi.\n\n### Suoratoisto ja äänen toimitus\n\nFlash-mallikortti dokumentoi nimenomaisesti suoratoistotulosteen suoraan vuoropuheluun, mukaan lukien työnkulut, jotka käsittelevät kuulijan puhumista vastauksen päälle. Sovellus voi toistaa ääntä sen saapuessa ja koordinoida keskeytyksen sekä seuraavan vuoron. Näin puhutun viestin ajoitus on osa vuorovaikutusta sen sijaan, että jokainen vastaus pitäisi ensin valmistella kokonaiseksi tallenteeksi.\n\nValmistaja antaa synteesityönkulun määrittää tulostemuodon. Julkaistu esimerkki tuottaa mono-MP3-tiedoston 24 kHz:n taajuudella ja 160 kbit/s:n bittinopeudella. Tämä on yksi dokumentoitu tulostekonfiguraatio, ei kiinteä natiivimuodon rajoitus. Valitse äänen esitysmuoto, jonka aiottu toistopolku hyväksyy, ja pidä puhuja sekä puhuttu sanamuoto saatavilla tuloksen tarkistamiseen.\n\n### Valinnainen viiteäänen tila\n\nMicrosoftin mukautetun äänen tila voi jäljitellä suostumuksensa antanutta puhujaa 5–60 sekunnin viiteleikkeestä ilman hienosäätöä. Mallikortti suosittelee luontevaa keskustelunomaista esitystä maltillisella energialla, sillä viite vaikuttaa generoituun esitykseen. Tilalla on erillinen valmistajan hyväksyntä- ja tallennetun suostumuksen prosessi; valmiit kirjastoäänet muodostavat erillisen valmistelupolun.\n\nKäytä brändikertojan määrittävään viitteeseen puhdasta, edustavaa katkelmaa ja päätä, minkä esitystavan tulee siirtyä uuteen käsikirjoitukseen. Valmistele valmiilla äänellä tehtävään puheeseen varsinaiset nimet, komennot ja kohdekieliset ilmaukset, joita sovellus käyttää. Kuuntele katkelmat valitulla äänellä ja tarkista vuorojen välinen siirtymä. Hyödyllinen tulos on ilmaisullinen puhuttu vuorovaikutus, jossa on harkittu puhuja, selkeä teksti ja kuulijan toistoympäristöön sopiva ääni.",
  "editorialOverlay": {
    "copy_fields": null,
    "copy_sha256": null,
    "copy_source": null,
    "html_sha256": "fb50b623b36eddd43257ef0ac75762cbc6e3df3c541c76392efb82f34b807d8f",
    "module_sha256": "ee9dc1c50b1e6a8fb7fa062030fcb4646b9aaaeb08be513b723a5a92a7290f06",
    "raw_model_unchanged": true,
    "schema": "ailoot-native-model-editorial-v1"
  },
  "locale": "fi",
  "methods": [
    {
      "html": "<div class=\"sheet-head\"><span class=\"mav\" aria-hidden=\"true\">•</span><h2 id=\"sheet-title\">Microsoft AI: MAI-Voice-2.1-Flash</h2><button class=\"icon-btn\" type=\"button\" data-close-sheet aria-label=\"Sulje\">×</button></div><div class=\"idline\"><span>Microsoft AI /</span><code>microsoft/mai-voice-2.1-flash</code><button type=\"button\" id=\"copy-id\">Kopioi ID</button></div><nav class=\"card-jump-nav\" aria-label=\"Mallikortin osiot\"><button type=\"button\" data-card-jump=\"overview\">Aloitus</button><button type=\"button\" data-card-jump=\"methods\">Syötteet &amp; menetelmät</button><button type=\"button\" data-card-jump=\"pricing\">Hinnoittelu</button><button type=\"button\" data-card-jump=\"examples\">Esimerkit</button><button type=\"button\" data-card-jump=\"results\">Tulokset</button><button type=\"button\" data-card-jump=\"aliases\">Aliakset</button></nav><div class=\"card-method-tabs\" role=\"tablist\" aria-label=\"API-menetelmät\"><button type=\"button\" role=\"tab\" tabindex=\"0\" aria-controls=\"card-method-content\" aria-selected=\"true\" id=\"card-method-tab-0\" data-card-method=\"Ultra|speech|/v1/audio/speech|microsoft%2Fmai-voice-2.1-flash\">Puhesynteesi</button></div><div id=\"card-method-content\" role=\"tabpanel\" aria-labelledby=\"card-method-tab-0\"><section class=\"card-section\" data-card-section=\"overview\"><h3 tabindex=\"-1\">Aloitus</h3><p class=\"mdesc-full\">Microsoft AI:n MAI-Voice-2.1-Flash generoi ilmaisullista puhetta 23 kielellä vuorovaikutteisiin äänisovelluksiin. Se tukee suoratoistoa, useita puhujia ja lausetason esitysohjausta sekä kuratoitua äänikirjastoa.</p><dl class=\"card-io\" data-card-io><div><dt>Hyväksytyt syötteet</dt><dd>Teksti</dd></div><div><dt>Tulokset</dt><dd>Ääni</dd></div></dl><details class=\"card-about\"><summary>Tietoa mallista</summary><p class=\"note-s\" data-model-method-boundary>Tämä kuvaus kattaa mallin ominaisuudet. Ailootissa saatavilla olevat syötteet, tulosteet ja asetukset luetellaan alla valitulle menetelmälle.</p><div class=\"mabout\" id=\"m-about\"><p>MAI-Voice-2.1-Flash on Microsoft AI:n kehotteilla ohjattava tekstistä puheeksi -malli nopeasti reagoivaan puhuttuun vuorovaikutukseen. Valmistaja tarjoaa sitä ääniavustajille, asiakastukikeskusteluihin ja puhelinvalikoihin. Se generoi luontevaa, ilmaisullista puhetta kahdellakymmenelläkolmella kielellä ja mahdollistaa sävyn sekä esityksen ohjauksen. Flash on suoraan vasteeseen suunnattu versio; erikseen nimetty MAI-Voice-2.1 asettaa etusijalle yksityiskohtaisen ilmaisun ja uskollisuuden pidemmässä sisällössä.</p><h4>Teksti, puhuja ja kieli</h4><p>Syöte on puhuttava puheteksti sekä valittu ääni ja valinnaiset SSML-ilmaisuohjeet. Hallittu äänivalikoima erottaa puhujan, kielialueen ja malliversion. Harper ja Grant ovat esimerkkejä nimetyistä puhujista, joilla on kielikohtaiset merkinnät. Käytä tarkoitettua kohdekielistä tekstiä ja valitse sopiva kielialue; valmisteltu englanninkielinen tervehdys ja espanjankielinen selitys ovat erillisiä puhuttuja katkelmia omine sanamuotoineen.</p><p>Mallikortti dokumentoi yhtenäisen ääni-identiteetin tuetuilla kielillä ja useita puhujia vuoropuheluun. Tämä voi tukea sovellusta, joka tarvitsee yhden tunnistettavan kertojan lokalisoituihin ohjeisiin tai lyhyen vuoropuhelun erillisillä rooleilla. Anna repliikit tarkoitetuille puhujille nimenomaisesti ja pidä jako vakaana. Ääni on kyseisen käsikirjoituksen puhuttu versio eikä avoimesta kysymyksestä laadittu uusi vastaus.</p><h4>Sävy ja puhetyyli</h4><p>Microsoft dokumentoi tunteen ja esityksen lause- sekä vuorokohtaisen ohjauksen SSML:n avulla. Käytettävissä olevat tyylit riippuvat valitusta äänestä. Hallittu valikoima sisältää tehtävätyylejä, kuten narrator, educational ja customer_call_center, sekä tiettyjen puhujien ilmaisullisia tyylejä. Esimerkiksi Yhdysvaltain Harper-merkintä sisältää joyful- ja relieved-tyylit. Valitse äänen tukema tyyli sen sijaan, että olettaisit jokaisen puhujan hyväksyvän saman valikoiman.</p><p>Käytännön tukirepliikki on: ”Voin auttaa löytämään oikean asiakirjan. Kerro sen nimi tai kuvaile aihetta.” Pidä pyyntö riittävän lyhyenä, jotta kuulija voi toimia sen mukaan, ja valitse vuorovaikutukseen sopiva rauhallinen tai rohkaiseva esitystapa. Kirjoita oppimistehtävän selitys ja seuraava kysymys erillisiksi puhutuiksi yksiköiksi. Ilmaisullisuus palvelee merkitystä, kun käsikirjoitus tekee tarkoituksen muutoksen selväksi.</p><h4>Suoratoisto ja äänen toimitus</h4><p>Flash-mallikortti dokumentoi nimenomaisesti suoratoistotulosteen suoraan vuoropuheluun, mukaan lukien työnkulut, jotka käsittelevät kuulijan puhumista vastauksen päälle. Sovellus voi toistaa ääntä sen saapuessa ja koordinoida keskeytyksen sekä seuraavan vuoron. Näin puhutun viestin ajoitus on osa vuorovaikutusta sen sijaan, että jokainen vastaus pitäisi ensin valmistella kokonaiseksi tallenteeksi.</p><p>Valmistaja antaa synteesityönkulun määrittää tulostemuodon. Julkaistu esimerkki tuottaa mono-MP3-tiedoston 24 kHz:n taajuudella ja 160 kbit/s:n bittinopeudella. Tämä on yksi dokumentoitu tulostekonfiguraatio, ei kiinteä natiivimuodon rajoitus. Valitse äänen esitysmuoto, jonka aiottu toistopolku hyväksyy, ja pidä puhuja sekä puhuttu sanamuoto saatavilla tuloksen tarkistamiseen.</p><h4>Valinnainen viiteäänen tila</h4><p>Microsoftin mukautetun äänen tila voi jäljitellä suostumuksensa antanutta puhujaa 5–60 sekunnin viiteleikkeestä ilman hienosäätöä. Mallikortti suosittelee luontevaa keskustelunomaista esitystä maltillisella energialla, sillä viite vaikuttaa generoituun esitykseen. Tilalla on erillinen valmistajan hyväksyntä- ja tallennetun suostumuksen prosessi; valmiit kirjastoäänet muodostavat erillisen valmistelupolun.</p><p>Käytä brändikertojan määrittävään viitteeseen puhdasta, edustavaa katkelmaa ja päätä, minkä esitystavan tulee siirtyä uuteen käsikirjoitukseen. Valmistele valmiilla äänellä tehtävään puheeseen varsinaiset nimet, komennot ja kohdekieliset ilmaukset, joita sovellus käyttää. Kuuntele katkelmat valitulla äänellä ja tarkista vuorojen välinen siirtymä. Hyödyllinen tulos on ilmaisullinen puhuttu vuorovaikutus, jossa on harkittu puhuja, selkeä teksti ja kuulijan toistoympäristöön sopiva ääni.</p></div></details></section><section class=\"card-section\" data-card-section=\"methods\"><h3 tabindex=\"-1\">Saatavilla Ailootissa · syötteet &amp; menetelmät</h3><details class=\"card-method\" open><summary><b>Ailoot Ultra · Puhesynteesi</b> <code>POST /v1/audio/speech</code></summary><dl class=\"method-capabilities\"><div><dt>Syötetyypit</dt><dd><code>text</code></dd></div><div><dt>Tulostyypit</dt><dd><code>audio</code></dd></div><div><dt>Tulosteen muoto</dt><dd>mp3</dd></div></dl><div class=\"tw\" data-card-parameters data-typed-parameters><table><thead><tr><th>Kenttä</th><th>Tyyppi</th><th>Vaatimus</th><th>Arvot &amp; rajat</th><th>Oletus</th></tr></thead><tbody><tr data-parameter-availability=\"source_interface\"><th data-cell-label=\"Kenttä\" scope=\"row\"><span class=\"card-cell-label\">Kenttä</span><code class=\"card-field-name\">model</code></th><td data-cell-label=\"Tyyppi\" data-field-type><span class=\"card-cell-label\">Tyyppi</span><code>string</code></td><td data-cell-label=\"Vaatimus\"><span class=\"card-cell-label\">Vaatimus</span>Pakollinen</td><td data-cell-label=\"Arvot &amp; rajat\"><span class=\"card-cell-label\">Arvot &amp; rajat</span><div>microsoft/mai-voice-2.1-flash</div></td><td data-cell-label=\"Oletus\" data-default=\"unspecified\"><span class=\"card-cell-label\">Oletus</span>—</td></tr><tr data-parameter-availability=\"source_interface\"><th data-cell-label=\"Kenttä\" scope=\"row\"><span class=\"card-cell-label\">Kenttä</span><code class=\"card-field-name\">input</code></th><td data-cell-label=\"Tyyppi\" data-field-type><span class=\"card-cell-label\">Tyyppi</span><code>string</code></td><td data-cell-label=\"Vaatimus\"><span class=\"card-cell-label\">Vaatimus</span>Pakollinen</td><td data-cell-label=\"Arvot &amp; rajat\"><span class=\"card-cell-label\">Arvot &amp; rajat</span><div>Vähimmäispituus: 1</div><div>Yksikkö: Unicode-merkit</div></td><td data-cell-label=\"Oletus\" data-default=\"unspecified\"><span class=\"card-cell-label\">Oletus</span>—</td></tr><tr data-parameter-availability=\"source_interface\"><th data-cell-label=\"Kenttä\" scope=\"row\"><span class=\"card-cell-label\">Kenttä</span><code class=\"card-field-name\">voice</code></th><td data-cell-label=\"Tyyppi\" data-field-type><span class=\"card-cell-label\">Tyyppi</span><code>string</code></td><td data-cell-label=\"Vaatimus\"><span class=\"card-cell-label\">Vaatimus</span>Pakollinen</td><td data-cell-label=\"Arvot &amp; rajat\"><span class=\"card-cell-label\">Arvot &amp; rajat</span><div>cs-CZ-Grant:MAI-Voice-2.1-Flash, cs-CZ-Harper:MAI-Voice-2.1-Flash, da-DK-Grant:MAI-Voice-2.1-Flash, da-DK-Harper:MAI-Voice-2.1-Flash, de-DE-Grant:MAI-Voice-2.1-Flash, de-DE-Harper:MAI-Voice-2.1-Flash, de-DE-Klaus:MAI-Voice-2.1-Flash, de-DE-Mia:MAI-Voice-2.1-Flash, en-AU-Isla:MAI-Voice-2.1-Flash, en-GB-Emily:MAI-Voice-2.1-Flash, en-GB-Harry:MAI-Voice-2.1-Flash, en-IN-Dhruv:MAI-Voice-2.1-Flash, en-IN-Priya:MAI-Voice-2.1-Flash, en-US-Ethan:MAI-Voice-2.1-Flash, en-US-Grant:MAI-Voice-2.1-Flash, en-US-Harper:MAI-Voice-2.1-Flash, en-US-Iris:MAI-Voice-2.1-Flash, en-US-Jasper:MAI-Voice-2.1-Flash, en-US-Olivia:MAI-Voice-2.1-Flash, en-US-Sage:MAI-Voice-2.1-Flash, es-ES-Marta:MAI-Voice-2.1-Flash, es-MX-Alejo:MAI-Voice-2.1-Flash, es-MX-Grant:MAI-Voice-2.1-Flash, es-MX-Harper:MAI-Voice-2.1-Flash, es-MX-Valeria:MAI-Voice-2.1-Flash, fi-FI-Grant:MAI-Voice-2.1-Flash, fi-FI-Harper:MAI-Voice-2.1-Flash, fr-FR-Grant:MAI-Voice-2.1-Flash, fr-FR-Harper:MAI-Voice-2.1-Flash, fr-FR-Marc:MAI-Voice-2.1-Flash, fr-FR-Soleil:MAI-Voice-2.1-Flash, hi-IN-Arjun:MAI-Voice-2.1-Flash, hi-IN-Dhruv:MAI-Voice-2.1-Flash, hi-IN-Grant:MAI-Voice-2.1-Flash, hi-IN-Harper:MAI-Voice-2.1-Flash, hi-IN-Kavya:MAI-Voice-2.1-Flash, hi-IN-Priya:MAI-Voice-2.1-Flash, hu-HU-Bence:MAI-Voice-2.1-Flash, hu-HU-Grant:MAI-Voice-2.1-Flash, hu-HU-Harper:MAI-Voice-2.1-Flash, hu-HU-Levente:MAI-Voice-2.1-Flash, hu-HU-Lilla:MAI-Voice-2.1-Flash, hu-HU-Reka:MAI-Voice-2.1-Flash, id-ID-Grant:MAI-Voice-2.1-Flash, id-ID-Harper:MAI-Voice-2.1-Flash, it-IT-Grant:MAI-Voice-2.1-Flash, it-IT-Harper:MAI-Voice-2.1-Flash, it-IT-Luca:MAI-Voice-2.1-Flash, it-IT-Rosa:MAI-Voice-2.1-Flash, ko-KR-Grant:MAI-Voice-2.1-Flash, ko-KR-Haena:MAI-Voice-2.1-Flash, ko-KR-Harper:MAI-Voice-2.1-Flash, ko-KR-Junho:MAI-Voice-2.1-Flash, nb-NO-Grant:MAI-Voice-2.1-Flash, nb-NO-Harper:MAI-Voice-2.1-Flash, nl-NL-Grant:MAI-Voice-2.1-Flash, nl-NL-Harper:MAI-Voice-2.1-Flash, nl-NL-Sander:MAI-Voice-2.1-Flash, pl-PL-Grant:MAI-Voice-2.1-Flash, pl-PL-Harper:MAI-Voice-2.1-Flash, pt-BR-Caio:MAI-Voice-2.1-Flash, pt-BR-Grant:MAI-Voice-2.1-Flash, pt-BR-Harper:MAI-Voice-2.1-Flash, pt-BR-Luana:MAI-Voice-2.1-Flash, pt-BR-Pedro:MAI-Voice-2.1-Flash, pt-BR-Rafael:MAI-Voice-2.1-Flash, pt-PT-Grant:MAI-Voice-2.1-Flash, pt-PT-Harper:MAI-Voice-2.1-Flash, pt-PT-Rui:MAI-Voice-2.1-Flash, ro-RO-Andrei:MAI-Voice-2.1-Flash, ro-RO-Elena:MAI-Voice-2.1-Flash, ro-RO-Grant:MAI-Voice-2.1-Flash, ro-RO-Harper:MAI-Voice-2.1-Flash, ro-RO-Ioana:MAI-Voice-2.1-Flash, ro-RO-Radu:MAI-Voice-2.1-Flash, ru-RU-Grant:MAI-Voice-2.1-Flash, ru-RU-Harper:MAI-Voice-2.1-Flash, ru-RU-Lev:MAI-Voice-2.1-Flash, ru-RU-Masha:MAI-Voice-2.1-Flash, sv-SE-Grant:MAI-Voice-2.1-Flash, sv-SE-Harper:MAI-Voice-2.1-Flash, th-TH-Grant:MAI-Voice-2.1-Flash, th-TH-Harper:MAI-Voice-2.1-Flash, th-TH-Krit:MAI-Voice-2.1-Flash, th-TH-Nattapong:MAI-Voice-2.1-Flash, tr-TR-Aydin:MAI-Voice-2.1-Flash, tr-TR-Elif:MAI-Voice-2.1-Flash, tr-TR-Grant:MAI-Voice-2.1-Flash, tr-TR-Harper:MAI-Voice-2.1-Flash, vi-VN-Grant:MAI-Voice-2.1-Flash, vi-VN-Harper:MAI-Voice-2.1-Flash, zh-CN-Bo:MAI-Voice-2.1-Flash, zh-CN-Grant:MAI-Voice-2.1-Flash, zh-CN-Harper:MAI-Voice-2.1-Flash, zh-CN-Lan:MAI-Voice-2.1-Flash, zh-CN-Mei:MAI-Voice-2.1-Flash, zh-CN-Wei:MAI-Voice-2.1-Flash</div></td><td data-cell-label=\"Oletus\" data-default=\"unspecified\"><span class=\"card-cell-label\">Oletus</span>—</td></tr><tr data-parameter-availability=\"source_interface\"><th data-cell-label=\"Kenttä\" scope=\"row\"><span class=\"card-cell-label\">Kenttä</span><code class=\"card-field-name\">response_format</code></th><td data-cell-label=\"Tyyppi\" data-field-type><span class=\"card-cell-label\">Tyyppi</span><code>string</code></td><td data-cell-label=\"Vaatimus\"><span class=\"card-cell-label\">Vaatimus</span>Pakollinen</td><td data-cell-label=\"Arvot &amp; rajat\"><span class=\"card-cell-label\">Arvot &amp; rajat</span><div>mp3</div></td><td data-cell-label=\"Oletus\" data-default=\"unspecified\"><span class=\"card-cell-label\">Oletus</span>—</td></tr></tbody></table></div><details class=\"card-about\" data-material-combinations><summary>Syöteaineistojen yhdistelmät</summary><p class=\"note-s\"><b>text_to_speech</b> · Pakollinen: input</p></details><details class=\"note-s\" data-method-contract><summary>Menetelmän parametrit ja elinkaari</summary><div class=\"tw\" data-card-table=\"contract\"><table><thead><tr><th>Parametri</th><th>Sopimus</th></tr></thead><tbody><tr><th data-cell-label=\"Parametri\" scope=\"row\"><span class=\"card-cell-label\">Parametri</span><code>content_type</code></th><td data-cell-label=\"Sopimus\"><span class=\"card-cell-label\">Sopimus</span>application/json</td></tr><tr><th data-cell-label=\"Parametri\" scope=\"row\"><span class=\"card-cell-label\">Parametri</span><code>required</code></th><td data-cell-label=\"Sopimus\"><span class=\"card-cell-label\">Sopimus</span>model, input, voice, response_format</td></tr><tr><th data-cell-label=\"Parametri\" scope=\"row\"><span class=\"card-cell-label\">Parametri</span><code>voice_ids</code></th><td data-cell-label=\"Sopimus\"><span class=\"card-cell-label\">Sopimus</span>cs-CZ-Grant:MAI-Voice-2.1-Flash, cs-CZ-Harper:MAI-Voice-2.1-Flash, da-DK-Grant:MAI-Voice-2.1-Flash, da-DK-Harper:MAI-Voice-2.1-Flash, de-DE-Grant:MAI-Voice-2.1-Flash, de-DE-Harper:MAI-Voice-2.1-Flash, de-DE-Klaus:MAI-Voice-2.1-Flash, de-DE-Mia:MAI-Voice-2.1-Flash, en-AU-Isla:MAI-Voice-2.1-Flash, en-GB-Emily:MAI-Voice-2.1-Flash, en-GB-Harry:MAI-Voice-2.1-Flash, en-IN-Dhruv:MAI-Voice-2.1-Flash, en-IN-Priya:MAI-Voice-2.1-Flash, en-US-Ethan:MAI-Voice-2.1-Flash, en-US-Grant:MAI-Voice-2.1-Flash, en-US-Harper:MAI-Voice-2.1-Flash, en-US-Iris:MAI-Voice-2.1-Flash, en-US-Jasper:MAI-Voice-2.1-Flash, en-US-Olivia:MAI-Voice-2.1-Flash, en-US-Sage:MAI-Voice-2.1-Flash, es-ES-Marta:MAI-Voice-2.1-Flash, es-MX-Alejo:MAI-Voice-2.1-Flash, es-MX-Grant:MAI-Voice-2.1-Flash, es-MX-Harper:MAI-Voice-2.1-Flash, es-MX-Valeria:MAI-Voice-2.1-Flash, fi-FI-Grant:MAI-Voice-2.1-Flash, fi-FI-Harper:MAI-Voice-2.1-Flash, fr-FR-Grant:MAI-Voice-2.1-Flash, fr-FR-Harper:MAI-Voice-2.1-Flash, fr-FR-Marc:MAI-Voice-2.1-Flash, fr-FR-Soleil:MAI-Voice-2.1-Flash, hi-IN-Arjun:MAI-Voice-2.1-Flash, hi-IN-Dhruv:MAI-Voice-2.1-Flash, hi-IN-Grant:MAI-Voice-2.1-Flash, hi-IN-Harper:MAI-Voice-2.1-Flash, hi-IN-Kavya:MAI-Voice-2.1-Flash, hi-IN-Priya:MAI-Voice-2.1-Flash, hu-HU-Bence:MAI-Voice-2.1-Flash, hu-HU-Grant:MAI-Voice-2.1-Flash, hu-HU-Harper:MAI-Voice-2.1-Flash, hu-HU-Levente:MAI-Voice-2.1-Flash, hu-HU-Lilla:MAI-Voice-2.1-Flash, hu-HU-Reka:MAI-Voice-2.1-Flash, id-ID-Grant:MAI-Voice-2.1-Flash, id-ID-Harper:MAI-Voice-2.1-Flash, it-IT-Grant:MAI-Voice-2.1-Flash, it-IT-Harper:MAI-Voice-2.1-Flash, it-IT-Luca:MAI-Voice-2.1-Flash, it-IT-Rosa:MAI-Voice-2.1-Flash, ko-KR-Grant:MAI-Voice-2.1-Flash, ko-KR-Haena:MAI-Voice-2.1-Flash, ko-KR-Harper:MAI-Voice-2.1-Flash, ko-KR-Junho:MAI-Voice-2.1-Flash, nb-NO-Grant:MAI-Voice-2.1-Flash, nb-NO-Harper:MAI-Voice-2.1-Flash, nl-NL-Grant:MAI-Voice-2.1-Flash, nl-NL-Harper:MAI-Voice-2.1-Flash, nl-NL-Sander:MAI-Voice-2.1-Flash, pl-PL-Grant:MAI-Voice-2.1-Flash, pl-PL-Harper:MAI-Voice-2.1-Flash, pt-BR-Caio:MAI-Voice-2.1-Flash, pt-BR-Grant:MAI-Voice-2.1-Flash, pt-BR-Harper:MAI-Voice-2.1-Flash, pt-BR-Luana:MAI-Voice-2.1-Flash, pt-BR-Pedro:MAI-Voice-2.1-Flash, pt-BR-Rafael:MAI-Voice-2.1-Flash, pt-PT-Grant:MAI-Voice-2.1-Flash, pt-PT-Harper:MAI-Voice-2.1-Flash, pt-PT-Rui:MAI-Voice-2.1-Flash, ro-RO-Andrei:MAI-Voice-2.1-Flash, ro-RO-Elena:MAI-Voice-2.1-Flash, ro-RO-Grant:MAI-Voice-2.1-Flash, ro-RO-Harper:MAI-Voice-2.1-Flash, ro-RO-Ioana:MAI-Voice-2.1-Flash, ro-RO-Radu:MAI-Voice-2.1-Flash, ru-RU-Grant:MAI-Voice-2.1-Flash, ru-RU-Harper:MAI-Voice-2.1-Flash, ru-RU-Lev:MAI-Voice-2.1-Flash, ru-RU-Masha:MAI-Voice-2.1-Flash, sv-SE-Grant:MAI-Voice-2.1-Flash, sv-SE-Harper:MAI-Voice-2.1-Flash, th-TH-Grant:MAI-Voice-2.1-Flash, th-TH-Harper:MAI-Voice-2.1-Flash, th-TH-Krit:MAI-Voice-2.1-Flash, th-TH-Nattapong:MAI-Voice-2.1-Flash, tr-TR-Aydin:MAI-Voice-2.1-Flash, tr-TR-Elif:MAI-Voice-2.1-Flash, tr-TR-Grant:MAI-Voice-2.1-Flash, tr-TR-Harper:MAI-Voice-2.1-Flash, vi-VN-Grant:MAI-Voice-2.1-Flash, vi-VN-Harper:MAI-Voice-2.1-Flash, zh-CN-Bo:MAI-Voice-2.1-Flash, zh-CN-Grant:MAI-Voice-2.1-Flash, zh-CN-Harper:MAI-Voice-2.1-Flash, zh-CN-Lan:MAI-Voice-2.1-Flash, zh-CN-Mei:MAI-Voice-2.1-Flash, zh-CN-Wei:MAI-Voice-2.1-Flash</td></tr><tr><th data-cell-label=\"Parametri\" scope=\"row\"><span class=\"card-cell-label\">Parametri</span><code>response_format</code></th><td data-cell-label=\"Sopimus\"><span class=\"card-cell-label\">Sopimus</span>mp3</td></tr><tr><th data-cell-label=\"Parametri\" scope=\"row\"><span class=\"card-cell-label\">Parametri</span><code>max_input_characters</code></th><td data-cell-label=\"Sopimus\"><span class=\"card-cell-label\">Sopimus</span>null</td></tr><tr><th data-cell-label=\"Parametri\" scope=\"row\"><span class=\"card-cell-label\">Parametri</span><code>other_options</code></th><td data-cell-label=\"Sopimus\"><span class=\"card-cell-label\">Sopimus</span>false</td></tr><tr><th data-cell-label=\"Parametri\" scope=\"row\"><span class=\"card-cell-label\">Parametri</span><code>input</code></th><td data-cell-label=\"Sopimus\"><span class=\"card-cell-label\">Sopimus</span>täsmällinen UTF-8-teksti; Unicode-merkkien määrä ilman normalisointia</td></tr><tr><th data-cell-label=\"Parametri\" scope=\"row\"><span class=\"card-cell-label\">Parametri</span><code>material_types</code></th><td data-cell-label=\"Sopimus\"><span class=\"card-cell-label\">Sopimus</span>text</td></tr></tbody></table></div><p>Elinkaari: <code>synchronous_result_then_owned_library</code></p><p class=\"note-s\"><code>GET /v1/media/tasks/{task_id}</code> · todellisuudessa palautettu task_id tai mediakirjaston tietue</p><p class=\"note-s\"><code>GET /v1/media/assets/{asset_id}/content</code></p><p class=\"note-s\"><code>GET /v1/media/assets</code></p><p class=\"note-s\"><code>GET /v1/media/assets/{asset_id}</code></p><p class=\"note-s\">Valitse juuri tämän malliprofiilin ääni.</p><p class=\"note-s\">Syötemerkit ja äänisekunnit ovat eri mittareita.</p></details></details></section><section class=\"card-section\" data-card-section=\"pricing\"><h3 tabindex=\"-1\">Hinnoittelu</h3><div data-native-semantic-method=\"v1\" data-tariff-reference-only><p class=\"note-s\" data-rate-support-note>Hintatiedot eivät lisää pyyntövalintoja. Tuetut parametrit on lueteltu valitulle menetelmälle.</p><dl data-price-conditions><dt>Nopea tila</dt><dd>Ei määritetty <span class=\"note-s\">Kun nopea tila on valittu</span></dd><dt>Flex-tila</dt><dd>Ei määritetty <span class=\"note-s\">Kun flex-tila on valittu</span></dd><dt>Päättelyn enimmäisteho</dt><dd>Ei määritetty <span class=\"note-s\">Kun päättelyn enimmäistehoon sovelletaan default-oletussäätöä</span></dd></dl></div><div data-declared-tariff-pricing><h4>Ailoot-hinnat</h4><h4>Hinnat asetusten mukaan</h4><p class=\"note-s\">Kohdista kukin veloitus näytettyihin ehtoihin. Käytä yhtä hintaa kutakin vaihtoehtoisten asetusten ryhmää kohden.</p><div class=\"tw\" data-pricing-profiles><table><thead><tr><th>Asetukset</th><th>Hinnasto</th><th>Laskutettava määrä</th><th>Laskutusyksikkö</th><th>Veloitus</th></tr></thead><tbody><tr><th data-cell-label=\"Asetukset\" scope=\"row\"><span class=\"card-cell-label\">Asetukset</span>Tokenien perushinnat</th><td data-cell-label=\"Hinnasto\"><span class=\"card-cell-label\">Hinnasto</span>Perushinta</td><td data-cell-label=\"Laskutettava määrä\"><span class=\"card-cell-label\">Laskutettava määrä</span>—</td><td data-cell-label=\"Laskutusyksikkö\"><span class=\"card-cell-label\">Laskutusyksikkö</span>—</td><td data-cell-label=\"Veloitus\"><span class=\"card-cell-label\">Veloitus</span><div><span>Syöte · Syötetokenit</span> <b>—</b> <span class=\"price-unit\">/ 1K tokenia</span></div><div><span>Tuloste · Tulostokenit</span> <b>—</b> <span class=\"price-unit\">/ 1K tokenia</span></div><div><span>Syöte · Välimuistin luku</span> <b>—</b> <span class=\"price-unit\">/ 1K tokenia</span></div><div><span>Syöte · Välimuistiin kirjoitus</span> <b>—</b> <span class=\"price-unit\">/ 1K tokenia</span></div><div><span>Syöte · Välimuistiin kirjoitus, 1 tunti</span> <b>—</b> <span class=\"price-unit\">/ 1K tokenia</span></div></td></tr><tr><th data-cell-label=\"Asetukset\" scope=\"row\"><span class=\"card-cell-label\">Asetukset</span>Ultra</th><td data-cell-label=\"Hinnasto\"><span class=\"card-cell-label\">Hinnasto</span>—</td><td data-cell-label=\"Laskutettava määrä\"><span class=\"card-cell-label\">Laskutettava määrä</span>Jokainen Unicode-koodipiste lasketaan yhdeksi merkiksi, myös Han-merkit.</td><td data-cell-label=\"Laskutusyksikkö\"><span class=\"card-cell-label\">Laskutusyksikkö</span>1K syötemerkkiä kohden</td><td data-cell-label=\"Veloitus\"><span class=\"card-cell-label\">Veloitus</span><div><span>Syöte · syötemerkki</span> <b>$0.03</b> <span class=\"price-unit\">1K syötemerkkiä kohden</span></div></td></tr></tbody></table></div></div><div data-declared-reference-pricing><h4>Viitehinnaston tiedot</h4><p class=\"note-s\">Mallitason viitehinnastot eivät muuta menetelmän valintaa, hinta-arvioita tai veloituksia. Käytössä olevat veloitukset käyttävät valitun Ailoot-menetelmän hintoja.</p><details class=\"card-price-reference\" data-declared-reference-group data-client-selectable=\"false\"><summary>Microsoft AI: MAI-Voice-2.1-Flash</summary><h4>Hinnat asetusten mukaan</h4><div class=\"tw\" data-pricing-profiles><table><thead><tr><th>Asetukset</th><th>Laskutusehdot</th><th>Veloitus</th></tr></thead><tbody><tr><th data-cell-label=\"Asetukset\" scope=\"row\"><span class=\"card-cell-label\">Asetukset</span>Microsoft AI: MAI-Voice-2.1-Flash · Oletusasetukset</th><td data-cell-label=\"Laskutusehdot\"><span class=\"card-cell-label\">Laskutusehdot</span>Oletuskokoonpano</td><td data-cell-label=\"Veloitus\"><span class=\"card-cell-label\">Veloitus</span><div><span>Syöte · Syötteen merkit</span> <b>0,00003 $</b> <span class=\"price-unit\">syötemerkkiä kohden</span></div></td></tr></tbody></table></div></details></div><p class=\"note-s\">Ailoot varaa arvioidun summan ennen pyyntöä. Tuloksen jälkeen lopullinen veloitus toteutetaan mitatun käytön perusteella. Suoratoiston veloituksessa käytetään lopullista käyttötietuetta. <a href=\"/docs/fi/billing/reserve/\">Varauksen ja lopullisen veloituksen toiminta →</a></p></section><section class=\"card-section\" data-card-section=\"examples\"><h3 tabindex=\"-1\">Esimerkkipyynnöt</h3><h4>Ailoot Ultra · Puhesynteesi</h4><div class=\"code-group\"><div class=\"cg-bar\"><div class=\"cg-tabs\" role=\"tablist\" aria-label=\"Koodivaihtoehdot\"><button class=\"cg-tab\" id=\"model-code-1855-tab-0\" role=\"tab\" type=\"button\" aria-controls=\"model-code-1855-panel-0\" aria-selected=\"true\" tabindex=\"0\">curl</button></div><div class=\"cg-tools\"><button class=\"cg-btn cg-copy\" type=\"button\" aria-label=\"Kopioi koodi\"><svg class=\"cp\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.4\"><rect x=\"5.25\" y=\"5.25\" width=\"8.5\" height=\"8.5\" rx=\"1.75\"/><path d=\"M10.75 5.25V3.5a1.25 1.25 0 0 0-1.25-1.25H3.5A1.25 1.25 0 0 0 2.25 3.5v6a1.25 1.25 0 0 0 1.25 1.25h1.75\"/></svg><svg class=\"ok\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.4\"><path d=\"m3 8.5 3.25 3.25L13 5\"/></svg></button></div></div><div class=\"cg-body\"><div class=\"cg-pane\" id=\"model-code-1855-panel-0\" role=\"tabpanel\" aria-labelledby=\"model-code-1855-tab-0\"><pre data-lang=\"bash\"><code>set -eu\n: &quot;${AILOOT_API_KEY:?Set your Ailoot API key}&quot;\n: &quot;${AILOOT_VOICE_ID:?Choose an accepted voice ID from this exact model profile}&quot;\nexport AILOOT_VOICE_ID\npython3 - &lt;&lt;&#39;PY_REQUEST&#39;\nimport json,os\nfrom pathlib import Path\np=json.loads(&#39;{&quot;model&quot;: &quot;microsoft/mai-voice-2.1-flash&quot;, &quot;input&quot;: &quot;Good afternoon! This is a short voice take.&quot;}&#39;)\nvoice=os.environ[&quot;AILOOT_VOICE_ID&quot;]\nallowed=json.loads(&#39;[&quot;cs-CZ-Grant:MAI-Voice-2.1-Flash&quot;, &quot;cs-CZ-Harper:MAI-Voice-2.1-Flash&quot;, &quot;da-DK-Grant:MAI-Voice-2.1-Flash&quot;, &quot;da-DK-Harper:MAI-Voice-2.1-Flash&quot;, &quot;de-DE-Grant:MAI-Voice-2.1-Flash&quot;, &quot;de-DE-Harper:MAI-Voice-2.1-Flash&quot;, &quot;de-DE-Klaus:MAI-Voice-2.1-Flash&quot;, &quot;de-DE-Mia:MAI-Voice-2.1-Flash&quot;, &quot;en-AU-Isla:MAI-Voice-2.1-Flash&quot;, &quot;en-GB-Emily:MAI-Voice-2.1-Flash&quot;, &quot;en-GB-Harry:MAI-Voice-2.1-Flash&quot;, &quot;en-IN-Dhruv:MAI-Voice-2.1-Flash&quot;, &quot;en-IN-Priya:MAI-Voice-2.1-Flash&quot;, &quot;en-US-Ethan:MAI-Voice-2.1-Flash&quot;, &quot;en-US-Grant:MAI-Voice-2.1-Flash&quot;, &quot;en-US-Harper:MAI-Voice-2.1-Flash&quot;, &quot;en-US-Iris:MAI-Voice-2.1-Flash&quot;, &quot;en-US-Jasper:MAI-Voice-2.1-Flash&quot;, &quot;en-US-Olivia:MAI-Voice-2.1-Flash&quot;, &quot;en-US-Sage:MAI-Voice-2.1-Flash&quot;, &quot;es-ES-Marta:MAI-Voice-2.1-Flash&quot;, &quot;es-MX-Alejo:MAI-Voice-2.1-Flash&quot;, &quot;es-MX-Grant:MAI-Voice-2.1-Flash&quot;, &quot;es-MX-Harper:MAI-Voice-2.1-Flash&quot;, &quot;es-MX-Valeria:MAI-Voice-2.1-Flash&quot;, &quot;fi-FI-Grant:MAI-Voice-2.1-Flash&quot;, &quot;fi-FI-Harper:MAI-Voice-2.1-Flash&quot;, &quot;fr-FR-Grant:MAI-Voice-2.1-Flash&quot;, &quot;fr-FR-Harper:MAI-Voice-2.1-Flash&quot;, &quot;fr-FR-Marc:MAI-Voice-2.1-Flash&quot;, &quot;fr-FR-Soleil:MAI-Voice-2.1-Flash&quot;, &quot;hi-IN-Arjun:MAI-Voice-2.1-Flash&quot;, &quot;hi-IN-Dhruv:MAI-Voice-2.1-Flash&quot;, &quot;hi-IN-Grant:MAI-Voice-2.1-Flash&quot;, &quot;hi-IN-Harper:MAI-Voice-2.1-Flash&quot;, &quot;hi-IN-Kavya:MAI-Voice-2.1-Flash&quot;, &quot;hi-IN-Priya:MAI-Voice-2.1-Flash&quot;, &quot;hu-HU-Bence:MAI-Voice-2.1-Flash&quot;, &quot;hu-HU-Grant:MAI-Voice-2.1-Flash&quot;, &quot;hu-HU-Harper:MAI-Voice-2.1-Flash&quot;, &quot;hu-HU-Levente:MAI-Voice-2.1-Flash&quot;, &quot;hu-HU-Lilla:MAI-Voice-2.1-Flash&quot;, &quot;hu-HU-Reka:MAI-Voice-2.1-Flash&quot;, &quot;id-ID-Grant:MAI-Voice-2.1-Flash&quot;, &quot;id-ID-Harper:MAI-Voice-2.1-Flash&quot;, &quot;it-IT-Grant:MAI-Voice-2.1-Flash&quot;, &quot;it-IT-Harper:MAI-Voice-2.1-Flash&quot;, &quot;it-IT-Luca:MAI-Voice-2.1-Flash&quot;, &quot;it-IT-Rosa:MAI-Voice-2.1-Flash&quot;, &quot;ko-KR-Grant:MAI-Voice-2.1-Flash&quot;, &quot;ko-KR-Haena:MAI-Voice-2.1-Flash&quot;, &quot;ko-KR-Harper:MAI-Voice-2.1-Flash&quot;, &quot;ko-KR-Junho:MAI-Voice-2.1-Flash&quot;, &quot;nb-NO-Grant:MAI-Voice-2.1-Flash&quot;, &quot;nb-NO-Harper:MAI-Voice-2.1-Flash&quot;, &quot;nl-NL-Grant:MAI-Voice-2.1-Flash&quot;, &quot;nl-NL-Harper:MAI-Voice-2.1-Flash&quot;, &quot;nl-NL-Sander:MAI-Voice-2.1-Flash&quot;, &quot;pl-PL-Grant:MAI-Voice-2.1-Flash&quot;, &quot;pl-PL-Harper:MAI-Voice-2.1-Flash&quot;, &quot;pt-BR-Caio:MAI-Voice-2.1-Flash&quot;, &quot;pt-BR-Grant:MAI-Voice-2.1-Flash&quot;, &quot;pt-BR-Harper:MAI-Voice-2.1-Flash&quot;, &quot;pt-BR-Luana:MAI-Voice-2.1-Flash&quot;, &quot;pt-BR-Pedro:MAI-Voice-2.1-Flash&quot;, &quot;pt-BR-Rafael:MAI-Voice-2.1-Flash&quot;, &quot;pt-PT-Grant:MAI-Voice-2.1-Flash&quot;, &quot;pt-PT-Harper:MAI-Voice-2.1-Flash&quot;, &quot;pt-PT-Rui:MAI-Voice-2.1-Flash&quot;, &quot;ro-RO-Andrei:MAI-Voice-2.1-Flash&quot;, &quot;ro-RO-Elena:MAI-Voice-2.1-Flash&quot;, &quot;ro-RO-Grant:MAI-Voice-2.1-Flash&quot;, &quot;ro-RO-Harper:MAI-Voice-2.1-Flash&quot;, &quot;ro-RO-Ioana:MAI-Voice-2.1-Flash&quot;, &quot;ro-RO-Radu:MAI-Voice-2.1-Flash&quot;, &quot;ru-RU-Grant:MAI-Voice-2.1-Flash&quot;, &quot;ru-RU-Harper:MAI-Voice-2.1-Flash&quot;, &quot;ru-RU-Lev:MAI-Voice-2.1-Flash&quot;, &quot;ru-RU-Masha:MAI-Voice-2.1-Flash&quot;, &quot;sv-SE-Grant:MAI-Voice-2.1-Flash&quot;, &quot;sv-SE-Harper:MAI-Voice-2.1-Flash&quot;, &quot;th-TH-Grant:MAI-Voice-2.1-Flash&quot;, &quot;th-TH-Harper:MAI-Voice-2.1-Flash&quot;, &quot;th-TH-Krit:MAI-Voice-2.1-Flash&quot;, &quot;th-TH-Nattapong:MAI-Voice-2.1-Flash&quot;, &quot;tr-TR-Aydin:MAI-Voice-2.1-Flash&quot;, &quot;tr-TR-Elif:MAI-Voice-2.1-Flash&quot;, &quot;tr-TR-Grant:MAI-Voice-2.1-Flash&quot;, &quot;tr-TR-Harper:MAI-Voice-2.1-Flash&quot;, &quot;vi-VN-Grant:MAI-Voice-2.1-Flash&quot;, &quot;vi-VN-Harper:MAI-Voice-2.1-Flash&quot;, &quot;zh-CN-Bo:MAI-Voice-2.1-Flash&quot;, &quot;zh-CN-Grant:MAI-Voice-2.1-Flash&quot;, &quot;zh-CN-Harper:MAI-Voice-2.1-Flash&quot;, &quot;zh-CN-Lan:MAI-Voice-2.1-Flash&quot;, &quot;zh-CN-Mei:MAI-Voice-2.1-Flash&quot;, &quot;zh-CN-Wei:MAI-Voice-2.1-Flash&quot;]&#39;)\nif voice not in allowed: raise SystemExit(&quot;Choose an accepted voice ID from this exact model profile&quot;)\np[&quot;voice&quot;]=voice\np[&quot;response_format&quot;]=&quot;mp3&quot;\nPath(&quot;request.json&quot;).write_text(json.dumps(p,ensure_ascii=False))\nPY_REQUEST\ncurl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/audio/speech \\\n  -H &quot;Authorization: Bearer $AILOOT_API_KEY&quot; -H &#39;Content-Type: application/json&#39; \\\n  --data-binary @request.json -D response-headers.txt -o speech.mp3\n</code></pre></div></div></div></section><section class=\"card-section\" data-card-section=\"results\"><h3 tabindex=\"-1\">Vastaanota ja tallenna tulokset</h3><h4>Ailoot Ultra · Puhesynteesi</h4><p class=\"note-s\">mp3</p><ul class=\"card-result-paths\"><li><code>GET /v1/media/tasks/{task_id}</code></li><li><code>GET /v1/media/assets/{asset_id}/content</code></li><li><code>GET /v1/media/assets</code></li><li><code>GET /v1/media/assets/{asset_id}</code></li></ul><details class=\"card-about\"><summary>Muut sisällön lukukerrat</summary><div class=\"code-group\"><div class=\"cg-bar\"><div class=\"cg-tabs\" role=\"tablist\" aria-label=\"Koodivaihtoehdot\"><button class=\"cg-tab\" id=\"model-code-1856-tab-0\" role=\"tab\" type=\"button\" aria-controls=\"model-code-1856-panel-0\" aria-selected=\"true\" tabindex=\"0\">Mediakirjasto</button><button class=\"cg-tab\" id=\"model-code-1856-tab-1\" role=\"tab\" type=\"button\" aria-controls=\"model-code-1856-panel-1\" aria-selected=\"false\" tabindex=\"-1\">Tehtävän tila</button><button class=\"cg-tab\" id=\"model-code-1856-tab-2\" role=\"tab\" type=\"button\" aria-controls=\"model-code-1856-panel-2\" aria-selected=\"false\" tabindex=\"-1\">Aineiston tiedot</button></div><div class=\"cg-tools\"><button class=\"cg-btn cg-copy\" type=\"button\" aria-label=\"Kopioi koodi\"><svg class=\"cp\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.4\"><rect x=\"5.25\" y=\"5.25\" width=\"8.5\" height=\"8.5\" rx=\"1.75\"/><path d=\"M10.75 5.25V3.5a1.25 1.25 0 0 0-1.25-1.25H3.5A1.25 1.25 0 0 0 2.25 3.5v6a1.25 1.25 0 0 0 1.25 1.25h1.75\"/></svg><svg class=\"ok\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.4\"><path d=\"m3 8.5 3.25 3.25L13 5\"/></svg></button></div></div><div class=\"cg-body\"><div class=\"cg-pane\" id=\"model-code-1856-panel-0\" role=\"tabpanel\" aria-labelledby=\"model-code-1856-tab-0\"><pre data-lang=\"bash\"><code>set -eu\n: &quot;${AILOOT_API_KEY:?Set your Ailoot API key}&quot;\ncurl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/media/assets \\\n  -H &quot;Authorization: Bearer $AILOOT_API_KEY&quot; -o media-assets.json\n</code></pre></div><div class=\"cg-pane\" id=\"model-code-1856-panel-1\" role=\"tabpanel\" aria-labelledby=\"model-code-1856-tab-1\" hidden><pre data-lang=\"bash\"><code>set -eu\n: &quot;${AILOOT_API_KEY:?Set your Ailoot API key}&quot;\n: &quot;${AILOOT_MEDIA_TASK_ID:?Set the actual ID returned by the response or media-library metadata}&quot;\nexport AILOOT_MEDIA_TASK_ID\nresource_id=$(python3 -c &#39;import os,urllib.parse;print(urllib.parse.quote(os.environ[&quot;AILOOT_MEDIA_TASK_ID&quot;],safe=&quot;&quot;))&#39;)\ncurl --fail-with-body --silent --show-error &quot;https://api.ailoot.ai/v1/media/tasks/$resource_id&quot; \\\n  -H &quot;Authorization: Bearer $AILOOT_API_KEY&quot; -o media-task.json\npython3 - &lt;&lt;&#39;PY_RESULT&#39;\nimport json\nfrom pathlib import Path\nprint(json.dumps(json.loads(Path(&quot;media-task.json&quot;).read_text())))\nPY_RESULT\n</code></pre></div><div class=\"cg-pane\" id=\"model-code-1856-panel-2\" role=\"tabpanel\" aria-labelledby=\"model-code-1856-tab-2\" hidden><pre data-lang=\"bash\"><code>set -eu\n: &quot;${AILOOT_API_KEY:?Set your Ailoot API key}&quot;\n: &quot;${AILOOT_ASSET_ID:?Set the actual ID returned by the response or media-library metadata}&quot;\nexport AILOOT_ASSET_ID\nresource_id=$(python3 -c &#39;import os,urllib.parse;print(urllib.parse.quote(os.environ[&quot;AILOOT_ASSET_ID&quot;],safe=&quot;&quot;))&#39;)\ncurl --fail-with-body --silent --show-error &quot;https://api.ailoot.ai/v1/media/assets/$resource_id&quot; \\\n  -H &quot;Authorization: Bearer $AILOOT_API_KEY&quot; -o media-asset.json\npython3 - &lt;&lt;&#39;PY_RESULT&#39;\nimport json\nfrom pathlib import Path\nprint(json.dumps(json.loads(Path(&quot;media-asset.json&quot;).read_text())))\nPY_RESULT\n</code></pre></div></div></div></details><div class=\"card-result-process\" data-all-results><h5>Säilytä kaikki valmistuneet tulokset</h5><p class=\"note-s\">Säilytä jokainen kokonainen palautettu vastaus, tiedosto ja sisällön osa.</p><p class=\"note-s\">Säilytä koko binääritulos ja otsakkeet. Jos palautetaan JSON tai useita tulosteita, säilytä jokainen data-alkio ja nouda jokainen resurssi sen todellisesta allekirjoitetusta URL-osoitteesta.</p></div><div class=\"card-result-process\" data-unknown-recovery><h5>Jos alkuperäinen vastaus on tarkistettava</h5><p class=\"note-s\">Säilytä alkuperäinen operation_id/X-Client-Request-ID täsmäytystä varten lähettämättä pyyntöä uudelleen; erillistä äänen tilakyselyreittiä ei ole.</p></div><details class=\"card-about\" data-output-fields><summary>Vastauksen kentät</summary><div class=\"tw\" data-card-table=\"output\"><table><thead><tr><th>Kenttä</th><th>Tyyppi</th></tr></thead><tbody><tr><th data-cell-label=\"Kenttä\" scope=\"row\"><span class=\"card-cell-label\">Kenttä</span><code class=\"card-field-name\">binary audio</code></th><td data-cell-label=\"Tyyppi\" data-field-type><span class=\"card-cell-label\">Tyyppi</span>bytes</td></tr><tr><th data-cell-label=\"Kenttä\" scope=\"row\"><span class=\"card-cell-label\">Kenttä</span><code class=\"card-field-name\">response headers</code></th><td data-cell-label=\"Tyyppi\" data-field-type><span class=\"card-cell-label\">Tyyppi</span>headers</td></tr></tbody></table></div></details><details class=\"card-about\" data-method-errors><summary>Virheet ja seuraavat vaiheet</summary><div class=\"tw\" data-card-table=\"errors\"><table><thead><tr><th>Vastaus</th><th>Ehto</th><th>Seuraava vaihe</th></tr></thead><tbody><tr><th data-cell-label=\"Vastaus\" scope=\"row\"><span class=\"card-cell-label\">Vastaus</span>400 · <code>invalid_request_error</code></th><td data-cell-label=\"Ehto\"><span class=\"card-cell-label\">Ehto</span>Virheelliset pakolliset kentät, aineiston esitysmuoto tai parametrin arvo</td><td data-cell-label=\"Seuraava vaihe\"><span class=\"card-cell-label\">Seuraava vaihe</span>Korjaa ilmoitetut kentät ennen uutta luontipyyntöä.</td></tr><tr><th data-cell-label=\"Vastaus\" scope=\"row\"><span class=\"card-cell-label\">Vastaus</span><code>server_error</code></th><td data-cell-label=\"Ehto\"><span class=\"card-cell-label\">Ehto</span>Palautettu vastaus ilmoittaa, että operaatio tai tulos edellyttää tarkistusta</td><td data-cell-label=\"Seuraava vaihe\"><span class=\"card-cell-label\">Seuraava vaihe</span>Säilytä alkuperäinen palautettu operaation tai tehtävän ID, pyynnön otsakkeet ja vastaus; jatka kyseisen alkuperäisen operaation tuettuja lukutoimintoja. Älä lähetä luontipyyntöä uudelleen.</td></tr></tbody></table></div></details></section><section class=\"card-section\" data-card-section=\"aliases\"><h3 tabindex=\"-1\">Aliakset</h3><h4>Mallin aliakset</h4><p class=\"note-s\"><span data-model-alias-route=\"Ultra\"><b>Ailoot Ultra</b> <a href=\"#m=microsoft%2Fmai-voice-2.1-flash&amp;route=Ultra&amp;caller=microsoft%2Fmai-voice-2.1-flash&amp;fmt=speech\"><code>microsoft/mai-voice-2.1-flash</code></a></span></p><h4>Menetelmäpolkujen aliakset</h4><p class=\"note-s\">Käytä yllä näytettyjä menetelmäpolkuja.</p><h4>Liittyvät kutsujan ID:t</h4><p class=\"note-s\"><a href=\"#m=microsoft%2Fmai-voice-2.1-flash&amp;route=Ultra&amp;caller=microsoft%2Fmai-voice-2.1-flash&amp;fmt=speech\"><code>microsoft/mai-voice-2.1-flash</code></a></p></section></div>",
      "method_identity": {
        "effective_request_model_id": "microsoft/mai-voice-2.1-flash",
        "fmt": "speech",
        "http": "POST",
        "path": "/v1/audio/speech",
        "request_model_id": "microsoft/mai-voice-2.1-flash",
        "route_label": "Ultra"
      },
      "method_key": "Ultra|speech|/v1/audio/speech|microsoft%2Fmai-voice-2.1-flash",
      "ordinal": 0,
      "rawMethod": {
        "available": null,
        "cache_read": null,
        "cache_write": null,
        "cache_write_1h": null,
        "contract": {
          "data": {
            "all_results": "Keep the complete binary result and headers. If JSON/multiple outputs are returned, retain every data item and fetch each actual signed asset URL.",
            "errors": [
              {
                "code": null,
                "condition": "Virheelliset pakolliset kentät, aineiston esitysmuoto tai parametrin arvo",
                "http_status": 400,
                "recovery": "Korjaa ilmoitetut kentät ennen uutta luontipyyntöä.",
                "type": "invalid_request_error"
              },
              {
                "code": null,
                "condition": "Palautettu vastaus ilmoittaa, että operaatio tai tulos edellyttää tarkistusta",
                "http_status": null,
                "recovery": "Säilytä alkuperäinen palautettu operaation tai tehtävän ID, pyynnön otsakkeet ja vastaus; jatka kyseisen alkuperäisen operaation tuettuja lukutoimintoja. Älä lähetä luontipyyntöä uudelleen.",
                "type": "server_error"
              }
            ],
            "hints": [],
            "ignored_fields": [],
            "lifecycle": {
              "all_results": "Follow everyactualreturnedoutputandownedasset; no result is discardedbecauseindex0orcontent_urlalreadyexists.",
              "assets": [
                {
                  "http": "GET",
                  "path": "/v1/media/assets"
                },
                {
                  "http": "GET",
                  "path": "/v1/media/assets/{asset_id}"
                }
              ],
              "content": [
                {
                  "http": "GET",
                  "path": "/v1/media/assets/{asset_id}/content",
                  "url_source": "exact returned signed URL; never construct token"
                }
              ],
              "mode": "synchronous_result_then_owned_library",
              "operation_id_is_not_task_id": true,
              "status": [
                {
                  "http": "GET",
                  "id_source": "actual returned task_id or media library record",
                  "path": "/v1/media/tasks/{task_id}"
                }
              ],
              "unknown": "Säilytä alkuperäinen operation_id/X-Client-Request-ID täsmäytystä varten lähettämättä pyyntöä uudelleen; erillistä äänen tilakyselyreittiä ei ole."
            },
            "material_combinations": [
              {
                "content_type": "application/json",
                "mode": "text_to_speech",
                "required": [
                  "input"
                ]
              }
            ],
            "media_library": {
              "asset": {
                "fields": [
                  {
                    "description": null,
                    "name": "asset_id",
                    "type": "string"
                  },
                  {
                    "description": null,
                    "name": "task_id",
                    "type": "string"
                  },
                  {
                    "description": null,
                    "name": "output_key",
                    "type": "string"
                  },
                  {
                    "description": null,
                    "name": "family",
                    "type": "string"
                  },
                  {
                    "description": null,
                    "name": "model",
                    "type": "string"
                  },
                  {
                    "description": null,
                    "name": "method",
                    "type": "string"
                  },
                  {
                    "description": null,
                    "name": "status",
                    "type": "string"
                  },
                  {
                    "description": null,
                    "name": "content_type",
                    "type": "string"
                  },
                  {
                    "description": null,
                    "name": "sha256",
                    "type": "string"
                  },
                  {
                    "description": null,
                    "name": "size_bytes",
                    "type": "integer"
                  },
                  {
                    "description": null,
                    "name": "content_url",
                    "type": "string"
                  }
                ],
                "http": "GET",
                "id_source": "actual returned asset_id",
                "path": "/v1/media/assets/{asset_id}"
              },
              "content": {
                "http": "GET",
                "path": "/v1/media/assets/{asset_id}/content",
                "range_header_supported": true,
                "url_source": "Use exact returned signed content_url including its token; do not construct a token."
              },
              "expired_link": {
                "code": "link_expired",
                "http_status": 404,
                "recovery": "Read the asset again to obtain its refreshed signed content_url, then fetch that URL. Do not regenerate."
              },
              "list": {
                "all_pages": "Follow every returned next_cursor, then select records by their actual task_id/output_key.",
                "http": "GET",
                "output_fields": [
                  {
                    "description": null,
                    "name": "object",
                    "type": "string"
                  },
                  {
                    "description": null,
                    "name": "data",
                    "type": "asset[]"
                  },
                  {
                    "description": null,
                    "name": "next_cursor",
                    "type": "string|null"
                  }
                ],
                "parameters": [
                  {
                    "availability": "source_interface",
                    "default": null,
                    "default_known": false,
                    "enum": null,
                    "enum_known": false,
                    "name": "family",
                    "required": false,
                    "type": "string"
                  },
                  {
                    "availability": "source_interface",
                    "default": null,
                    "default_known": false,
                    "enum": null,
                    "enum_known": false,
                    "name": "cursor",
                    "required": false,
                    "type": "string"
                  },
                  {
                    "availability": "source_interface",
                    "default": 20,
                    "default_known": true,
                    "enum": null,
                    "enum_known": false,
                    "maximum": 100,
                    "minimum": 1,
                    "name": "limit",
                    "required": false,
                    "type": "integer"
                  }
                ],
                "path": "/v1/media/assets"
              },
              "revoke": {
                "http": "DELETE",
                "meaning": "Revokes/deletes the existing owned file; this is not generation cancellation.",
                "path": "/v1/media/assets/{asset_id}",
                "pending_status": "revoking",
                "success_statuses": [
                  202,
                  204
                ]
              },
              "task": {
                "http": "GET",
                "id_source": "actual returned task_id or media library record; operation_id is not task_id",
                "path": "/v1/media/tasks/{task_id}"
              }
            },
            "operation_modes": [
              "text_to_speech"
            ],
            "outputs": {
              "all_results": "Säilytä koko binääritulos ja otsakkeet. Jos palautetaan JSON tai useita tulosteita, säilytä jokainen data-alkio ja nouda jokainen resurssi sen todellisesta allekirjoitetusta URL-osoitteesta.",
              "family": "audio",
              "fields": [
                {
                  "description": null,
                  "name": "binary audio",
                  "type": "bytes"
                },
                {
                  "description": null,
                  "name": "response headers",
                  "type": "headers"
                }
              ],
              "format": "mp3",
              "http_success": 200
            },
            "parameters": [
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": [
                  "microsoft/mai-voice-2.1-flash"
                ],
                "enum_known": true,
                "name": "model",
                "required": true,
                "type": "string"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": null,
                "enum_known": false,
                "limit_known": false,
                "maximum_length": null,
                "min_length": 1,
                "name": "input",
                "required": true,
                "type": "string",
                "unit": "Unicode-merkit"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": [
                  "cs-CZ-Grant:MAI-Voice-2.1-Flash",
                  "cs-CZ-Harper:MAI-Voice-2.1-Flash",
                  "da-DK-Grant:MAI-Voice-2.1-Flash",
                  "da-DK-Harper:MAI-Voice-2.1-Flash",
                  "de-DE-Grant:MAI-Voice-2.1-Flash",
                  "de-DE-Harper:MAI-Voice-2.1-Flash",
                  "de-DE-Klaus:MAI-Voice-2.1-Flash",
                  "de-DE-Mia:MAI-Voice-2.1-Flash",
                  "en-AU-Isla:MAI-Voice-2.1-Flash",
                  "en-GB-Emily:MAI-Voice-2.1-Flash",
                  "en-GB-Harry:MAI-Voice-2.1-Flash",
                  "en-IN-Dhruv:MAI-Voice-2.1-Flash",
                  "en-IN-Priya:MAI-Voice-2.1-Flash",
                  "en-US-Ethan:MAI-Voice-2.1-Flash",
                  "en-US-Grant:MAI-Voice-2.1-Flash",
                  "en-US-Harper:MAI-Voice-2.1-Flash",
                  "en-US-Iris:MAI-Voice-2.1-Flash",
                  "en-US-Jasper:MAI-Voice-2.1-Flash",
                  "en-US-Olivia:MAI-Voice-2.1-Flash",
                  "en-US-Sage:MAI-Voice-2.1-Flash",
                  "es-ES-Marta:MAI-Voice-2.1-Flash",
                  "es-MX-Alejo:MAI-Voice-2.1-Flash",
                  "es-MX-Grant:MAI-Voice-2.1-Flash",
                  "es-MX-Harper:MAI-Voice-2.1-Flash",
                  "es-MX-Valeria:MAI-Voice-2.1-Flash",
                  "fi-FI-Grant:MAI-Voice-2.1-Flash",
                  "fi-FI-Harper:MAI-Voice-2.1-Flash",
                  "fr-FR-Grant:MAI-Voice-2.1-Flash",
                  "fr-FR-Harper:MAI-Voice-2.1-Flash",
                  "fr-FR-Marc:MAI-Voice-2.1-Flash",
                  "fr-FR-Soleil:MAI-Voice-2.1-Flash",
                  "hi-IN-Arjun:MAI-Voice-2.1-Flash",
                  "hi-IN-Dhruv:MAI-Voice-2.1-Flash",
                  "hi-IN-Grant:MAI-Voice-2.1-Flash",
                  "hi-IN-Harper:MAI-Voice-2.1-Flash",
                  "hi-IN-Kavya:MAI-Voice-2.1-Flash",
                  "hi-IN-Priya:MAI-Voice-2.1-Flash",
                  "hu-HU-Bence:MAI-Voice-2.1-Flash",
                  "hu-HU-Grant:MAI-Voice-2.1-Flash",
                  "hu-HU-Harper:MAI-Voice-2.1-Flash",
                  "hu-HU-Levente:MAI-Voice-2.1-Flash",
                  "hu-HU-Lilla:MAI-Voice-2.1-Flash",
                  "hu-HU-Reka:MAI-Voice-2.1-Flash",
                  "id-ID-Grant:MAI-Voice-2.1-Flash",
                  "id-ID-Harper:MAI-Voice-2.1-Flash",
                  "it-IT-Grant:MAI-Voice-2.1-Flash",
                  "it-IT-Harper:MAI-Voice-2.1-Flash",
                  "it-IT-Luca:MAI-Voice-2.1-Flash",
                  "it-IT-Rosa:MAI-Voice-2.1-Flash",
                  "ko-KR-Grant:MAI-Voice-2.1-Flash",
                  "ko-KR-Haena:MAI-Voice-2.1-Flash",
                  "ko-KR-Harper:MAI-Voice-2.1-Flash",
                  "ko-KR-Junho:MAI-Voice-2.1-Flash",
                  "nb-NO-Grant:MAI-Voice-2.1-Flash",
                  "nb-NO-Harper:MAI-Voice-2.1-Flash",
                  "nl-NL-Grant:MAI-Voice-2.1-Flash",
                  "nl-NL-Harper:MAI-Voice-2.1-Flash",
                  "nl-NL-Sander:MAI-Voice-2.1-Flash",
                  "pl-PL-Grant:MAI-Voice-2.1-Flash",
                  "pl-PL-Harper:MAI-Voice-2.1-Flash",
                  "pt-BR-Caio:MAI-Voice-2.1-Flash",
                  "pt-BR-Grant:MAI-Voice-2.1-Flash",
                  "pt-BR-Harper:MAI-Voice-2.1-Flash",
                  "pt-BR-Luana:MAI-Voice-2.1-Flash",
                  "pt-BR-Pedro:MAI-Voice-2.1-Flash",
                  "pt-BR-Rafael:MAI-Voice-2.1-Flash",
                  "pt-PT-Grant:MAI-Voice-2.1-Flash",
                  "pt-PT-Harper:MAI-Voice-2.1-Flash",
                  "pt-PT-Rui:MAI-Voice-2.1-Flash",
                  "ro-RO-Andrei:MAI-Voice-2.1-Flash",
                  "ro-RO-Elena:MAI-Voice-2.1-Flash",
                  "ro-RO-Grant:MAI-Voice-2.1-Flash",
                  "ro-RO-Harper:MAI-Voice-2.1-Flash",
                  "ro-RO-Ioana:MAI-Voice-2.1-Flash",
                  "ro-RO-Radu:MAI-Voice-2.1-Flash",
                  "ru-RU-Grant:MAI-Voice-2.1-Flash",
                  "ru-RU-Harper:MAI-Voice-2.1-Flash",
                  "ru-RU-Lev:MAI-Voice-2.1-Flash",
                  "ru-RU-Masha:MAI-Voice-2.1-Flash",
                  "sv-SE-Grant:MAI-Voice-2.1-Flash",
                  "sv-SE-Harper:MAI-Voice-2.1-Flash",
                  "th-TH-Grant:MAI-Voice-2.1-Flash",
                  "th-TH-Harper:MAI-Voice-2.1-Flash",
                  "th-TH-Krit:MAI-Voice-2.1-Flash",
                  "th-TH-Nattapong:MAI-Voice-2.1-Flash",
                  "tr-TR-Aydin:MAI-Voice-2.1-Flash",
                  "tr-TR-Elif:MAI-Voice-2.1-Flash",
                  "tr-TR-Grant:MAI-Voice-2.1-Flash",
                  "tr-TR-Harper:MAI-Voice-2.1-Flash",
                  "vi-VN-Grant:MAI-Voice-2.1-Flash",
                  "vi-VN-Harper:MAI-Voice-2.1-Flash",
                  "zh-CN-Bo:MAI-Voice-2.1-Flash",
                  "zh-CN-Grant:MAI-Voice-2.1-Flash",
                  "zh-CN-Harper:MAI-Voice-2.1-Flash",
                  "zh-CN-Lan:MAI-Voice-2.1-Flash",
                  "zh-CN-Mei:MAI-Voice-2.1-Flash",
                  "zh-CN-Wei:MAI-Voice-2.1-Flash"
                ],
                "enum_known": true,
                "name": "voice",
                "required": true,
                "type": "string"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": [
                  "mp3"
                ],
                "enum_known": true,
                "name": "response_format",
                "required": true,
                "type": "string"
              }
            ],
            "profile_binding": "Exact existing Ailoot model and method; interface constraints below do not assert provider qualification.",
            "unsupported": [
              "every field outside exactmodel,input,voice,response_format",
              "stream/speed/reference speech options"
            ]
          },
          "hints": [
            "Valitse juuri tämän malliprofiilin ääni.",
            "Syötemerkit ja äänisekunnit ovat eri mittareita."
          ],
          "input": {
            "content_type": "application/json",
            "input": "täsmällinen UTF-8-teksti; Unicode-merkkien määrä ilman normalisointia",
            "material_types": [
              "text"
            ],
            "max_input_characters": null,
            "other_options": false,
            "required": [
              "model",
              "input",
              "voice",
              "response_format"
            ],
            "response_format": [
              "mp3"
            ],
            "voice_ids": [
              "cs-CZ-Grant:MAI-Voice-2.1-Flash",
              "cs-CZ-Harper:MAI-Voice-2.1-Flash",
              "da-DK-Grant:MAI-Voice-2.1-Flash",
              "da-DK-Harper:MAI-Voice-2.1-Flash",
              "de-DE-Grant:MAI-Voice-2.1-Flash",
              "de-DE-Harper:MAI-Voice-2.1-Flash",
              "de-DE-Klaus:MAI-Voice-2.1-Flash",
              "de-DE-Mia:MAI-Voice-2.1-Flash",
              "en-AU-Isla:MAI-Voice-2.1-Flash",
              "en-GB-Emily:MAI-Voice-2.1-Flash",
              "en-GB-Harry:MAI-Voice-2.1-Flash",
              "en-IN-Dhruv:MAI-Voice-2.1-Flash",
              "en-IN-Priya:MAI-Voice-2.1-Flash",
              "en-US-Ethan:MAI-Voice-2.1-Flash",
              "en-US-Grant:MAI-Voice-2.1-Flash",
              "en-US-Harper:MAI-Voice-2.1-Flash",
              "en-US-Iris:MAI-Voice-2.1-Flash",
              "en-US-Jasper:MAI-Voice-2.1-Flash",
              "en-US-Olivia:MAI-Voice-2.1-Flash",
              "en-US-Sage:MAI-Voice-2.1-Flash",
              "es-ES-Marta:MAI-Voice-2.1-Flash",
              "es-MX-Alejo:MAI-Voice-2.1-Flash",
              "es-MX-Grant:MAI-Voice-2.1-Flash",
              "es-MX-Harper:MAI-Voice-2.1-Flash",
              "es-MX-Valeria:MAI-Voice-2.1-Flash",
              "fi-FI-Grant:MAI-Voice-2.1-Flash",
              "fi-FI-Harper:MAI-Voice-2.1-Flash",
              "fr-FR-Grant:MAI-Voice-2.1-Flash",
              "fr-FR-Harper:MAI-Voice-2.1-Flash",
              "fr-FR-Marc:MAI-Voice-2.1-Flash",
              "fr-FR-Soleil:MAI-Voice-2.1-Flash",
              "hi-IN-Arjun:MAI-Voice-2.1-Flash",
              "hi-IN-Dhruv:MAI-Voice-2.1-Flash",
              "hi-IN-Grant:MAI-Voice-2.1-Flash",
              "hi-IN-Harper:MAI-Voice-2.1-Flash",
              "hi-IN-Kavya:MAI-Voice-2.1-Flash",
              "hi-IN-Priya:MAI-Voice-2.1-Flash",
              "hu-HU-Bence:MAI-Voice-2.1-Flash",
              "hu-HU-Grant:MAI-Voice-2.1-Flash",
              "hu-HU-Harper:MAI-Voice-2.1-Flash",
              "hu-HU-Levente:MAI-Voice-2.1-Flash",
              "hu-HU-Lilla:MAI-Voice-2.1-Flash",
              "hu-HU-Reka:MAI-Voice-2.1-Flash",
              "id-ID-Grant:MAI-Voice-2.1-Flash",
              "id-ID-Harper:MAI-Voice-2.1-Flash",
              "it-IT-Grant:MAI-Voice-2.1-Flash",
              "it-IT-Harper:MAI-Voice-2.1-Flash",
              "it-IT-Luca:MAI-Voice-2.1-Flash",
              "it-IT-Rosa:MAI-Voice-2.1-Flash",
              "ko-KR-Grant:MAI-Voice-2.1-Flash",
              "ko-KR-Haena:MAI-Voice-2.1-Flash",
              "ko-KR-Harper:MAI-Voice-2.1-Flash",
              "ko-KR-Junho:MAI-Voice-2.1-Flash",
              "nb-NO-Grant:MAI-Voice-2.1-Flash",
              "nb-NO-Harper:MAI-Voice-2.1-Flash",
              "nl-NL-Grant:MAI-Voice-2.1-Flash",
              "nl-NL-Harper:MAI-Voice-2.1-Flash",
              "nl-NL-Sander:MAI-Voice-2.1-Flash",
              "pl-PL-Grant:MAI-Voice-2.1-Flash",
              "pl-PL-Harper:MAI-Voice-2.1-Flash",
              "pt-BR-Caio:MAI-Voice-2.1-Flash",
              "pt-BR-Grant:MAI-Voice-2.1-Flash",
              "pt-BR-Harper:MAI-Voice-2.1-Flash",
              "pt-BR-Luana:MAI-Voice-2.1-Flash",
              "pt-BR-Pedro:MAI-Voice-2.1-Flash",
              "pt-BR-Rafael:MAI-Voice-2.1-Flash",
              "pt-PT-Grant:MAI-Voice-2.1-Flash",
              "pt-PT-Harper:MAI-Voice-2.1-Flash",
              "pt-PT-Rui:MAI-Voice-2.1-Flash",
              "ro-RO-Andrei:MAI-Voice-2.1-Flash",
              "ro-RO-Elena:MAI-Voice-2.1-Flash",
              "ro-RO-Grant:MAI-Voice-2.1-Flash",
              "ro-RO-Harper:MAI-Voice-2.1-Flash",
              "ro-RO-Ioana:MAI-Voice-2.1-Flash",
              "ro-RO-Radu:MAI-Voice-2.1-Flash",
              "ru-RU-Grant:MAI-Voice-2.1-Flash",
              "ru-RU-Harper:MAI-Voice-2.1-Flash",
              "ru-RU-Lev:MAI-Voice-2.1-Flash",
              "ru-RU-Masha:MAI-Voice-2.1-Flash",
              "sv-SE-Grant:MAI-Voice-2.1-Flash",
              "sv-SE-Harper:MAI-Voice-2.1-Flash",
              "th-TH-Grant:MAI-Voice-2.1-Flash",
              "th-TH-Harper:MAI-Voice-2.1-Flash",
              "th-TH-Krit:MAI-Voice-2.1-Flash",
              "th-TH-Nattapong:MAI-Voice-2.1-Flash",
              "tr-TR-Aydin:MAI-Voice-2.1-Flash",
              "tr-TR-Elif:MAI-Voice-2.1-Flash",
              "tr-TR-Grant:MAI-Voice-2.1-Flash",
              "tr-TR-Harper:MAI-Voice-2.1-Flash",
              "vi-VN-Grant:MAI-Voice-2.1-Flash",
              "vi-VN-Harper:MAI-Voice-2.1-Flash",
              "zh-CN-Bo:MAI-Voice-2.1-Flash",
              "zh-CN-Grant:MAI-Voice-2.1-Flash",
              "zh-CN-Harper:MAI-Voice-2.1-Flash",
              "zh-CN-Lan:MAI-Voice-2.1-Flash",
              "zh-CN-Mei:MAI-Voice-2.1-Flash",
              "zh-CN-Wei:MAI-Voice-2.1-Flash"
            ]
          },
          "lifecycle": {
            "assets": [
              {
                "http": "GET",
                "path": "/v1/media/assets"
              },
              {
                "http": "GET",
                "path": "/v1/media/assets/{asset_id}"
              }
            ],
            "content": [
              {
                "http": "GET",
                "path": "/v1/media/assets/{asset_id}/content",
                "url_source": "exact returned signed URL; never construct token"
              }
            ],
            "mode": "synchronous_result_then_owned_library",
            "operation_id_is_not_task_id": true,
            "status": [
              {
                "http": "GET",
                "id_source": "todellisuudessa palautettu task_id tai mediakirjaston tietue",
                "path": "/v1/media/tasks/{task_id}"
              }
            ],
            "unknown": "Retain original operation_id/X-Client-Request-ID for reconciliation without resubmission; no dedicated audio poll route."
          },
          "manufacturer_capability": null,
          "method": {
            "http": "POST",
            "path": "/v1/audio/speech"
          },
          "method_aliases": [],
          "operation_modes": [
            "text_to_speech"
          ],
          "output": {
            "family": "audio",
            "format": "mp3",
            "http_success": 200,
            "response": "full binary MP3 plus response headers",
            "result": "complete playable owned MP3"
          }
        },
        "ctx": null,
        "declared_pricing_profiles": [
          {
            "dimensions": {
              "regime": "base"
            },
            "label": "Base token rates",
            "units": [
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": true,
                "estimate_only": false,
                "key": "input_price",
                "label": "Input tokens",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "input_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": false,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "input_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": true,
                "estimate_only": false,
                "key": "output_price",
                "label": "Output tokens",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "output_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": false,
                "rate_role": "typed_native_retail_rate",
                "side": "out",
                "unit": "output_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": true,
                "estimate_only": false,
                "key": "cache_read_price",
                "label": "Cache read",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "cached_input_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": false,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "cached_input_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": true,
                "estimate_only": false,
                "key": "cache_write_price",
                "label": "Cache write",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "generic_cache_creation_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": false,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "generic_cache_creation_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": true,
                "estimate_only": false,
                "key": "cache_write_1h_price",
                "label": "Cache write, 1 hour",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "one_hour_cache_creation_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": false,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "one_hour_cache_creation_token"
              }
            ]
          },
          {
            "dimensions": {
              "quantity_meter": "utf8.RuneCountInString(validUTF8): one Han codepoint=1; no Han weighting",
              "quoted_unit": "per 1000 input character"
            },
            "label": "Ultra",
            "units": [
              {
                "amount": "0.03000",
                "amount_unit": "usd_per_1000_characters",
                "billing_input": true,
                "estimate_only": false,
                "key": "audio_input_character",
                "label": "input character",
                "native_amount_usd_per_unit": "0.00003",
                "native_quantity": 1,
                "public_unit_label": "per 1000 input character",
                "quantity": "1000",
                "quantity_is_estimate": false,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "input_character"
              }
            ]
          }
        ],
        "declared_tariff_references": [
          {
            "client_selectable": false,
            "key": "768d1dc9b9da20eb0942",
            "label": "Microsoft AI: MAI-Voice-2.1-Flash",
            "profiles": [
              {
                "basis": "",
                "dimensions": {
                  "conditions": "Oletuskokoonpano"
                },
                "label": "Microsoft AI: MAI-Voice-2.1-Flash · Oletusasetukset",
                "units": [
                  {
                    "amount": "0.000030",
                    "amount_unit": "usd_per_exact_physical_unit",
                    "billing_input": false,
                    "key": "a7f384d81db64c9b1e8c0855",
                    "label": "Input characters",
                    "public_unit_label": "per input character",
                    "quantity": "1",
                    "rate_role": "declared_tariff_rate",
                    "side": "in",
                    "unit": "input_character"
                  }
                ]
              }
            ]
          }
        ],
        "examples": [
          {
            "code": "set -eu\n: \"${AILOOT_API_KEY:?Set your Ailoot API key}\"\n: \"${AILOOT_VOICE_ID:?Choose an accepted voice ID from this exact model profile}\"\nexport AILOOT_VOICE_ID\npython3 - <<'PY_REQUEST'\nimport json,os\nfrom pathlib import Path\np=json.loads('{\"model\": \"microsoft/mai-voice-2.1-flash\", \"input\": \"Good afternoon! This is a short voice take.\"}')\nvoice=os.environ[\"AILOOT_VOICE_ID\"]\nallowed=json.loads('[\"cs-CZ-Grant:MAI-Voice-2.1-Flash\", \"cs-CZ-Harper:MAI-Voice-2.1-Flash\", \"da-DK-Grant:MAI-Voice-2.1-Flash\", \"da-DK-Harper:MAI-Voice-2.1-Flash\", \"de-DE-Grant:MAI-Voice-2.1-Flash\", \"de-DE-Harper:MAI-Voice-2.1-Flash\", \"de-DE-Klaus:MAI-Voice-2.1-Flash\", \"de-DE-Mia:MAI-Voice-2.1-Flash\", \"en-AU-Isla:MAI-Voice-2.1-Flash\", \"en-GB-Emily:MAI-Voice-2.1-Flash\", \"en-GB-Harry:MAI-Voice-2.1-Flash\", \"en-IN-Dhruv:MAI-Voice-2.1-Flash\", \"en-IN-Priya:MAI-Voice-2.1-Flash\", \"en-US-Ethan:MAI-Voice-2.1-Flash\", \"en-US-Grant:MAI-Voice-2.1-Flash\", \"en-US-Harper:MAI-Voice-2.1-Flash\", \"en-US-Iris:MAI-Voice-2.1-Flash\", \"en-US-Jasper:MAI-Voice-2.1-Flash\", \"en-US-Olivia:MAI-Voice-2.1-Flash\", \"en-US-Sage:MAI-Voice-2.1-Flash\", \"es-ES-Marta:MAI-Voice-2.1-Flash\", \"es-MX-Alejo:MAI-Voice-2.1-Flash\", \"es-MX-Grant:MAI-Voice-2.1-Flash\", \"es-MX-Harper:MAI-Voice-2.1-Flash\", \"es-MX-Valeria:MAI-Voice-2.1-Flash\", \"fi-FI-Grant:MAI-Voice-2.1-Flash\", \"fi-FI-Harper:MAI-Voice-2.1-Flash\", \"fr-FR-Grant:MAI-Voice-2.1-Flash\", \"fr-FR-Harper:MAI-Voice-2.1-Flash\", \"fr-FR-Marc:MAI-Voice-2.1-Flash\", \"fr-FR-Soleil:MAI-Voice-2.1-Flash\", \"hi-IN-Arjun:MAI-Voice-2.1-Flash\", \"hi-IN-Dhruv:MAI-Voice-2.1-Flash\", \"hi-IN-Grant:MAI-Voice-2.1-Flash\", \"hi-IN-Harper:MAI-Voice-2.1-Flash\", \"hi-IN-Kavya:MAI-Voice-2.1-Flash\", \"hi-IN-Priya:MAI-Voice-2.1-Flash\", \"hu-HU-Bence:MAI-Voice-2.1-Flash\", \"hu-HU-Grant:MAI-Voice-2.1-Flash\", \"hu-HU-Harper:MAI-Voice-2.1-Flash\", \"hu-HU-Levente:MAI-Voice-2.1-Flash\", \"hu-HU-Lilla:MAI-Voice-2.1-Flash\", \"hu-HU-Reka:MAI-Voice-2.1-Flash\", \"id-ID-Grant:MAI-Voice-2.1-Flash\", \"id-ID-Harper:MAI-Voice-2.1-Flash\", \"it-IT-Grant:MAI-Voice-2.1-Flash\", \"it-IT-Harper:MAI-Voice-2.1-Flash\", \"it-IT-Luca:MAI-Voice-2.1-Flash\", \"it-IT-Rosa:MAI-Voice-2.1-Flash\", \"ko-KR-Grant:MAI-Voice-2.1-Flash\", \"ko-KR-Haena:MAI-Voice-2.1-Flash\", \"ko-KR-Harper:MAI-Voice-2.1-Flash\", \"ko-KR-Junho:MAI-Voice-2.1-Flash\", \"nb-NO-Grant:MAI-Voice-2.1-Flash\", \"nb-NO-Harper:MAI-Voice-2.1-Flash\", \"nl-NL-Grant:MAI-Voice-2.1-Flash\", \"nl-NL-Harper:MAI-Voice-2.1-Flash\", \"nl-NL-Sander:MAI-Voice-2.1-Flash\", \"pl-PL-Grant:MAI-Voice-2.1-Flash\", \"pl-PL-Harper:MAI-Voice-2.1-Flash\", \"pt-BR-Caio:MAI-Voice-2.1-Flash\", \"pt-BR-Grant:MAI-Voice-2.1-Flash\", \"pt-BR-Harper:MAI-Voice-2.1-Flash\", \"pt-BR-Luana:MAI-Voice-2.1-Flash\", \"pt-BR-Pedro:MAI-Voice-2.1-Flash\", \"pt-BR-Rafael:MAI-Voice-2.1-Flash\", \"pt-PT-Grant:MAI-Voice-2.1-Flash\", \"pt-PT-Harper:MAI-Voice-2.1-Flash\", \"pt-PT-Rui:MAI-Voice-2.1-Flash\", \"ro-RO-Andrei:MAI-Voice-2.1-Flash\", \"ro-RO-Elena:MAI-Voice-2.1-Flash\", \"ro-RO-Grant:MAI-Voice-2.1-Flash\", \"ro-RO-Harper:MAI-Voice-2.1-Flash\", \"ro-RO-Ioana:MAI-Voice-2.1-Flash\", \"ro-RO-Radu:MAI-Voice-2.1-Flash\", \"ru-RU-Grant:MAI-Voice-2.1-Flash\", \"ru-RU-Harper:MAI-Voice-2.1-Flash\", \"ru-RU-Lev:MAI-Voice-2.1-Flash\", \"ru-RU-Masha:MAI-Voice-2.1-Flash\", \"sv-SE-Grant:MAI-Voice-2.1-Flash\", \"sv-SE-Harper:MAI-Voice-2.1-Flash\", \"th-TH-Grant:MAI-Voice-2.1-Flash\", \"th-TH-Harper:MAI-Voice-2.1-Flash\", \"th-TH-Krit:MAI-Voice-2.1-Flash\", \"th-TH-Nattapong:MAI-Voice-2.1-Flash\", \"tr-TR-Aydin:MAI-Voice-2.1-Flash\", \"tr-TR-Elif:MAI-Voice-2.1-Flash\", \"tr-TR-Grant:MAI-Voice-2.1-Flash\", \"tr-TR-Harper:MAI-Voice-2.1-Flash\", \"vi-VN-Grant:MAI-Voice-2.1-Flash\", \"vi-VN-Harper:MAI-Voice-2.1-Flash\", \"zh-CN-Bo:MAI-Voice-2.1-Flash\", \"zh-CN-Grant:MAI-Voice-2.1-Flash\", \"zh-CN-Harper:MAI-Voice-2.1-Flash\", \"zh-CN-Lan:MAI-Voice-2.1-Flash\", \"zh-CN-Mei:MAI-Voice-2.1-Flash\", \"zh-CN-Wei:MAI-Voice-2.1-Flash\"]')\nif voice not in allowed: raise SystemExit(\"Choose an accepted voice ID from this exact model profile\")\np[\"voice\"]=voice\np[\"response_format\"]=\"mp3\"\nPath(\"request.json\").write_text(json.dumps(p,ensure_ascii=False))\nPY_REQUEST\ncurl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/audio/speech \\\n  -H \"Authorization: Bearer $AILOOT_API_KEY\" -H 'Content-Type: application/json' \\\n  --data-binary @request.json -D response-headers.txt -o speech.mp3\n",
            "label": "curl",
            "language": "bash"
          },
          {
            "code": "set -eu\n: \"${AILOOT_API_KEY:?Set your Ailoot API key}\"\ncurl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/media/assets \\\n  -H \"Authorization: Bearer $AILOOT_API_KEY\" -o media-assets.json\n",
            "label": "List actual media assets",
            "language": "bash"
          },
          {
            "code": "set -eu\n: \"${AILOOT_API_KEY:?Set your Ailoot API key}\"\n: \"${AILOOT_MEDIA_TASK_ID:?Set the actual ID returned by the response or media-library metadata}\"\nexport AILOOT_MEDIA_TASK_ID\nresource_id=$(python3 -c 'import os,urllib.parse;print(urllib.parse.quote(os.environ[\"AILOOT_MEDIA_TASK_ID\"],safe=\"\"))')\ncurl --fail-with-body --silent --show-error \"https://api.ailoot.ai/v1/media/tasks/$resource_id\" \\\n  -H \"Authorization: Bearer $AILOOT_API_KEY\" -o media-task.json\npython3 - <<'PY_RESULT'\nimport json\nfrom pathlib import Path\nprint(json.dumps(json.loads(Path(\"media-task.json\").read_text())))\nPY_RESULT\n",
            "label": "Read actual media task",
            "language": "bash"
          },
          {
            "code": "set -eu\n: \"${AILOOT_API_KEY:?Set your Ailoot API key}\"\n: \"${AILOOT_ASSET_ID:?Set the actual ID returned by the response or media-library metadata}\"\nexport AILOOT_ASSET_ID\nresource_id=$(python3 -c 'import os,urllib.parse;print(urllib.parse.quote(os.environ[\"AILOOT_ASSET_ID\"],safe=\"\"))')\ncurl --fail-with-body --silent --show-error \"https://api.ailoot.ai/v1/media/assets/$resource_id\" \\\n  -H \"Authorization: Bearer $AILOOT_API_KEY\" -o media-asset.json\npython3 - <<'PY_RESULT'\nimport json\nfrom pathlib import Path\nprint(json.dumps(json.loads(Path(\"media-asset.json\").read_text())))\nPY_RESULT\n",
            "label": "Read actual asset metadata",
            "language": "bash"
          }
        ],
        "family": "openai",
        "fast_multiplier": null,
        "flex_multiplier": null,
        "fmt": "speech",
        "hints": [
          "Select exact voice from this model profile.",
          "Input characters and audio seconds are different meters."
        ],
        "http": "POST",
        "in": null,
        "input": [
          "text"
        ],
        "label": "Озвучка текста",
        "max_out": null,
        "max_reasoning_effort_multiplier": null,
        "method_aliases": [],
        "out": null,
        "output": [
          "audio"
        ],
        "path": "/v1/audio/speech",
        "price_conditions": [
          {
            "label": "Fast mode",
            "value": "Not specified",
            "when": "When fast mode is selected"
          },
          {
            "label": "Flex mode",
            "value": "Not specified",
            "when": "When flex mode is selected"
          },
          {
            "label": "Maximum reasoning effort",
            "value": "Not specified",
            "when": "When maximum reasoning effort uses the default adjustment"
          }
        ],
        "pricing": {
          "billing_mode": "per_request",
          "image_input_price": null,
          "image_output_price": null,
          "per_request_price": null,
          "unit_prices": {
            "audio_input_character": 3e-05
          }
        },
        "pricing_profiles": [
          {
            "dimensions": {
              "regime": "base"
            },
            "label": "Base token rates",
            "units": [
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": true,
                "estimate_only": false,
                "key": "input_price",
                "label": "Input tokens",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "input_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": false,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "input_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": true,
                "estimate_only": false,
                "key": "output_price",
                "label": "Output tokens",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "output_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": false,
                "rate_role": "typed_native_retail_rate",
                "side": "out",
                "unit": "output_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": true,
                "estimate_only": false,
                "key": "cache_read_price",
                "label": "Cache read",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "cached_input_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": false,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "cached_input_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": true,
                "estimate_only": false,
                "key": "cache_write_price",
                "label": "Cache write",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "generic_cache_creation_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": false,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "generic_cache_creation_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": true,
                "estimate_only": false,
                "key": "cache_write_1h_price",
                "label": "Cache write, 1 hour",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "one_hour_cache_creation_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": false,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "one_hour_cache_creation_token"
              }
            ]
          },
          {
            "dimensions": {
              "quantity_meter": "utf8.RuneCountInString(validUTF8): one Han codepoint=1; no Han weighting",
              "quoted_unit": "per 1000 input character"
            },
            "label": "Ultra",
            "units": [
              {
                "amount": "0.03000",
                "amount_unit": "usd_per_1000_characters",
                "billing_input": true,
                "estimate_only": false,
                "key": "audio_input_character",
                "label": "input character",
                "native_amount_usd_per_unit": "0.00003",
                "native_quantity": 1,
                "public_unit_label": "per 1000 input character",
                "quantity": "1000",
                "quantity_is_estimate": false,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "input_character"
              }
            ]
          }
        ],
        "request_model_id": "microsoft/mai-voice-2.1-flash",
        "route_label": "Ultra",
        "status_reads": [
          "GET /v1/media/tasks/{task_id}",
          "GET /v1/media/assets/{asset_id}/content"
        ],
        "tiers": [],
        "units": [
          {
            "amount": null,
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": true,
            "estimate_only": false,
            "key": "input_price",
            "label": "Input tokens",
            "native_amount_usd_per_unit": null,
            "native_quantity": 1,
            "native_unit": "input_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": false,
            "rate_role": "typed_native_retail_rate",
            "side": "in",
            "unit": "input_token"
          },
          {
            "amount": null,
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": true,
            "estimate_only": false,
            "key": "output_price",
            "label": "Output tokens",
            "native_amount_usd_per_unit": null,
            "native_quantity": 1,
            "native_unit": "output_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": false,
            "rate_role": "typed_native_retail_rate",
            "side": "out",
            "unit": "output_token"
          },
          {
            "amount": null,
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": true,
            "estimate_only": false,
            "key": "cache_read_price",
            "label": "Cache read",
            "native_amount_usd_per_unit": null,
            "native_quantity": 1,
            "native_unit": "cached_input_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": false,
            "rate_role": "typed_native_retail_rate",
            "side": "in",
            "unit": "cached_input_token"
          },
          {
            "amount": null,
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": true,
            "estimate_only": false,
            "key": "cache_write_price",
            "label": "Cache write",
            "native_amount_usd_per_unit": null,
            "native_quantity": 1,
            "native_unit": "generic_cache_creation_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": false,
            "rate_role": "typed_native_retail_rate",
            "side": "in",
            "unit": "generic_cache_creation_token"
          },
          {
            "amount": null,
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": true,
            "estimate_only": false,
            "key": "cache_write_1h_price",
            "label": "Cache write, 1 hour",
            "native_amount_usd_per_unit": null,
            "native_quantity": 1,
            "native_unit": "one_hour_cache_creation_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": false,
            "rate_role": "typed_native_retail_rate",
            "side": "in",
            "unit": "one_hour_cache_creation_token"
          },
          {
            "amount": "0.03000",
            "amount_unit": "usd_per_1000_characters",
            "billing_input": true,
            "estimate_only": false,
            "key": "audio_input_character",
            "label": "input character",
            "native_amount_usd_per_unit": "0.00003",
            "native_quantity": 1,
            "public_unit_label": "per 1000 input character",
            "quantity": "1000",
            "quantity_is_estimate": false,
            "rate_role": "typed_native_retail_rate",
            "side": "in",
            "unit": "input_character"
          }
        ]
      }
    }
  ],
  "model_id": "microsoft/mai-voice-2.1-flash",
  "nativeProvenance": {
    "input_facts_canonical_sha256": "458f357e1aef01dd87c33bcdb4c6c0914b0b390428b79567aacc1918c2422eca",
    "input_html_sha256": "8f2c6ae149876d4ed48578437aab46a9a35304e173773a5f201b32647bd1fb4e",
    "private_audit_sha256": "7df1baae674b4414ac84443b193ed0ad8b2c7420a6201946a7733b1bb67cccdb",
    "role": "historical-normalized-input-audit-hashes",
    "schema": "ailoot-native-model-provenance-v2"
  },
  "page": {
    "canonical": "https://ailoot.ai/models/fi/microsoft-mai-voice-2-1-flash/",
    "description": "Microsoft AI:n MAI-Voice-2.1-Flash generoi ilmaisullista puhetta 23 kielellä vuorovaikutteisiin äänisovelluksiin. Se tukee suoratoistoa, useita puhujia ja lausetason esitysohjausta sekä kuratoitua äänikirjastoa.",
    "locale": "fi",
    "md_url": "https://ailoot.ai/models/fi/microsoft-mai-voice-2-1-flash/index.md",
    "title": "Microsoft AI: MAI-Voice-2.1-Flash — Ailoot",
    "url": "https://ailoot.ai/models/fi/microsoft-mai-voice-2-1-flash/"
  },
  "rawModel": {
    "about": "MAI-Voice-2.1-Flash on Microsoft AI:n kehotteilla ohjattava tekstistä puheeksi -malli nopeasti reagoivaan puhuttuun vuorovaikutukseen. Valmistaja tarjoaa sitä ääniavustajille, asiakastukikeskusteluihin ja puhelinvalikoihin. Se generoi luontevaa, ilmaisullista puhetta kahdellakymmenelläkolmella kielellä ja mahdollistaa sävyn sekä esityksen ohjauksen. Flash on suoraan vasteeseen suunnattu versio; erikseen nimetty MAI-Voice-2.1 asettaa etusijalle yksityiskohtaisen ilmaisun ja uskollisuuden pidemmässä sisällössä.\n\n### Teksti, puhuja ja kieli\n\nSyöte on puhuttava puheteksti sekä valittu ääni ja valinnaiset SSML-ilmaisuohjeet. Hallittu äänivalikoima erottaa puhujan, kielialueen ja malliversion. Harper ja Grant ovat esimerkkejä nimetyistä puhujista, joilla on kielikohtaiset merkinnät. Käytä tarkoitettua kohdekielistä tekstiä ja valitse sopiva kielialue; valmisteltu englanninkielinen tervehdys ja espanjankielinen selitys ovat erillisiä puhuttuja katkelmia omine sanamuotoineen.\n\nMallikortti dokumentoi yhtenäisen ääni-identiteetin tuetuilla kielillä ja useita puhujia vuoropuheluun. Tämä voi tukea sovellusta, joka tarvitsee yhden tunnistettavan kertojan lokalisoituihin ohjeisiin tai lyhyen vuoropuhelun erillisillä rooleilla. Anna repliikit tarkoitetuille puhujille nimenomaisesti ja pidä jako vakaana. Ääni on kyseisen käsikirjoituksen puhuttu versio eikä avoimesta kysymyksestä laadittu uusi vastaus.\n\n### Sävy ja puhetyyli\n\nMicrosoft dokumentoi tunteen ja esityksen lause- sekä vuorokohtaisen ohjauksen SSML:n avulla. Käytettävissä olevat tyylit riippuvat valitusta äänestä. Hallittu valikoima sisältää tehtävätyylejä, kuten narrator, educational ja customer_call_center, sekä tiettyjen puhujien ilmaisullisia tyylejä. Esimerkiksi Yhdysvaltain Harper-merkintä sisältää joyful- ja relieved-tyylit. Valitse äänen tukema tyyli sen sijaan, että olettaisit jokaisen puhujan hyväksyvän saman valikoiman.\n\nKäytännön tukirepliikki on: ”Voin auttaa löytämään oikean asiakirjan. Kerro sen nimi tai kuvaile aihetta.” Pidä pyyntö riittävän lyhyenä, jotta kuulija voi toimia sen mukaan, ja valitse vuorovaikutukseen sopiva rauhallinen tai rohkaiseva esitystapa. Kirjoita oppimistehtävän selitys ja seuraava kysymys erillisiksi puhutuiksi yksiköiksi. Ilmaisullisuus palvelee merkitystä, kun käsikirjoitus tekee tarkoituksen muutoksen selväksi.\n\n### Suoratoisto ja äänen toimitus\n\nFlash-mallikortti dokumentoi nimenomaisesti suoratoistotulosteen suoraan vuoropuheluun, mukaan lukien työnkulut, jotka käsittelevät kuulijan puhumista vastauksen päälle. Sovellus voi toistaa ääntä sen saapuessa ja koordinoida keskeytyksen sekä seuraavan vuoron. Näin puhutun viestin ajoitus on osa vuorovaikutusta sen sijaan, että jokainen vastaus pitäisi ensin valmistella kokonaiseksi tallenteeksi.\n\nValmistaja antaa synteesityönkulun määrittää tulostemuodon. Julkaistu esimerkki tuottaa mono-MP3-tiedoston 24 kHz:n taajuudella ja 160 kbit/s:n bittinopeudella. Tämä on yksi dokumentoitu tulostekonfiguraatio, ei kiinteä natiivimuodon rajoitus. Valitse äänen esitysmuoto, jonka aiottu toistopolku hyväksyy, ja pidä puhuja sekä puhuttu sanamuoto saatavilla tuloksen tarkistamiseen.\n\n### Valinnainen viiteäänen tila\n\nMicrosoftin mukautetun äänen tila voi jäljitellä suostumuksensa antanutta puhujaa 5–60 sekunnin viiteleikkeestä ilman hienosäätöä. Mallikortti suosittelee luontevaa keskustelunomaista esitystä maltillisella energialla, sillä viite vaikuttaa generoituun esitykseen. Tilalla on erillinen valmistajan hyväksyntä- ja tallennetun suostumuksen prosessi; valmiit kirjastoäänet muodostavat erillisen valmistelupolun.\n\nKäytä brändikertojan määrittävään viitteeseen puhdasta, edustavaa katkelmaa ja päätä, minkä esitystavan tulee siirtyä uuteen käsikirjoitukseen. Valmistele valmiilla äänellä tehtävään puheeseen varsinaiset nimet, komennot ja kohdekieliset ilmaukset, joita sovellus käyttää. Kuuntele katkelmat valitulla äänellä ja tarkista vuorojen välinen siirtymä. Hyödyllinen tulos on ilmaisullinen puhuttu vuorovaikutus, jossa on harkittu puhuja, selkeä teksti ja kuulijan toistoympäristöön sopiva ääni.",
    "alias_of": null,
    "aliases": [],
    "author": "Microsoft AI",
    "available": null,
    "canonical_model": "microsoft/mai-voice-2.1-flash",
    "capabilities": {
      "context_length": 0,
      "manufacturer_input": [
        "text"
      ],
      "manufacturer_output": [
        "speech"
      ]
    },
    "card_routes": [
      {
        "label": "Ultra",
        "rates": [
          {
            "amount": "0.03000",
            "amount_unit": "usd_per_1000_characters",
            "billing_input": true,
            "estimate_only": false,
            "key": "audio_input_character",
            "label": "input character",
            "native_amount_usd_per_unit": "0.00003",
            "native_quantity": 1,
            "public_unit_label": "per 1000 input character",
            "quantity": "1000",
            "quantity_is_estimate": false,
            "rate_role": "typed_native_retail_rate",
            "side": "in",
            "unit": "input_character"
          }
        ],
        "summary": "Konfiguraation täydet hintatiedot lisätiedoissa."
      }
    ],
    "ctx": null,
    "entity_type": "model",
    "formats": [
      "speech"
    ],
    "id": "microsoft/mai-voice-2.1-flash",
    "input": [
      "text"
    ],
    "kind": "speech",
    "max_out": null,
    "methods": [
      {
        "available": null,
        "cache_read": null,
        "cache_write": null,
        "cache_write_1h": null,
        "contract": {
          "data": {
            "all_results": "Keep the complete binary result and headers. If JSON/multiple outputs are returned, retain every data item and fetch each actual signed asset URL.",
            "errors": [
              {
                "code": null,
                "condition": "Virheelliset pakolliset kentät, aineiston esitysmuoto tai parametrin arvo",
                "http_status": 400,
                "recovery": "Korjaa ilmoitetut kentät ennen uutta luontipyyntöä.",
                "type": "invalid_request_error"
              },
              {
                "code": null,
                "condition": "Palautettu vastaus ilmoittaa, että operaatio tai tulos edellyttää tarkistusta",
                "http_status": null,
                "recovery": "Säilytä alkuperäinen palautettu operaation tai tehtävän ID, pyynnön otsakkeet ja vastaus; jatka kyseisen alkuperäisen operaation tuettuja lukutoimintoja. Älä lähetä luontipyyntöä uudelleen.",
                "type": "server_error"
              }
            ],
            "hints": [],
            "ignored_fields": [],
            "lifecycle": {
              "all_results": "Follow everyactualreturnedoutputandownedasset; no result is discardedbecauseindex0orcontent_urlalreadyexists.",
              "assets": [
                {
                  "http": "GET",
                  "path": "/v1/media/assets"
                },
                {
                  "http": "GET",
                  "path": "/v1/media/assets/{asset_id}"
                }
              ],
              "content": [
                {
                  "http": "GET",
                  "path": "/v1/media/assets/{asset_id}/content",
                  "url_source": "exact returned signed URL; never construct token"
                }
              ],
              "mode": "synchronous_result_then_owned_library",
              "operation_id_is_not_task_id": true,
              "status": [
                {
                  "http": "GET",
                  "id_source": "actual returned task_id or media library record",
                  "path": "/v1/media/tasks/{task_id}"
                }
              ],
              "unknown": "Säilytä alkuperäinen operation_id/X-Client-Request-ID täsmäytystä varten lähettämättä pyyntöä uudelleen; erillistä äänen tilakyselyreittiä ei ole."
            },
            "material_combinations": [
              {
                "content_type": "application/json",
                "mode": "text_to_speech",
                "required": [
                  "input"
                ]
              }
            ],
            "media_library": {
              "asset": {
                "fields": [
                  {
                    "description": null,
                    "name": "asset_id",
                    "type": "string"
                  },
                  {
                    "description": null,
                    "name": "task_id",
                    "type": "string"
                  },
                  {
                    "description": null,
                    "name": "output_key",
                    "type": "string"
                  },
                  {
                    "description": null,
                    "name": "family",
                    "type": "string"
                  },
                  {
                    "description": null,
                    "name": "model",
                    "type": "string"
                  },
                  {
                    "description": null,
                    "name": "method",
                    "type": "string"
                  },
                  {
                    "description": null,
                    "name": "status",
                    "type": "string"
                  },
                  {
                    "description": null,
                    "name": "content_type",
                    "type": "string"
                  },
                  {
                    "description": null,
                    "name": "sha256",
                    "type": "string"
                  },
                  {
                    "description": null,
                    "name": "size_bytes",
                    "type": "integer"
                  },
                  {
                    "description": null,
                    "name": "content_url",
                    "type": "string"
                  }
                ],
                "http": "GET",
                "id_source": "actual returned asset_id",
                "path": "/v1/media/assets/{asset_id}"
              },
              "content": {
                "http": "GET",
                "path": "/v1/media/assets/{asset_id}/content",
                "range_header_supported": true,
                "url_source": "Use exact returned signed content_url including its token; do not construct a token."
              },
              "expired_link": {
                "code": "link_expired",
                "http_status": 404,
                "recovery": "Read the asset again to obtain its refreshed signed content_url, then fetch that URL. Do not regenerate."
              },
              "list": {
                "all_pages": "Follow every returned next_cursor, then select records by their actual task_id/output_key.",
                "http": "GET",
                "output_fields": [
                  {
                    "description": null,
                    "name": "object",
                    "type": "string"
                  },
                  {
                    "description": null,
                    "name": "data",
                    "type": "asset[]"
                  },
                  {
                    "description": null,
                    "name": "next_cursor",
                    "type": "string|null"
                  }
                ],
                "parameters": [
                  {
                    "availability": "source_interface",
                    "default": null,
                    "default_known": false,
                    "enum": null,
                    "enum_known": false,
                    "name": "family",
                    "required": false,
                    "type": "string"
                  },
                  {
                    "availability": "source_interface",
                    "default": null,
                    "default_known": false,
                    "enum": null,
                    "enum_known": false,
                    "name": "cursor",
                    "required": false,
                    "type": "string"
                  },
                  {
                    "availability": "source_interface",
                    "default": 20,
                    "default_known": true,
                    "enum": null,
                    "enum_known": false,
                    "maximum": 100,
                    "minimum": 1,
                    "name": "limit",
                    "required": false,
                    "type": "integer"
                  }
                ],
                "path": "/v1/media/assets"
              },
              "revoke": {
                "http": "DELETE",
                "meaning": "Revokes/deletes the existing owned file; this is not generation cancellation.",
                "path": "/v1/media/assets/{asset_id}",
                "pending_status": "revoking",
                "success_statuses": [
                  202,
                  204
                ]
              },
              "task": {
                "http": "GET",
                "id_source": "actual returned task_id or media library record; operation_id is not task_id",
                "path": "/v1/media/tasks/{task_id}"
              }
            },
            "operation_modes": [
              "text_to_speech"
            ],
            "outputs": {
              "all_results": "Säilytä koko binääritulos ja otsakkeet. Jos palautetaan JSON tai useita tulosteita, säilytä jokainen data-alkio ja nouda jokainen resurssi sen todellisesta allekirjoitetusta URL-osoitteesta.",
              "family": "audio",
              "fields": [
                {
                  "description": null,
                  "name": "binary audio",
                  "type": "bytes"
                },
                {
                  "description": null,
                  "name": "response headers",
                  "type": "headers"
                }
              ],
              "format": "mp3",
              "http_success": 200
            },
            "parameters": [
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": [
                  "microsoft/mai-voice-2.1-flash"
                ],
                "enum_known": true,
                "name": "model",
                "required": true,
                "type": "string"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": null,
                "enum_known": false,
                "limit_known": false,
                "maximum_length": null,
                "min_length": 1,
                "name": "input",
                "required": true,
                "type": "string",
                "unit": "Unicode-merkit"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": [
                  "cs-CZ-Grant:MAI-Voice-2.1-Flash",
                  "cs-CZ-Harper:MAI-Voice-2.1-Flash",
                  "da-DK-Grant:MAI-Voice-2.1-Flash",
                  "da-DK-Harper:MAI-Voice-2.1-Flash",
                  "de-DE-Grant:MAI-Voice-2.1-Flash",
                  "de-DE-Harper:MAI-Voice-2.1-Flash",
                  "de-DE-Klaus:MAI-Voice-2.1-Flash",
                  "de-DE-Mia:MAI-Voice-2.1-Flash",
                  "en-AU-Isla:MAI-Voice-2.1-Flash",
                  "en-GB-Emily:MAI-Voice-2.1-Flash",
                  "en-GB-Harry:MAI-Voice-2.1-Flash",
                  "en-IN-Dhruv:MAI-Voice-2.1-Flash",
                  "en-IN-Priya:MAI-Voice-2.1-Flash",
                  "en-US-Ethan:MAI-Voice-2.1-Flash",
                  "en-US-Grant:MAI-Voice-2.1-Flash",
                  "en-US-Harper:MAI-Voice-2.1-Flash",
                  "en-US-Iris:MAI-Voice-2.1-Flash",
                  "en-US-Jasper:MAI-Voice-2.1-Flash",
                  "en-US-Olivia:MAI-Voice-2.1-Flash",
                  "en-US-Sage:MAI-Voice-2.1-Flash",
                  "es-ES-Marta:MAI-Voice-2.1-Flash",
                  "es-MX-Alejo:MAI-Voice-2.1-Flash",
                  "es-MX-Grant:MAI-Voice-2.1-Flash",
                  "es-MX-Harper:MAI-Voice-2.1-Flash",
                  "es-MX-Valeria:MAI-Voice-2.1-Flash",
                  "fi-FI-Grant:MAI-Voice-2.1-Flash",
                  "fi-FI-Harper:MAI-Voice-2.1-Flash",
                  "fr-FR-Grant:MAI-Voice-2.1-Flash",
                  "fr-FR-Harper:MAI-Voice-2.1-Flash",
                  "fr-FR-Marc:MAI-Voice-2.1-Flash",
                  "fr-FR-Soleil:MAI-Voice-2.1-Flash",
                  "hi-IN-Arjun:MAI-Voice-2.1-Flash",
                  "hi-IN-Dhruv:MAI-Voice-2.1-Flash",
                  "hi-IN-Grant:MAI-Voice-2.1-Flash",
                  "hi-IN-Harper:MAI-Voice-2.1-Flash",
                  "hi-IN-Kavya:MAI-Voice-2.1-Flash",
                  "hi-IN-Priya:MAI-Voice-2.1-Flash",
                  "hu-HU-Bence:MAI-Voice-2.1-Flash",
                  "hu-HU-Grant:MAI-Voice-2.1-Flash",
                  "hu-HU-Harper:MAI-Voice-2.1-Flash",
                  "hu-HU-Levente:MAI-Voice-2.1-Flash",
                  "hu-HU-Lilla:MAI-Voice-2.1-Flash",
                  "hu-HU-Reka:MAI-Voice-2.1-Flash",
                  "id-ID-Grant:MAI-Voice-2.1-Flash",
                  "id-ID-Harper:MAI-Voice-2.1-Flash",
                  "it-IT-Grant:MAI-Voice-2.1-Flash",
                  "it-IT-Harper:MAI-Voice-2.1-Flash",
                  "it-IT-Luca:MAI-Voice-2.1-Flash",
                  "it-IT-Rosa:MAI-Voice-2.1-Flash",
                  "ko-KR-Grant:MAI-Voice-2.1-Flash",
                  "ko-KR-Haena:MAI-Voice-2.1-Flash",
                  "ko-KR-Harper:MAI-Voice-2.1-Flash",
                  "ko-KR-Junho:MAI-Voice-2.1-Flash",
                  "nb-NO-Grant:MAI-Voice-2.1-Flash",
                  "nb-NO-Harper:MAI-Voice-2.1-Flash",
                  "nl-NL-Grant:MAI-Voice-2.1-Flash",
                  "nl-NL-Harper:MAI-Voice-2.1-Flash",
                  "nl-NL-Sander:MAI-Voice-2.1-Flash",
                  "pl-PL-Grant:MAI-Voice-2.1-Flash",
                  "pl-PL-Harper:MAI-Voice-2.1-Flash",
                  "pt-BR-Caio:MAI-Voice-2.1-Flash",
                  "pt-BR-Grant:MAI-Voice-2.1-Flash",
                  "pt-BR-Harper:MAI-Voice-2.1-Flash",
                  "pt-BR-Luana:MAI-Voice-2.1-Flash",
                  "pt-BR-Pedro:MAI-Voice-2.1-Flash",
                  "pt-BR-Rafael:MAI-Voice-2.1-Flash",
                  "pt-PT-Grant:MAI-Voice-2.1-Flash",
                  "pt-PT-Harper:MAI-Voice-2.1-Flash",
                  "pt-PT-Rui:MAI-Voice-2.1-Flash",
                  "ro-RO-Andrei:MAI-Voice-2.1-Flash",
                  "ro-RO-Elena:MAI-Voice-2.1-Flash",
                  "ro-RO-Grant:MAI-Voice-2.1-Flash",
                  "ro-RO-Harper:MAI-Voice-2.1-Flash",
                  "ro-RO-Ioana:MAI-Voice-2.1-Flash",
                  "ro-RO-Radu:MAI-Voice-2.1-Flash",
                  "ru-RU-Grant:MAI-Voice-2.1-Flash",
                  "ru-RU-Harper:MAI-Voice-2.1-Flash",
                  "ru-RU-Lev:MAI-Voice-2.1-Flash",
                  "ru-RU-Masha:MAI-Voice-2.1-Flash",
                  "sv-SE-Grant:MAI-Voice-2.1-Flash",
                  "sv-SE-Harper:MAI-Voice-2.1-Flash",
                  "th-TH-Grant:MAI-Voice-2.1-Flash",
                  "th-TH-Harper:MAI-Voice-2.1-Flash",
                  "th-TH-Krit:MAI-Voice-2.1-Flash",
                  "th-TH-Nattapong:MAI-Voice-2.1-Flash",
                  "tr-TR-Aydin:MAI-Voice-2.1-Flash",
                  "tr-TR-Elif:MAI-Voice-2.1-Flash",
                  "tr-TR-Grant:MAI-Voice-2.1-Flash",
                  "tr-TR-Harper:MAI-Voice-2.1-Flash",
                  "vi-VN-Grant:MAI-Voice-2.1-Flash",
                  "vi-VN-Harper:MAI-Voice-2.1-Flash",
                  "zh-CN-Bo:MAI-Voice-2.1-Flash",
                  "zh-CN-Grant:MAI-Voice-2.1-Flash",
                  "zh-CN-Harper:MAI-Voice-2.1-Flash",
                  "zh-CN-Lan:MAI-Voice-2.1-Flash",
                  "zh-CN-Mei:MAI-Voice-2.1-Flash",
                  "zh-CN-Wei:MAI-Voice-2.1-Flash"
                ],
                "enum_known": true,
                "name": "voice",
                "required": true,
                "type": "string"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": [
                  "mp3"
                ],
                "enum_known": true,
                "name": "response_format",
                "required": true,
                "type": "string"
              }
            ],
            "profile_binding": "Exact existing Ailoot model and method; interface constraints below do not assert provider qualification.",
            "unsupported": [
              "every field outside exactmodel,input,voice,response_format",
              "stream/speed/reference speech options"
            ]
          },
          "hints": [
            "Valitse juuri tämän malliprofiilin ääni.",
            "Syötemerkit ja äänisekunnit ovat eri mittareita."
          ],
          "input": {
            "content_type": "application/json",
            "input": "täsmällinen UTF-8-teksti; Unicode-merkkien määrä ilman normalisointia",
            "material_types": [
              "text"
            ],
            "max_input_characters": null,
            "other_options": false,
            "required": [
              "model",
              "input",
              "voice",
              "response_format"
            ],
            "response_format": [
              "mp3"
            ],
            "voice_ids": [
              "cs-CZ-Grant:MAI-Voice-2.1-Flash",
              "cs-CZ-Harper:MAI-Voice-2.1-Flash",
              "da-DK-Grant:MAI-Voice-2.1-Flash",
              "da-DK-Harper:MAI-Voice-2.1-Flash",
              "de-DE-Grant:MAI-Voice-2.1-Flash",
              "de-DE-Harper:MAI-Voice-2.1-Flash",
              "de-DE-Klaus:MAI-Voice-2.1-Flash",
              "de-DE-Mia:MAI-Voice-2.1-Flash",
              "en-AU-Isla:MAI-Voice-2.1-Flash",
              "en-GB-Emily:MAI-Voice-2.1-Flash",
              "en-GB-Harry:MAI-Voice-2.1-Flash",
              "en-IN-Dhruv:MAI-Voice-2.1-Flash",
              "en-IN-Priya:MAI-Voice-2.1-Flash",
              "en-US-Ethan:MAI-Voice-2.1-Flash",
              "en-US-Grant:MAI-Voice-2.1-Flash",
              "en-US-Harper:MAI-Voice-2.1-Flash",
              "en-US-Iris:MAI-Voice-2.1-Flash",
              "en-US-Jasper:MAI-Voice-2.1-Flash",
              "en-US-Olivia:MAI-Voice-2.1-Flash",
              "en-US-Sage:MAI-Voice-2.1-Flash",
              "es-ES-Marta:MAI-Voice-2.1-Flash",
              "es-MX-Alejo:MAI-Voice-2.1-Flash",
              "es-MX-Grant:MAI-Voice-2.1-Flash",
              "es-MX-Harper:MAI-Voice-2.1-Flash",
              "es-MX-Valeria:MAI-Voice-2.1-Flash",
              "fi-FI-Grant:MAI-Voice-2.1-Flash",
              "fi-FI-Harper:MAI-Voice-2.1-Flash",
              "fr-FR-Grant:MAI-Voice-2.1-Flash",
              "fr-FR-Harper:MAI-Voice-2.1-Flash",
              "fr-FR-Marc:MAI-Voice-2.1-Flash",
              "fr-FR-Soleil:MAI-Voice-2.1-Flash",
              "hi-IN-Arjun:MAI-Voice-2.1-Flash",
              "hi-IN-Dhruv:MAI-Voice-2.1-Flash",
              "hi-IN-Grant:MAI-Voice-2.1-Flash",
              "hi-IN-Harper:MAI-Voice-2.1-Flash",
              "hi-IN-Kavya:MAI-Voice-2.1-Flash",
              "hi-IN-Priya:MAI-Voice-2.1-Flash",
              "hu-HU-Bence:MAI-Voice-2.1-Flash",
              "hu-HU-Grant:MAI-Voice-2.1-Flash",
              "hu-HU-Harper:MAI-Voice-2.1-Flash",
              "hu-HU-Levente:MAI-Voice-2.1-Flash",
              "hu-HU-Lilla:MAI-Voice-2.1-Flash",
              "hu-HU-Reka:MAI-Voice-2.1-Flash",
              "id-ID-Grant:MAI-Voice-2.1-Flash",
              "id-ID-Harper:MAI-Voice-2.1-Flash",
              "it-IT-Grant:MAI-Voice-2.1-Flash",
              "it-IT-Harper:MAI-Voice-2.1-Flash",
              "it-IT-Luca:MAI-Voice-2.1-Flash",
              "it-IT-Rosa:MAI-Voice-2.1-Flash",
              "ko-KR-Grant:MAI-Voice-2.1-Flash",
              "ko-KR-Haena:MAI-Voice-2.1-Flash",
              "ko-KR-Harper:MAI-Voice-2.1-Flash",
              "ko-KR-Junho:MAI-Voice-2.1-Flash",
              "nb-NO-Grant:MAI-Voice-2.1-Flash",
              "nb-NO-Harper:MAI-Voice-2.1-Flash",
              "nl-NL-Grant:MAI-Voice-2.1-Flash",
              "nl-NL-Harper:MAI-Voice-2.1-Flash",
              "nl-NL-Sander:MAI-Voice-2.1-Flash",
              "pl-PL-Grant:MAI-Voice-2.1-Flash",
              "pl-PL-Harper:MAI-Voice-2.1-Flash",
              "pt-BR-Caio:MAI-Voice-2.1-Flash",
              "pt-BR-Grant:MAI-Voice-2.1-Flash",
              "pt-BR-Harper:MAI-Voice-2.1-Flash",
              "pt-BR-Luana:MAI-Voice-2.1-Flash",
              "pt-BR-Pedro:MAI-Voice-2.1-Flash",
              "pt-BR-Rafael:MAI-Voice-2.1-Flash",
              "pt-PT-Grant:MAI-Voice-2.1-Flash",
              "pt-PT-Harper:MAI-Voice-2.1-Flash",
              "pt-PT-Rui:MAI-Voice-2.1-Flash",
              "ro-RO-Andrei:MAI-Voice-2.1-Flash",
              "ro-RO-Elena:MAI-Voice-2.1-Flash",
              "ro-RO-Grant:MAI-Voice-2.1-Flash",
              "ro-RO-Harper:MAI-Voice-2.1-Flash",
              "ro-RO-Ioana:MAI-Voice-2.1-Flash",
              "ro-RO-Radu:MAI-Voice-2.1-Flash",
              "ru-RU-Grant:MAI-Voice-2.1-Flash",
              "ru-RU-Harper:MAI-Voice-2.1-Flash",
              "ru-RU-Lev:MAI-Voice-2.1-Flash",
              "ru-RU-Masha:MAI-Voice-2.1-Flash",
              "sv-SE-Grant:MAI-Voice-2.1-Flash",
              "sv-SE-Harper:MAI-Voice-2.1-Flash",
              "th-TH-Grant:MAI-Voice-2.1-Flash",
              "th-TH-Harper:MAI-Voice-2.1-Flash",
              "th-TH-Krit:MAI-Voice-2.1-Flash",
              "th-TH-Nattapong:MAI-Voice-2.1-Flash",
              "tr-TR-Aydin:MAI-Voice-2.1-Flash",
              "tr-TR-Elif:MAI-Voice-2.1-Flash",
              "tr-TR-Grant:MAI-Voice-2.1-Flash",
              "tr-TR-Harper:MAI-Voice-2.1-Flash",
              "vi-VN-Grant:MAI-Voice-2.1-Flash",
              "vi-VN-Harper:MAI-Voice-2.1-Flash",
              "zh-CN-Bo:MAI-Voice-2.1-Flash",
              "zh-CN-Grant:MAI-Voice-2.1-Flash",
              "zh-CN-Harper:MAI-Voice-2.1-Flash",
              "zh-CN-Lan:MAI-Voice-2.1-Flash",
              "zh-CN-Mei:MAI-Voice-2.1-Flash",
              "zh-CN-Wei:MAI-Voice-2.1-Flash"
            ]
          },
          "lifecycle": {
            "assets": [
              {
                "http": "GET",
                "path": "/v1/media/assets"
              },
              {
                "http": "GET",
                "path": "/v1/media/assets/{asset_id}"
              }
            ],
            "content": [
              {
                "http": "GET",
                "path": "/v1/media/assets/{asset_id}/content",
                "url_source": "exact returned signed URL; never construct token"
              }
            ],
            "mode": "synchronous_result_then_owned_library",
            "operation_id_is_not_task_id": true,
            "status": [
              {
                "http": "GET",
                "id_source": "todellisuudessa palautettu task_id tai mediakirjaston tietue",
                "path": "/v1/media/tasks/{task_id}"
              }
            ],
            "unknown": "Retain original operation_id/X-Client-Request-ID for reconciliation without resubmission; no dedicated audio poll route."
          },
          "manufacturer_capability": null,
          "method": {
            "http": "POST",
            "path": "/v1/audio/speech"
          },
          "method_aliases": [],
          "operation_modes": [
            "text_to_speech"
          ],
          "output": {
            "family": "audio",
            "format": "mp3",
            "http_success": 200,
            "response": "full binary MP3 plus response headers",
            "result": "complete playable owned MP3"
          }
        },
        "ctx": null,
        "declared_pricing_profiles": [
          {
            "dimensions": {
              "regime": "base"
            },
            "label": "Base token rates",
            "units": [
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": true,
                "estimate_only": false,
                "key": "input_price",
                "label": "Input tokens",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "input_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": false,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "input_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": true,
                "estimate_only": false,
                "key": "output_price",
                "label": "Output tokens",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "output_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": false,
                "rate_role": "typed_native_retail_rate",
                "side": "out",
                "unit": "output_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": true,
                "estimate_only": false,
                "key": "cache_read_price",
                "label": "Cache read",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "cached_input_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": false,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "cached_input_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": true,
                "estimate_only": false,
                "key": "cache_write_price",
                "label": "Cache write",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "generic_cache_creation_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": false,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "generic_cache_creation_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": true,
                "estimate_only": false,
                "key": "cache_write_1h_price",
                "label": "Cache write, 1 hour",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "one_hour_cache_creation_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": false,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "one_hour_cache_creation_token"
              }
            ]
          },
          {
            "dimensions": {
              "quantity_meter": "utf8.RuneCountInString(validUTF8): one Han codepoint=1; no Han weighting",
              "quoted_unit": "per 1000 input character"
            },
            "label": "Ultra",
            "units": [
              {
                "amount": "0.03000",
                "amount_unit": "usd_per_1000_characters",
                "billing_input": true,
                "estimate_only": false,
                "key": "audio_input_character",
                "label": "input character",
                "native_amount_usd_per_unit": "0.00003",
                "native_quantity": 1,
                "public_unit_label": "per 1000 input character",
                "quantity": "1000",
                "quantity_is_estimate": false,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "input_character"
              }
            ]
          }
        ],
        "declared_tariff_references": [
          {
            "client_selectable": false,
            "key": "768d1dc9b9da20eb0942",
            "label": "Microsoft AI: MAI-Voice-2.1-Flash",
            "profiles": [
              {
                "basis": "",
                "dimensions": {
                  "conditions": "Oletuskokoonpano"
                },
                "label": "Microsoft AI: MAI-Voice-2.1-Flash · Oletusasetukset",
                "units": [
                  {
                    "amount": "0.000030",
                    "amount_unit": "usd_per_exact_physical_unit",
                    "billing_input": false,
                    "key": "a7f384d81db64c9b1e8c0855",
                    "label": "Input characters",
                    "public_unit_label": "per input character",
                    "quantity": "1",
                    "rate_role": "declared_tariff_rate",
                    "side": "in",
                    "unit": "input_character"
                  }
                ]
              }
            ]
          }
        ],
        "examples": [
          {
            "code": "set -eu\n: \"${AILOOT_API_KEY:?Set your Ailoot API key}\"\n: \"${AILOOT_VOICE_ID:?Choose an accepted voice ID from this exact model profile}\"\nexport AILOOT_VOICE_ID\npython3 - <<'PY_REQUEST'\nimport json,os\nfrom pathlib import Path\np=json.loads('{\"model\": \"microsoft/mai-voice-2.1-flash\", \"input\": \"Good afternoon! This is a short voice take.\"}')\nvoice=os.environ[\"AILOOT_VOICE_ID\"]\nallowed=json.loads('[\"cs-CZ-Grant:MAI-Voice-2.1-Flash\", \"cs-CZ-Harper:MAI-Voice-2.1-Flash\", \"da-DK-Grant:MAI-Voice-2.1-Flash\", \"da-DK-Harper:MAI-Voice-2.1-Flash\", \"de-DE-Grant:MAI-Voice-2.1-Flash\", \"de-DE-Harper:MAI-Voice-2.1-Flash\", \"de-DE-Klaus:MAI-Voice-2.1-Flash\", \"de-DE-Mia:MAI-Voice-2.1-Flash\", \"en-AU-Isla:MAI-Voice-2.1-Flash\", \"en-GB-Emily:MAI-Voice-2.1-Flash\", \"en-GB-Harry:MAI-Voice-2.1-Flash\", \"en-IN-Dhruv:MAI-Voice-2.1-Flash\", \"en-IN-Priya:MAI-Voice-2.1-Flash\", \"en-US-Ethan:MAI-Voice-2.1-Flash\", \"en-US-Grant:MAI-Voice-2.1-Flash\", \"en-US-Harper:MAI-Voice-2.1-Flash\", \"en-US-Iris:MAI-Voice-2.1-Flash\", \"en-US-Jasper:MAI-Voice-2.1-Flash\", \"en-US-Olivia:MAI-Voice-2.1-Flash\", \"en-US-Sage:MAI-Voice-2.1-Flash\", \"es-ES-Marta:MAI-Voice-2.1-Flash\", \"es-MX-Alejo:MAI-Voice-2.1-Flash\", \"es-MX-Grant:MAI-Voice-2.1-Flash\", \"es-MX-Harper:MAI-Voice-2.1-Flash\", \"es-MX-Valeria:MAI-Voice-2.1-Flash\", \"fi-FI-Grant:MAI-Voice-2.1-Flash\", \"fi-FI-Harper:MAI-Voice-2.1-Flash\", \"fr-FR-Grant:MAI-Voice-2.1-Flash\", \"fr-FR-Harper:MAI-Voice-2.1-Flash\", \"fr-FR-Marc:MAI-Voice-2.1-Flash\", \"fr-FR-Soleil:MAI-Voice-2.1-Flash\", \"hi-IN-Arjun:MAI-Voice-2.1-Flash\", \"hi-IN-Dhruv:MAI-Voice-2.1-Flash\", \"hi-IN-Grant:MAI-Voice-2.1-Flash\", \"hi-IN-Harper:MAI-Voice-2.1-Flash\", \"hi-IN-Kavya:MAI-Voice-2.1-Flash\", \"hi-IN-Priya:MAI-Voice-2.1-Flash\", \"hu-HU-Bence:MAI-Voice-2.1-Flash\", \"hu-HU-Grant:MAI-Voice-2.1-Flash\", \"hu-HU-Harper:MAI-Voice-2.1-Flash\", \"hu-HU-Levente:MAI-Voice-2.1-Flash\", \"hu-HU-Lilla:MAI-Voice-2.1-Flash\", \"hu-HU-Reka:MAI-Voice-2.1-Flash\", \"id-ID-Grant:MAI-Voice-2.1-Flash\", \"id-ID-Harper:MAI-Voice-2.1-Flash\", \"it-IT-Grant:MAI-Voice-2.1-Flash\", \"it-IT-Harper:MAI-Voice-2.1-Flash\", \"it-IT-Luca:MAI-Voice-2.1-Flash\", \"it-IT-Rosa:MAI-Voice-2.1-Flash\", \"ko-KR-Grant:MAI-Voice-2.1-Flash\", \"ko-KR-Haena:MAI-Voice-2.1-Flash\", \"ko-KR-Harper:MAI-Voice-2.1-Flash\", \"ko-KR-Junho:MAI-Voice-2.1-Flash\", \"nb-NO-Grant:MAI-Voice-2.1-Flash\", \"nb-NO-Harper:MAI-Voice-2.1-Flash\", \"nl-NL-Grant:MAI-Voice-2.1-Flash\", \"nl-NL-Harper:MAI-Voice-2.1-Flash\", \"nl-NL-Sander:MAI-Voice-2.1-Flash\", \"pl-PL-Grant:MAI-Voice-2.1-Flash\", \"pl-PL-Harper:MAI-Voice-2.1-Flash\", \"pt-BR-Caio:MAI-Voice-2.1-Flash\", \"pt-BR-Grant:MAI-Voice-2.1-Flash\", \"pt-BR-Harper:MAI-Voice-2.1-Flash\", \"pt-BR-Luana:MAI-Voice-2.1-Flash\", \"pt-BR-Pedro:MAI-Voice-2.1-Flash\", \"pt-BR-Rafael:MAI-Voice-2.1-Flash\", \"pt-PT-Grant:MAI-Voice-2.1-Flash\", \"pt-PT-Harper:MAI-Voice-2.1-Flash\", \"pt-PT-Rui:MAI-Voice-2.1-Flash\", \"ro-RO-Andrei:MAI-Voice-2.1-Flash\", \"ro-RO-Elena:MAI-Voice-2.1-Flash\", \"ro-RO-Grant:MAI-Voice-2.1-Flash\", \"ro-RO-Harper:MAI-Voice-2.1-Flash\", \"ro-RO-Ioana:MAI-Voice-2.1-Flash\", \"ro-RO-Radu:MAI-Voice-2.1-Flash\", \"ru-RU-Grant:MAI-Voice-2.1-Flash\", \"ru-RU-Harper:MAI-Voice-2.1-Flash\", \"ru-RU-Lev:MAI-Voice-2.1-Flash\", \"ru-RU-Masha:MAI-Voice-2.1-Flash\", \"sv-SE-Grant:MAI-Voice-2.1-Flash\", \"sv-SE-Harper:MAI-Voice-2.1-Flash\", \"th-TH-Grant:MAI-Voice-2.1-Flash\", \"th-TH-Harper:MAI-Voice-2.1-Flash\", \"th-TH-Krit:MAI-Voice-2.1-Flash\", \"th-TH-Nattapong:MAI-Voice-2.1-Flash\", \"tr-TR-Aydin:MAI-Voice-2.1-Flash\", \"tr-TR-Elif:MAI-Voice-2.1-Flash\", \"tr-TR-Grant:MAI-Voice-2.1-Flash\", \"tr-TR-Harper:MAI-Voice-2.1-Flash\", \"vi-VN-Grant:MAI-Voice-2.1-Flash\", \"vi-VN-Harper:MAI-Voice-2.1-Flash\", \"zh-CN-Bo:MAI-Voice-2.1-Flash\", \"zh-CN-Grant:MAI-Voice-2.1-Flash\", \"zh-CN-Harper:MAI-Voice-2.1-Flash\", \"zh-CN-Lan:MAI-Voice-2.1-Flash\", \"zh-CN-Mei:MAI-Voice-2.1-Flash\", \"zh-CN-Wei:MAI-Voice-2.1-Flash\"]')\nif voice not in allowed: raise SystemExit(\"Choose an accepted voice ID from this exact model profile\")\np[\"voice\"]=voice\np[\"response_format\"]=\"mp3\"\nPath(\"request.json\").write_text(json.dumps(p,ensure_ascii=False))\nPY_REQUEST\ncurl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/audio/speech \\\n  -H \"Authorization: Bearer $AILOOT_API_KEY\" -H 'Content-Type: application/json' \\\n  --data-binary @request.json -D response-headers.txt -o speech.mp3\n",
            "label": "curl",
            "language": "bash"
          },
          {
            "code": "set -eu\n: \"${AILOOT_API_KEY:?Set your Ailoot API key}\"\ncurl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/media/assets \\\n  -H \"Authorization: Bearer $AILOOT_API_KEY\" -o media-assets.json\n",
            "label": "List actual media assets",
            "language": "bash"
          },
          {
            "code": "set -eu\n: \"${AILOOT_API_KEY:?Set your Ailoot API key}\"\n: \"${AILOOT_MEDIA_TASK_ID:?Set the actual ID returned by the response or media-library metadata}\"\nexport AILOOT_MEDIA_TASK_ID\nresource_id=$(python3 -c 'import os,urllib.parse;print(urllib.parse.quote(os.environ[\"AILOOT_MEDIA_TASK_ID\"],safe=\"\"))')\ncurl --fail-with-body --silent --show-error \"https://api.ailoot.ai/v1/media/tasks/$resource_id\" \\\n  -H \"Authorization: Bearer $AILOOT_API_KEY\" -o media-task.json\npython3 - <<'PY_RESULT'\nimport json\nfrom pathlib import Path\nprint(json.dumps(json.loads(Path(\"media-task.json\").read_text())))\nPY_RESULT\n",
            "label": "Read actual media task",
            "language": "bash"
          },
          {
            "code": "set -eu\n: \"${AILOOT_API_KEY:?Set your Ailoot API key}\"\n: \"${AILOOT_ASSET_ID:?Set the actual ID returned by the response or media-library metadata}\"\nexport AILOOT_ASSET_ID\nresource_id=$(python3 -c 'import os,urllib.parse;print(urllib.parse.quote(os.environ[\"AILOOT_ASSET_ID\"],safe=\"\"))')\ncurl --fail-with-body --silent --show-error \"https://api.ailoot.ai/v1/media/assets/$resource_id\" \\\n  -H \"Authorization: Bearer $AILOOT_API_KEY\" -o media-asset.json\npython3 - <<'PY_RESULT'\nimport json\nfrom pathlib import Path\nprint(json.dumps(json.loads(Path(\"media-asset.json\").read_text())))\nPY_RESULT\n",
            "label": "Read actual asset metadata",
            "language": "bash"
          }
        ],
        "family": "openai",
        "fast_multiplier": null,
        "flex_multiplier": null,
        "fmt": "speech",
        "hints": [
          "Select exact voice from this model profile.",
          "Input characters and audio seconds are different meters."
        ],
        "http": "POST",
        "in": null,
        "input": [
          "text"
        ],
        "label": "Озвучка текста",
        "max_out": null,
        "max_reasoning_effort_multiplier": null,
        "method_aliases": [],
        "out": null,
        "output": [
          "audio"
        ],
        "path": "/v1/audio/speech",
        "price_conditions": [
          {
            "label": "Fast mode",
            "value": "Not specified",
            "when": "When fast mode is selected"
          },
          {
            "label": "Flex mode",
            "value": "Not specified",
            "when": "When flex mode is selected"
          },
          {
            "label": "Maximum reasoning effort",
            "value": "Not specified",
            "when": "When maximum reasoning effort uses the default adjustment"
          }
        ],
        "pricing": {
          "billing_mode": "per_request",
          "image_input_price": null,
          "image_output_price": null,
          "per_request_price": null,
          "unit_prices": {
            "audio_input_character": 3e-05
          }
        },
        "pricing_profiles": [
          {
            "dimensions": {
              "regime": "base"
            },
            "label": "Base token rates",
            "units": [
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": true,
                "estimate_only": false,
                "key": "input_price",
                "label": "Input tokens",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "input_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": false,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "input_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": true,
                "estimate_only": false,
                "key": "output_price",
                "label": "Output tokens",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "output_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": false,
                "rate_role": "typed_native_retail_rate",
                "side": "out",
                "unit": "output_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": true,
                "estimate_only": false,
                "key": "cache_read_price",
                "label": "Cache read",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "cached_input_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": false,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "cached_input_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": true,
                "estimate_only": false,
                "key": "cache_write_price",
                "label": "Cache write",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "generic_cache_creation_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": false,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "generic_cache_creation_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": true,
                "estimate_only": false,
                "key": "cache_write_1h_price",
                "label": "Cache write, 1 hour",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "one_hour_cache_creation_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": false,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "one_hour_cache_creation_token"
              }
            ]
          },
          {
            "dimensions": {
              "quantity_meter": "utf8.RuneCountInString(validUTF8): one Han codepoint=1; no Han weighting",
              "quoted_unit": "per 1000 input character"
            },
            "label": "Ultra",
            "units": [
              {
                "amount": "0.03000",
                "amount_unit": "usd_per_1000_characters",
                "billing_input": true,
                "estimate_only": false,
                "key": "audio_input_character",
                "label": "input character",
                "native_amount_usd_per_unit": "0.00003",
                "native_quantity": 1,
                "public_unit_label": "per 1000 input character",
                "quantity": "1000",
                "quantity_is_estimate": false,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "input_character"
              }
            ]
          }
        ],
        "request_model_id": "microsoft/mai-voice-2.1-flash",
        "route_label": "Ultra",
        "status_reads": [
          "GET /v1/media/tasks/{task_id}",
          "GET /v1/media/assets/{asset_id}/content"
        ],
        "tiers": [],
        "units": [
          {
            "amount": null,
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": true,
            "estimate_only": false,
            "key": "input_price",
            "label": "Input tokens",
            "native_amount_usd_per_unit": null,
            "native_quantity": 1,
            "native_unit": "input_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": false,
            "rate_role": "typed_native_retail_rate",
            "side": "in",
            "unit": "input_token"
          },
          {
            "amount": null,
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": true,
            "estimate_only": false,
            "key": "output_price",
            "label": "Output tokens",
            "native_amount_usd_per_unit": null,
            "native_quantity": 1,
            "native_unit": "output_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": false,
            "rate_role": "typed_native_retail_rate",
            "side": "out",
            "unit": "output_token"
          },
          {
            "amount": null,
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": true,
            "estimate_only": false,
            "key": "cache_read_price",
            "label": "Cache read",
            "native_amount_usd_per_unit": null,
            "native_quantity": 1,
            "native_unit": "cached_input_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": false,
            "rate_role": "typed_native_retail_rate",
            "side": "in",
            "unit": "cached_input_token"
          },
          {
            "amount": null,
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": true,
            "estimate_only": false,
            "key": "cache_write_price",
            "label": "Cache write",
            "native_amount_usd_per_unit": null,
            "native_quantity": 1,
            "native_unit": "generic_cache_creation_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": false,
            "rate_role": "typed_native_retail_rate",
            "side": "in",
            "unit": "generic_cache_creation_token"
          },
          {
            "amount": null,
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": true,
            "estimate_only": false,
            "key": "cache_write_1h_price",
            "label": "Cache write, 1 hour",
            "native_amount_usd_per_unit": null,
            "native_quantity": 1,
            "native_unit": "one_hour_cache_creation_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": false,
            "rate_role": "typed_native_retail_rate",
            "side": "in",
            "unit": "one_hour_cache_creation_token"
          },
          {
            "amount": "0.03000",
            "amount_unit": "usd_per_1000_characters",
            "billing_input": true,
            "estimate_only": false,
            "key": "audio_input_character",
            "label": "input character",
            "native_amount_usd_per_unit": "0.00003",
            "native_quantity": 1,
            "public_unit_label": "per 1000 input character",
            "quantity": "1000",
            "quantity_is_estimate": false,
            "rate_role": "typed_native_retail_rate",
            "side": "in",
            "unit": "input_character"
          }
        ]
      }
    ],
    "model_aliases": [
      {
        "canonical_model_id": "microsoft/mai-voice-2.1-flash",
        "request_model_id": "microsoft/mai-voice-2.1-flash",
        "route_label": "Ultra"
      }
    ],
    "name": "Microsoft AI: MAI-Voice-2.1-Flash",
    "price": {
      "in": null,
      "in_label": null,
      "out": null,
      "out_label": null,
      "sort_in": null,
      "sort_out": null,
      "varies": true
    },
    "pricing_profiles": [
      {
        "applicability": {
          "client_selectable": false,
          "native_profile_selection_pending": true,
          "scope": "hosted_reference"
        },
        "dimensions": {
          "variant": null
        },
        "label": "Ultra",
        "units": [
          {
            "amount": "0.000030",
            "amount_unit": "usd_per_input_character",
            "conditions": {
              "variant": null
            },
            "key": "pricing.prompt",
            "label": "prompt",
            "profile_index": 0,
            "quantity": "1",
            "rate_role": "binding_component_rate",
            "side": "in",
            "unit": "input_character"
          },
          {
            "amount": "0",
            "amount_unit": "usd_per_not_separately_charged_output",
            "conditions": {
              "variant": null
            },
            "key": "pricing.completion",
            "label": "completion",
            "profile_index": 0,
            "quantity": "1",
            "rate_role": "binding_component_rate",
            "side": "out",
            "unit": "not_separately_charged_output"
          }
        ]
      }
    ],
    "public_id": "microsoft/mai-voice-2.1-flash",
    "short": "Microsoft AI:n MAI-Voice-2.1-Flash generoi ilmaisullista puhetta 23 kielellä vuorovaikutteisiin äänisovelluksiin. Se tukee suoratoistoa, useita puhujia ja lausetason esitysohjausta sekä kuratoitua äänikirjastoa."
  },
  "renderer_schema": {
    "method_order": "Original DTO methods order; every exact route/format/path/caller survives.",
    "prices": "Original public DTO fields and original native display HTML; no flattened or normalized offers."
  },
  "representation": "exact-public-dto-and-native-renderer-html",
  "representationNotes": {
    "current_reference": {
      "about_json_pointer": "/aboutHtml",
      "methods": [
        {
          "contract_json_pointer": "/methods/0/rawMethod/contract",
          "html_json_pointer": "/methods/0/html",
          "method_ordinal": 0
        }
      ],
      "role": "current-semantic-reference"
    },
    "raw_input": {
      "examples_role": "historical-input-not-current-ready-examples",
      "json_pointers": [
        "/rawModel",
        "/methods/0/rawMethod"
      ],
      "role": "historical-owner-input"
    },
    "schema": "ailoot-native-model-representations-v1"
  },
  "schema": "ailoot-static-model-facts-v1",
  "schema_version": 1,
  "shortText": "Microsoft AI:n MAI-Voice-2.1-Flash generoi ilmaisullista puhetta 23 kielellä vuorovaikutteisiin äänisovelluksiin. Se tukee suoratoistoa, useita puhujia ja lausetason esitysohjausta sekä kuratoitua äänikirjastoa.",
  "source": {
    "audit_sha256": "2e00086bcbfc28e64d0cebe97aa47c17d8d5618963027f8ffb9dc6123d7d25b1",
    "bridge_map_sha256": "1125275768b9636fc8461bc7da5061239a81ddfe508e2557843ca42c58ab0036",
    "raw_model_json_sha256": "6c9b68e6366bc457851f4f7b9a4fbba9a50ab1e4bc80714612ff4d6cce8fd121",
    "renderer_sha256": "303a59603e2bc29ba8fda690e95fd32cec68de223d92e26054a88babff801dd7"
  },
  "sourceRevision": "181a6d24eadf7fcc896c15c28408547d272e66d03501ab890d5b5fe6b5541b2c"
}
