{
  "aboutHtml": "<h4>Ääni selostuksiin ja pitkään lukemiseen</h4><p>Speech 02 HD luo puhetta painottaen laatua, rytmiä ja äänen vakautta. Valmistaja nostaa esiin aineistojen ääneenlukemisen ja äänikirjat, joissa äänen tulee säilyttää luonteensa ja edetä tasaisesti pitkän tekstin läpi. Tämä on synteesimalli: se vastaanottaa tekstiä ja muuntaa sen puheääneksi.</p><h4>Tekstin ja äänenvärin yhdistäminen</h4><p>Speech 02 -perheen perustana ovat autoregressiivinen Transformer-arkkitehtuuri ja koulutettava puhujaenkooderi. Äänenvärin poiminta ja puheen generointi on koulutettu yhdessä, jotta äänen ominaisuudet sopivat sisältöön. Perheen kykyihin kuuluvat valmiiksi kloonattujen äänten käyttö ja kielen, aksentin sekä ääntämistavan yhdistäminen.</p><h4>Tunne ja monikielinen lukeminen</h4><p>Tunnesävy voi määräytyä tekstin merkityksestä tai se voidaan asettaa käsin. Käytettävissä ovat ilo, suru, viha, pelko, inho, hämmästys ja rauhallisuus. Malli toimii venäjäksi, englanniksi ja muilla kielillä; valmistaja kuvaa englannin eri aksentteja, kiinaa ja kantoninkiinaa, japania, koreaa, eurooppalaisia ja muita kieliä.</p><p>Nykyisessä Speech 02 -kuvauksessa persia, filipino ja tamili on erikseen suljettu pois. Uudempien Speech-sukupolvien yleistä kieliluetteloa ei tule siirtää automaattisesti tähän versioon.</p><h4>Äänen asetukset</h4><p>Synteesissä voidaan valita ääni sekä säätää nopeutta välillä <strong>0,5–2</strong>, voimakkuutta yli 0:sta enintään <strong>10</strong>:een ja korkeutta välillä <strong>−12–12</strong>. Ääntämissanastossa kirjoitusasu voidaan korvata halutulla lukutavalla; foneettisia merkintöjä ja japanin ääntämisvaihtoehtoja tuetaan. Näin voidaan ohjata nimien ja monitulkintaisten sanojen ääntämistä.</p><h4>Tauot ja valmis ääni</h4><p>Valmistaja mahdollistaa puhuttujen jaksojen väliset tauot, joiden kesto on <strong>0,01–99,99 sekuntia</strong>. Tauon kesto määritetään kahden desimaalin tarkkuudella; merkit sijoitetaan puhuttujen jaksojen väliin eikä peräkkäin. Yhden synkronisen pyynnön tekstissä on oltava alle <strong>10 000 merkkiä</strong>. Äänen voi saada kokonaan tai asteittain; yli 3000 merkin tekstille suositellaan suoratoistotulostusta.</p><p>Mallin formaatteihin kuuluvat MP3, WAV, FLAC ja PCM; synteesin yleiset asetukset kuvaavat myös Opus-muodon ja G.711 μ-law -vaihtoehdot. Mono- tai stereoääntä voidaan käyttää. Tässä kortissa on käytettävissä tekstin ääneenlukeminen, ja erillinen äänen valmistelu sekä laajennetut asetukset ovat käytössä vain Ailootin tukeman kutsutavan rajoissa.</p><p>Äänen lisäasetuksiin kuuluvat näytteenottotaajuudet <strong>8, 16, 22,05, 24, 32 ja 44,1 kHz</strong>. MP3:n bittinopeudeksi on tarjolla <strong>32, 64, 128 tai 256 kbit/s</strong>. Myös äänenväriä voidaan muuttaa ja yhtä tehostetta käyttää: avara kaiku, salikaiku, puhelinääni tai robottiääni. Äänenmuokkaustehosteita tuetaan MP3-, WAV- ja FLAC-muodoissa koko ääntä palautettaessa, mutta suoratoistossa vain MP3-muodossa. G.711 μ-law -formaatit käyttävät 8 kHz:n taajuutta. Nämä kyvyt koskevat MiniMaxin synteesiasetuksia.</p><p>Valmistaja mahdollistaa puheen ja tekstin synkronoinnin: lauseiden, sanojen tai asteittain palautettavien sanojen aikaleimat. Tulos auttaa sovittamaan puheen yhteen tekstin näyttämisen kanssa. Tämä lisäominaisuus edellyttää kyseisen vastausformaatin tukea.</p>",
  "aboutText": "### Ääni selostuksiin ja pitkään lukemiseen\n\nSpeech 02 HD luo puhetta painottaen laatua, rytmiä ja äänen vakautta. Valmistaja nostaa esiin aineistojen ääneenlukemisen ja äänikirjat, joissa äänen tulee säilyttää luonteensa ja edetä tasaisesti pitkän tekstin läpi. Tämä on synteesimalli: se vastaanottaa tekstiä ja muuntaa sen puheääneksi.\n\n### Tekstin ja äänenvärin yhdistäminen\n\nSpeech 02 -perheen perustana ovat autoregressiivinen Transformer-arkkitehtuuri ja koulutettava puhujaenkooderi. Äänenvärin poiminta ja puheen generointi on koulutettu yhdessä, jotta äänen ominaisuudet sopivat sisältöön. Perheen kykyihin kuuluvat valmiiksi kloonattujen äänten käyttö ja kielen, aksentin sekä ääntämistavan yhdistäminen.\n\n### Tunne ja monikielinen lukeminen\n\nTunnesävy voi määräytyä tekstin merkityksestä tai se voidaan asettaa käsin. Käytettävissä ovat ilo, suru, viha, pelko, inho, hämmästys ja rauhallisuus. Malli toimii venäjäksi, englanniksi ja muilla kielillä; valmistaja kuvaa englannin eri aksentteja, kiinaa ja kantoninkiinaa, japania, koreaa, eurooppalaisia ja muita kieliä.\n\nNykyisessä Speech 02 -kuvauksessa persia, filipino ja tamili on erikseen suljettu pois. Uudempien Speech-sukupolvien yleistä kieliluetteloa ei tule siirtää automaattisesti tähän versioon.\n\n### Äänen asetukset\n\nSynteesissä voidaan valita ääni sekä säätää nopeutta välillä **0,5–2**, voimakkuutta yli 0:sta enintään **10**:een ja korkeutta välillä **−12–12**. Ääntämissanastossa kirjoitusasu voidaan korvata halutulla lukutavalla; foneettisia merkintöjä ja japanin ääntämisvaihtoehtoja tuetaan. Näin voidaan ohjata nimien ja monitulkintaisten sanojen ääntämistä.\n\n### Tauot ja valmis ääni\n\nValmistaja mahdollistaa puhuttujen jaksojen väliset tauot, joiden kesto on **0,01–99,99 sekuntia**. Tauon kesto määritetään kahden desimaalin tarkkuudella; merkit sijoitetaan puhuttujen jaksojen väliin eikä peräkkäin. Yhden synkronisen pyynnön tekstissä on oltava alle **10 000 merkkiä**. Äänen voi saada kokonaan tai asteittain; yli 3000 merkin tekstille suositellaan suoratoistotulostusta.\n\nMallin formaatteihin kuuluvat MP3, WAV, FLAC ja PCM; synteesin yleiset asetukset kuvaavat myös Opus-muodon ja G.711 μ-law -vaihtoehdot. Mono- tai stereoääntä voidaan käyttää. Tässä kortissa on käytettävissä tekstin ääneenlukeminen, ja erillinen äänen valmistelu sekä laajennetut asetukset ovat käytössä vain Ailootin tukeman kutsutavan rajoissa.\n\nÄänen lisäasetuksiin kuuluvat näytteenottotaajuudet **8, 16, 22,05, 24, 32 ja 44,1 kHz**. MP3:n bittinopeudeksi on tarjolla **32, 64, 128 tai 256 kbit/s**. Myös äänenväriä voidaan muuttaa ja yhtä tehostetta käyttää: avara kaiku, salikaiku, puhelinääni tai robottiääni. Äänenmuokkaustehosteita tuetaan MP3-, WAV- ja FLAC-muodoissa koko ääntä palautettaessa, mutta suoratoistossa vain MP3-muodossa. G.711 μ-law -formaatit käyttävät 8 kHz:n taajuutta. Nämä kyvyt koskevat MiniMaxin synteesiasetuksia.\n\nValmistaja mahdollistaa puheen ja tekstin synkronoinnin: lauseiden, sanojen tai asteittain palautettavien sanojen aikaleimat. Tulos auttaa sovittamaan puheen yhteen tekstin näyttämisen kanssa. Tämä lisäominaisuus edellyttää kyseisen vastausformaatin tukea.",
  "editorialOverlay": {
    "copy_fields": null,
    "copy_sha256": null,
    "copy_source": null,
    "html_sha256": "2ac6c42b8ce8702ee6df115af6d6e7b0bc4acfc6c43027096aeae106a38f6415",
    "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\">MM</span><h2 id=\"sheet-title\">speech-02-hd</h2><button class=\"icon-btn\" type=\"button\" data-close-sheet aria-label=\"Sulje\">×</button></div><div class=\"idline\"><span>MiniMax /</span><code>speech-02-hd</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=\"Core|speech|/v1/audio/speech|speech-02-hd\">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\">Speech-02 HD on puhesynteesimalli, joka painottaa äänen laatua ja äänen samankaltaisuutta.</p><dl class=\"card-io\" data-card-io><div><dt>Hyväksytyt syötteet</dt><dd>Teksti</dd></div><div><dt>Tulokset</dt><dd>speech</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\"><h4>Ääni selostuksiin ja pitkään lukemiseen</h4><p>Speech 02 HD luo puhetta painottaen laatua, rytmiä ja äänen vakautta. Valmistaja nostaa esiin aineistojen ääneenlukemisen ja äänikirjat, joissa äänen tulee säilyttää luonteensa ja edetä tasaisesti pitkän tekstin läpi. Tämä on synteesimalli: se vastaanottaa tekstiä ja muuntaa sen puheääneksi.</p><h4>Tekstin ja äänenvärin yhdistäminen</h4><p>Speech 02 -perheen perustana ovat autoregressiivinen Transformer-arkkitehtuuri ja koulutettava puhujaenkooderi. Äänenvärin poiminta ja puheen generointi on koulutettu yhdessä, jotta äänen ominaisuudet sopivat sisältöön. Perheen kykyihin kuuluvat valmiiksi kloonattujen äänten käyttö ja kielen, aksentin sekä ääntämistavan yhdistäminen.</p><h4>Tunne ja monikielinen lukeminen</h4><p>Tunnesävy voi määräytyä tekstin merkityksestä tai se voidaan asettaa käsin. Käytettävissä ovat ilo, suru, viha, pelko, inho, hämmästys ja rauhallisuus. Malli toimii venäjäksi, englanniksi ja muilla kielillä; valmistaja kuvaa englannin eri aksentteja, kiinaa ja kantoninkiinaa, japania, koreaa, eurooppalaisia ja muita kieliä.</p><p>Nykyisessä Speech 02 -kuvauksessa persia, filipino ja tamili on erikseen suljettu pois. Uudempien Speech-sukupolvien yleistä kieliluetteloa ei tule siirtää automaattisesti tähän versioon.</p><h4>Äänen asetukset</h4><p>Synteesissä voidaan valita ääni sekä säätää nopeutta välillä <strong>0,5–2</strong>, voimakkuutta yli 0:sta enintään <strong>10</strong>:een ja korkeutta välillä <strong>−12–12</strong>. Ääntämissanastossa kirjoitusasu voidaan korvata halutulla lukutavalla; foneettisia merkintöjä ja japanin ääntämisvaihtoehtoja tuetaan. Näin voidaan ohjata nimien ja monitulkintaisten sanojen ääntämistä.</p><h4>Tauot ja valmis ääni</h4><p>Valmistaja mahdollistaa puhuttujen jaksojen väliset tauot, joiden kesto on <strong>0,01–99,99 sekuntia</strong>. Tauon kesto määritetään kahden desimaalin tarkkuudella; merkit sijoitetaan puhuttujen jaksojen väliin eikä peräkkäin. Yhden synkronisen pyynnön tekstissä on oltava alle <strong>10 000 merkkiä</strong>. Äänen voi saada kokonaan tai asteittain; yli 3000 merkin tekstille suositellaan suoratoistotulostusta.</p><p>Mallin formaatteihin kuuluvat MP3, WAV, FLAC ja PCM; synteesin yleiset asetukset kuvaavat myös Opus-muodon ja G.711 μ-law -vaihtoehdot. Mono- tai stereoääntä voidaan käyttää. Tässä kortissa on käytettävissä tekstin ääneenlukeminen, ja erillinen äänen valmistelu sekä laajennetut asetukset ovat käytössä vain Ailootin tukeman kutsutavan rajoissa.</p><p>Äänen lisäasetuksiin kuuluvat näytteenottotaajuudet <strong>8, 16, 22,05, 24, 32 ja 44,1 kHz</strong>. MP3:n bittinopeudeksi on tarjolla <strong>32, 64, 128 tai 256 kbit/s</strong>. Myös äänenväriä voidaan muuttaa ja yhtä tehostetta käyttää: avara kaiku, salikaiku, puhelinääni tai robottiääni. Äänenmuokkaustehosteita tuetaan MP3-, WAV- ja FLAC-muodoissa koko ääntä palautettaessa, mutta suoratoistossa vain MP3-muodossa. G.711 μ-law -formaatit käyttävät 8 kHz:n taajuutta. Nämä kyvyt koskevat MiniMaxin synteesiasetuksia.</p><p>Valmistaja mahdollistaa puheen ja tekstin synkronoinnin: lauseiden, sanojen tai asteittain palautettavien sanojen aikaleimat. Tulos auttaa sovittamaan puheen yhteen tekstin näyttämisen kanssa. Tämä lisäominaisuus edellyttää kyseisen vastausformaatin tukea.</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 · 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>speech</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>speech-02-hd</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>Enimmäispituus (raja-arvo pois lukien): 10 000</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>Merkkijonomalli: ^[A-Za-z0-9_-]{1,128}$</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>Valinnainen</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>material_types</code></th><td data-cell-label=\"Sopimus\"><span class=\"card-cell-label\">Sopimus</span>text</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>null</td></tr><tr><th data-cell-label=\"Parametri\" scope=\"row\"><span class=\"card-cell-label\">Parametri</span><code>optional_controls</code></th><td data-cell-label=\"Sopimus\"><span class=\"card-cell-label\">Sopimus</span>null</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\">Menetelmien rakenteet ja ID:t ovat täsmällisiä; toimittajan kyvykkyys on erillinen pyynnön hyväksymisestä.</p></details></details></section><section class=\"card-section\" data-card-section=\"pricing\"><h3 tabindex=\"-1\">Hinnoittelu</h3><h4>Ailoot-menetelmien hinnat</h4><section class=\"meth\" data-route=\"Core\"><header><b><span class=\"alias\">Ailoot</span> Puhesynteesi</b><code>POST /v1/audio/speech</code></header><dl><div><dt>Syöte</dt><dd>100,00 $ <em>1 miljoonaa merkkiä kohden</em></dd></div></dl></section><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 · 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-467-tab-0\" role=\"tab\" type=\"button\" aria-controls=\"model-code-467-panel-0\" aria-selected=\"true\" tabindex=\"0\">Puhe-esimerkki</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-467-panel-0\" role=\"tabpanel\" aria-labelledby=\"model-code-467-tab-0\"><pre data-lang=\"bash\"><code>set -eu\n: &quot;${AILOOT_API_KEY:?Set your Ailoot API key}&quot;\n: &quot;${AILOOT_TEXT_FILE:?Set your actual UTF-8 narration script}&quot;\nexport AILOOT_TEXT_FILE\n: &quot;${AILOOT_VOICE_ID:?Set the actual accepted voice ID for this model}&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;speech-02-hd&quot;, &quot;input&quot;: &quot;&quot;}&#39;)\nf=Path(os.environ[&quot;AILOOT_TEXT_FILE&quot;])\nif not f.is_file():raise SystemExit(&quot;Choose your actual UTF-8 source material&quot;)\ntext=f.read_text(encoding=&quot;utf-8&quot;)\nif not text.strip():raise SystemExit(&quot;Source material must contain text&quot;)\np[&quot;input&quot;]=text\nimport re\nvoice=os.environ[&quot;AILOOT_VOICE_ID&quot;]\nif not re.fullmatch(r&quot;[A-Za-z0-9_-]{1,128}&quot;,voice):raise SystemExit(&quot;Set an actual accepted voice ID&quot;)\np[&quot;voice&quot;]=voice\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 · 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><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=\"Core\"><b>Ailoot</b> <a href=\"#m=speech-02-hd&amp;route=Core&amp;caller=speech-02-hd&amp;fmt=speech\"><code>speech-02-hd</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=speech-02-hd&amp;route=Core&amp;caller=speech-02-hd&amp;fmt=speech\"><code>speech-02-hd</code></a></p></section></div>",
      "method_identity": {
        "effective_request_model_id": "speech-02-hd",
        "fmt": "speech",
        "http": "POST",
        "path": "/v1/audio/speech",
        "request_model_id": "speech-02-hd",
        "route_label": "Core"
      },
      "method_key": "Core|speech|/v1/audio/speech|speech-02-hd",
      "ordinal": 0,
      "rawMethod": {
        "cache_read": null,
        "cache_write": null,
        "cache_write_1h": null,
        "cache_write_5m": null,
        "conditional_meter": 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": [
              "MiniMax accepts optionalresponse_formatmp3. Actual voice IDs come from the selected model voice profile.",
              "The facade uses bufferedMP3; provider speed/volume/pitch/sample-rate fields are fixed by the adapter, not callercontrols."
            ],
            "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"
            },
            "parameters": [
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": [
                  "speech-02-hd"
                ],
                "enum_known": true,
                "name": "model",
                "required": true,
                "type": "string"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": null,
                "enum_known": false,
                "maximum_length_exclusive": 10000,
                "min_length": 1,
                "name": "input",
                "required": true,
                "type": "string",
                "unit": "Unicode-merkit"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": null,
                "enum_known": false,
                "name": "voice",
                "pattern": "^[A-Za-z0-9_-]{1,128}$",
                "required": true,
                "type": "string"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": [
                  "mp3"
                ],
                "enum_known": true,
                "name": "response_format",
                "required": false,
                "type": "string"
              }
            ],
            "profile_binding": "Exact existing Ailoot model and method; interface constraints below do not assert provider qualification.",
            "unsupported": []
          },
          "hints": [
            "Menetelmien rakenteet ja ID:t ovat täsmällisiä; toimittajan kyvykkyys on erillinen pyynnön hyväksymisestä."
          ],
          "input": {
            "material_types": [
              "text"
            ],
            "optional_controls": null,
            "required": null
          },
          "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."
          },
          "method": {
            "http": "POST",
            "path": "/v1/audio/speech"
          },
          "operation_modes": [
            "audio_speech"
          ],
          "output": {
            "family": [
              "speech"
            ],
            "format": null,
            "multioutputs": "retain every actual response output"
          }
        },
        "ctx": null,
        "examples": [
          {
            "code": "set -eu\n: \"${AILOOT_API_KEY:?Set your Ailoot API key}\"\n: \"${AILOOT_TEXT_FILE:?Set your actual UTF-8 narration script}\"\nexport AILOOT_TEXT_FILE\n: \"${AILOOT_VOICE_ID:?Set the actual accepted voice ID for this model}\"\nexport AILOOT_VOICE_ID\npython3 - <<'PY_REQUEST'\nimport json,os\nfrom pathlib import Path\np=json.loads('{\"model\": \"speech-02-hd\", \"input\": \"\"}')\nf=Path(os.environ[\"AILOOT_TEXT_FILE\"])\nif not f.is_file():raise SystemExit(\"Choose your actual UTF-8 source material\")\ntext=f.read_text(encoding=\"utf-8\")\nif not text.strip():raise SystemExit(\"Source material must contain text\")\np[\"input\"]=text\nimport re\nvoice=os.environ[\"AILOOT_VOICE_ID\"]\nif not re.fullmatch(r\"[A-Za-z0-9_-]{1,128}\",voice):raise SystemExit(\"Set an actual accepted voice ID\")\np[\"voice\"]=voice\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": "Synthesize your actual script",
            "language": "bash"
          }
        ],
        "family": "openai",
        "fast_multiplier": null,
        "flex_multiplier": null,
        "fmt": "speech",
        "http": "POST",
        "img_in": null,
        "img_out": null,
        "in": null,
        "input": [
          "text"
        ],
        "label": "Puhesynteesi",
        "max_out": null,
        "max_tool_calls": null,
        "out": null,
        "output": [
          "speech"
        ],
        "path": "/v1/audio/speech",
        "pricing_profiles": [
          {
            "dimensions": {},
            "label": "Core",
            "units": [
              {
                "amount": 100,
                "amount_unit": "usd_per_display_unit",
                "key": "tts_million_chars",
                "label": "per 1 million characters",
                "side": "in"
              }
            ]
          }
        ],
        "request_model_id": "speech-02-hd",
        "route_label": "Core",
        "status_reads": [],
        "tiers": [],
        "tool_prices": null,
        "unit": "tts_million_chars",
        "units": [
          {
            "key": "tts_million_chars",
            "label": "per 1 million characters",
            "side": "in",
            "usd": 100
          }
        ]
      }
    }
  ],
  "model_id": "speech-02-hd",
  "nativeProvenance": {
    "input_facts_canonical_sha256": "54dfe8211c6ce6026aa1876e80b93c7e7eb7b704b6067e85b4e63b16b2c7c839",
    "input_html_sha256": "d6f14229d1656a3e0eb48aa15b48d4dba2bf137332096f39ef18108d7954c9c6",
    "private_audit_sha256": "6620e65f9fdadc98687a37692bf1d20865a5e6a7625130457a2ea0d008f7b7c2",
    "role": "historical-normalized-input-audit-hashes",
    "schema": "ailoot-native-model-provenance-v2"
  },
  "page": {
    "canonical": "https://ailoot.ai/models/fi/speech-02-hd/",
    "description": "Speech-02 HD on puhesynteesimalli, joka painottaa äänen laatua ja äänen samankaltaisuutta.",
    "locale": "fi",
    "md_url": "https://ailoot.ai/models/fi/speech-02-hd/index.md",
    "title": "speech-02-hd — Ailoot",
    "url": "https://ailoot.ai/models/fi/speech-02-hd/"
  },
  "rawModel": {
    "about": "### Ääni selostuksiin ja pitkään lukemiseen\n\nSpeech 02 HD luo puhetta painottaen laatua, rytmiä ja äänen vakautta. Valmistaja nostaa esiin aineistojen ääneenlukemisen ja äänikirjat, joissa äänen tulee säilyttää luonteensa ja edetä tasaisesti pitkän tekstin läpi. Tämä on synteesimalli: se vastaanottaa tekstiä ja muuntaa sen puheääneksi.\n\n### Tekstin ja äänenvärin yhdistäminen\n\nSpeech 02 -perheen perustana ovat autoregressiivinen Transformer-arkkitehtuuri ja koulutettava puhujaenkooderi. Äänenvärin poiminta ja puheen generointi on koulutettu yhdessä, jotta äänen ominaisuudet sopivat sisältöön. Perheen kykyihin kuuluvat valmiiksi kloonattujen äänten käyttö ja kielen, aksentin sekä ääntämistavan yhdistäminen.\n\n### Tunne ja monikielinen lukeminen\n\nTunnesävy voi määräytyä tekstin merkityksestä tai se voidaan asettaa käsin. Käytettävissä ovat ilo, suru, viha, pelko, inho, hämmästys ja rauhallisuus. Malli toimii venäjäksi, englanniksi ja muilla kielillä; valmistaja kuvaa englannin eri aksentteja, kiinaa ja kantoninkiinaa, japania, koreaa, eurooppalaisia ja muita kieliä.\n\nNykyisessä Speech 02 -kuvauksessa persia, filipino ja tamili on erikseen suljettu pois. Uudempien Speech-sukupolvien yleistä kieliluetteloa ei tule siirtää automaattisesti tähän versioon.\n\n### Äänen asetukset\n\nSynteesissä voidaan valita ääni sekä säätää nopeutta välillä **0,5–2**, voimakkuutta yli 0:sta enintään **10**:een ja korkeutta välillä **−12–12**. Ääntämissanastossa kirjoitusasu voidaan korvata halutulla lukutavalla; foneettisia merkintöjä ja japanin ääntämisvaihtoehtoja tuetaan. Näin voidaan ohjata nimien ja monitulkintaisten sanojen ääntämistä.\n\n### Tauot ja valmis ääni\n\nValmistaja mahdollistaa puhuttujen jaksojen väliset tauot, joiden kesto on **0,01–99,99 sekuntia**. Tauon kesto määritetään kahden desimaalin tarkkuudella; merkit sijoitetaan puhuttujen jaksojen väliin eikä peräkkäin. Yhden synkronisen pyynnön tekstissä on oltava alle **10 000 merkkiä**. Äänen voi saada kokonaan tai asteittain; yli 3000 merkin tekstille suositellaan suoratoistotulostusta.\n\nMallin formaatteihin kuuluvat MP3, WAV, FLAC ja PCM; synteesin yleiset asetukset kuvaavat myös Opus-muodon ja G.711 μ-law -vaihtoehdot. Mono- tai stereoääntä voidaan käyttää. Tässä kortissa on käytettävissä tekstin ääneenlukeminen, ja erillinen äänen valmistelu sekä laajennetut asetukset ovat käytössä vain Ailootin tukeman kutsutavan rajoissa.\n\nÄänen lisäasetuksiin kuuluvat näytteenottotaajuudet **8, 16, 22,05, 24, 32 ja 44,1 kHz**. MP3:n bittinopeudeksi on tarjolla **32, 64, 128 tai 256 kbit/s**. Myös äänenväriä voidaan muuttaa ja yhtä tehostetta käyttää: avara kaiku, salikaiku, puhelinääni tai robottiääni. Äänenmuokkaustehosteita tuetaan MP3-, WAV- ja FLAC-muodoissa koko ääntä palautettaessa, mutta suoratoistossa vain MP3-muodossa. G.711 μ-law -formaatit käyttävät 8 kHz:n taajuutta. Nämä kyvyt koskevat MiniMaxin synteesiasetuksia.\n\nValmistaja mahdollistaa puheen ja tekstin synkronoinnin: lauseiden, sanojen tai asteittain palautettavien sanojen aikaleimat. Tulos auttaa sovittamaan puheen yhteen tekstin näyttämisen kanssa. Tämä lisäominaisuus edellyttää kyseisen vastausformaatin tukea.",
    "alias_of": null,
    "aliases": [],
    "author": "MiniMax",
    "ctx": null,
    "formats": [
      "speech"
    ],
    "id": "speech-02-hd",
    "input": [
      "text"
    ],
    "kind": "speech",
    "max_out": null,
    "methods": [
      {
        "cache_read": null,
        "cache_write": null,
        "cache_write_1h": null,
        "cache_write_5m": null,
        "conditional_meter": 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": [
              "MiniMax accepts optionalresponse_formatmp3. Actual voice IDs come from the selected model voice profile.",
              "The facade uses bufferedMP3; provider speed/volume/pitch/sample-rate fields are fixed by the adapter, not callercontrols."
            ],
            "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"
            },
            "parameters": [
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": [
                  "speech-02-hd"
                ],
                "enum_known": true,
                "name": "model",
                "required": true,
                "type": "string"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": null,
                "enum_known": false,
                "maximum_length_exclusive": 10000,
                "min_length": 1,
                "name": "input",
                "required": true,
                "type": "string",
                "unit": "Unicode-merkit"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": null,
                "enum_known": false,
                "name": "voice",
                "pattern": "^[A-Za-z0-9_-]{1,128}$",
                "required": true,
                "type": "string"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": [
                  "mp3"
                ],
                "enum_known": true,
                "name": "response_format",
                "required": false,
                "type": "string"
              }
            ],
            "profile_binding": "Exact existing Ailoot model and method; interface constraints below do not assert provider qualification.",
            "unsupported": []
          },
          "hints": [
            "Menetelmien rakenteet ja ID:t ovat täsmällisiä; toimittajan kyvykkyys on erillinen pyynnön hyväksymisestä."
          ],
          "input": {
            "material_types": [
              "text"
            ],
            "optional_controls": null,
            "required": null
          },
          "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."
          },
          "method": {
            "http": "POST",
            "path": "/v1/audio/speech"
          },
          "operation_modes": [
            "audio_speech"
          ],
          "output": {
            "family": [
              "speech"
            ],
            "format": null,
            "multioutputs": "retain every actual response output"
          }
        },
        "ctx": null,
        "examples": [
          {
            "code": "set -eu\n: \"${AILOOT_API_KEY:?Set your Ailoot API key}\"\n: \"${AILOOT_TEXT_FILE:?Set your actual UTF-8 narration script}\"\nexport AILOOT_TEXT_FILE\n: \"${AILOOT_VOICE_ID:?Set the actual accepted voice ID for this model}\"\nexport AILOOT_VOICE_ID\npython3 - <<'PY_REQUEST'\nimport json,os\nfrom pathlib import Path\np=json.loads('{\"model\": \"speech-02-hd\", \"input\": \"\"}')\nf=Path(os.environ[\"AILOOT_TEXT_FILE\"])\nif not f.is_file():raise SystemExit(\"Choose your actual UTF-8 source material\")\ntext=f.read_text(encoding=\"utf-8\")\nif not text.strip():raise SystemExit(\"Source material must contain text\")\np[\"input\"]=text\nimport re\nvoice=os.environ[\"AILOOT_VOICE_ID\"]\nif not re.fullmatch(r\"[A-Za-z0-9_-]{1,128}\",voice):raise SystemExit(\"Set an actual accepted voice ID\")\np[\"voice\"]=voice\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": "Synthesize your actual script",
            "language": "bash"
          }
        ],
        "family": "openai",
        "fast_multiplier": null,
        "flex_multiplier": null,
        "fmt": "speech",
        "http": "POST",
        "img_in": null,
        "img_out": null,
        "in": null,
        "input": [
          "text"
        ],
        "label": "Puhesynteesi",
        "max_out": null,
        "max_tool_calls": null,
        "out": null,
        "output": [
          "speech"
        ],
        "path": "/v1/audio/speech",
        "pricing_profiles": [
          {
            "dimensions": {},
            "label": "Core",
            "units": [
              {
                "amount": 100,
                "amount_unit": "usd_per_display_unit",
                "key": "tts_million_chars",
                "label": "per 1 million characters",
                "side": "in"
              }
            ]
          }
        ],
        "request_model_id": "speech-02-hd",
        "route_label": "Core",
        "status_reads": [],
        "tiers": [],
        "tool_prices": null,
        "unit": "tts_million_chars",
        "units": [
          {
            "key": "tts_million_chars",
            "label": "per 1 million characters",
            "side": "in",
            "usd": 100
          }
        ]
      }
    ],
    "model_aliases": [
      {
        "canonical_model_id": "speech-02-hd",
        "request_model_id": "speech-02-hd",
        "route_label": "Core"
      }
    ],
    "name": "speech-02-hd",
    "price": {
      "in": 100,
      "in_label": "per 1 million characters",
      "out": null,
      "out_label": null,
      "sort_in": null,
      "sort_out": null,
      "varies": false
    },
    "short": "Speech-02 HD on puhesynteesimalli, joka painottaa äänen laatua ja äänen samankaltaisuutta."
  },
  "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": "Speech-02 HD on puhesynteesimalli, joka painottaa äänen laatua ja äänen samankaltaisuutta.",
  "source": {
    "audit_sha256": "2e00086bcbfc28e64d0cebe97aa47c17d8d5618963027f8ffb9dc6123d7d25b1",
    "bridge_map_sha256": "1125275768b9636fc8461bc7da5061239a81ddfe508e2557843ca42c58ab0036",
    "raw_model_json_sha256": "fae3e8084d2ad91378c56926774e85c31dcfebe0f96c6f7e91bdf5e11cbe986d",
    "renderer_sha256": "303a59603e2bc29ba8fda690e95fd32cec68de223d92e26054a88babff801dd7"
  },
  "sourceRevision": "1784edfdb35f920f33b00bc25dd53a5a9e0c214a3663f4066b321a01bce8aa0e"
}
