{
  "aboutHtml": "<p>Kokoro 82M on hexgradin avoimen painojulkaisun tekstistä puheeksi -malli, jossa on kahdeksankymmentäkaksi miljoonaa parametria. Mallikortti kuvaa kompaktin, vain dekooderia käyttävän arkkitehtuurin, joka perustuu StyleTTS 2:een ja iSTFTNetiin. Kirjoitettu teksti muunnetaan ääntämistiedoksi ja sitten puheeksi valitulla äänellä. Dokumentoitu v1.0-julkaisu tarjoaa viisikymmentäneljä ääntä kahdeksalla kielellä; profiili on erillinen aiemmasta vain englantia tukevasta v0.19-julkaisusta.</p><h4>Valitse toisiaan vastaava kieli ja ääni</h4><p>Äänivalikoima kattaa amerikan- ja brittienglannin, japanin, mandariinikiinan, espanjan, ranskan, hindin, italian ja brasilianportugalin. Kaksi englannin aksenttia ovat yhden kielen variantteja. Ääninimet ja kieliasetukset kuuluvat yhteen: af_heart on amerikanenglannin esimerkki virallisessa työnkulussa, ja valikoimassa on erilliset ryhmät muille kielille ja aksenteille.</p><p>Valitse puhuja sen luettavan aineiston perusteella. Lyhyt kurssikerronta voi käyttää yhtä yhtenäistä valmista ääntä kaikissa osissaan; monikielinen kokoelma voi valita äänen jokaisesta tarvittavasta kieliryhmästä. Valikoiman kattavuus vaihtelee ryhmien välillä. Ranskaa edustaa esimerkiksi yksi lueteltu ääni englannin laajemman valikoiman sijaan.</p><h4>Valmistele ääntäminen ja katkelmat</h4><p>Kokoron viiteputki muuntaa kirjoitetut muodot foneemeiksi. Esimerkit sallivat termin nimenomaisen foneettisen lukutavan, joten vaikean nimen voi valmistella sen sijaan, että sen jättäisi monitulkintaisen kirjoitusasun varaan. Pidä ympäröivä lause luontevana ja säilytä sanamuoto, joka kuulijan tulee kuulla.</p><p>Käytännön katkelma on: ”Oppaassa on kolme osaa. Valitse ensin aineisto. Vertaa seuraavaksi esimerkkejä. Tallenna lopuksi versio, jota haluat käyttää.” Kirjoita kokonaisia ilmauksia ja säilytä välimerkkien osoittamat tauot. Jäsennä pitkän teoksen syöte johdonmukaisiksi kappaleiksi sen sijaan, että käsittelisit koko asiakirjaa yhtenä keskeytymättömänä ilmauksena.</p><p>Ääniopas kertoo monien puhujien toimivan parhaiten noin 100–200 tokenin katkelmilla noin 500 tokenin jänteen sisällä. Se mainitsee heikkouksia hyvin lyhyissä ilmauksissa, erityisesti alle 10–20 tokenissa, ja taipumuksen kiirehtiä pidempiä katkelmia, erityisesti yli 400 tokenissa. Nämä ovat tokenipohjaisia valmisteluhavaintoja, eivät sanamäärä- tai tallenteen kestorajoja. Lyhyiden fragmenttien yhdistäminen tai pitkän katkelman jakaminen voi antaa sopivamman puheyksikön.</p><h4>Äänituloste ja tahti</h4><p>Virallinen työnkulku tuottaa jokaiselle generoidulle segmentille käsitellyn tekstin, foneemit ja äänituloksen. Se tallentaa segmentit WAV-muodossa 24 000 Hz:n taajuudella ja tarjoaa nopeusasetuksen viiteputkessa. Säilytä segmentin tekstin ja järjestyksen yhteys ääneen, jotta koottu kerronta seuraa tarkoitettua käsikirjoitusta.</p><p>Hyödyllinen editointitarkistus on kuunnella kahden katkelman rajan yli ja tarkistaa sitten toistuvat nimet sekä luetteloiden tahti. Äänituloste ja foneeminäkymä palvelevat eri tarkoituksia: toinen on kuulijan kuulema tallenne, toinen auttaa tarkistamaan kirjoitetun tekstin ääntämistä.</p><h4>Kielikattavuus ja hyödylliset rajat</h4><p>Valmistaja huomauttaa nimenomaisesti, että muiden kuin englannin tuki voi olla ohutta rajallisen ääntämiskäsittelyn tai äänien koulutusaineiston vuoksi. Valmiita ääniryhmiä ei siksi pidä pitää samanarvoisina esitystakuina jokaiseen katkelmaan. Valitse sopiva puhuja ja tarkista tehtävän vaatimat todelliset nimet ja ilmaukset.</p><p>Hyödyllinen tuotos on puhuttu katkelma tai koottu kerronta dokumentoidulla valmiilla äänellä, ja teksti valmistellaan sen ääntämis- ja katkelmapituustarpeiden mukaan. Tämä profiili seuraa valmistajan v1.0 Kokoro 82M -aineistoja; toisella tarkistuspisteellä, kvantisoidulla toteutuksella tai ulkoisesti muokatulla äänellä on oma tekninen rajauksensa.</p>",
  "aboutText": "Kokoro 82M on hexgradin avoimen painojulkaisun tekstistä puheeksi -malli, jossa on kahdeksankymmentäkaksi miljoonaa parametria. Mallikortti kuvaa kompaktin, vain dekooderia käyttävän arkkitehtuurin, joka perustuu StyleTTS 2:een ja iSTFTNetiin. Kirjoitettu teksti muunnetaan ääntämistiedoksi ja sitten puheeksi valitulla äänellä. Dokumentoitu v1.0-julkaisu tarjoaa viisikymmentäneljä ääntä kahdeksalla kielellä; profiili on erillinen aiemmasta vain englantia tukevasta v0.19-julkaisusta.\n\n### Valitse toisiaan vastaava kieli ja ääni\n\nÄänivalikoima kattaa amerikan- ja brittienglannin, japanin, mandariinikiinan, espanjan, ranskan, hindin, italian ja brasilianportugalin. Kaksi englannin aksenttia ovat yhden kielen variantteja. Ääninimet ja kieliasetukset kuuluvat yhteen: af_heart on amerikanenglannin esimerkki virallisessa työnkulussa, ja valikoimassa on erilliset ryhmät muille kielille ja aksenteille.\n\nValitse puhuja sen luettavan aineiston perusteella. Lyhyt kurssikerronta voi käyttää yhtä yhtenäistä valmista ääntä kaikissa osissaan; monikielinen kokoelma voi valita äänen jokaisesta tarvittavasta kieliryhmästä. Valikoiman kattavuus vaihtelee ryhmien välillä. Ranskaa edustaa esimerkiksi yksi lueteltu ääni englannin laajemman valikoiman sijaan.\n\n### Valmistele ääntäminen ja katkelmat\n\nKokoron viiteputki muuntaa kirjoitetut muodot foneemeiksi. Esimerkit sallivat termin nimenomaisen foneettisen lukutavan, joten vaikean nimen voi valmistella sen sijaan, että sen jättäisi monitulkintaisen kirjoitusasun varaan. Pidä ympäröivä lause luontevana ja säilytä sanamuoto, joka kuulijan tulee kuulla.\n\nKäytännön katkelma on: ”Oppaassa on kolme osaa. Valitse ensin aineisto. Vertaa seuraavaksi esimerkkejä. Tallenna lopuksi versio, jota haluat käyttää.” Kirjoita kokonaisia ilmauksia ja säilytä välimerkkien osoittamat tauot. Jäsennä pitkän teoksen syöte johdonmukaisiksi kappaleiksi sen sijaan, että käsittelisit koko asiakirjaa yhtenä keskeytymättömänä ilmauksena.\n\nÄäniopas kertoo monien puhujien toimivan parhaiten noin 100–200 tokenin katkelmilla noin 500 tokenin jänteen sisällä. Se mainitsee heikkouksia hyvin lyhyissä ilmauksissa, erityisesti alle 10–20 tokenissa, ja taipumuksen kiirehtiä pidempiä katkelmia, erityisesti yli 400 tokenissa. Nämä ovat tokenipohjaisia valmisteluhavaintoja, eivät sanamäärä- tai tallenteen kestorajoja. Lyhyiden fragmenttien yhdistäminen tai pitkän katkelman jakaminen voi antaa sopivamman puheyksikön.\n\n### Äänituloste ja tahti\n\nVirallinen työnkulku tuottaa jokaiselle generoidulle segmentille käsitellyn tekstin, foneemit ja äänituloksen. Se tallentaa segmentit WAV-muodossa 24 000 Hz:n taajuudella ja tarjoaa nopeusasetuksen viiteputkessa. Säilytä segmentin tekstin ja järjestyksen yhteys ääneen, jotta koottu kerronta seuraa tarkoitettua käsikirjoitusta.\n\nHyödyllinen editointitarkistus on kuunnella kahden katkelman rajan yli ja tarkistaa sitten toistuvat nimet sekä luetteloiden tahti. Äänituloste ja foneeminäkymä palvelevat eri tarkoituksia: toinen on kuulijan kuulema tallenne, toinen auttaa tarkistamaan kirjoitetun tekstin ääntämistä.\n\n### Kielikattavuus ja hyödylliset rajat\n\nValmistaja huomauttaa nimenomaisesti, että muiden kuin englannin tuki voi olla ohutta rajallisen ääntämiskäsittelyn tai äänien koulutusaineiston vuoksi. Valmiita ääniryhmiä ei siksi pidä pitää samanarvoisina esitystakuina jokaiseen katkelmaan. Valitse sopiva puhuja ja tarkista tehtävän vaatimat todelliset nimet ja ilmaukset.\n\nHyödyllinen tuotos on puhuttu katkelma tai koottu kerronta dokumentoidulla valmiilla äänellä, ja teksti valmistellaan sen ääntämis- ja katkelmapituustarpeiden mukaan. Tämä profiili seuraa valmistajan v1.0 Kokoro 82M -aineistoja; toisella tarkistuspisteellä, kvantisoidulla toteutuksella tai ulkoisesti muokatulla äänellä on oma tekninen rajauksensa.",
  "editorialOverlay": {
    "copy_fields": null,
    "copy_sha256": null,
    "copy_source": null,
    "html_sha256": "0a0c19b0d74e3e8aadee84fcafa13d97b2769d3a2f225792c19294f804cb5620",
    "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\">hexgrad: Kokoro 82M</h2><button class=\"icon-btn\" type=\"button\" data-close-sheet aria-label=\"Sulje\">×</button></div><div class=\"idline\"><span>hexgrad /</span><code>hexgrad/kokoro-82m</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|hexgrad%2Fkokoro-82m\">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\">hexgradin Kokoro 82M generoi puhetta kompaktilla 82 miljoonan parametrin mallilla ja kielikohtaisella valmiilla äänellä. Sen dokumentoitu v1.0-profiili sisältää kahdeksan kieltä, 54 ääntä ja 24 kHz:n äänitulosteen.</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>Kokoro 82M on hexgradin avoimen painojulkaisun tekstistä puheeksi -malli, jossa on kahdeksankymmentäkaksi miljoonaa parametria. Mallikortti kuvaa kompaktin, vain dekooderia käyttävän arkkitehtuurin, joka perustuu StyleTTS 2:een ja iSTFTNetiin. Kirjoitettu teksti muunnetaan ääntämistiedoksi ja sitten puheeksi valitulla äänellä. Dokumentoitu v1.0-julkaisu tarjoaa viisikymmentäneljä ääntä kahdeksalla kielellä; profiili on erillinen aiemmasta vain englantia tukevasta v0.19-julkaisusta.</p><h4>Valitse toisiaan vastaava kieli ja ääni</h4><p>Äänivalikoima kattaa amerikan- ja brittienglannin, japanin, mandariinikiinan, espanjan, ranskan, hindin, italian ja brasilianportugalin. Kaksi englannin aksenttia ovat yhden kielen variantteja. Ääninimet ja kieliasetukset kuuluvat yhteen: af_heart on amerikanenglannin esimerkki virallisessa työnkulussa, ja valikoimassa on erilliset ryhmät muille kielille ja aksenteille.</p><p>Valitse puhuja sen luettavan aineiston perusteella. Lyhyt kurssikerronta voi käyttää yhtä yhtenäistä valmista ääntä kaikissa osissaan; monikielinen kokoelma voi valita äänen jokaisesta tarvittavasta kieliryhmästä. Valikoiman kattavuus vaihtelee ryhmien välillä. Ranskaa edustaa esimerkiksi yksi lueteltu ääni englannin laajemman valikoiman sijaan.</p><h4>Valmistele ääntäminen ja katkelmat</h4><p>Kokoron viiteputki muuntaa kirjoitetut muodot foneemeiksi. Esimerkit sallivat termin nimenomaisen foneettisen lukutavan, joten vaikean nimen voi valmistella sen sijaan, että sen jättäisi monitulkintaisen kirjoitusasun varaan. Pidä ympäröivä lause luontevana ja säilytä sanamuoto, joka kuulijan tulee kuulla.</p><p>Käytännön katkelma on: ”Oppaassa on kolme osaa. Valitse ensin aineisto. Vertaa seuraavaksi esimerkkejä. Tallenna lopuksi versio, jota haluat käyttää.” Kirjoita kokonaisia ilmauksia ja säilytä välimerkkien osoittamat tauot. Jäsennä pitkän teoksen syöte johdonmukaisiksi kappaleiksi sen sijaan, että käsittelisit koko asiakirjaa yhtenä keskeytymättömänä ilmauksena.</p><p>Ääniopas kertoo monien puhujien toimivan parhaiten noin 100–200 tokenin katkelmilla noin 500 tokenin jänteen sisällä. Se mainitsee heikkouksia hyvin lyhyissä ilmauksissa, erityisesti alle 10–20 tokenissa, ja taipumuksen kiirehtiä pidempiä katkelmia, erityisesti yli 400 tokenissa. Nämä ovat tokenipohjaisia valmisteluhavaintoja, eivät sanamäärä- tai tallenteen kestorajoja. Lyhyiden fragmenttien yhdistäminen tai pitkän katkelman jakaminen voi antaa sopivamman puheyksikön.</p><h4>Äänituloste ja tahti</h4><p>Virallinen työnkulku tuottaa jokaiselle generoidulle segmentille käsitellyn tekstin, foneemit ja äänituloksen. Se tallentaa segmentit WAV-muodossa 24 000 Hz:n taajuudella ja tarjoaa nopeusasetuksen viiteputkessa. Säilytä segmentin tekstin ja järjestyksen yhteys ääneen, jotta koottu kerronta seuraa tarkoitettua käsikirjoitusta.</p><p>Hyödyllinen editointitarkistus on kuunnella kahden katkelman rajan yli ja tarkistaa sitten toistuvat nimet sekä luetteloiden tahti. Äänituloste ja foneeminäkymä palvelevat eri tarkoituksia: toinen on kuulijan kuulema tallenne, toinen auttaa tarkistamaan kirjoitetun tekstin ääntämistä.</p><h4>Kielikattavuus ja hyödylliset rajat</h4><p>Valmistaja huomauttaa nimenomaisesti, että muiden kuin englannin tuki voi olla ohutta rajallisen ääntämiskäsittelyn tai äänien koulutusaineiston vuoksi. Valmiita ääniryhmiä ei siksi pidä pitää samanarvoisina esitystakuina jokaiseen katkelmaan. Valitse sopiva puhuja ja tarkista tehtävän vaatimat todelliset nimet ja ilmaukset.</p><p>Hyödyllinen tuotos on puhuttu katkelma tai koottu kerronta dokumentoidulla valmiilla äänellä, ja teksti valmistellaan sen ääntämis- ja katkelmapituustarpeiden mukaan. Tämä profiili seuraa valmistajan v1.0 Kokoro 82M -aineistoja; toisella tarkistuspisteellä, kvantisoidulla toteutuksella tai ulkoisesti muokatulla äänellä on oma tekninen rajauksensa.</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>hexgrad/kokoro-82m</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>af_alloy, af_aoede, af_bella, af_heart, af_jessica, af_kore, af_nicole, af_nova, af_river, af_sarah, af_sky, am_adam, am_echo, am_eric, am_fenrir, am_liam, am_michael, am_onyx, am_puck, am_santa, bf_alice, bf_emma, bf_isabella, bf_lily, bm_daniel, bm_fable, bm_george, bm_lewis, ef_dora, em_alex, em_santa, ff_siwis, hf_alpha, hf_beta, hm_omega, hm_psi, if_sara, im_nicola, jf_alpha, jf_gongitsune, jf_nezumi, jf_tebukuro, jm_kumo, pf_dora, pm_alex, pm_santa, zf_xiaobei, zf_xiaoni, zf_xiaoxiao, zf_xiaoyi, zm_yunjian, zm_yunxi, zm_yunxia, zm_yunyang</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>af_alloy, af_aoede, af_bella, af_heart, af_jessica, af_kore, af_nicole, af_nova, af_river, af_sarah, af_sky, am_adam, am_echo, am_eric, am_fenrir, am_liam, am_michael, am_onyx, am_puck, am_santa, bf_alice, bf_emma, bf_isabella, bf_lily, bm_daniel, bm_fable, bm_george, bm_lewis, ef_dora, em_alex, em_santa, ff_siwis, hf_alpha, hf_beta, hm_omega, hm_psi, if_sara, im_nicola, jf_alpha, jf_gongitsune, jf_nezumi, jf_tebukuro, jm_kumo, pf_dora, pm_alex, pm_santa, zf_xiaobei, zf_xiaoni, zf_xiaoxiao, zf_xiaoyi, zm_yunjian, zm_yunxi, zm_yunxia, zm_yunyang</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.008</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>hexgrad: Kokoro 82M</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>hexgrad: Kokoro 82M · 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,00000124 $</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-1709-tab-0\" role=\"tab\" type=\"button\" aria-controls=\"model-code-1709-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-1709-panel-0\" role=\"tabpanel\" aria-labelledby=\"model-code-1709-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;hexgrad/kokoro-82m&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;af_alloy&quot;, &quot;af_aoede&quot;, &quot;af_bella&quot;, &quot;af_heart&quot;, &quot;af_jessica&quot;, &quot;af_kore&quot;, &quot;af_nicole&quot;, &quot;af_nova&quot;, &quot;af_river&quot;, &quot;af_sarah&quot;, &quot;af_sky&quot;, &quot;am_adam&quot;, &quot;am_echo&quot;, &quot;am_eric&quot;, &quot;am_fenrir&quot;, &quot;am_liam&quot;, &quot;am_michael&quot;, &quot;am_onyx&quot;, &quot;am_puck&quot;, &quot;am_santa&quot;, &quot;bf_alice&quot;, &quot;bf_emma&quot;, &quot;bf_isabella&quot;, &quot;bf_lily&quot;, &quot;bm_daniel&quot;, &quot;bm_fable&quot;, &quot;bm_george&quot;, &quot;bm_lewis&quot;, &quot;ef_dora&quot;, &quot;em_alex&quot;, &quot;em_santa&quot;, &quot;ff_siwis&quot;, &quot;hf_alpha&quot;, &quot;hf_beta&quot;, &quot;hm_omega&quot;, &quot;hm_psi&quot;, &quot;if_sara&quot;, &quot;im_nicola&quot;, &quot;jf_alpha&quot;, &quot;jf_gongitsune&quot;, &quot;jf_nezumi&quot;, &quot;jf_tebukuro&quot;, &quot;jm_kumo&quot;, &quot;pf_dora&quot;, &quot;pm_alex&quot;, &quot;pm_santa&quot;, &quot;zf_xiaobei&quot;, &quot;zf_xiaoni&quot;, &quot;zf_xiaoxiao&quot;, &quot;zf_xiaoyi&quot;, &quot;zm_yunjian&quot;, &quot;zm_yunxi&quot;, &quot;zm_yunxia&quot;, &quot;zm_yunyang&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-1710-tab-0\" role=\"tab\" type=\"button\" aria-controls=\"model-code-1710-panel-0\" aria-selected=\"true\" tabindex=\"0\">Mediakirjasto</button><button class=\"cg-tab\" id=\"model-code-1710-tab-1\" role=\"tab\" type=\"button\" aria-controls=\"model-code-1710-panel-1\" aria-selected=\"false\" tabindex=\"-1\">Tehtävän tila</button><button class=\"cg-tab\" id=\"model-code-1710-tab-2\" role=\"tab\" type=\"button\" aria-controls=\"model-code-1710-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-1710-panel-0\" role=\"tabpanel\" aria-labelledby=\"model-code-1710-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-1710-panel-1\" role=\"tabpanel\" aria-labelledby=\"model-code-1710-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-1710-panel-2\" role=\"tabpanel\" aria-labelledby=\"model-code-1710-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=hexgrad%2Fkokoro-82m&amp;route=Ultra&amp;caller=hexgrad%2Fkokoro-82m&amp;fmt=speech\"><code>hexgrad/kokoro-82m</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=hexgrad%2Fkokoro-82m&amp;route=Ultra&amp;caller=hexgrad%2Fkokoro-82m&amp;fmt=speech\"><code>hexgrad/kokoro-82m</code></a></p></section></div>",
      "method_identity": {
        "effective_request_model_id": "hexgrad/kokoro-82m",
        "fmt": "speech",
        "http": "POST",
        "path": "/v1/audio/speech",
        "request_model_id": "hexgrad/kokoro-82m",
        "route_label": "Ultra"
      },
      "method_key": "Ultra|speech|/v1/audio/speech|hexgrad%2Fkokoro-82m",
      "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": [
                  "hexgrad/kokoro-82m"
                ],
                "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": [
                  "af_alloy",
                  "af_aoede",
                  "af_bella",
                  "af_heart",
                  "af_jessica",
                  "af_kore",
                  "af_nicole",
                  "af_nova",
                  "af_river",
                  "af_sarah",
                  "af_sky",
                  "am_adam",
                  "am_echo",
                  "am_eric",
                  "am_fenrir",
                  "am_liam",
                  "am_michael",
                  "am_onyx",
                  "am_puck",
                  "am_santa",
                  "bf_alice",
                  "bf_emma",
                  "bf_isabella",
                  "bf_lily",
                  "bm_daniel",
                  "bm_fable",
                  "bm_george",
                  "bm_lewis",
                  "ef_dora",
                  "em_alex",
                  "em_santa",
                  "ff_siwis",
                  "hf_alpha",
                  "hf_beta",
                  "hm_omega",
                  "hm_psi",
                  "if_sara",
                  "im_nicola",
                  "jf_alpha",
                  "jf_gongitsune",
                  "jf_nezumi",
                  "jf_tebukuro",
                  "jm_kumo",
                  "pf_dora",
                  "pm_alex",
                  "pm_santa",
                  "zf_xiaobei",
                  "zf_xiaoni",
                  "zf_xiaoxiao",
                  "zf_xiaoyi",
                  "zm_yunjian",
                  "zm_yunxi",
                  "zm_yunxia",
                  "zm_yunyang"
                ],
                "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": [
              "af_alloy",
              "af_aoede",
              "af_bella",
              "af_heart",
              "af_jessica",
              "af_kore",
              "af_nicole",
              "af_nova",
              "af_river",
              "af_sarah",
              "af_sky",
              "am_adam",
              "am_echo",
              "am_eric",
              "am_fenrir",
              "am_liam",
              "am_michael",
              "am_onyx",
              "am_puck",
              "am_santa",
              "bf_alice",
              "bf_emma",
              "bf_isabella",
              "bf_lily",
              "bm_daniel",
              "bm_fable",
              "bm_george",
              "bm_lewis",
              "ef_dora",
              "em_alex",
              "em_santa",
              "ff_siwis",
              "hf_alpha",
              "hf_beta",
              "hm_omega",
              "hm_psi",
              "if_sara",
              "im_nicola",
              "jf_alpha",
              "jf_gongitsune",
              "jf_nezumi",
              "jf_tebukuro",
              "jm_kumo",
              "pf_dora",
              "pm_alex",
              "pm_santa",
              "zf_xiaobei",
              "zf_xiaoni",
              "zf_xiaoxiao",
              "zf_xiaoyi",
              "zm_yunjian",
              "zm_yunxi",
              "zm_yunxia",
              "zm_yunyang"
            ]
          },
          "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.008000",
                "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.000008",
                "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": "e43e93397bc0f4d8af3d",
            "label": "hexgrad: Kokoro 82M",
            "profiles": [
              {
                "basis": "",
                "dimensions": {
                  "conditions": "Oletuskokoonpano"
                },
                "label": "hexgrad: Kokoro 82M · Oletusasetukset",
                "units": [
                  {
                    "amount": "0.00000124",
                    "amount_unit": "usd_per_exact_physical_unit",
                    "billing_input": false,
                    "key": "2e6b47581d2d5355918a9389",
                    "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\": \"hexgrad/kokoro-82m\", \"input\": \"Good afternoon! This is a short voice take.\"}')\nvoice=os.environ[\"AILOOT_VOICE_ID\"]\nallowed=json.loads('[\"af_alloy\", \"af_aoede\", \"af_bella\", \"af_heart\", \"af_jessica\", \"af_kore\", \"af_nicole\", \"af_nova\", \"af_river\", \"af_sarah\", \"af_sky\", \"am_adam\", \"am_echo\", \"am_eric\", \"am_fenrir\", \"am_liam\", \"am_michael\", \"am_onyx\", \"am_puck\", \"am_santa\", \"bf_alice\", \"bf_emma\", \"bf_isabella\", \"bf_lily\", \"bm_daniel\", \"bm_fable\", \"bm_george\", \"bm_lewis\", \"ef_dora\", \"em_alex\", \"em_santa\", \"ff_siwis\", \"hf_alpha\", \"hf_beta\", \"hm_omega\", \"hm_psi\", \"if_sara\", \"im_nicola\", \"jf_alpha\", \"jf_gongitsune\", \"jf_nezumi\", \"jf_tebukuro\", \"jm_kumo\", \"pf_dora\", \"pm_alex\", \"pm_santa\", \"zf_xiaobei\", \"zf_xiaoni\", \"zf_xiaoxiao\", \"zf_xiaoyi\", \"zm_yunjian\", \"zm_yunxi\", \"zm_yunxia\", \"zm_yunyang\"]')\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": 8e-06
          }
        },
        "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.008000",
                "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.000008",
                "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": "hexgrad/kokoro-82m",
        "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.008000",
            "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.000008",
            "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": "hexgrad/kokoro-82m",
  "nativeProvenance": {
    "input_facts_canonical_sha256": "5579f3e8c447f92c9751505a33e1c143810e4e554495c4da9e14ff1e5a315662",
    "input_html_sha256": "670982c5e220decc8b4863e833c21b3bafbf9c4caa2cae3206ec2e98a6d6bc25",
    "private_audit_sha256": "4c49278a81807837bc3955c200b3ab5212742314be7ad5396fae2fa16224863c",
    "role": "historical-normalized-input-audit-hashes",
    "schema": "ailoot-native-model-provenance-v2"
  },
  "page": {
    "canonical": "https://ailoot.ai/models/fi/hexgrad-kokoro-82m/",
    "description": "hexgradin Kokoro 82M generoi puhetta kompaktilla 82 miljoonan parametrin mallilla ja kielikohtaisella valmiilla äänellä. Sen dokumentoitu v1.0-profiili sisältää kahdeksan kieltä, 54 ääntä ja 24 kHz:n äänitulosteen.",
    "locale": "fi",
    "md_url": "https://ailoot.ai/models/fi/hexgrad-kokoro-82m/index.md",
    "title": "hexgrad: Kokoro 82M — Ailoot",
    "url": "https://ailoot.ai/models/fi/hexgrad-kokoro-82m/"
  },
  "rawModel": {
    "about": "Kokoro 82M on hexgradin avoimen painojulkaisun tekstistä puheeksi -malli, jossa on kahdeksankymmentäkaksi miljoonaa parametria. Mallikortti kuvaa kompaktin, vain dekooderia käyttävän arkkitehtuurin, joka perustuu StyleTTS 2:een ja iSTFTNetiin. Kirjoitettu teksti muunnetaan ääntämistiedoksi ja sitten puheeksi valitulla äänellä. Dokumentoitu v1.0-julkaisu tarjoaa viisikymmentäneljä ääntä kahdeksalla kielellä; profiili on erillinen aiemmasta vain englantia tukevasta v0.19-julkaisusta.\n\n### Valitse toisiaan vastaava kieli ja ääni\n\nÄänivalikoima kattaa amerikan- ja brittienglannin, japanin, mandariinikiinan, espanjan, ranskan, hindin, italian ja brasilianportugalin. Kaksi englannin aksenttia ovat yhden kielen variantteja. Ääninimet ja kieliasetukset kuuluvat yhteen: af_heart on amerikanenglannin esimerkki virallisessa työnkulussa, ja valikoimassa on erilliset ryhmät muille kielille ja aksenteille.\n\nValitse puhuja sen luettavan aineiston perusteella. Lyhyt kurssikerronta voi käyttää yhtä yhtenäistä valmista ääntä kaikissa osissaan; monikielinen kokoelma voi valita äänen jokaisesta tarvittavasta kieliryhmästä. Valikoiman kattavuus vaihtelee ryhmien välillä. Ranskaa edustaa esimerkiksi yksi lueteltu ääni englannin laajemman valikoiman sijaan.\n\n### Valmistele ääntäminen ja katkelmat\n\nKokoron viiteputki muuntaa kirjoitetut muodot foneemeiksi. Esimerkit sallivat termin nimenomaisen foneettisen lukutavan, joten vaikean nimen voi valmistella sen sijaan, että sen jättäisi monitulkintaisen kirjoitusasun varaan. Pidä ympäröivä lause luontevana ja säilytä sanamuoto, joka kuulijan tulee kuulla.\n\nKäytännön katkelma on: ”Oppaassa on kolme osaa. Valitse ensin aineisto. Vertaa seuraavaksi esimerkkejä. Tallenna lopuksi versio, jota haluat käyttää.” Kirjoita kokonaisia ilmauksia ja säilytä välimerkkien osoittamat tauot. Jäsennä pitkän teoksen syöte johdonmukaisiksi kappaleiksi sen sijaan, että käsittelisit koko asiakirjaa yhtenä keskeytymättömänä ilmauksena.\n\nÄäniopas kertoo monien puhujien toimivan parhaiten noin 100–200 tokenin katkelmilla noin 500 tokenin jänteen sisällä. Se mainitsee heikkouksia hyvin lyhyissä ilmauksissa, erityisesti alle 10–20 tokenissa, ja taipumuksen kiirehtiä pidempiä katkelmia, erityisesti yli 400 tokenissa. Nämä ovat tokenipohjaisia valmisteluhavaintoja, eivät sanamäärä- tai tallenteen kestorajoja. Lyhyiden fragmenttien yhdistäminen tai pitkän katkelman jakaminen voi antaa sopivamman puheyksikön.\n\n### Äänituloste ja tahti\n\nVirallinen työnkulku tuottaa jokaiselle generoidulle segmentille käsitellyn tekstin, foneemit ja äänituloksen. Se tallentaa segmentit WAV-muodossa 24 000 Hz:n taajuudella ja tarjoaa nopeusasetuksen viiteputkessa. Säilytä segmentin tekstin ja järjestyksen yhteys ääneen, jotta koottu kerronta seuraa tarkoitettua käsikirjoitusta.\n\nHyödyllinen editointitarkistus on kuunnella kahden katkelman rajan yli ja tarkistaa sitten toistuvat nimet sekä luetteloiden tahti. Äänituloste ja foneeminäkymä palvelevat eri tarkoituksia: toinen on kuulijan kuulema tallenne, toinen auttaa tarkistamaan kirjoitetun tekstin ääntämistä.\n\n### Kielikattavuus ja hyödylliset rajat\n\nValmistaja huomauttaa nimenomaisesti, että muiden kuin englannin tuki voi olla ohutta rajallisen ääntämiskäsittelyn tai äänien koulutusaineiston vuoksi. Valmiita ääniryhmiä ei siksi pidä pitää samanarvoisina esitystakuina jokaiseen katkelmaan. Valitse sopiva puhuja ja tarkista tehtävän vaatimat todelliset nimet ja ilmaukset.\n\nHyödyllinen tuotos on puhuttu katkelma tai koottu kerronta dokumentoidulla valmiilla äänellä, ja teksti valmistellaan sen ääntämis- ja katkelmapituustarpeiden mukaan. Tämä profiili seuraa valmistajan v1.0 Kokoro 82M -aineistoja; toisella tarkistuspisteellä, kvantisoidulla toteutuksella tai ulkoisesti muokatulla äänellä on oma tekninen rajauksensa.",
    "alias_of": null,
    "aliases": [],
    "author": "hexgrad",
    "available": null,
    "canonical_model": "hexgrad/kokoro-82m",
    "capabilities": {
      "context_length": 4096,
      "manufacturer_input": [
        "text"
      ],
      "manufacturer_output": [
        "speech"
      ]
    },
    "card_routes": [
      {
        "label": "Ultra",
        "rates": [
          {
            "amount": "0.008000",
            "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.000008",
            "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": "hexgrad/kokoro-82m",
    "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": [
                  "hexgrad/kokoro-82m"
                ],
                "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": [
                  "af_alloy",
                  "af_aoede",
                  "af_bella",
                  "af_heart",
                  "af_jessica",
                  "af_kore",
                  "af_nicole",
                  "af_nova",
                  "af_river",
                  "af_sarah",
                  "af_sky",
                  "am_adam",
                  "am_echo",
                  "am_eric",
                  "am_fenrir",
                  "am_liam",
                  "am_michael",
                  "am_onyx",
                  "am_puck",
                  "am_santa",
                  "bf_alice",
                  "bf_emma",
                  "bf_isabella",
                  "bf_lily",
                  "bm_daniel",
                  "bm_fable",
                  "bm_george",
                  "bm_lewis",
                  "ef_dora",
                  "em_alex",
                  "em_santa",
                  "ff_siwis",
                  "hf_alpha",
                  "hf_beta",
                  "hm_omega",
                  "hm_psi",
                  "if_sara",
                  "im_nicola",
                  "jf_alpha",
                  "jf_gongitsune",
                  "jf_nezumi",
                  "jf_tebukuro",
                  "jm_kumo",
                  "pf_dora",
                  "pm_alex",
                  "pm_santa",
                  "zf_xiaobei",
                  "zf_xiaoni",
                  "zf_xiaoxiao",
                  "zf_xiaoyi",
                  "zm_yunjian",
                  "zm_yunxi",
                  "zm_yunxia",
                  "zm_yunyang"
                ],
                "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": [
              "af_alloy",
              "af_aoede",
              "af_bella",
              "af_heart",
              "af_jessica",
              "af_kore",
              "af_nicole",
              "af_nova",
              "af_river",
              "af_sarah",
              "af_sky",
              "am_adam",
              "am_echo",
              "am_eric",
              "am_fenrir",
              "am_liam",
              "am_michael",
              "am_onyx",
              "am_puck",
              "am_santa",
              "bf_alice",
              "bf_emma",
              "bf_isabella",
              "bf_lily",
              "bm_daniel",
              "bm_fable",
              "bm_george",
              "bm_lewis",
              "ef_dora",
              "em_alex",
              "em_santa",
              "ff_siwis",
              "hf_alpha",
              "hf_beta",
              "hm_omega",
              "hm_psi",
              "if_sara",
              "im_nicola",
              "jf_alpha",
              "jf_gongitsune",
              "jf_nezumi",
              "jf_tebukuro",
              "jm_kumo",
              "pf_dora",
              "pm_alex",
              "pm_santa",
              "zf_xiaobei",
              "zf_xiaoni",
              "zf_xiaoxiao",
              "zf_xiaoyi",
              "zm_yunjian",
              "zm_yunxi",
              "zm_yunxia",
              "zm_yunyang"
            ]
          },
          "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.008000",
                "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.000008",
                "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": "e43e93397bc0f4d8af3d",
            "label": "hexgrad: Kokoro 82M",
            "profiles": [
              {
                "basis": "",
                "dimensions": {
                  "conditions": "Oletuskokoonpano"
                },
                "label": "hexgrad: Kokoro 82M · Oletusasetukset",
                "units": [
                  {
                    "amount": "0.00000124",
                    "amount_unit": "usd_per_exact_physical_unit",
                    "billing_input": false,
                    "key": "2e6b47581d2d5355918a9389",
                    "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\": \"hexgrad/kokoro-82m\", \"input\": \"Good afternoon! This is a short voice take.\"}')\nvoice=os.environ[\"AILOOT_VOICE_ID\"]\nallowed=json.loads('[\"af_alloy\", \"af_aoede\", \"af_bella\", \"af_heart\", \"af_jessica\", \"af_kore\", \"af_nicole\", \"af_nova\", \"af_river\", \"af_sarah\", \"af_sky\", \"am_adam\", \"am_echo\", \"am_eric\", \"am_fenrir\", \"am_liam\", \"am_michael\", \"am_onyx\", \"am_puck\", \"am_santa\", \"bf_alice\", \"bf_emma\", \"bf_isabella\", \"bf_lily\", \"bm_daniel\", \"bm_fable\", \"bm_george\", \"bm_lewis\", \"ef_dora\", \"em_alex\", \"em_santa\", \"ff_siwis\", \"hf_alpha\", \"hf_beta\", \"hm_omega\", \"hm_psi\", \"if_sara\", \"im_nicola\", \"jf_alpha\", \"jf_gongitsune\", \"jf_nezumi\", \"jf_tebukuro\", \"jm_kumo\", \"pf_dora\", \"pm_alex\", \"pm_santa\", \"zf_xiaobei\", \"zf_xiaoni\", \"zf_xiaoxiao\", \"zf_xiaoyi\", \"zm_yunjian\", \"zm_yunxi\", \"zm_yunxia\", \"zm_yunyang\"]')\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": 8e-06
          }
        },
        "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.008000",
                "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.000008",
                "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": "hexgrad/kokoro-82m",
        "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.008000",
            "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.000008",
            "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": "hexgrad/kokoro-82m",
        "request_model_id": "hexgrad/kokoro-82m",
        "route_label": "Ultra"
      }
    ],
    "name": "hexgrad: Kokoro 82M",
    "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.000008",
            "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": "hexgrad/kokoro-82m",
    "short": "hexgradin Kokoro 82M generoi puhetta kompaktilla 82 miljoonan parametrin mallilla ja kielikohtaisella valmiilla äänellä. Sen dokumentoitu v1.0-profiili sisältää kahdeksan kieltä, 54 ääntä ja 24 kHz:n äänitulosteen."
  },
  "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": "hexgradin Kokoro 82M generoi puhetta kompaktilla 82 miljoonan parametrin mallilla ja kielikohtaisella valmiilla äänellä. Sen dokumentoitu v1.0-profiili sisältää kahdeksan kieltä, 54 ääntä ja 24 kHz:n äänitulosteen.",
  "source": {
    "audit_sha256": "2e00086bcbfc28e64d0cebe97aa47c17d8d5618963027f8ffb9dc6123d7d25b1",
    "bridge_map_sha256": "1125275768b9636fc8461bc7da5061239a81ddfe508e2557843ca42c58ab0036",
    "raw_model_json_sha256": "bbcf9789f68e8662a02b147b800ab2fbd75a1f8b6870e6dbeea0d79e948b42d3",
    "renderer_sha256": "303a59603e2bc29ba8fda690e95fd32cec68de223d92e26054a88babff801dd7"
  },
  "sourceRevision": "10e9b65aa9b2e92958983fa10536c9e7db728914707946b029fa263f495b1dd1"
}
