{
  "aboutHtml": "<p>MAI-Voice-2.1 on Microsoft AI:n kehotteilla ohjattava tekstistä puheeksi -malli työhön, jossa ilmaisullinen esitys ja äänen uskollisuus ovat tärkeitä. Mallikortti kattaa kaksikymmentäkolme kieltä ja kaksikymmentäkuusi kielialuevarianttia sekä luontevan intonaation, rytmin ja tunnesävyt. Valmistaja nimeää keskeisiksi käyttökohteiksi äänikirjat, mediakerronnan, sisällöntuotannon ja taustakerronnan. Tämä versio painottaa pidempää ilmaisullista sisältöä; MAI-Voice-2.1-Flash on erillinen vaihtoehto viiveelle herkkiin vuorovaikutuksiin.</p><h4>Kerrontaa yhtenäisellä puhujalla</h4><p>Mallikortti dokumentoi yhden ääni-identiteetin toistamisen yhtenäisesti tuetuilla kielillä. Pitkän sisällön generointi käyttää ositusta ja kontekstin siirtämistä katkelmien jatkuvuuden parantamiseen. Tämä hyödyttää oppituntia, äänikirjan lukua tai toisiinsa liittyviä taustakerronnan osia, joiden kertojan luonteen tulee säilyä. Valmistele johdonmukaiset katkelmat selkeillä rajoilla ja säilytä sama puhujavalinta koko teoksessa.</p><p>Syöte on lopullinen puheteksti sekä valinnainen puhujaviite ja SSML-ilmaisusäätimet. Kerronnan tehtävänannon tulee erottaa kuulijan kuulema sisältö tuotantomuistiinpanoista. Kirjoita tekniseen selitykseen selkeä johdanto, sitten varsinaiset vaiheet ja lopuksi päättävä ohje. Pidä tuotenimet ja toistuvat termit yhtenäisessä kirjoitusasussa. Valmistele lokalisoituun kerrontaan kohdekielinen käsikirjoitus; valittu kieli ja ääni ohjaavat sen puhuttua toteutusta.</p><h4>Puhujat, roolit ja ilmaisun ohjaus</h4><p>Microsoft tarjoaa kuratoidun äänikirjaston ja dokumentoi useiden puhujien käytön vuoropuhelussa. Harper ja Grant havainnollistavat puhujaidentiteettejä, joilla on merkintöjä useille kielialueille. Kahden henkilön opetuskeskustelu voi antaa kysymyksen ja selityksen eri äänille ja säilyttää saman jaon roolin palatessa. Merkitse puhutut repliikit selkeästi, jotta haluttu keskustelu on esitetty synteesin syötteessä.</p><p>Sävyä ja esitystä voi muokata vuoro- tai lausetasolla SSML:n avulla. Tyylit ovat puhujakohtaisia: hallittu valikoima luettelee sopiville äänille tehtävään suunnattuja kertoja- tai opetustyylejä ja toisille tunnevalintoja, kuten iloisen tai helpottuneen. Yhdysvaltain Harper-merkintä tukee näitä kahta tunnetyyliä. Valitse puhuja ja sen dokumentoitu esitystyyli yhdessä sen sijaan, että siirtäisit tyylin toiselta ääneltä.</p><p>Tarinassa tai esityksessä ilmaisullisuus voi erottaa asiaselityksen, pohdiskelevan katkelman ja eloisan lainauksen. Käytännön repliikki on: ”Ensimmäinen yritys antoi meille puutteellisen kuvan. Koko tapahtumasarjan tarkastelu paljasti puuttuvan vaiheen.” Päätä, missä merkitys muuttuu, ja valmistele puhutut yksiköt sen mukaan. Kuuntele siirtymät, jotta esitys seuraa kerrontaa sen sijaan, että jokaista lausetta painotettaisiin yhtä voimakkaasti.</p><h4>Viiteääni ja äänitulos</h4><p>Valinnainen mukautetun äänen tila jäljittelee suostumuksensa antanutta puhujaa 5–60 sekunnin ääniviitteen perusteella ilman hienosäätöä. Microsoft suosittelee viitteeseen luontevaa keskustelunomaista esitystä ja maltillista energiaa, sillä näyte vaikuttaa generoituun ääneen. Mukautetun äänen työnkulku edellyttää valmistajan hyväksyntää ja tallennettua suostumuslausumaa. Valmis kirjasto on erillinen äänenvalintapolku.</p><p>Valmistaja sallii tulostemuodon valinnan, ja julkaistu synteesiesimerkki tallentaa mono-MP3:n 24 kHz:n taajuudella ja 160 kbit/s:n bittinopeudella. Asetukset kuvaavat yhtä tulostetyönkulkua. Valitse äänen esitysmuoto seuraavaa editointi- tai toistovaihetta varten ja säilytä käsikirjoituksen, puhujan ja osien järjestyksen yhteys tallenteeseen. Valmis luku tai oppitunti voi sisältää useita generoituja katkelmia mutta muodostaa silti yhtenäisen kuuntelukokemuksen.</p><h4>Hyödynnä pitkän sisällön tulos</h4><p>MAI-Voice-2.1 painottaa luontevuutta ja ilmaisua tilanteissa, joissa välitön vasteaika on vähemmän tärkeä kuin puhuttu esitys. Tarkista laajasta teoksesta toistuvat nimet, osien rajat, vuoropuhelun äänijako ja tunneilmaisun muutokset. Dokumentaatio vahvistaa pitkän sisällön kyvyn ja yhtenäisyysmekanismit määrittämättä rajatonta käsikirjoitusta tai taattua tallenteen enimmäiskestoa. Käytännön tuotos on ilmaisullinen ääni, jonka kertoja, sanamuodot ja eteneminen vastaavat valmisteltua aineistoa.</p>",
  "aboutText": "MAI-Voice-2.1 on Microsoft AI:n kehotteilla ohjattava tekstistä puheeksi -malli työhön, jossa ilmaisullinen esitys ja äänen uskollisuus ovat tärkeitä. Mallikortti kattaa kaksikymmentäkolme kieltä ja kaksikymmentäkuusi kielialuevarianttia sekä luontevan intonaation, rytmin ja tunnesävyt. Valmistaja nimeää keskeisiksi käyttökohteiksi äänikirjat, mediakerronnan, sisällöntuotannon ja taustakerronnan. Tämä versio painottaa pidempää ilmaisullista sisältöä; MAI-Voice-2.1-Flash on erillinen vaihtoehto viiveelle herkkiin vuorovaikutuksiin.\n\n### Kerrontaa yhtenäisellä puhujalla\n\nMallikortti dokumentoi yhden ääni-identiteetin toistamisen yhtenäisesti tuetuilla kielillä. Pitkän sisällön generointi käyttää ositusta ja kontekstin siirtämistä katkelmien jatkuvuuden parantamiseen. Tämä hyödyttää oppituntia, äänikirjan lukua tai toisiinsa liittyviä taustakerronnan osia, joiden kertojan luonteen tulee säilyä. Valmistele johdonmukaiset katkelmat selkeillä rajoilla ja säilytä sama puhujavalinta koko teoksessa.\n\nSyöte on lopullinen puheteksti sekä valinnainen puhujaviite ja SSML-ilmaisusäätimet. Kerronnan tehtävänannon tulee erottaa kuulijan kuulema sisältö tuotantomuistiinpanoista. Kirjoita tekniseen selitykseen selkeä johdanto, sitten varsinaiset vaiheet ja lopuksi päättävä ohje. Pidä tuotenimet ja toistuvat termit yhtenäisessä kirjoitusasussa. Valmistele lokalisoituun kerrontaan kohdekielinen käsikirjoitus; valittu kieli ja ääni ohjaavat sen puhuttua toteutusta.\n\n### Puhujat, roolit ja ilmaisun ohjaus\n\nMicrosoft tarjoaa kuratoidun äänikirjaston ja dokumentoi useiden puhujien käytön vuoropuhelussa. Harper ja Grant havainnollistavat puhujaidentiteettejä, joilla on merkintöjä useille kielialueille. Kahden henkilön opetuskeskustelu voi antaa kysymyksen ja selityksen eri äänille ja säilyttää saman jaon roolin palatessa. Merkitse puhutut repliikit selkeästi, jotta haluttu keskustelu on esitetty synteesin syötteessä.\n\nSävyä ja esitystä voi muokata vuoro- tai lausetasolla SSML:n avulla. Tyylit ovat puhujakohtaisia: hallittu valikoima luettelee sopiville äänille tehtävään suunnattuja kertoja- tai opetustyylejä ja toisille tunnevalintoja, kuten iloisen tai helpottuneen. Yhdysvaltain Harper-merkintä tukee näitä kahta tunnetyyliä. Valitse puhuja ja sen dokumentoitu esitystyyli yhdessä sen sijaan, että siirtäisit tyylin toiselta ääneltä.\n\nTarinassa tai esityksessä ilmaisullisuus voi erottaa asiaselityksen, pohdiskelevan katkelman ja eloisan lainauksen. Käytännön repliikki on: ”Ensimmäinen yritys antoi meille puutteellisen kuvan. Koko tapahtumasarjan tarkastelu paljasti puuttuvan vaiheen.” Päätä, missä merkitys muuttuu, ja valmistele puhutut yksiköt sen mukaan. Kuuntele siirtymät, jotta esitys seuraa kerrontaa sen sijaan, että jokaista lausetta painotettaisiin yhtä voimakkaasti.\n\n### Viiteääni ja äänitulos\n\nValinnainen mukautetun äänen tila jäljittelee suostumuksensa antanutta puhujaa 5–60 sekunnin ääniviitteen perusteella ilman hienosäätöä. Microsoft suosittelee viitteeseen luontevaa keskustelunomaista esitystä ja maltillista energiaa, sillä näyte vaikuttaa generoituun ääneen. Mukautetun äänen työnkulku edellyttää valmistajan hyväksyntää ja tallennettua suostumuslausumaa. Valmis kirjasto on erillinen äänenvalintapolku.\n\nValmistaja sallii tulostemuodon valinnan, ja julkaistu synteesiesimerkki tallentaa mono-MP3:n 24 kHz:n taajuudella ja 160 kbit/s:n bittinopeudella. Asetukset kuvaavat yhtä tulostetyönkulkua. Valitse äänen esitysmuoto seuraavaa editointi- tai toistovaihetta varten ja säilytä käsikirjoituksen, puhujan ja osien järjestyksen yhteys tallenteeseen. Valmis luku tai oppitunti voi sisältää useita generoituja katkelmia mutta muodostaa silti yhtenäisen kuuntelukokemuksen.\n\n### Hyödynnä pitkän sisällön tulos\n\nMAI-Voice-2.1 painottaa luontevuutta ja ilmaisua tilanteissa, joissa välitön vasteaika on vähemmän tärkeä kuin puhuttu esitys. Tarkista laajasta teoksesta toistuvat nimet, osien rajat, vuoropuhelun äänijako ja tunneilmaisun muutokset. Dokumentaatio vahvistaa pitkän sisällön kyvyn ja yhtenäisyysmekanismit määrittämättä rajatonta käsikirjoitusta tai taattua tallenteen enimmäiskestoa. Käytännön tuotos on ilmaisullinen ääni, jonka kertoja, sanamuodot ja eteneminen vastaavat valmisteltua aineistoa.",
  "editorialOverlay": {
    "copy_fields": null,
    "copy_sha256": null,
    "copy_source": null,
    "html_sha256": "941ef805e9015f1df08b8f95091ab6668f2283b15e4ab6d1f5aaf12fdd5de440",
    "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</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</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\">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 generoi ilmaisullista monikielistä puhetta kerrontaan, äänikirjoihin, opetussisältöön ja taustakerrontaan. Sen 23 kielen profiili tukee yhtenäistä puhujaidentiteettiä, useita puhujia ja ohjattua esitystapaa.</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 on Microsoft AI:n kehotteilla ohjattava tekstistä puheeksi -malli työhön, jossa ilmaisullinen esitys ja äänen uskollisuus ovat tärkeitä. Mallikortti kattaa kaksikymmentäkolme kieltä ja kaksikymmentäkuusi kielialuevarianttia sekä luontevan intonaation, rytmin ja tunnesävyt. Valmistaja nimeää keskeisiksi käyttökohteiksi äänikirjat, mediakerronnan, sisällöntuotannon ja taustakerronnan. Tämä versio painottaa pidempää ilmaisullista sisältöä; MAI-Voice-2.1-Flash on erillinen vaihtoehto viiveelle herkkiin vuorovaikutuksiin.</p><h4>Kerrontaa yhtenäisellä puhujalla</h4><p>Mallikortti dokumentoi yhden ääni-identiteetin toistamisen yhtenäisesti tuetuilla kielillä. Pitkän sisällön generointi käyttää ositusta ja kontekstin siirtämistä katkelmien jatkuvuuden parantamiseen. Tämä hyödyttää oppituntia, äänikirjan lukua tai toisiinsa liittyviä taustakerronnan osia, joiden kertojan luonteen tulee säilyä. Valmistele johdonmukaiset katkelmat selkeillä rajoilla ja säilytä sama puhujavalinta koko teoksessa.</p><p>Syöte on lopullinen puheteksti sekä valinnainen puhujaviite ja SSML-ilmaisusäätimet. Kerronnan tehtävänannon tulee erottaa kuulijan kuulema sisältö tuotantomuistiinpanoista. Kirjoita tekniseen selitykseen selkeä johdanto, sitten varsinaiset vaiheet ja lopuksi päättävä ohje. Pidä tuotenimet ja toistuvat termit yhtenäisessä kirjoitusasussa. Valmistele lokalisoituun kerrontaan kohdekielinen käsikirjoitus; valittu kieli ja ääni ohjaavat sen puhuttua toteutusta.</p><h4>Puhujat, roolit ja ilmaisun ohjaus</h4><p>Microsoft tarjoaa kuratoidun äänikirjaston ja dokumentoi useiden puhujien käytön vuoropuhelussa. Harper ja Grant havainnollistavat puhujaidentiteettejä, joilla on merkintöjä useille kielialueille. Kahden henkilön opetuskeskustelu voi antaa kysymyksen ja selityksen eri äänille ja säilyttää saman jaon roolin palatessa. Merkitse puhutut repliikit selkeästi, jotta haluttu keskustelu on esitetty synteesin syötteessä.</p><p>Sävyä ja esitystä voi muokata vuoro- tai lausetasolla SSML:n avulla. Tyylit ovat puhujakohtaisia: hallittu valikoima luettelee sopiville äänille tehtävään suunnattuja kertoja- tai opetustyylejä ja toisille tunnevalintoja, kuten iloisen tai helpottuneen. Yhdysvaltain Harper-merkintä tukee näitä kahta tunnetyyliä. Valitse puhuja ja sen dokumentoitu esitystyyli yhdessä sen sijaan, että siirtäisit tyylin toiselta ääneltä.</p><p>Tarinassa tai esityksessä ilmaisullisuus voi erottaa asiaselityksen, pohdiskelevan katkelman ja eloisan lainauksen. Käytännön repliikki on: ”Ensimmäinen yritys antoi meille puutteellisen kuvan. Koko tapahtumasarjan tarkastelu paljasti puuttuvan vaiheen.” Päätä, missä merkitys muuttuu, ja valmistele puhutut yksiköt sen mukaan. Kuuntele siirtymät, jotta esitys seuraa kerrontaa sen sijaan, että jokaista lausetta painotettaisiin yhtä voimakkaasti.</p><h4>Viiteääni ja äänitulos</h4><p>Valinnainen mukautetun äänen tila jäljittelee suostumuksensa antanutta puhujaa 5–60 sekunnin ääniviitteen perusteella ilman hienosäätöä. Microsoft suosittelee viitteeseen luontevaa keskustelunomaista esitystä ja maltillista energiaa, sillä näyte vaikuttaa generoituun ääneen. Mukautetun äänen työnkulku edellyttää valmistajan hyväksyntää ja tallennettua suostumuslausumaa. Valmis kirjasto on erillinen äänenvalintapolku.</p><p>Valmistaja sallii tulostemuodon valinnan, ja julkaistu synteesiesimerkki tallentaa mono-MP3:n 24 kHz:n taajuudella ja 160 kbit/s:n bittinopeudella. Asetukset kuvaavat yhtä tulostetyönkulkua. Valitse äänen esitysmuoto seuraavaa editointi- tai toistovaihetta varten ja säilytä käsikirjoituksen, puhujan ja osien järjestyksen yhteys tallenteeseen. Valmis luku tai oppitunti voi sisältää useita generoituja katkelmia mutta muodostaa silti yhtenäisen kuuntelukokemuksen.</p><h4>Hyödynnä pitkän sisällön tulos</h4><p>MAI-Voice-2.1 painottaa luontevuutta ja ilmaisua tilanteissa, joissa välitön vasteaika on vähemmän tärkeä kuin puhuttu esitys. Tarkista laajasta teoksesta toistuvat nimet, osien rajat, vuoropuhelun äänijako ja tunneilmaisun muutokset. Dokumentaatio vahvistaa pitkän sisällön kyvyn ja yhtenäisyysmekanismit määrittämättä rajatonta käsikirjoitusta tai taattua tallenteen enimmäiskestoa. Käytännön tuotos on ilmaisullinen ääni, jonka kertoja, sanamuodot ja eteneminen vastaavat valmisteltua aineistoa.</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</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, cs-CZ-Harper:MAI-Voice-2.1, da-DK-Grant:MAI-Voice-2.1, da-DK-Harper:MAI-Voice-2.1, de-DE-Grant:MAI-Voice-2.1, de-DE-Harper:MAI-Voice-2.1, de-DE-Klaus:MAI-Voice-2.1, de-DE-Mia:MAI-Voice-2.1, en-AU-Isla:MAI-Voice-2.1, en-GB-Emily:MAI-Voice-2.1, en-GB-Harry:MAI-Voice-2.1, en-IN-Dhruv:MAI-Voice-2.1, en-IN-Priya:MAI-Voice-2.1, en-US-Ethan:MAI-Voice-2.1, en-US-Grant:MAI-Voice-2.1, en-US-Harper:MAI-Voice-2.1, en-US-Iris:MAI-Voice-2.1, en-US-Jasper:MAI-Voice-2.1, en-US-Olivia:MAI-Voice-2.1, en-US-Sage:MAI-Voice-2.1, es-ES-Marta:MAI-Voice-2.1, es-MX-Alejo:MAI-Voice-2.1, es-MX-Grant:MAI-Voice-2.1, es-MX-Harper:MAI-Voice-2.1, es-MX-Valeria:MAI-Voice-2.1, fi-FI-Grant:MAI-Voice-2.1, fi-FI-Harper:MAI-Voice-2.1, fr-FR-Grant:MAI-Voice-2.1, fr-FR-Harper:MAI-Voice-2.1, fr-FR-Marc:MAI-Voice-2.1, fr-FR-Soleil:MAI-Voice-2.1, hi-IN-Arjun:MAI-Voice-2.1, hi-IN-Dhruv:MAI-Voice-2.1, hi-IN-Grant:MAI-Voice-2.1, hi-IN-Harper:MAI-Voice-2.1, hi-IN-Kavya:MAI-Voice-2.1, hi-IN-Priya:MAI-Voice-2.1, hu-HU-Bence:MAI-Voice-2.1, hu-HU-Grant:MAI-Voice-2.1, hu-HU-Harper:MAI-Voice-2.1, hu-HU-Levente:MAI-Voice-2.1, hu-HU-Lilla:MAI-Voice-2.1, hu-HU-Reka:MAI-Voice-2.1, id-ID-Grant:MAI-Voice-2.1, id-ID-Harper:MAI-Voice-2.1, it-IT-Grant:MAI-Voice-2.1, it-IT-Harper:MAI-Voice-2.1, it-IT-Luca:MAI-Voice-2.1, it-IT-Rosa:MAI-Voice-2.1, ko-KR-Grant:MAI-Voice-2.1, ko-KR-Haena:MAI-Voice-2.1, ko-KR-Harper:MAI-Voice-2.1, ko-KR-Junho:MAI-Voice-2.1, nb-NO-Grant:MAI-Voice-2.1, nb-NO-Harper:MAI-Voice-2.1, nl-NL-Grant:MAI-Voice-2.1, nl-NL-Harper:MAI-Voice-2.1, nl-NL-Sander:MAI-Voice-2.1, pl-PL-Grant:MAI-Voice-2.1, pl-PL-Harper:MAI-Voice-2.1, pt-BR-Caio:MAI-Voice-2.1, pt-BR-Grant:MAI-Voice-2.1, pt-BR-Harper:MAI-Voice-2.1, pt-BR-Luana:MAI-Voice-2.1, pt-BR-Pedro:MAI-Voice-2.1, pt-BR-Rafael:MAI-Voice-2.1, pt-PT-Grant:MAI-Voice-2.1, pt-PT-Harper:MAI-Voice-2.1, pt-PT-Rui:MAI-Voice-2.1, ro-RO-Andrei:MAI-Voice-2.1, ro-RO-Elena:MAI-Voice-2.1, ro-RO-Grant:MAI-Voice-2.1, ro-RO-Harper:MAI-Voice-2.1, ro-RO-Ioana:MAI-Voice-2.1, ro-RO-Radu:MAI-Voice-2.1, ru-RU-Grant:MAI-Voice-2.1, ru-RU-Harper:MAI-Voice-2.1, ru-RU-Lev:MAI-Voice-2.1, ru-RU-Masha:MAI-Voice-2.1, sv-SE-Grant:MAI-Voice-2.1, sv-SE-Harper:MAI-Voice-2.1, th-TH-Grant:MAI-Voice-2.1, th-TH-Harper:MAI-Voice-2.1, th-TH-Krit:MAI-Voice-2.1, th-TH-Nattapong:MAI-Voice-2.1, tr-TR-Aydin:MAI-Voice-2.1, tr-TR-Elif:MAI-Voice-2.1, tr-TR-Grant:MAI-Voice-2.1, tr-TR-Harper:MAI-Voice-2.1, vi-VN-Grant:MAI-Voice-2.1, vi-VN-Harper:MAI-Voice-2.1, zh-CN-Bo:MAI-Voice-2.1, zh-CN-Grant:MAI-Voice-2.1, zh-CN-Harper:MAI-Voice-2.1, zh-CN-Lan:MAI-Voice-2.1, zh-CN-Mei:MAI-Voice-2.1, zh-CN-Wei:MAI-Voice-2.1</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, cs-CZ-Harper:MAI-Voice-2.1, da-DK-Grant:MAI-Voice-2.1, da-DK-Harper:MAI-Voice-2.1, de-DE-Grant:MAI-Voice-2.1, de-DE-Harper:MAI-Voice-2.1, de-DE-Klaus:MAI-Voice-2.1, de-DE-Mia:MAI-Voice-2.1, en-AU-Isla:MAI-Voice-2.1, en-GB-Emily:MAI-Voice-2.1, en-GB-Harry:MAI-Voice-2.1, en-IN-Dhruv:MAI-Voice-2.1, en-IN-Priya:MAI-Voice-2.1, en-US-Ethan:MAI-Voice-2.1, en-US-Grant:MAI-Voice-2.1, en-US-Harper:MAI-Voice-2.1, en-US-Iris:MAI-Voice-2.1, en-US-Jasper:MAI-Voice-2.1, en-US-Olivia:MAI-Voice-2.1, en-US-Sage:MAI-Voice-2.1, es-ES-Marta:MAI-Voice-2.1, es-MX-Alejo:MAI-Voice-2.1, es-MX-Grant:MAI-Voice-2.1, es-MX-Harper:MAI-Voice-2.1, es-MX-Valeria:MAI-Voice-2.1, fi-FI-Grant:MAI-Voice-2.1, fi-FI-Harper:MAI-Voice-2.1, fr-FR-Grant:MAI-Voice-2.1, fr-FR-Harper:MAI-Voice-2.1, fr-FR-Marc:MAI-Voice-2.1, fr-FR-Soleil:MAI-Voice-2.1, hi-IN-Arjun:MAI-Voice-2.1, hi-IN-Dhruv:MAI-Voice-2.1, hi-IN-Grant:MAI-Voice-2.1, hi-IN-Harper:MAI-Voice-2.1, hi-IN-Kavya:MAI-Voice-2.1, hi-IN-Priya:MAI-Voice-2.1, hu-HU-Bence:MAI-Voice-2.1, hu-HU-Grant:MAI-Voice-2.1, hu-HU-Harper:MAI-Voice-2.1, hu-HU-Levente:MAI-Voice-2.1, hu-HU-Lilla:MAI-Voice-2.1, hu-HU-Reka:MAI-Voice-2.1, id-ID-Grant:MAI-Voice-2.1, id-ID-Harper:MAI-Voice-2.1, it-IT-Grant:MAI-Voice-2.1, it-IT-Harper:MAI-Voice-2.1, it-IT-Luca:MAI-Voice-2.1, it-IT-Rosa:MAI-Voice-2.1, ko-KR-Grant:MAI-Voice-2.1, ko-KR-Haena:MAI-Voice-2.1, ko-KR-Harper:MAI-Voice-2.1, ko-KR-Junho:MAI-Voice-2.1, nb-NO-Grant:MAI-Voice-2.1, nb-NO-Harper:MAI-Voice-2.1, nl-NL-Grant:MAI-Voice-2.1, nl-NL-Harper:MAI-Voice-2.1, nl-NL-Sander:MAI-Voice-2.1, pl-PL-Grant:MAI-Voice-2.1, pl-PL-Harper:MAI-Voice-2.1, pt-BR-Caio:MAI-Voice-2.1, pt-BR-Grant:MAI-Voice-2.1, pt-BR-Harper:MAI-Voice-2.1, pt-BR-Luana:MAI-Voice-2.1, pt-BR-Pedro:MAI-Voice-2.1, pt-BR-Rafael:MAI-Voice-2.1, pt-PT-Grant:MAI-Voice-2.1, pt-PT-Harper:MAI-Voice-2.1, pt-PT-Rui:MAI-Voice-2.1, ro-RO-Andrei:MAI-Voice-2.1, ro-RO-Elena:MAI-Voice-2.1, ro-RO-Grant:MAI-Voice-2.1, ro-RO-Harper:MAI-Voice-2.1, ro-RO-Ioana:MAI-Voice-2.1, ro-RO-Radu:MAI-Voice-2.1, ru-RU-Grant:MAI-Voice-2.1, ru-RU-Harper:MAI-Voice-2.1, ru-RU-Lev:MAI-Voice-2.1, ru-RU-Masha:MAI-Voice-2.1, sv-SE-Grant:MAI-Voice-2.1, sv-SE-Harper:MAI-Voice-2.1, th-TH-Grant:MAI-Voice-2.1, th-TH-Harper:MAI-Voice-2.1, th-TH-Krit:MAI-Voice-2.1, th-TH-Nattapong:MAI-Voice-2.1, tr-TR-Aydin:MAI-Voice-2.1, tr-TR-Elif:MAI-Voice-2.1, tr-TR-Grant:MAI-Voice-2.1, tr-TR-Harper:MAI-Voice-2.1, vi-VN-Grant:MAI-Voice-2.1, vi-VN-Harper:MAI-Voice-2.1, zh-CN-Bo:MAI-Voice-2.1, zh-CN-Grant:MAI-Voice-2.1, zh-CN-Harper:MAI-Voice-2.1, zh-CN-Lan:MAI-Voice-2.1, zh-CN-Mei:MAI-Voice-2.1, zh-CN-Wei:MAI-Voice-2.1</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.044</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</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 · 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,000044 $</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-1853-tab-0\" role=\"tab\" type=\"button\" aria-controls=\"model-code-1853-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-1853-panel-0\" role=\"tabpanel\" aria-labelledby=\"model-code-1853-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&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&quot;, &quot;cs-CZ-Harper:MAI-Voice-2.1&quot;, &quot;da-DK-Grant:MAI-Voice-2.1&quot;, &quot;da-DK-Harper:MAI-Voice-2.1&quot;, &quot;de-DE-Grant:MAI-Voice-2.1&quot;, &quot;de-DE-Harper:MAI-Voice-2.1&quot;, &quot;de-DE-Klaus:MAI-Voice-2.1&quot;, &quot;de-DE-Mia:MAI-Voice-2.1&quot;, &quot;en-AU-Isla:MAI-Voice-2.1&quot;, &quot;en-GB-Emily:MAI-Voice-2.1&quot;, &quot;en-GB-Harry:MAI-Voice-2.1&quot;, &quot;en-IN-Dhruv:MAI-Voice-2.1&quot;, &quot;en-IN-Priya:MAI-Voice-2.1&quot;, &quot;en-US-Ethan:MAI-Voice-2.1&quot;, &quot;en-US-Grant:MAI-Voice-2.1&quot;, &quot;en-US-Harper:MAI-Voice-2.1&quot;, &quot;en-US-Iris:MAI-Voice-2.1&quot;, &quot;en-US-Jasper:MAI-Voice-2.1&quot;, &quot;en-US-Olivia:MAI-Voice-2.1&quot;, &quot;en-US-Sage:MAI-Voice-2.1&quot;, &quot;es-ES-Marta:MAI-Voice-2.1&quot;, &quot;es-MX-Alejo:MAI-Voice-2.1&quot;, &quot;es-MX-Grant:MAI-Voice-2.1&quot;, &quot;es-MX-Harper:MAI-Voice-2.1&quot;, &quot;es-MX-Valeria:MAI-Voice-2.1&quot;, &quot;fi-FI-Grant:MAI-Voice-2.1&quot;, &quot;fi-FI-Harper:MAI-Voice-2.1&quot;, &quot;fr-FR-Grant:MAI-Voice-2.1&quot;, &quot;fr-FR-Harper:MAI-Voice-2.1&quot;, &quot;fr-FR-Marc:MAI-Voice-2.1&quot;, &quot;fr-FR-Soleil:MAI-Voice-2.1&quot;, &quot;hi-IN-Arjun:MAI-Voice-2.1&quot;, &quot;hi-IN-Dhruv:MAI-Voice-2.1&quot;, &quot;hi-IN-Grant:MAI-Voice-2.1&quot;, &quot;hi-IN-Harper:MAI-Voice-2.1&quot;, &quot;hi-IN-Kavya:MAI-Voice-2.1&quot;, &quot;hi-IN-Priya:MAI-Voice-2.1&quot;, &quot;hu-HU-Bence:MAI-Voice-2.1&quot;, &quot;hu-HU-Grant:MAI-Voice-2.1&quot;, &quot;hu-HU-Harper:MAI-Voice-2.1&quot;, &quot;hu-HU-Levente:MAI-Voice-2.1&quot;, &quot;hu-HU-Lilla:MAI-Voice-2.1&quot;, &quot;hu-HU-Reka:MAI-Voice-2.1&quot;, &quot;id-ID-Grant:MAI-Voice-2.1&quot;, &quot;id-ID-Harper:MAI-Voice-2.1&quot;, &quot;it-IT-Grant:MAI-Voice-2.1&quot;, &quot;it-IT-Harper:MAI-Voice-2.1&quot;, &quot;it-IT-Luca:MAI-Voice-2.1&quot;, &quot;it-IT-Rosa:MAI-Voice-2.1&quot;, &quot;ko-KR-Grant:MAI-Voice-2.1&quot;, &quot;ko-KR-Haena:MAI-Voice-2.1&quot;, &quot;ko-KR-Harper:MAI-Voice-2.1&quot;, &quot;ko-KR-Junho:MAI-Voice-2.1&quot;, &quot;nb-NO-Grant:MAI-Voice-2.1&quot;, &quot;nb-NO-Harper:MAI-Voice-2.1&quot;, &quot;nl-NL-Grant:MAI-Voice-2.1&quot;, &quot;nl-NL-Harper:MAI-Voice-2.1&quot;, &quot;nl-NL-Sander:MAI-Voice-2.1&quot;, &quot;pl-PL-Grant:MAI-Voice-2.1&quot;, &quot;pl-PL-Harper:MAI-Voice-2.1&quot;, &quot;pt-BR-Caio:MAI-Voice-2.1&quot;, &quot;pt-BR-Grant:MAI-Voice-2.1&quot;, &quot;pt-BR-Harper:MAI-Voice-2.1&quot;, &quot;pt-BR-Luana:MAI-Voice-2.1&quot;, &quot;pt-BR-Pedro:MAI-Voice-2.1&quot;, &quot;pt-BR-Rafael:MAI-Voice-2.1&quot;, &quot;pt-PT-Grant:MAI-Voice-2.1&quot;, &quot;pt-PT-Harper:MAI-Voice-2.1&quot;, &quot;pt-PT-Rui:MAI-Voice-2.1&quot;, &quot;ro-RO-Andrei:MAI-Voice-2.1&quot;, &quot;ro-RO-Elena:MAI-Voice-2.1&quot;, &quot;ro-RO-Grant:MAI-Voice-2.1&quot;, &quot;ro-RO-Harper:MAI-Voice-2.1&quot;, &quot;ro-RO-Ioana:MAI-Voice-2.1&quot;, &quot;ro-RO-Radu:MAI-Voice-2.1&quot;, &quot;ru-RU-Grant:MAI-Voice-2.1&quot;, &quot;ru-RU-Harper:MAI-Voice-2.1&quot;, &quot;ru-RU-Lev:MAI-Voice-2.1&quot;, &quot;ru-RU-Masha:MAI-Voice-2.1&quot;, &quot;sv-SE-Grant:MAI-Voice-2.1&quot;, &quot;sv-SE-Harper:MAI-Voice-2.1&quot;, &quot;th-TH-Grant:MAI-Voice-2.1&quot;, &quot;th-TH-Harper:MAI-Voice-2.1&quot;, &quot;th-TH-Krit:MAI-Voice-2.1&quot;, &quot;th-TH-Nattapong:MAI-Voice-2.1&quot;, &quot;tr-TR-Aydin:MAI-Voice-2.1&quot;, &quot;tr-TR-Elif:MAI-Voice-2.1&quot;, &quot;tr-TR-Grant:MAI-Voice-2.1&quot;, &quot;tr-TR-Harper:MAI-Voice-2.1&quot;, &quot;vi-VN-Grant:MAI-Voice-2.1&quot;, &quot;vi-VN-Harper:MAI-Voice-2.1&quot;, &quot;zh-CN-Bo:MAI-Voice-2.1&quot;, &quot;zh-CN-Grant:MAI-Voice-2.1&quot;, &quot;zh-CN-Harper:MAI-Voice-2.1&quot;, &quot;zh-CN-Lan:MAI-Voice-2.1&quot;, &quot;zh-CN-Mei:MAI-Voice-2.1&quot;, &quot;zh-CN-Wei:MAI-Voice-2.1&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-1854-tab-0\" role=\"tab\" type=\"button\" aria-controls=\"model-code-1854-panel-0\" aria-selected=\"true\" tabindex=\"0\">Mediakirjasto</button><button class=\"cg-tab\" id=\"model-code-1854-tab-1\" role=\"tab\" type=\"button\" aria-controls=\"model-code-1854-panel-1\" aria-selected=\"false\" tabindex=\"-1\">Tehtävän tila</button><button class=\"cg-tab\" id=\"model-code-1854-tab-2\" role=\"tab\" type=\"button\" aria-controls=\"model-code-1854-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-1854-panel-0\" role=\"tabpanel\" aria-labelledby=\"model-code-1854-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-1854-panel-1\" role=\"tabpanel\" aria-labelledby=\"model-code-1854-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-1854-panel-2\" role=\"tabpanel\" aria-labelledby=\"model-code-1854-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&amp;route=Ultra&amp;caller=microsoft%2Fmai-voice-2.1&amp;fmt=speech\"><code>microsoft/mai-voice-2.1</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&amp;route=Ultra&amp;caller=microsoft%2Fmai-voice-2.1&amp;fmt=speech\"><code>microsoft/mai-voice-2.1</code></a></p></section></div>",
      "method_identity": {
        "effective_request_model_id": "microsoft/mai-voice-2.1",
        "fmt": "speech",
        "http": "POST",
        "path": "/v1/audio/speech",
        "request_model_id": "microsoft/mai-voice-2.1",
        "route_label": "Ultra"
      },
      "method_key": "Ultra|speech|/v1/audio/speech|microsoft%2Fmai-voice-2.1",
      "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"
                ],
                "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",
                  "cs-CZ-Harper:MAI-Voice-2.1",
                  "da-DK-Grant:MAI-Voice-2.1",
                  "da-DK-Harper:MAI-Voice-2.1",
                  "de-DE-Grant:MAI-Voice-2.1",
                  "de-DE-Harper:MAI-Voice-2.1",
                  "de-DE-Klaus:MAI-Voice-2.1",
                  "de-DE-Mia:MAI-Voice-2.1",
                  "en-AU-Isla:MAI-Voice-2.1",
                  "en-GB-Emily:MAI-Voice-2.1",
                  "en-GB-Harry:MAI-Voice-2.1",
                  "en-IN-Dhruv:MAI-Voice-2.1",
                  "en-IN-Priya:MAI-Voice-2.1",
                  "en-US-Ethan:MAI-Voice-2.1",
                  "en-US-Grant:MAI-Voice-2.1",
                  "en-US-Harper:MAI-Voice-2.1",
                  "en-US-Iris:MAI-Voice-2.1",
                  "en-US-Jasper:MAI-Voice-2.1",
                  "en-US-Olivia:MAI-Voice-2.1",
                  "en-US-Sage:MAI-Voice-2.1",
                  "es-ES-Marta:MAI-Voice-2.1",
                  "es-MX-Alejo:MAI-Voice-2.1",
                  "es-MX-Grant:MAI-Voice-2.1",
                  "es-MX-Harper:MAI-Voice-2.1",
                  "es-MX-Valeria:MAI-Voice-2.1",
                  "fi-FI-Grant:MAI-Voice-2.1",
                  "fi-FI-Harper:MAI-Voice-2.1",
                  "fr-FR-Grant:MAI-Voice-2.1",
                  "fr-FR-Harper:MAI-Voice-2.1",
                  "fr-FR-Marc:MAI-Voice-2.1",
                  "fr-FR-Soleil:MAI-Voice-2.1",
                  "hi-IN-Arjun:MAI-Voice-2.1",
                  "hi-IN-Dhruv:MAI-Voice-2.1",
                  "hi-IN-Grant:MAI-Voice-2.1",
                  "hi-IN-Harper:MAI-Voice-2.1",
                  "hi-IN-Kavya:MAI-Voice-2.1",
                  "hi-IN-Priya:MAI-Voice-2.1",
                  "hu-HU-Bence:MAI-Voice-2.1",
                  "hu-HU-Grant:MAI-Voice-2.1",
                  "hu-HU-Harper:MAI-Voice-2.1",
                  "hu-HU-Levente:MAI-Voice-2.1",
                  "hu-HU-Lilla:MAI-Voice-2.1",
                  "hu-HU-Reka:MAI-Voice-2.1",
                  "id-ID-Grant:MAI-Voice-2.1",
                  "id-ID-Harper:MAI-Voice-2.1",
                  "it-IT-Grant:MAI-Voice-2.1",
                  "it-IT-Harper:MAI-Voice-2.1",
                  "it-IT-Luca:MAI-Voice-2.1",
                  "it-IT-Rosa:MAI-Voice-2.1",
                  "ko-KR-Grant:MAI-Voice-2.1",
                  "ko-KR-Haena:MAI-Voice-2.1",
                  "ko-KR-Harper:MAI-Voice-2.1",
                  "ko-KR-Junho:MAI-Voice-2.1",
                  "nb-NO-Grant:MAI-Voice-2.1",
                  "nb-NO-Harper:MAI-Voice-2.1",
                  "nl-NL-Grant:MAI-Voice-2.1",
                  "nl-NL-Harper:MAI-Voice-2.1",
                  "nl-NL-Sander:MAI-Voice-2.1",
                  "pl-PL-Grant:MAI-Voice-2.1",
                  "pl-PL-Harper:MAI-Voice-2.1",
                  "pt-BR-Caio:MAI-Voice-2.1",
                  "pt-BR-Grant:MAI-Voice-2.1",
                  "pt-BR-Harper:MAI-Voice-2.1",
                  "pt-BR-Luana:MAI-Voice-2.1",
                  "pt-BR-Pedro:MAI-Voice-2.1",
                  "pt-BR-Rafael:MAI-Voice-2.1",
                  "pt-PT-Grant:MAI-Voice-2.1",
                  "pt-PT-Harper:MAI-Voice-2.1",
                  "pt-PT-Rui:MAI-Voice-2.1",
                  "ro-RO-Andrei:MAI-Voice-2.1",
                  "ro-RO-Elena:MAI-Voice-2.1",
                  "ro-RO-Grant:MAI-Voice-2.1",
                  "ro-RO-Harper:MAI-Voice-2.1",
                  "ro-RO-Ioana:MAI-Voice-2.1",
                  "ro-RO-Radu:MAI-Voice-2.1",
                  "ru-RU-Grant:MAI-Voice-2.1",
                  "ru-RU-Harper:MAI-Voice-2.1",
                  "ru-RU-Lev:MAI-Voice-2.1",
                  "ru-RU-Masha:MAI-Voice-2.1",
                  "sv-SE-Grant:MAI-Voice-2.1",
                  "sv-SE-Harper:MAI-Voice-2.1",
                  "th-TH-Grant:MAI-Voice-2.1",
                  "th-TH-Harper:MAI-Voice-2.1",
                  "th-TH-Krit:MAI-Voice-2.1",
                  "th-TH-Nattapong:MAI-Voice-2.1",
                  "tr-TR-Aydin:MAI-Voice-2.1",
                  "tr-TR-Elif:MAI-Voice-2.1",
                  "tr-TR-Grant:MAI-Voice-2.1",
                  "tr-TR-Harper:MAI-Voice-2.1",
                  "vi-VN-Grant:MAI-Voice-2.1",
                  "vi-VN-Harper:MAI-Voice-2.1",
                  "zh-CN-Bo:MAI-Voice-2.1",
                  "zh-CN-Grant:MAI-Voice-2.1",
                  "zh-CN-Harper:MAI-Voice-2.1",
                  "zh-CN-Lan:MAI-Voice-2.1",
                  "zh-CN-Mei:MAI-Voice-2.1",
                  "zh-CN-Wei:MAI-Voice-2.1"
                ],
                "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",
              "cs-CZ-Harper:MAI-Voice-2.1",
              "da-DK-Grant:MAI-Voice-2.1",
              "da-DK-Harper:MAI-Voice-2.1",
              "de-DE-Grant:MAI-Voice-2.1",
              "de-DE-Harper:MAI-Voice-2.1",
              "de-DE-Klaus:MAI-Voice-2.1",
              "de-DE-Mia:MAI-Voice-2.1",
              "en-AU-Isla:MAI-Voice-2.1",
              "en-GB-Emily:MAI-Voice-2.1",
              "en-GB-Harry:MAI-Voice-2.1",
              "en-IN-Dhruv:MAI-Voice-2.1",
              "en-IN-Priya:MAI-Voice-2.1",
              "en-US-Ethan:MAI-Voice-2.1",
              "en-US-Grant:MAI-Voice-2.1",
              "en-US-Harper:MAI-Voice-2.1",
              "en-US-Iris:MAI-Voice-2.1",
              "en-US-Jasper:MAI-Voice-2.1",
              "en-US-Olivia:MAI-Voice-2.1",
              "en-US-Sage:MAI-Voice-2.1",
              "es-ES-Marta:MAI-Voice-2.1",
              "es-MX-Alejo:MAI-Voice-2.1",
              "es-MX-Grant:MAI-Voice-2.1",
              "es-MX-Harper:MAI-Voice-2.1",
              "es-MX-Valeria:MAI-Voice-2.1",
              "fi-FI-Grant:MAI-Voice-2.1",
              "fi-FI-Harper:MAI-Voice-2.1",
              "fr-FR-Grant:MAI-Voice-2.1",
              "fr-FR-Harper:MAI-Voice-2.1",
              "fr-FR-Marc:MAI-Voice-2.1",
              "fr-FR-Soleil:MAI-Voice-2.1",
              "hi-IN-Arjun:MAI-Voice-2.1",
              "hi-IN-Dhruv:MAI-Voice-2.1",
              "hi-IN-Grant:MAI-Voice-2.1",
              "hi-IN-Harper:MAI-Voice-2.1",
              "hi-IN-Kavya:MAI-Voice-2.1",
              "hi-IN-Priya:MAI-Voice-2.1",
              "hu-HU-Bence:MAI-Voice-2.1",
              "hu-HU-Grant:MAI-Voice-2.1",
              "hu-HU-Harper:MAI-Voice-2.1",
              "hu-HU-Levente:MAI-Voice-2.1",
              "hu-HU-Lilla:MAI-Voice-2.1",
              "hu-HU-Reka:MAI-Voice-2.1",
              "id-ID-Grant:MAI-Voice-2.1",
              "id-ID-Harper:MAI-Voice-2.1",
              "it-IT-Grant:MAI-Voice-2.1",
              "it-IT-Harper:MAI-Voice-2.1",
              "it-IT-Luca:MAI-Voice-2.1",
              "it-IT-Rosa:MAI-Voice-2.1",
              "ko-KR-Grant:MAI-Voice-2.1",
              "ko-KR-Haena:MAI-Voice-2.1",
              "ko-KR-Harper:MAI-Voice-2.1",
              "ko-KR-Junho:MAI-Voice-2.1",
              "nb-NO-Grant:MAI-Voice-2.1",
              "nb-NO-Harper:MAI-Voice-2.1",
              "nl-NL-Grant:MAI-Voice-2.1",
              "nl-NL-Harper:MAI-Voice-2.1",
              "nl-NL-Sander:MAI-Voice-2.1",
              "pl-PL-Grant:MAI-Voice-2.1",
              "pl-PL-Harper:MAI-Voice-2.1",
              "pt-BR-Caio:MAI-Voice-2.1",
              "pt-BR-Grant:MAI-Voice-2.1",
              "pt-BR-Harper:MAI-Voice-2.1",
              "pt-BR-Luana:MAI-Voice-2.1",
              "pt-BR-Pedro:MAI-Voice-2.1",
              "pt-BR-Rafael:MAI-Voice-2.1",
              "pt-PT-Grant:MAI-Voice-2.1",
              "pt-PT-Harper:MAI-Voice-2.1",
              "pt-PT-Rui:MAI-Voice-2.1",
              "ro-RO-Andrei:MAI-Voice-2.1",
              "ro-RO-Elena:MAI-Voice-2.1",
              "ro-RO-Grant:MAI-Voice-2.1",
              "ro-RO-Harper:MAI-Voice-2.1",
              "ro-RO-Ioana:MAI-Voice-2.1",
              "ro-RO-Radu:MAI-Voice-2.1",
              "ru-RU-Grant:MAI-Voice-2.1",
              "ru-RU-Harper:MAI-Voice-2.1",
              "ru-RU-Lev:MAI-Voice-2.1",
              "ru-RU-Masha:MAI-Voice-2.1",
              "sv-SE-Grant:MAI-Voice-2.1",
              "sv-SE-Harper:MAI-Voice-2.1",
              "th-TH-Grant:MAI-Voice-2.1",
              "th-TH-Harper:MAI-Voice-2.1",
              "th-TH-Krit:MAI-Voice-2.1",
              "th-TH-Nattapong:MAI-Voice-2.1",
              "tr-TR-Aydin:MAI-Voice-2.1",
              "tr-TR-Elif:MAI-Voice-2.1",
              "tr-TR-Grant:MAI-Voice-2.1",
              "tr-TR-Harper:MAI-Voice-2.1",
              "vi-VN-Grant:MAI-Voice-2.1",
              "vi-VN-Harper:MAI-Voice-2.1",
              "zh-CN-Bo:MAI-Voice-2.1",
              "zh-CN-Grant:MAI-Voice-2.1",
              "zh-CN-Harper:MAI-Voice-2.1",
              "zh-CN-Lan:MAI-Voice-2.1",
              "zh-CN-Mei:MAI-Voice-2.1",
              "zh-CN-Wei:MAI-Voice-2.1"
            ]
          },
          "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.044000",
                "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.000044",
                "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": "53ceea2ccaa50cadb12f",
            "label": "Microsoft AI: MAI-Voice-2.1",
            "profiles": [
              {
                "basis": "",
                "dimensions": {
                  "conditions": "Oletuskokoonpano"
                },
                "label": "Microsoft AI: MAI-Voice-2.1 · Oletusasetukset",
                "units": [
                  {
                    "amount": "0.000044",
                    "amount_unit": "usd_per_exact_physical_unit",
                    "billing_input": false,
                    "key": "8d1e4e9bf0f3647249d90a3c",
                    "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\", \"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\", \"cs-CZ-Harper:MAI-Voice-2.1\", \"da-DK-Grant:MAI-Voice-2.1\", \"da-DK-Harper:MAI-Voice-2.1\", \"de-DE-Grant:MAI-Voice-2.1\", \"de-DE-Harper:MAI-Voice-2.1\", \"de-DE-Klaus:MAI-Voice-2.1\", \"de-DE-Mia:MAI-Voice-2.1\", \"en-AU-Isla:MAI-Voice-2.1\", \"en-GB-Emily:MAI-Voice-2.1\", \"en-GB-Harry:MAI-Voice-2.1\", \"en-IN-Dhruv:MAI-Voice-2.1\", \"en-IN-Priya:MAI-Voice-2.1\", \"en-US-Ethan:MAI-Voice-2.1\", \"en-US-Grant:MAI-Voice-2.1\", \"en-US-Harper:MAI-Voice-2.1\", \"en-US-Iris:MAI-Voice-2.1\", \"en-US-Jasper:MAI-Voice-2.1\", \"en-US-Olivia:MAI-Voice-2.1\", \"en-US-Sage:MAI-Voice-2.1\", \"es-ES-Marta:MAI-Voice-2.1\", \"es-MX-Alejo:MAI-Voice-2.1\", \"es-MX-Grant:MAI-Voice-2.1\", \"es-MX-Harper:MAI-Voice-2.1\", \"es-MX-Valeria:MAI-Voice-2.1\", \"fi-FI-Grant:MAI-Voice-2.1\", \"fi-FI-Harper:MAI-Voice-2.1\", \"fr-FR-Grant:MAI-Voice-2.1\", \"fr-FR-Harper:MAI-Voice-2.1\", \"fr-FR-Marc:MAI-Voice-2.1\", \"fr-FR-Soleil:MAI-Voice-2.1\", \"hi-IN-Arjun:MAI-Voice-2.1\", \"hi-IN-Dhruv:MAI-Voice-2.1\", \"hi-IN-Grant:MAI-Voice-2.1\", \"hi-IN-Harper:MAI-Voice-2.1\", \"hi-IN-Kavya:MAI-Voice-2.1\", \"hi-IN-Priya:MAI-Voice-2.1\", \"hu-HU-Bence:MAI-Voice-2.1\", \"hu-HU-Grant:MAI-Voice-2.1\", \"hu-HU-Harper:MAI-Voice-2.1\", \"hu-HU-Levente:MAI-Voice-2.1\", \"hu-HU-Lilla:MAI-Voice-2.1\", \"hu-HU-Reka:MAI-Voice-2.1\", \"id-ID-Grant:MAI-Voice-2.1\", \"id-ID-Harper:MAI-Voice-2.1\", \"it-IT-Grant:MAI-Voice-2.1\", \"it-IT-Harper:MAI-Voice-2.1\", \"it-IT-Luca:MAI-Voice-2.1\", \"it-IT-Rosa:MAI-Voice-2.1\", \"ko-KR-Grant:MAI-Voice-2.1\", \"ko-KR-Haena:MAI-Voice-2.1\", \"ko-KR-Harper:MAI-Voice-2.1\", \"ko-KR-Junho:MAI-Voice-2.1\", \"nb-NO-Grant:MAI-Voice-2.1\", \"nb-NO-Harper:MAI-Voice-2.1\", \"nl-NL-Grant:MAI-Voice-2.1\", \"nl-NL-Harper:MAI-Voice-2.1\", \"nl-NL-Sander:MAI-Voice-2.1\", \"pl-PL-Grant:MAI-Voice-2.1\", \"pl-PL-Harper:MAI-Voice-2.1\", \"pt-BR-Caio:MAI-Voice-2.1\", \"pt-BR-Grant:MAI-Voice-2.1\", \"pt-BR-Harper:MAI-Voice-2.1\", \"pt-BR-Luana:MAI-Voice-2.1\", \"pt-BR-Pedro:MAI-Voice-2.1\", \"pt-BR-Rafael:MAI-Voice-2.1\", \"pt-PT-Grant:MAI-Voice-2.1\", \"pt-PT-Harper:MAI-Voice-2.1\", \"pt-PT-Rui:MAI-Voice-2.1\", \"ro-RO-Andrei:MAI-Voice-2.1\", \"ro-RO-Elena:MAI-Voice-2.1\", \"ro-RO-Grant:MAI-Voice-2.1\", \"ro-RO-Harper:MAI-Voice-2.1\", \"ro-RO-Ioana:MAI-Voice-2.1\", \"ro-RO-Radu:MAI-Voice-2.1\", \"ru-RU-Grant:MAI-Voice-2.1\", \"ru-RU-Harper:MAI-Voice-2.1\", \"ru-RU-Lev:MAI-Voice-2.1\", \"ru-RU-Masha:MAI-Voice-2.1\", \"sv-SE-Grant:MAI-Voice-2.1\", \"sv-SE-Harper:MAI-Voice-2.1\", \"th-TH-Grant:MAI-Voice-2.1\", \"th-TH-Harper:MAI-Voice-2.1\", \"th-TH-Krit:MAI-Voice-2.1\", \"th-TH-Nattapong:MAI-Voice-2.1\", \"tr-TR-Aydin:MAI-Voice-2.1\", \"tr-TR-Elif:MAI-Voice-2.1\", \"tr-TR-Grant:MAI-Voice-2.1\", \"tr-TR-Harper:MAI-Voice-2.1\", \"vi-VN-Grant:MAI-Voice-2.1\", \"vi-VN-Harper:MAI-Voice-2.1\", \"zh-CN-Bo:MAI-Voice-2.1\", \"zh-CN-Grant:MAI-Voice-2.1\", \"zh-CN-Harper:MAI-Voice-2.1\", \"zh-CN-Lan:MAI-Voice-2.1\", \"zh-CN-Mei:MAI-Voice-2.1\", \"zh-CN-Wei:MAI-Voice-2.1\"]')\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": 4.4e-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.044000",
                "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.000044",
                "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",
        "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.044000",
            "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.000044",
            "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",
  "nativeProvenance": {
    "input_facts_canonical_sha256": "838853ca24ea5e43d2923a8871e859d2c86ca6c8a7216515f43feecc56a93fd0",
    "input_html_sha256": "1bde1d2e1a2df18a0a8ac18ddd396de7f29d9ce18168e978f3fc6f81f5668a0e",
    "private_audit_sha256": "e81c729e410b3a5f763e4f7bb7a0d3730a03e89530916cba0311845e162edd6f",
    "role": "historical-normalized-input-audit-hashes",
    "schema": "ailoot-native-model-provenance-v2"
  },
  "page": {
    "canonical": "https://ailoot.ai/models/fi/microsoft-mai-voice-2-1/",
    "description": "Microsoft AI:n MAI-Voice-2.1 generoi ilmaisullista monikielistä puhetta kerrontaan, äänikirjoihin, opetussisältöön ja taustakerrontaan. Sen 23 kielen profiili tukee yhtenäistä puhujaidentiteettiä, useita puhujia ja ohjattua esitystapaa.",
    "locale": "fi",
    "md_url": "https://ailoot.ai/models/fi/microsoft-mai-voice-2-1/index.md",
    "title": "Microsoft AI: MAI-Voice-2.1 — Ailoot",
    "url": "https://ailoot.ai/models/fi/microsoft-mai-voice-2-1/"
  },
  "rawModel": {
    "about": "MAI-Voice-2.1 on Microsoft AI:n kehotteilla ohjattava tekstistä puheeksi -malli työhön, jossa ilmaisullinen esitys ja äänen uskollisuus ovat tärkeitä. Mallikortti kattaa kaksikymmentäkolme kieltä ja kaksikymmentäkuusi kielialuevarianttia sekä luontevan intonaation, rytmin ja tunnesävyt. Valmistaja nimeää keskeisiksi käyttökohteiksi äänikirjat, mediakerronnan, sisällöntuotannon ja taustakerronnan. Tämä versio painottaa pidempää ilmaisullista sisältöä; MAI-Voice-2.1-Flash on erillinen vaihtoehto viiveelle herkkiin vuorovaikutuksiin.\n\n### Kerrontaa yhtenäisellä puhujalla\n\nMallikortti dokumentoi yhden ääni-identiteetin toistamisen yhtenäisesti tuetuilla kielillä. Pitkän sisällön generointi käyttää ositusta ja kontekstin siirtämistä katkelmien jatkuvuuden parantamiseen. Tämä hyödyttää oppituntia, äänikirjan lukua tai toisiinsa liittyviä taustakerronnan osia, joiden kertojan luonteen tulee säilyä. Valmistele johdonmukaiset katkelmat selkeillä rajoilla ja säilytä sama puhujavalinta koko teoksessa.\n\nSyöte on lopullinen puheteksti sekä valinnainen puhujaviite ja SSML-ilmaisusäätimet. Kerronnan tehtävänannon tulee erottaa kuulijan kuulema sisältö tuotantomuistiinpanoista. Kirjoita tekniseen selitykseen selkeä johdanto, sitten varsinaiset vaiheet ja lopuksi päättävä ohje. Pidä tuotenimet ja toistuvat termit yhtenäisessä kirjoitusasussa. Valmistele lokalisoituun kerrontaan kohdekielinen käsikirjoitus; valittu kieli ja ääni ohjaavat sen puhuttua toteutusta.\n\n### Puhujat, roolit ja ilmaisun ohjaus\n\nMicrosoft tarjoaa kuratoidun äänikirjaston ja dokumentoi useiden puhujien käytön vuoropuhelussa. Harper ja Grant havainnollistavat puhujaidentiteettejä, joilla on merkintöjä useille kielialueille. Kahden henkilön opetuskeskustelu voi antaa kysymyksen ja selityksen eri äänille ja säilyttää saman jaon roolin palatessa. Merkitse puhutut repliikit selkeästi, jotta haluttu keskustelu on esitetty synteesin syötteessä.\n\nSävyä ja esitystä voi muokata vuoro- tai lausetasolla SSML:n avulla. Tyylit ovat puhujakohtaisia: hallittu valikoima luettelee sopiville äänille tehtävään suunnattuja kertoja- tai opetustyylejä ja toisille tunnevalintoja, kuten iloisen tai helpottuneen. Yhdysvaltain Harper-merkintä tukee näitä kahta tunnetyyliä. Valitse puhuja ja sen dokumentoitu esitystyyli yhdessä sen sijaan, että siirtäisit tyylin toiselta ääneltä.\n\nTarinassa tai esityksessä ilmaisullisuus voi erottaa asiaselityksen, pohdiskelevan katkelman ja eloisan lainauksen. Käytännön repliikki on: ”Ensimmäinen yritys antoi meille puutteellisen kuvan. Koko tapahtumasarjan tarkastelu paljasti puuttuvan vaiheen.” Päätä, missä merkitys muuttuu, ja valmistele puhutut yksiköt sen mukaan. Kuuntele siirtymät, jotta esitys seuraa kerrontaa sen sijaan, että jokaista lausetta painotettaisiin yhtä voimakkaasti.\n\n### Viiteääni ja äänitulos\n\nValinnainen mukautetun äänen tila jäljittelee suostumuksensa antanutta puhujaa 5–60 sekunnin ääniviitteen perusteella ilman hienosäätöä. Microsoft suosittelee viitteeseen luontevaa keskustelunomaista esitystä ja maltillista energiaa, sillä näyte vaikuttaa generoituun ääneen. Mukautetun äänen työnkulku edellyttää valmistajan hyväksyntää ja tallennettua suostumuslausumaa. Valmis kirjasto on erillinen äänenvalintapolku.\n\nValmistaja sallii tulostemuodon valinnan, ja julkaistu synteesiesimerkki tallentaa mono-MP3:n 24 kHz:n taajuudella ja 160 kbit/s:n bittinopeudella. Asetukset kuvaavat yhtä tulostetyönkulkua. Valitse äänen esitysmuoto seuraavaa editointi- tai toistovaihetta varten ja säilytä käsikirjoituksen, puhujan ja osien järjestyksen yhteys tallenteeseen. Valmis luku tai oppitunti voi sisältää useita generoituja katkelmia mutta muodostaa silti yhtenäisen kuuntelukokemuksen.\n\n### Hyödynnä pitkän sisällön tulos\n\nMAI-Voice-2.1 painottaa luontevuutta ja ilmaisua tilanteissa, joissa välitön vasteaika on vähemmän tärkeä kuin puhuttu esitys. Tarkista laajasta teoksesta toistuvat nimet, osien rajat, vuoropuhelun äänijako ja tunneilmaisun muutokset. Dokumentaatio vahvistaa pitkän sisällön kyvyn ja yhtenäisyysmekanismit määrittämättä rajatonta käsikirjoitusta tai taattua tallenteen enimmäiskestoa. Käytännön tuotos on ilmaisullinen ääni, jonka kertoja, sanamuodot ja eteneminen vastaavat valmisteltua aineistoa.",
    "alias_of": null,
    "aliases": [],
    "author": "Microsoft AI",
    "available": null,
    "canonical_model": "microsoft/mai-voice-2.1",
    "capabilities": {
      "context_length": 0,
      "manufacturer_input": [
        "text"
      ],
      "manufacturer_output": [
        "speech"
      ]
    },
    "card_routes": [
      {
        "label": "Ultra",
        "rates": [
          {
            "amount": "0.044000",
            "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.000044",
            "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",
    "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"
                ],
                "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",
                  "cs-CZ-Harper:MAI-Voice-2.1",
                  "da-DK-Grant:MAI-Voice-2.1",
                  "da-DK-Harper:MAI-Voice-2.1",
                  "de-DE-Grant:MAI-Voice-2.1",
                  "de-DE-Harper:MAI-Voice-2.1",
                  "de-DE-Klaus:MAI-Voice-2.1",
                  "de-DE-Mia:MAI-Voice-2.1",
                  "en-AU-Isla:MAI-Voice-2.1",
                  "en-GB-Emily:MAI-Voice-2.1",
                  "en-GB-Harry:MAI-Voice-2.1",
                  "en-IN-Dhruv:MAI-Voice-2.1",
                  "en-IN-Priya:MAI-Voice-2.1",
                  "en-US-Ethan:MAI-Voice-2.1",
                  "en-US-Grant:MAI-Voice-2.1",
                  "en-US-Harper:MAI-Voice-2.1",
                  "en-US-Iris:MAI-Voice-2.1",
                  "en-US-Jasper:MAI-Voice-2.1",
                  "en-US-Olivia:MAI-Voice-2.1",
                  "en-US-Sage:MAI-Voice-2.1",
                  "es-ES-Marta:MAI-Voice-2.1",
                  "es-MX-Alejo:MAI-Voice-2.1",
                  "es-MX-Grant:MAI-Voice-2.1",
                  "es-MX-Harper:MAI-Voice-2.1",
                  "es-MX-Valeria:MAI-Voice-2.1",
                  "fi-FI-Grant:MAI-Voice-2.1",
                  "fi-FI-Harper:MAI-Voice-2.1",
                  "fr-FR-Grant:MAI-Voice-2.1",
                  "fr-FR-Harper:MAI-Voice-2.1",
                  "fr-FR-Marc:MAI-Voice-2.1",
                  "fr-FR-Soleil:MAI-Voice-2.1",
                  "hi-IN-Arjun:MAI-Voice-2.1",
                  "hi-IN-Dhruv:MAI-Voice-2.1",
                  "hi-IN-Grant:MAI-Voice-2.1",
                  "hi-IN-Harper:MAI-Voice-2.1",
                  "hi-IN-Kavya:MAI-Voice-2.1",
                  "hi-IN-Priya:MAI-Voice-2.1",
                  "hu-HU-Bence:MAI-Voice-2.1",
                  "hu-HU-Grant:MAI-Voice-2.1",
                  "hu-HU-Harper:MAI-Voice-2.1",
                  "hu-HU-Levente:MAI-Voice-2.1",
                  "hu-HU-Lilla:MAI-Voice-2.1",
                  "hu-HU-Reka:MAI-Voice-2.1",
                  "id-ID-Grant:MAI-Voice-2.1",
                  "id-ID-Harper:MAI-Voice-2.1",
                  "it-IT-Grant:MAI-Voice-2.1",
                  "it-IT-Harper:MAI-Voice-2.1",
                  "it-IT-Luca:MAI-Voice-2.1",
                  "it-IT-Rosa:MAI-Voice-2.1",
                  "ko-KR-Grant:MAI-Voice-2.1",
                  "ko-KR-Haena:MAI-Voice-2.1",
                  "ko-KR-Harper:MAI-Voice-2.1",
                  "ko-KR-Junho:MAI-Voice-2.1",
                  "nb-NO-Grant:MAI-Voice-2.1",
                  "nb-NO-Harper:MAI-Voice-2.1",
                  "nl-NL-Grant:MAI-Voice-2.1",
                  "nl-NL-Harper:MAI-Voice-2.1",
                  "nl-NL-Sander:MAI-Voice-2.1",
                  "pl-PL-Grant:MAI-Voice-2.1",
                  "pl-PL-Harper:MAI-Voice-2.1",
                  "pt-BR-Caio:MAI-Voice-2.1",
                  "pt-BR-Grant:MAI-Voice-2.1",
                  "pt-BR-Harper:MAI-Voice-2.1",
                  "pt-BR-Luana:MAI-Voice-2.1",
                  "pt-BR-Pedro:MAI-Voice-2.1",
                  "pt-BR-Rafael:MAI-Voice-2.1",
                  "pt-PT-Grant:MAI-Voice-2.1",
                  "pt-PT-Harper:MAI-Voice-2.1",
                  "pt-PT-Rui:MAI-Voice-2.1",
                  "ro-RO-Andrei:MAI-Voice-2.1",
                  "ro-RO-Elena:MAI-Voice-2.1",
                  "ro-RO-Grant:MAI-Voice-2.1",
                  "ro-RO-Harper:MAI-Voice-2.1",
                  "ro-RO-Ioana:MAI-Voice-2.1",
                  "ro-RO-Radu:MAI-Voice-2.1",
                  "ru-RU-Grant:MAI-Voice-2.1",
                  "ru-RU-Harper:MAI-Voice-2.1",
                  "ru-RU-Lev:MAI-Voice-2.1",
                  "ru-RU-Masha:MAI-Voice-2.1",
                  "sv-SE-Grant:MAI-Voice-2.1",
                  "sv-SE-Harper:MAI-Voice-2.1",
                  "th-TH-Grant:MAI-Voice-2.1",
                  "th-TH-Harper:MAI-Voice-2.1",
                  "th-TH-Krit:MAI-Voice-2.1",
                  "th-TH-Nattapong:MAI-Voice-2.1",
                  "tr-TR-Aydin:MAI-Voice-2.1",
                  "tr-TR-Elif:MAI-Voice-2.1",
                  "tr-TR-Grant:MAI-Voice-2.1",
                  "tr-TR-Harper:MAI-Voice-2.1",
                  "vi-VN-Grant:MAI-Voice-2.1",
                  "vi-VN-Harper:MAI-Voice-2.1",
                  "zh-CN-Bo:MAI-Voice-2.1",
                  "zh-CN-Grant:MAI-Voice-2.1",
                  "zh-CN-Harper:MAI-Voice-2.1",
                  "zh-CN-Lan:MAI-Voice-2.1",
                  "zh-CN-Mei:MAI-Voice-2.1",
                  "zh-CN-Wei:MAI-Voice-2.1"
                ],
                "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",
              "cs-CZ-Harper:MAI-Voice-2.1",
              "da-DK-Grant:MAI-Voice-2.1",
              "da-DK-Harper:MAI-Voice-2.1",
              "de-DE-Grant:MAI-Voice-2.1",
              "de-DE-Harper:MAI-Voice-2.1",
              "de-DE-Klaus:MAI-Voice-2.1",
              "de-DE-Mia:MAI-Voice-2.1",
              "en-AU-Isla:MAI-Voice-2.1",
              "en-GB-Emily:MAI-Voice-2.1",
              "en-GB-Harry:MAI-Voice-2.1",
              "en-IN-Dhruv:MAI-Voice-2.1",
              "en-IN-Priya:MAI-Voice-2.1",
              "en-US-Ethan:MAI-Voice-2.1",
              "en-US-Grant:MAI-Voice-2.1",
              "en-US-Harper:MAI-Voice-2.1",
              "en-US-Iris:MAI-Voice-2.1",
              "en-US-Jasper:MAI-Voice-2.1",
              "en-US-Olivia:MAI-Voice-2.1",
              "en-US-Sage:MAI-Voice-2.1",
              "es-ES-Marta:MAI-Voice-2.1",
              "es-MX-Alejo:MAI-Voice-2.1",
              "es-MX-Grant:MAI-Voice-2.1",
              "es-MX-Harper:MAI-Voice-2.1",
              "es-MX-Valeria:MAI-Voice-2.1",
              "fi-FI-Grant:MAI-Voice-2.1",
              "fi-FI-Harper:MAI-Voice-2.1",
              "fr-FR-Grant:MAI-Voice-2.1",
              "fr-FR-Harper:MAI-Voice-2.1",
              "fr-FR-Marc:MAI-Voice-2.1",
              "fr-FR-Soleil:MAI-Voice-2.1",
              "hi-IN-Arjun:MAI-Voice-2.1",
              "hi-IN-Dhruv:MAI-Voice-2.1",
              "hi-IN-Grant:MAI-Voice-2.1",
              "hi-IN-Harper:MAI-Voice-2.1",
              "hi-IN-Kavya:MAI-Voice-2.1",
              "hi-IN-Priya:MAI-Voice-2.1",
              "hu-HU-Bence:MAI-Voice-2.1",
              "hu-HU-Grant:MAI-Voice-2.1",
              "hu-HU-Harper:MAI-Voice-2.1",
              "hu-HU-Levente:MAI-Voice-2.1",
              "hu-HU-Lilla:MAI-Voice-2.1",
              "hu-HU-Reka:MAI-Voice-2.1",
              "id-ID-Grant:MAI-Voice-2.1",
              "id-ID-Harper:MAI-Voice-2.1",
              "it-IT-Grant:MAI-Voice-2.1",
              "it-IT-Harper:MAI-Voice-2.1",
              "it-IT-Luca:MAI-Voice-2.1",
              "it-IT-Rosa:MAI-Voice-2.1",
              "ko-KR-Grant:MAI-Voice-2.1",
              "ko-KR-Haena:MAI-Voice-2.1",
              "ko-KR-Harper:MAI-Voice-2.1",
              "ko-KR-Junho:MAI-Voice-2.1",
              "nb-NO-Grant:MAI-Voice-2.1",
              "nb-NO-Harper:MAI-Voice-2.1",
              "nl-NL-Grant:MAI-Voice-2.1",
              "nl-NL-Harper:MAI-Voice-2.1",
              "nl-NL-Sander:MAI-Voice-2.1",
              "pl-PL-Grant:MAI-Voice-2.1",
              "pl-PL-Harper:MAI-Voice-2.1",
              "pt-BR-Caio:MAI-Voice-2.1",
              "pt-BR-Grant:MAI-Voice-2.1",
              "pt-BR-Harper:MAI-Voice-2.1",
              "pt-BR-Luana:MAI-Voice-2.1",
              "pt-BR-Pedro:MAI-Voice-2.1",
              "pt-BR-Rafael:MAI-Voice-2.1",
              "pt-PT-Grant:MAI-Voice-2.1",
              "pt-PT-Harper:MAI-Voice-2.1",
              "pt-PT-Rui:MAI-Voice-2.1",
              "ro-RO-Andrei:MAI-Voice-2.1",
              "ro-RO-Elena:MAI-Voice-2.1",
              "ro-RO-Grant:MAI-Voice-2.1",
              "ro-RO-Harper:MAI-Voice-2.1",
              "ro-RO-Ioana:MAI-Voice-2.1",
              "ro-RO-Radu:MAI-Voice-2.1",
              "ru-RU-Grant:MAI-Voice-2.1",
              "ru-RU-Harper:MAI-Voice-2.1",
              "ru-RU-Lev:MAI-Voice-2.1",
              "ru-RU-Masha:MAI-Voice-2.1",
              "sv-SE-Grant:MAI-Voice-2.1",
              "sv-SE-Harper:MAI-Voice-2.1",
              "th-TH-Grant:MAI-Voice-2.1",
              "th-TH-Harper:MAI-Voice-2.1",
              "th-TH-Krit:MAI-Voice-2.1",
              "th-TH-Nattapong:MAI-Voice-2.1",
              "tr-TR-Aydin:MAI-Voice-2.1",
              "tr-TR-Elif:MAI-Voice-2.1",
              "tr-TR-Grant:MAI-Voice-2.1",
              "tr-TR-Harper:MAI-Voice-2.1",
              "vi-VN-Grant:MAI-Voice-2.1",
              "vi-VN-Harper:MAI-Voice-2.1",
              "zh-CN-Bo:MAI-Voice-2.1",
              "zh-CN-Grant:MAI-Voice-2.1",
              "zh-CN-Harper:MAI-Voice-2.1",
              "zh-CN-Lan:MAI-Voice-2.1",
              "zh-CN-Mei:MAI-Voice-2.1",
              "zh-CN-Wei:MAI-Voice-2.1"
            ]
          },
          "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.044000",
                "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.000044",
                "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": "53ceea2ccaa50cadb12f",
            "label": "Microsoft AI: MAI-Voice-2.1",
            "profiles": [
              {
                "basis": "",
                "dimensions": {
                  "conditions": "Oletuskokoonpano"
                },
                "label": "Microsoft AI: MAI-Voice-2.1 · Oletusasetukset",
                "units": [
                  {
                    "amount": "0.000044",
                    "amount_unit": "usd_per_exact_physical_unit",
                    "billing_input": false,
                    "key": "8d1e4e9bf0f3647249d90a3c",
                    "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\", \"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\", \"cs-CZ-Harper:MAI-Voice-2.1\", \"da-DK-Grant:MAI-Voice-2.1\", \"da-DK-Harper:MAI-Voice-2.1\", \"de-DE-Grant:MAI-Voice-2.1\", \"de-DE-Harper:MAI-Voice-2.1\", \"de-DE-Klaus:MAI-Voice-2.1\", \"de-DE-Mia:MAI-Voice-2.1\", \"en-AU-Isla:MAI-Voice-2.1\", \"en-GB-Emily:MAI-Voice-2.1\", \"en-GB-Harry:MAI-Voice-2.1\", \"en-IN-Dhruv:MAI-Voice-2.1\", \"en-IN-Priya:MAI-Voice-2.1\", \"en-US-Ethan:MAI-Voice-2.1\", \"en-US-Grant:MAI-Voice-2.1\", \"en-US-Harper:MAI-Voice-2.1\", \"en-US-Iris:MAI-Voice-2.1\", \"en-US-Jasper:MAI-Voice-2.1\", \"en-US-Olivia:MAI-Voice-2.1\", \"en-US-Sage:MAI-Voice-2.1\", \"es-ES-Marta:MAI-Voice-2.1\", \"es-MX-Alejo:MAI-Voice-2.1\", \"es-MX-Grant:MAI-Voice-2.1\", \"es-MX-Harper:MAI-Voice-2.1\", \"es-MX-Valeria:MAI-Voice-2.1\", \"fi-FI-Grant:MAI-Voice-2.1\", \"fi-FI-Harper:MAI-Voice-2.1\", \"fr-FR-Grant:MAI-Voice-2.1\", \"fr-FR-Harper:MAI-Voice-2.1\", \"fr-FR-Marc:MAI-Voice-2.1\", \"fr-FR-Soleil:MAI-Voice-2.1\", \"hi-IN-Arjun:MAI-Voice-2.1\", \"hi-IN-Dhruv:MAI-Voice-2.1\", \"hi-IN-Grant:MAI-Voice-2.1\", \"hi-IN-Harper:MAI-Voice-2.1\", \"hi-IN-Kavya:MAI-Voice-2.1\", \"hi-IN-Priya:MAI-Voice-2.1\", \"hu-HU-Bence:MAI-Voice-2.1\", \"hu-HU-Grant:MAI-Voice-2.1\", \"hu-HU-Harper:MAI-Voice-2.1\", \"hu-HU-Levente:MAI-Voice-2.1\", \"hu-HU-Lilla:MAI-Voice-2.1\", \"hu-HU-Reka:MAI-Voice-2.1\", \"id-ID-Grant:MAI-Voice-2.1\", \"id-ID-Harper:MAI-Voice-2.1\", \"it-IT-Grant:MAI-Voice-2.1\", \"it-IT-Harper:MAI-Voice-2.1\", \"it-IT-Luca:MAI-Voice-2.1\", \"it-IT-Rosa:MAI-Voice-2.1\", \"ko-KR-Grant:MAI-Voice-2.1\", \"ko-KR-Haena:MAI-Voice-2.1\", \"ko-KR-Harper:MAI-Voice-2.1\", \"ko-KR-Junho:MAI-Voice-2.1\", \"nb-NO-Grant:MAI-Voice-2.1\", \"nb-NO-Harper:MAI-Voice-2.1\", \"nl-NL-Grant:MAI-Voice-2.1\", \"nl-NL-Harper:MAI-Voice-2.1\", \"nl-NL-Sander:MAI-Voice-2.1\", \"pl-PL-Grant:MAI-Voice-2.1\", \"pl-PL-Harper:MAI-Voice-2.1\", \"pt-BR-Caio:MAI-Voice-2.1\", \"pt-BR-Grant:MAI-Voice-2.1\", \"pt-BR-Harper:MAI-Voice-2.1\", \"pt-BR-Luana:MAI-Voice-2.1\", \"pt-BR-Pedro:MAI-Voice-2.1\", \"pt-BR-Rafael:MAI-Voice-2.1\", \"pt-PT-Grant:MAI-Voice-2.1\", \"pt-PT-Harper:MAI-Voice-2.1\", \"pt-PT-Rui:MAI-Voice-2.1\", \"ro-RO-Andrei:MAI-Voice-2.1\", \"ro-RO-Elena:MAI-Voice-2.1\", \"ro-RO-Grant:MAI-Voice-2.1\", \"ro-RO-Harper:MAI-Voice-2.1\", \"ro-RO-Ioana:MAI-Voice-2.1\", \"ro-RO-Radu:MAI-Voice-2.1\", \"ru-RU-Grant:MAI-Voice-2.1\", \"ru-RU-Harper:MAI-Voice-2.1\", \"ru-RU-Lev:MAI-Voice-2.1\", \"ru-RU-Masha:MAI-Voice-2.1\", \"sv-SE-Grant:MAI-Voice-2.1\", \"sv-SE-Harper:MAI-Voice-2.1\", \"th-TH-Grant:MAI-Voice-2.1\", \"th-TH-Harper:MAI-Voice-2.1\", \"th-TH-Krit:MAI-Voice-2.1\", \"th-TH-Nattapong:MAI-Voice-2.1\", \"tr-TR-Aydin:MAI-Voice-2.1\", \"tr-TR-Elif:MAI-Voice-2.1\", \"tr-TR-Grant:MAI-Voice-2.1\", \"tr-TR-Harper:MAI-Voice-2.1\", \"vi-VN-Grant:MAI-Voice-2.1\", \"vi-VN-Harper:MAI-Voice-2.1\", \"zh-CN-Bo:MAI-Voice-2.1\", \"zh-CN-Grant:MAI-Voice-2.1\", \"zh-CN-Harper:MAI-Voice-2.1\", \"zh-CN-Lan:MAI-Voice-2.1\", \"zh-CN-Mei:MAI-Voice-2.1\", \"zh-CN-Wei:MAI-Voice-2.1\"]')\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": 4.4e-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.044000",
                "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.000044",
                "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",
        "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.044000",
            "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.000044",
            "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",
        "request_model_id": "microsoft/mai-voice-2.1",
        "route_label": "Ultra"
      }
    ],
    "name": "Microsoft AI: MAI-Voice-2.1",
    "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.000044",
            "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",
    "short": "Microsoft AI:n MAI-Voice-2.1 generoi ilmaisullista monikielistä puhetta kerrontaan, äänikirjoihin, opetussisältöön ja taustakerrontaan. Sen 23 kielen profiili tukee yhtenäistä puhujaidentiteettiä, useita puhujia ja ohjattua esitystapaa."
  },
  "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 generoi ilmaisullista monikielistä puhetta kerrontaan, äänikirjoihin, opetussisältöön ja taustakerrontaan. Sen 23 kielen profiili tukee yhtenäistä puhujaidentiteettiä, useita puhujia ja ohjattua esitystapaa.",
  "source": {
    "audit_sha256": "2e00086bcbfc28e64d0cebe97aa47c17d8d5618963027f8ffb9dc6123d7d25b1",
    "bridge_map_sha256": "1125275768b9636fc8461bc7da5061239a81ddfe508e2557843ca42c58ab0036",
    "raw_model_json_sha256": "8c91abd71066bcf6412a26912e190ddbc7418d1560e0f1b1742aa959b70d0b53",
    "renderer_sha256": "303a59603e2bc29ba8fda690e95fd32cec68de223d92e26054a88babff801dd7"
  },
  "sourceRevision": "c20c19eb677208588f457b29f48b5cd7f7b00f437a5c63d2dbdeb322db3443e8"
}
