{
  "aboutHtml": "<p>MAI-Voice-2.1 is het met prompts aangestuurde tekst-naar-spraakmodel van Microsoft AI voor werk waarbij expressieve voordracht en geluidsgetrouwheid belangrijk zijn. De modelkaart omvat drieëntwintig talen en zesentwintig taalvarianten, met natuurlijke intonatie, ritme en emotionele nuances. De fabrikant noemt luisterboeken, vertelteksten voor media, contentcreatie en voice-overs als belangrijkste toepassingen. Deze versie legt de nadruk op langere expressieve content; MAI-Voice-2.1-Flash is de afzonderlijke keuze voor interacties waarbij een korte reactietijd belangrijk is.</p><h4>Vertellen met een consistente spreker</h4><p>De modelkaart beschrijft één stemidentiteit die consistent wordt weergegeven in alle ondersteunde talen. Voor het genereren van langere stukken wordt de tekst in delen verwerkt en wordt context meegenomen om de samenhang tussen passages te verbeteren. Dat is nuttig voor een les, een hoofdstuk van een luisterboek of een reeks verwante voice-overonderdelen waarin het karakter van de verteller behouden moet blijven. Bereid samenhangende passages met duidelijke grenzen voor en behoud dezelfde sprekerkeuze door het hele stuk.</p><p>De invoer is het definitieve transcript, met een optionele sprekerreferentie en SSML-regelaars voor expressiviteit. Een briefing voor een verteltekst moet onderscheid maken tussen wat de luisteraar hoort en productienotities. Schrijf voor een technische uitleg een duidelijke inleiding, vervolgens de concrete stappen en de afsluitende instructie. Schrijf productnamen en terugkerende termen steeds op dezelfde manier. Bereid voor een gelokaliseerde verteltekst het script in de doeltaal voor; de gekozen taal en stem bepalen hoe het wordt uitgesproken.</p><h4>Sprekers, rollen en controle over expressiviteit</h4><p>Microsoft biedt een zorgvuldig samengestelde stemmenbibliotheek en beschrijft ondersteuning voor meerdere sprekers in dialogen. Harper en Grant zijn voorbeelden van sprekeridentiteiten met vermeldingen voor verschillende taalvarianten. In een educatief gesprek tussen twee personen kunnen de vraag en de uitleg verschillende stemmen krijgen, waarbij dezelfde toewijzing behouden blijft wanneer een rol terugkomt. Label de gesproken regels duidelijk zodat het gewenste gesprek in de synthese-invoer is vastgelegd.</p><p>Toon en voordracht kunnen via SSML per spreekbeurt of zin worden vormgegeven. Stijlen zijn sprekergebonden: de beheerde catalogus vermeldt taakgerichte vertel- of onderwijsstijlen voor geschikte stemmen en emotionele keuzes zoals blij of opgelucht voor andere stemmen. De Amerikaanse vermelding van Harper ondersteunt die twee emotionele stijlen. Kies de spreker en diens gedocumenteerde voordrachtstijl samen, in plaats van een stijl van een andere stem over te nemen.</p><p>In een verhaal of presentatie kan expressiviteit een feitelijke uitleg, een beschouwende passage en een levendig citaat van elkaar onderscheiden. Een praktische zin is: “De eerste poging gaf ons een onvolledig beeld. Toen we de hele reeks bekeken, werd de ontbrekende stap duidelijk.” Bepaal waar de betekenis verandert en bereid de gesproken eenheden daarop voor. Luister naar de overgangen zodat de voordracht het verhaal volgt en niet elke zin even sterk benadrukt.</p><h4>Referentiestem en audioresultaat</h4><p>De optionele modus voor een aangepaste stem benadert een spreker die toestemming heeft gegeven op basis van een audioreferentie van vijf tot zestig seconden, zonder fine-tuning. Microsoft raadt een natuurlijke gesprekstoon en gematigde energie in die referentie aan, omdat het fragment de gegenereerde stem beïnvloedt. De workflow voor een aangepaste stem vereist goedkeuring van de fabrikant en een opgenomen toestemmingsverklaring. De bibliotheek met vooraf gebouwde stemmen vormt een afzonderlijke route voor stemselectie.</p><p>De fabrikant laat een uitvoerformaat kiezen en slaat in het gepubliceerde synthesevoorbeeld mono-MP3 op met 24 kHz en 160 kbit/s. Deze instellingen beschrijven één uitvoerworkflow. Kies de audiorepresentatie voor de volgende montage- of afspeelfase en houd het script, de spreker en de volgorde van de onderdelen gekoppeld aan de opname. Een voltooid hoofdstuk of een les kan meerdere gegenereerde passages bevatten en toch één samenhangende luisterervaring blijven.</p><h4>Het langere resultaat gebruiken</h4><p>MAI-Voice-2.1 is gericht op natuurlijkheid en expressie wanneer een onmiddellijke reactie minder belangrijk is dan de gesproken uitvoering. Controleer bij een langer stuk terugkerende namen, grenzen tussen onderdelen, de stemmen die aan dialogen zijn toegewezen en veranderingen in emotioneel register. De documentatie beschrijft mogelijkheden voor lange content en mechanismen voor consistentie, zonder een onbeperkt script of een gegarandeerde maximale opnameduur vast te leggen. Het praktische resultaat is expressieve audio waarvan de verteller, formulering en opbouw overeenkomen met het voorbereide materiaal.</p>",
  "aboutText": "MAI-Voice-2.1 is het met prompts aangestuurde tekst-naar-spraakmodel van Microsoft AI voor werk waarbij expressieve voordracht en geluidsgetrouwheid belangrijk zijn. De modelkaart omvat drieëntwintig talen en zesentwintig taalvarianten, met natuurlijke intonatie, ritme en emotionele nuances. De fabrikant noemt luisterboeken, vertelteksten voor media, contentcreatie en voice-overs als belangrijkste toepassingen. Deze versie legt de nadruk op langere expressieve content; MAI-Voice-2.1-Flash is de afzonderlijke keuze voor interacties waarbij een korte reactietijd belangrijk is.\n\n### Vertellen met een consistente spreker\n\nDe modelkaart beschrijft één stemidentiteit die consistent wordt weergegeven in alle ondersteunde talen. Voor het genereren van langere stukken wordt de tekst in delen verwerkt en wordt context meegenomen om de samenhang tussen passages te verbeteren. Dat is nuttig voor een les, een hoofdstuk van een luisterboek of een reeks verwante voice-overonderdelen waarin het karakter van de verteller behouden moet blijven. Bereid samenhangende passages met duidelijke grenzen voor en behoud dezelfde sprekerkeuze door het hele stuk.\n\nDe invoer is het definitieve transcript, met een optionele sprekerreferentie en SSML-regelaars voor expressiviteit. Een briefing voor een verteltekst moet onderscheid maken tussen wat de luisteraar hoort en productienotities. Schrijf voor een technische uitleg een duidelijke inleiding, vervolgens de concrete stappen en de afsluitende instructie. Schrijf productnamen en terugkerende termen steeds op dezelfde manier. Bereid voor een gelokaliseerde verteltekst het script in de doeltaal voor; de gekozen taal en stem bepalen hoe het wordt uitgesproken.\n\n### Sprekers, rollen en controle over expressiviteit\n\nMicrosoft biedt een zorgvuldig samengestelde stemmenbibliotheek en beschrijft ondersteuning voor meerdere sprekers in dialogen. Harper en Grant zijn voorbeelden van sprekeridentiteiten met vermeldingen voor verschillende taalvarianten. In een educatief gesprek tussen twee personen kunnen de vraag en de uitleg verschillende stemmen krijgen, waarbij dezelfde toewijzing behouden blijft wanneer een rol terugkomt. Label de gesproken regels duidelijk zodat het gewenste gesprek in de synthese-invoer is vastgelegd.\n\nToon en voordracht kunnen via SSML per spreekbeurt of zin worden vormgegeven. Stijlen zijn sprekergebonden: de beheerde catalogus vermeldt taakgerichte vertel- of onderwijsstijlen voor geschikte stemmen en emotionele keuzes zoals blij of opgelucht voor andere stemmen. De Amerikaanse vermelding van Harper ondersteunt die twee emotionele stijlen. Kies de spreker en diens gedocumenteerde voordrachtstijl samen, in plaats van een stijl van een andere stem over te nemen.\n\nIn een verhaal of presentatie kan expressiviteit een feitelijke uitleg, een beschouwende passage en een levendig citaat van elkaar onderscheiden. Een praktische zin is: “De eerste poging gaf ons een onvolledig beeld. Toen we de hele reeks bekeken, werd de ontbrekende stap duidelijk.” Bepaal waar de betekenis verandert en bereid de gesproken eenheden daarop voor. Luister naar de overgangen zodat de voordracht het verhaal volgt en niet elke zin even sterk benadrukt.\n\n### Referentiestem en audioresultaat\n\nDe optionele modus voor een aangepaste stem benadert een spreker die toestemming heeft gegeven op basis van een audioreferentie van vijf tot zestig seconden, zonder fine-tuning. Microsoft raadt een natuurlijke gesprekstoon en gematigde energie in die referentie aan, omdat het fragment de gegenereerde stem beïnvloedt. De workflow voor een aangepaste stem vereist goedkeuring van de fabrikant en een opgenomen toestemmingsverklaring. De bibliotheek met vooraf gebouwde stemmen vormt een afzonderlijke route voor stemselectie.\n\nDe fabrikant laat een uitvoerformaat kiezen en slaat in het gepubliceerde synthesevoorbeeld mono-MP3 op met 24 kHz en 160 kbit/s. Deze instellingen beschrijven één uitvoerworkflow. Kies de audiorepresentatie voor de volgende montage- of afspeelfase en houd het script, de spreker en de volgorde van de onderdelen gekoppeld aan de opname. Een voltooid hoofdstuk of een les kan meerdere gegenereerde passages bevatten en toch één samenhangende luisterervaring blijven.\n\n### Het langere resultaat gebruiken\n\nMAI-Voice-2.1 is gericht op natuurlijkheid en expressie wanneer een onmiddellijke reactie minder belangrijk is dan de gesproken uitvoering. Controleer bij een langer stuk terugkerende namen, grenzen tussen onderdelen, de stemmen die aan dialogen zijn toegewezen en veranderingen in emotioneel register. De documentatie beschrijft mogelijkheden voor lange content en mechanismen voor consistentie, zonder een onbeperkt script of een gegarandeerde maximale opnameduur vast te leggen. Het praktische resultaat is expressieve audio waarvan de verteller, formulering en opbouw overeenkomen met het voorbereide materiaal.",
  "editorialOverlay": {
    "copy_fields": null,
    "copy_sha256": null,
    "copy_source": null,
    "html_sha256": "01e9fd7aaa68093d40b5271a1e27b45986d75c910cbaeacf0661fe944cb89f84",
    "module_sha256": "ee9dc1c50b1e6a8fb7fa062030fcb4646b9aaaeb08be513b723a5a92a7290f06",
    "raw_model_unchanged": true,
    "schema": "ailoot-native-model-editorial-v1"
  },
  "locale": "nl-be",
  "methods": [
    {
      "html": "<div class=\"sheet-head\"><span class=\"mav\" aria-hidden=\"true\">•</span><h2 id=\"sheet-title\">Microsoft AI: MAI-Voice-2.1</h2><button class=\"icon-btn\" type=\"button\" data-close-sheet aria-label=\"Sluiten\">×</button></div><div class=\"idline\"><span>Microsoft AI /</span><code>microsoft/mai-voice-2.1</code><button type=\"button\" id=\"copy-id\">ID kopiëren</button></div><nav class=\"card-jump-nav\" aria-label=\"Onderdelen van de modelkaart\"><button type=\"button\" data-card-jump=\"overview\">Aan de slag</button><button type=\"button\" data-card-jump=\"methods\">Invoer en methoden</button><button type=\"button\" data-card-jump=\"pricing\">Tarieven</button><button type=\"button\" data-card-jump=\"examples\">Voorbeelden</button><button type=\"button\" data-card-jump=\"results\">Resultaten</button><button type=\"button\" data-card-jump=\"aliases\">Aliasnamen</button></nav><div class=\"card-method-tabs\" role=\"tablist\" aria-label=\"API-methoden\"><button type=\"button\" role=\"tab\" tabindex=\"0\" aria-controls=\"card-method-content\" aria-selected=\"true\" id=\"card-method-tab-0\" data-card-method=\"Ultra|speech|/v1/audio/speech|microsoft%2Fmai-voice-2.1\">Spraakgeneratie</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\">Aan de slag</h3><p class=\"mdesc-full\">MAI-Voice-2.1 van Microsoft AI genereert expressieve meertalige spraak voor vertelteksten, luisterboeken, educatieve content en voice-overs. Het profiel met 23 talen ondersteunt een consistente sprekeridentiteit, meerdere sprekers en gerichte controle over de voordracht.</p><dl class=\"card-io\" data-card-io><div><dt>Toegestane invoer</dt><dd>Tekst</dd></div><div><dt>Resultaten</dt><dd>Audio</dd></div></dl><details class=\"card-about\"><summary>Over het model</summary><p class=\"note-s\" data-model-method-boundary>Deze beschrijving gaat over de mogelijkheden van het model. De via Ailoot beschikbare invoer, uitvoer en opties staan hieronder voor de geselecteerde methode.</p><div class=\"mabout\" id=\"m-about\"><p>MAI-Voice-2.1 is het met prompts aangestuurde tekst-naar-spraakmodel van Microsoft AI voor werk waarbij expressieve voordracht en geluidsgetrouwheid belangrijk zijn. De modelkaart omvat drieëntwintig talen en zesentwintig taalvarianten, met natuurlijke intonatie, ritme en emotionele nuances. De fabrikant noemt luisterboeken, vertelteksten voor media, contentcreatie en voice-overs als belangrijkste toepassingen. Deze versie legt de nadruk op langere expressieve content; MAI-Voice-2.1-Flash is de afzonderlijke keuze voor interacties waarbij een korte reactietijd belangrijk is.</p><h4>Vertellen met een consistente spreker</h4><p>De modelkaart beschrijft één stemidentiteit die consistent wordt weergegeven in alle ondersteunde talen. Voor het genereren van langere stukken wordt de tekst in delen verwerkt en wordt context meegenomen om de samenhang tussen passages te verbeteren. Dat is nuttig voor een les, een hoofdstuk van een luisterboek of een reeks verwante voice-overonderdelen waarin het karakter van de verteller behouden moet blijven. Bereid samenhangende passages met duidelijke grenzen voor en behoud dezelfde sprekerkeuze door het hele stuk.</p><p>De invoer is het definitieve transcript, met een optionele sprekerreferentie en SSML-regelaars voor expressiviteit. Een briefing voor een verteltekst moet onderscheid maken tussen wat de luisteraar hoort en productienotities. Schrijf voor een technische uitleg een duidelijke inleiding, vervolgens de concrete stappen en de afsluitende instructie. Schrijf productnamen en terugkerende termen steeds op dezelfde manier. Bereid voor een gelokaliseerde verteltekst het script in de doeltaal voor; de gekozen taal en stem bepalen hoe het wordt uitgesproken.</p><h4>Sprekers, rollen en controle over expressiviteit</h4><p>Microsoft biedt een zorgvuldig samengestelde stemmenbibliotheek en beschrijft ondersteuning voor meerdere sprekers in dialogen. Harper en Grant zijn voorbeelden van sprekeridentiteiten met vermeldingen voor verschillende taalvarianten. In een educatief gesprek tussen twee personen kunnen de vraag en de uitleg verschillende stemmen krijgen, waarbij dezelfde toewijzing behouden blijft wanneer een rol terugkomt. Label de gesproken regels duidelijk zodat het gewenste gesprek in de synthese-invoer is vastgelegd.</p><p>Toon en voordracht kunnen via SSML per spreekbeurt of zin worden vormgegeven. Stijlen zijn sprekergebonden: de beheerde catalogus vermeldt taakgerichte vertel- of onderwijsstijlen voor geschikte stemmen en emotionele keuzes zoals blij of opgelucht voor andere stemmen. De Amerikaanse vermelding van Harper ondersteunt die twee emotionele stijlen. Kies de spreker en diens gedocumenteerde voordrachtstijl samen, in plaats van een stijl van een andere stem over te nemen.</p><p>In een verhaal of presentatie kan expressiviteit een feitelijke uitleg, een beschouwende passage en een levendig citaat van elkaar onderscheiden. Een praktische zin is: “De eerste poging gaf ons een onvolledig beeld. Toen we de hele reeks bekeken, werd de ontbrekende stap duidelijk.” Bepaal waar de betekenis verandert en bereid de gesproken eenheden daarop voor. Luister naar de overgangen zodat de voordracht het verhaal volgt en niet elke zin even sterk benadrukt.</p><h4>Referentiestem en audioresultaat</h4><p>De optionele modus voor een aangepaste stem benadert een spreker die toestemming heeft gegeven op basis van een audioreferentie van vijf tot zestig seconden, zonder fine-tuning. Microsoft raadt een natuurlijke gesprekstoon en gematigde energie in die referentie aan, omdat het fragment de gegenereerde stem beïnvloedt. De workflow voor een aangepaste stem vereist goedkeuring van de fabrikant en een opgenomen toestemmingsverklaring. De bibliotheek met vooraf gebouwde stemmen vormt een afzonderlijke route voor stemselectie.</p><p>De fabrikant laat een uitvoerformaat kiezen en slaat in het gepubliceerde synthesevoorbeeld mono-MP3 op met 24 kHz en 160 kbit/s. Deze instellingen beschrijven één uitvoerworkflow. Kies de audiorepresentatie voor de volgende montage- of afspeelfase en houd het script, de spreker en de volgorde van de onderdelen gekoppeld aan de opname. Een voltooid hoofdstuk of een les kan meerdere gegenereerde passages bevatten en toch één samenhangende luisterervaring blijven.</p><h4>Het langere resultaat gebruiken</h4><p>MAI-Voice-2.1 is gericht op natuurlijkheid en expressie wanneer een onmiddellijke reactie minder belangrijk is dan de gesproken uitvoering. Controleer bij een langer stuk terugkerende namen, grenzen tussen onderdelen, de stemmen die aan dialogen zijn toegewezen en veranderingen in emotioneel register. De documentatie beschrijft mogelijkheden voor lange content en mechanismen voor consistentie, zonder een onbeperkt script of een gegarandeerde maximale opnameduur vast te leggen. Het praktische resultaat is expressieve audio waarvan de verteller, formulering en opbouw overeenkomen met het voorbereide materiaal.</p></div></details></section><section class=\"card-section\" data-card-section=\"methods\"><h3 tabindex=\"-1\">Beschikbaar in Ailoot · invoer en methoden</h3><details class=\"card-method\" open><summary><b>Ailoot Ultra · Spraakgeneratie</b> <code>POST /v1/audio/speech</code></summary><dl class=\"method-capabilities\"><div><dt>Invoer</dt><dd><code>text</code></dd></div><div><dt>Uitvoer</dt><dd><code>audio</code></dd></div><div><dt>Uitvoerformaat</dt><dd>mp3</dd></div></dl><div class=\"tw\" data-card-parameters data-typed-parameters><table><thead><tr><th>Veld</th><th>Type</th><th>Vereiste</th><th>Waarden en limieten</th><th>Standaard</th></tr></thead><tbody><tr data-parameter-availability=\"source_interface\"><th data-cell-label=\"Veld\" scope=\"row\"><span class=\"card-cell-label\">Veld</span><code class=\"card-field-name\">model</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span><code>string</code></td><td data-cell-label=\"Vereiste\"><span class=\"card-cell-label\">Vereiste</span>Vereist</td><td data-cell-label=\"Waarden en limieten\"><span class=\"card-cell-label\">Waarden en limieten</span><div>microsoft/mai-voice-2.1</div></td><td data-cell-label=\"Standaard\" data-default=\"unspecified\"><span class=\"card-cell-label\">Standaard</span>—</td></tr><tr data-parameter-availability=\"source_interface\"><th data-cell-label=\"Veld\" scope=\"row\"><span class=\"card-cell-label\">Veld</span><code class=\"card-field-name\">input</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span><code>string</code></td><td data-cell-label=\"Vereiste\"><span class=\"card-cell-label\">Vereiste</span>Vereist</td><td data-cell-label=\"Waarden en limieten\"><span class=\"card-cell-label\">Waarden en limieten</span><div>Minimumlengte: 1</div><div>Eenheid: Unicode-tekens</div></td><td data-cell-label=\"Standaard\" data-default=\"unspecified\"><span class=\"card-cell-label\">Standaard</span>—</td></tr><tr data-parameter-availability=\"source_interface\"><th data-cell-label=\"Veld\" scope=\"row\"><span class=\"card-cell-label\">Veld</span><code class=\"card-field-name\">voice</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span><code>string</code></td><td data-cell-label=\"Vereiste\"><span class=\"card-cell-label\">Vereiste</span>Vereist</td><td data-cell-label=\"Waarden en limieten\"><span class=\"card-cell-label\">Waarden en limieten</span><div>cs-CZ-Grant:MAI-Voice-2.1, cs-CZ-Harper:MAI-Voice-2.1, da-DK-Grant:MAI-Voice-2.1, da-DK-Harper:MAI-Voice-2.1, de-DE-Grant:MAI-Voice-2.1, de-DE-Harper:MAI-Voice-2.1, de-DE-Klaus:MAI-Voice-2.1, de-DE-Mia:MAI-Voice-2.1, en-AU-Isla:MAI-Voice-2.1, en-GB-Emily:MAI-Voice-2.1, en-GB-Harry:MAI-Voice-2.1, en-IN-Dhruv:MAI-Voice-2.1, en-IN-Priya:MAI-Voice-2.1, en-US-Ethan:MAI-Voice-2.1, en-US-Grant:MAI-Voice-2.1, en-US-Harper:MAI-Voice-2.1, en-US-Iris:MAI-Voice-2.1, en-US-Jasper:MAI-Voice-2.1, en-US-Olivia:MAI-Voice-2.1, en-US-Sage:MAI-Voice-2.1, es-ES-Marta:MAI-Voice-2.1, es-MX-Alejo:MAI-Voice-2.1, es-MX-Grant:MAI-Voice-2.1, es-MX-Harper:MAI-Voice-2.1, es-MX-Valeria:MAI-Voice-2.1, fi-FI-Grant:MAI-Voice-2.1, fi-FI-Harper:MAI-Voice-2.1, fr-FR-Grant:MAI-Voice-2.1, fr-FR-Harper:MAI-Voice-2.1, fr-FR-Marc:MAI-Voice-2.1, fr-FR-Soleil:MAI-Voice-2.1, hi-IN-Arjun:MAI-Voice-2.1, hi-IN-Dhruv:MAI-Voice-2.1, hi-IN-Grant:MAI-Voice-2.1, hi-IN-Harper:MAI-Voice-2.1, hi-IN-Kavya:MAI-Voice-2.1, hi-IN-Priya:MAI-Voice-2.1, hu-HU-Bence:MAI-Voice-2.1, hu-HU-Grant:MAI-Voice-2.1, hu-HU-Harper:MAI-Voice-2.1, hu-HU-Levente:MAI-Voice-2.1, hu-HU-Lilla:MAI-Voice-2.1, hu-HU-Reka:MAI-Voice-2.1, id-ID-Grant:MAI-Voice-2.1, id-ID-Harper:MAI-Voice-2.1, it-IT-Grant:MAI-Voice-2.1, it-IT-Harper:MAI-Voice-2.1, it-IT-Luca:MAI-Voice-2.1, it-IT-Rosa:MAI-Voice-2.1, ko-KR-Grant:MAI-Voice-2.1, ko-KR-Haena:MAI-Voice-2.1, ko-KR-Harper:MAI-Voice-2.1, ko-KR-Junho:MAI-Voice-2.1, nb-NO-Grant:MAI-Voice-2.1, nb-NO-Harper:MAI-Voice-2.1, nl-NL-Grant:MAI-Voice-2.1, nl-NL-Harper:MAI-Voice-2.1, nl-NL-Sander:MAI-Voice-2.1, pl-PL-Grant:MAI-Voice-2.1, pl-PL-Harper:MAI-Voice-2.1, pt-BR-Caio:MAI-Voice-2.1, pt-BR-Grant:MAI-Voice-2.1, pt-BR-Harper:MAI-Voice-2.1, pt-BR-Luana:MAI-Voice-2.1, pt-BR-Pedro:MAI-Voice-2.1, pt-BR-Rafael:MAI-Voice-2.1, pt-PT-Grant:MAI-Voice-2.1, pt-PT-Harper:MAI-Voice-2.1, pt-PT-Rui:MAI-Voice-2.1, ro-RO-Andrei:MAI-Voice-2.1, ro-RO-Elena:MAI-Voice-2.1, ro-RO-Grant:MAI-Voice-2.1, ro-RO-Harper:MAI-Voice-2.1, ro-RO-Ioana:MAI-Voice-2.1, ro-RO-Radu:MAI-Voice-2.1, ru-RU-Grant:MAI-Voice-2.1, ru-RU-Harper:MAI-Voice-2.1, ru-RU-Lev:MAI-Voice-2.1, ru-RU-Masha:MAI-Voice-2.1, sv-SE-Grant:MAI-Voice-2.1, sv-SE-Harper:MAI-Voice-2.1, th-TH-Grant:MAI-Voice-2.1, th-TH-Harper:MAI-Voice-2.1, th-TH-Krit:MAI-Voice-2.1, th-TH-Nattapong:MAI-Voice-2.1, tr-TR-Aydin:MAI-Voice-2.1, tr-TR-Elif:MAI-Voice-2.1, tr-TR-Grant:MAI-Voice-2.1, tr-TR-Harper:MAI-Voice-2.1, vi-VN-Grant:MAI-Voice-2.1, vi-VN-Harper:MAI-Voice-2.1, zh-CN-Bo:MAI-Voice-2.1, zh-CN-Grant:MAI-Voice-2.1, zh-CN-Harper:MAI-Voice-2.1, zh-CN-Lan:MAI-Voice-2.1, zh-CN-Mei:MAI-Voice-2.1, zh-CN-Wei:MAI-Voice-2.1</div></td><td data-cell-label=\"Standaard\" data-default=\"unspecified\"><span class=\"card-cell-label\">Standaard</span>—</td></tr><tr data-parameter-availability=\"source_interface\"><th data-cell-label=\"Veld\" scope=\"row\"><span class=\"card-cell-label\">Veld</span><code class=\"card-field-name\">response_format</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span><code>string</code></td><td data-cell-label=\"Vereiste\"><span class=\"card-cell-label\">Vereiste</span>Vereist</td><td data-cell-label=\"Waarden en limieten\"><span class=\"card-cell-label\">Waarden en limieten</span><div>mp3</div></td><td data-cell-label=\"Standaard\" data-default=\"unspecified\"><span class=\"card-cell-label\">Standaard</span>—</td></tr></tbody></table></div><details class=\"card-about\" data-material-combinations><summary>Combinaties van invoermaterialen</summary><p class=\"note-s\"><b>text_to_speech</b> · Vereist: input</p></details><details class=\"note-s\" data-method-contract><summary>Methodeparameters en levenscyclus</summary><div class=\"tw\" data-card-table=\"contract\"><table><thead><tr><th>Parameter</th><th>Contract</th></tr></thead><tbody><tr><th data-cell-label=\"Parameter\" scope=\"row\"><span class=\"card-cell-label\">Parameter</span><code>content_type</code></th><td data-cell-label=\"Contract\"><span class=\"card-cell-label\">Contract</span>application/json</td></tr><tr><th data-cell-label=\"Parameter\" scope=\"row\"><span class=\"card-cell-label\">Parameter</span><code>required</code></th><td data-cell-label=\"Contract\"><span class=\"card-cell-label\">Contract</span>model, input, voice, response_format</td></tr><tr><th data-cell-label=\"Parameter\" scope=\"row\"><span class=\"card-cell-label\">Parameter</span><code>voice_ids</code></th><td data-cell-label=\"Contract\"><span class=\"card-cell-label\">Contract</span>cs-CZ-Grant:MAI-Voice-2.1, cs-CZ-Harper:MAI-Voice-2.1, da-DK-Grant:MAI-Voice-2.1, da-DK-Harper:MAI-Voice-2.1, de-DE-Grant:MAI-Voice-2.1, de-DE-Harper:MAI-Voice-2.1, de-DE-Klaus:MAI-Voice-2.1, de-DE-Mia:MAI-Voice-2.1, en-AU-Isla:MAI-Voice-2.1, en-GB-Emily:MAI-Voice-2.1, en-GB-Harry:MAI-Voice-2.1, en-IN-Dhruv:MAI-Voice-2.1, en-IN-Priya:MAI-Voice-2.1, en-US-Ethan:MAI-Voice-2.1, en-US-Grant:MAI-Voice-2.1, en-US-Harper:MAI-Voice-2.1, en-US-Iris:MAI-Voice-2.1, en-US-Jasper:MAI-Voice-2.1, en-US-Olivia:MAI-Voice-2.1, en-US-Sage:MAI-Voice-2.1, es-ES-Marta:MAI-Voice-2.1, es-MX-Alejo:MAI-Voice-2.1, es-MX-Grant:MAI-Voice-2.1, es-MX-Harper:MAI-Voice-2.1, es-MX-Valeria:MAI-Voice-2.1, fi-FI-Grant:MAI-Voice-2.1, fi-FI-Harper:MAI-Voice-2.1, fr-FR-Grant:MAI-Voice-2.1, fr-FR-Harper:MAI-Voice-2.1, fr-FR-Marc:MAI-Voice-2.1, fr-FR-Soleil:MAI-Voice-2.1, hi-IN-Arjun:MAI-Voice-2.1, hi-IN-Dhruv:MAI-Voice-2.1, hi-IN-Grant:MAI-Voice-2.1, hi-IN-Harper:MAI-Voice-2.1, hi-IN-Kavya:MAI-Voice-2.1, hi-IN-Priya:MAI-Voice-2.1, hu-HU-Bence:MAI-Voice-2.1, hu-HU-Grant:MAI-Voice-2.1, hu-HU-Harper:MAI-Voice-2.1, hu-HU-Levente:MAI-Voice-2.1, hu-HU-Lilla:MAI-Voice-2.1, hu-HU-Reka:MAI-Voice-2.1, id-ID-Grant:MAI-Voice-2.1, id-ID-Harper:MAI-Voice-2.1, it-IT-Grant:MAI-Voice-2.1, it-IT-Harper:MAI-Voice-2.1, it-IT-Luca:MAI-Voice-2.1, it-IT-Rosa:MAI-Voice-2.1, ko-KR-Grant:MAI-Voice-2.1, ko-KR-Haena:MAI-Voice-2.1, ko-KR-Harper:MAI-Voice-2.1, ko-KR-Junho:MAI-Voice-2.1, nb-NO-Grant:MAI-Voice-2.1, nb-NO-Harper:MAI-Voice-2.1, nl-NL-Grant:MAI-Voice-2.1, nl-NL-Harper:MAI-Voice-2.1, nl-NL-Sander:MAI-Voice-2.1, pl-PL-Grant:MAI-Voice-2.1, pl-PL-Harper:MAI-Voice-2.1, pt-BR-Caio:MAI-Voice-2.1, pt-BR-Grant:MAI-Voice-2.1, pt-BR-Harper:MAI-Voice-2.1, pt-BR-Luana:MAI-Voice-2.1, pt-BR-Pedro:MAI-Voice-2.1, pt-BR-Rafael:MAI-Voice-2.1, pt-PT-Grant:MAI-Voice-2.1, pt-PT-Harper:MAI-Voice-2.1, pt-PT-Rui:MAI-Voice-2.1, ro-RO-Andrei:MAI-Voice-2.1, ro-RO-Elena:MAI-Voice-2.1, ro-RO-Grant:MAI-Voice-2.1, ro-RO-Harper:MAI-Voice-2.1, ro-RO-Ioana:MAI-Voice-2.1, ro-RO-Radu:MAI-Voice-2.1, ru-RU-Grant:MAI-Voice-2.1, ru-RU-Harper:MAI-Voice-2.1, ru-RU-Lev:MAI-Voice-2.1, ru-RU-Masha:MAI-Voice-2.1, sv-SE-Grant:MAI-Voice-2.1, sv-SE-Harper:MAI-Voice-2.1, th-TH-Grant:MAI-Voice-2.1, th-TH-Harper:MAI-Voice-2.1, th-TH-Krit:MAI-Voice-2.1, th-TH-Nattapong:MAI-Voice-2.1, tr-TR-Aydin:MAI-Voice-2.1, tr-TR-Elif:MAI-Voice-2.1, tr-TR-Grant:MAI-Voice-2.1, tr-TR-Harper:MAI-Voice-2.1, vi-VN-Grant:MAI-Voice-2.1, vi-VN-Harper:MAI-Voice-2.1, zh-CN-Bo:MAI-Voice-2.1, zh-CN-Grant:MAI-Voice-2.1, zh-CN-Harper:MAI-Voice-2.1, zh-CN-Lan:MAI-Voice-2.1, zh-CN-Mei:MAI-Voice-2.1, zh-CN-Wei:MAI-Voice-2.1</td></tr><tr><th data-cell-label=\"Parameter\" scope=\"row\"><span class=\"card-cell-label\">Parameter</span><code>response_format</code></th><td data-cell-label=\"Contract\"><span class=\"card-cell-label\">Contract</span>mp3</td></tr><tr><th data-cell-label=\"Parameter\" scope=\"row\"><span class=\"card-cell-label\">Parameter</span><code>max_input_characters</code></th><td data-cell-label=\"Contract\"><span class=\"card-cell-label\">Contract</span>null</td></tr><tr><th data-cell-label=\"Parameter\" scope=\"row\"><span class=\"card-cell-label\">Parameter</span><code>other_options</code></th><td data-cell-label=\"Contract\"><span class=\"card-cell-label\">Contract</span>false</td></tr><tr><th data-cell-label=\"Parameter\" scope=\"row\"><span class=\"card-cell-label\">Parameter</span><code>input</code></th><td data-cell-label=\"Contract\"><span class=\"card-cell-label\">Contract</span>exacte UTF-8-tekst; aantal Unicode-tekens zonder normalisatie</td></tr><tr><th data-cell-label=\"Parameter\" scope=\"row\"><span class=\"card-cell-label\">Parameter</span><code>material_types</code></th><td data-cell-label=\"Contract\"><span class=\"card-cell-label\">Contract</span>text</td></tr></tbody></table></div><p>Levenscyclus: <code>synchronous_result_then_owned_library</code></p><p class=\"note-s\"><code>GET /v1/media/tasks/{task_id}</code> · daadwerkelijk teruggegeven task_id of record in de mediabibliotheek</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\">Selecteer de exacte stem uit dit modelprofiel.</p><p class=\"note-s\">Invoertekens en audioseconden zijn verschillende meeteenheden.</p></details></details></section><section class=\"card-section\" data-card-section=\"pricing\"><h3 tabindex=\"-1\">Tarieven</h3><div data-native-semantic-method=\"v1\" data-tariff-reference-only><p class=\"note-s\" data-rate-support-note>Tariefverwijzingen voegen geen verzoekopties toe. Ondersteunde parameters staan bij de geselecteerde methode.</p><dl data-price-conditions><dt>Snelle modus</dt><dd>Niet opgegeven <span class=\"note-s\">Wanneer de snelle modus geselecteerd is</span></dd><dt>Flex-modus</dt><dd>Niet opgegeven <span class=\"note-s\">Wanneer de flex-modus geselecteerd is</span></dd><dt>Maximale redeneerinspanning</dt><dd>Niet opgegeven <span class=\"note-s\">Wanneer voor maximale redeneerinspanning de default-aanpassing wordt gebruikt</span></dd></dl></div><div data-declared-tariff-pricing><h4>Ailoot-tarieven</h4><h4>Prijzen per configuratie</h4><p class=\"note-s\">Koppel elke kostenpost aan de getoonde voorwaarden. Gebruik één tarief voor elke groep alternatieve configuraties.</p><div class=\"tw\" data-pricing-profiles><table><thead><tr><th>Configuratie</th><th>Tariefstaffel</th><th>Factureerbare hoeveelheid</th><th>Rekeneenheid</th><th>Kosten</th></tr></thead><tbody><tr><th data-cell-label=\"Configuratie\" scope=\"row\"><span class=\"card-cell-label\">Configuratie</span>Basistarieven voor tokens</th><td data-cell-label=\"Tariefstaffel\"><span class=\"card-cell-label\">Tariefstaffel</span>Basistarief</td><td data-cell-label=\"Factureerbare hoeveelheid\"><span class=\"card-cell-label\">Factureerbare hoeveelheid</span>—</td><td data-cell-label=\"Rekeneenheid\"><span class=\"card-cell-label\">Rekeneenheid</span>—</td><td data-cell-label=\"Kosten\"><span class=\"card-cell-label\">Kosten</span><div><span>Invoer · Invoertokens</span> <b>—</b> <span class=\"price-unit\">/ 1K tokens</span></div><div><span>Uitvoer · Uitvoertokens</span> <b>—</b> <span class=\"price-unit\">/ 1K tokens</span></div><div><span>Invoer · Cache lezen</span> <b>—</b> <span class=\"price-unit\">/ 1K tokens</span></div><div><span>Invoer · Cache schrijven</span> <b>—</b> <span class=\"price-unit\">/ 1K tokens</span></div><div><span>Invoer · Cache schrijven, 1 uur</span> <b>—</b> <span class=\"price-unit\">/ 1K tokens</span></div></td></tr><tr><th data-cell-label=\"Configuratie\" scope=\"row\"><span class=\"card-cell-label\">Configuratie</span>Ultra</th><td data-cell-label=\"Tariefstaffel\"><span class=\"card-cell-label\">Tariefstaffel</span>—</td><td data-cell-label=\"Factureerbare hoeveelheid\"><span class=\"card-cell-label\">Factureerbare hoeveelheid</span>Elk Unicode-codepunt telt als één teken, inclusief Han-tekens.</td><td data-cell-label=\"Rekeneenheid\"><span class=\"card-cell-label\">Rekeneenheid</span>per 1K invoertekens</td><td data-cell-label=\"Kosten\"><span class=\"card-cell-label\">Kosten</span><div><span>Invoer · invoerteken</span> <b>$0.044</b> <span class=\"price-unit\">per 1K invoertekens</span></div></td></tr></tbody></table></div></div><div data-declared-reference-pricing><h4>Details van het referentietarief</h4><p class=\"note-s\">Referentiestaffels op modelniveau veranderen de methodeselectie, kostenramingen of afschrijvingen niet. Voor de actieve kostenberekening gelden de tarieven van de geselecteerde Ailoot-methode.</p><details class=\"card-price-reference\" data-declared-reference-group data-client-selectable=\"false\"><summary>Microsoft AI: MAI-Voice-2.1</summary><h4>Prijzen per configuratie</h4><div class=\"tw\" data-pricing-profiles><table><thead><tr><th>Configuratie</th><th>Factureringsvoorwaarden</th><th>Kosten</th></tr></thead><tbody><tr><th data-cell-label=\"Configuratie\" scope=\"row\"><span class=\"card-cell-label\">Configuratie</span>Microsoft AI: MAI-Voice-2.1 · Standaardconfiguratie</th><td data-cell-label=\"Factureringsvoorwaarden\"><span class=\"card-cell-label\">Factureringsvoorwaarden</span>Standaardconfiguratie</td><td data-cell-label=\"Kosten\"><span class=\"card-cell-label\">Kosten</span><div><span>Invoer · Invoertekens</span> <b>US$ 0,000044</b> <span class=\"price-unit\">per invoerteken</span></div></td></tr></tbody></table></div></details></div><p class=\"note-s\">Ailoot reserveert vóór een verzoek een geschat bedrag. Na het resultaat worden de uiteindelijke kosten afgerekend op basis van het gemeten verbruik. Bij streaming gebeurt de afrekening op basis van de definitieve verbruiksregistratie. <a href=\"/docs/nl-be/billing/reserve/\">Zo werken reservering en afrekening →</a></p></section><section class=\"card-section\" data-card-section=\"examples\"><h3 tabindex=\"-1\">Voorbeeldverzoeken</h3><h4>Ailoot Ultra · Spraakgeneratie</h4><div class=\"code-group\"><div class=\"cg-bar\"><div class=\"cg-tabs\" role=\"tablist\" aria-label=\"Codevarianten\"><button class=\"cg-tab\" id=\"model-code-1853-tab-0\" role=\"tab\" type=\"button\" aria-controls=\"model-code-1853-panel-0\" aria-selected=\"true\" tabindex=\"0\">curl</button></div><div class=\"cg-tools\"><button class=\"cg-btn cg-copy\" type=\"button\" aria-label=\"Code kopiëren\"><svg class=\"cp\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.4\"><rect x=\"5.25\" y=\"5.25\" width=\"8.5\" height=\"8.5\" rx=\"1.75\"/><path d=\"M10.75 5.25V3.5a1.25 1.25 0 0 0-1.25-1.25H3.5A1.25 1.25 0 0 0 2.25 3.5v6a1.25 1.25 0 0 0 1.25 1.25h1.75\"/></svg><svg class=\"ok\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.4\"><path d=\"m3 8.5 3.25 3.25L13 5\"/></svg></button></div></div><div class=\"cg-body\"><div class=\"cg-pane\" id=\"model-code-1853-panel-0\" role=\"tabpanel\" aria-labelledby=\"model-code-1853-tab-0\"><pre data-lang=\"bash\"><code>set -eu\n: &quot;${AILOOT_API_KEY:?Set your Ailoot API key}&quot;\n: &quot;${AILOOT_VOICE_ID:?Choose an accepted voice ID from this exact model profile}&quot;\nexport AILOOT_VOICE_ID\npython3 - &lt;&lt;&#39;PY_REQUEST&#39;\nimport json,os\nfrom pathlib import Path\np=json.loads(&#39;{&quot;model&quot;: &quot;microsoft/mai-voice-2.1&quot;, &quot;input&quot;: &quot;Good afternoon! This is a short voice take.&quot;}&#39;)\nvoice=os.environ[&quot;AILOOT_VOICE_ID&quot;]\nallowed=json.loads(&#39;[&quot;cs-CZ-Grant:MAI-Voice-2.1&quot;, &quot;cs-CZ-Harper:MAI-Voice-2.1&quot;, &quot;da-DK-Grant:MAI-Voice-2.1&quot;, &quot;da-DK-Harper:MAI-Voice-2.1&quot;, &quot;de-DE-Grant:MAI-Voice-2.1&quot;, &quot;de-DE-Harper:MAI-Voice-2.1&quot;, &quot;de-DE-Klaus:MAI-Voice-2.1&quot;, &quot;de-DE-Mia:MAI-Voice-2.1&quot;, &quot;en-AU-Isla:MAI-Voice-2.1&quot;, &quot;en-GB-Emily:MAI-Voice-2.1&quot;, &quot;en-GB-Harry:MAI-Voice-2.1&quot;, &quot;en-IN-Dhruv:MAI-Voice-2.1&quot;, &quot;en-IN-Priya:MAI-Voice-2.1&quot;, &quot;en-US-Ethan:MAI-Voice-2.1&quot;, &quot;en-US-Grant:MAI-Voice-2.1&quot;, &quot;en-US-Harper:MAI-Voice-2.1&quot;, &quot;en-US-Iris:MAI-Voice-2.1&quot;, &quot;en-US-Jasper:MAI-Voice-2.1&quot;, &quot;en-US-Olivia:MAI-Voice-2.1&quot;, &quot;en-US-Sage:MAI-Voice-2.1&quot;, &quot;es-ES-Marta:MAI-Voice-2.1&quot;, &quot;es-MX-Alejo:MAI-Voice-2.1&quot;, &quot;es-MX-Grant:MAI-Voice-2.1&quot;, &quot;es-MX-Harper:MAI-Voice-2.1&quot;, &quot;es-MX-Valeria:MAI-Voice-2.1&quot;, &quot;fi-FI-Grant:MAI-Voice-2.1&quot;, &quot;fi-FI-Harper:MAI-Voice-2.1&quot;, &quot;fr-FR-Grant:MAI-Voice-2.1&quot;, &quot;fr-FR-Harper:MAI-Voice-2.1&quot;, &quot;fr-FR-Marc:MAI-Voice-2.1&quot;, &quot;fr-FR-Soleil:MAI-Voice-2.1&quot;, &quot;hi-IN-Arjun:MAI-Voice-2.1&quot;, &quot;hi-IN-Dhruv:MAI-Voice-2.1&quot;, &quot;hi-IN-Grant:MAI-Voice-2.1&quot;, &quot;hi-IN-Harper:MAI-Voice-2.1&quot;, &quot;hi-IN-Kavya:MAI-Voice-2.1&quot;, &quot;hi-IN-Priya:MAI-Voice-2.1&quot;, &quot;hu-HU-Bence:MAI-Voice-2.1&quot;, &quot;hu-HU-Grant:MAI-Voice-2.1&quot;, &quot;hu-HU-Harper:MAI-Voice-2.1&quot;, &quot;hu-HU-Levente:MAI-Voice-2.1&quot;, &quot;hu-HU-Lilla:MAI-Voice-2.1&quot;, &quot;hu-HU-Reka:MAI-Voice-2.1&quot;, &quot;id-ID-Grant:MAI-Voice-2.1&quot;, &quot;id-ID-Harper:MAI-Voice-2.1&quot;, &quot;it-IT-Grant:MAI-Voice-2.1&quot;, &quot;it-IT-Harper:MAI-Voice-2.1&quot;, &quot;it-IT-Luca:MAI-Voice-2.1&quot;, &quot;it-IT-Rosa:MAI-Voice-2.1&quot;, &quot;ko-KR-Grant:MAI-Voice-2.1&quot;, &quot;ko-KR-Haena:MAI-Voice-2.1&quot;, &quot;ko-KR-Harper:MAI-Voice-2.1&quot;, &quot;ko-KR-Junho:MAI-Voice-2.1&quot;, &quot;nb-NO-Grant:MAI-Voice-2.1&quot;, &quot;nb-NO-Harper:MAI-Voice-2.1&quot;, &quot;nl-NL-Grant:MAI-Voice-2.1&quot;, &quot;nl-NL-Harper:MAI-Voice-2.1&quot;, &quot;nl-NL-Sander:MAI-Voice-2.1&quot;, &quot;pl-PL-Grant:MAI-Voice-2.1&quot;, &quot;pl-PL-Harper:MAI-Voice-2.1&quot;, &quot;pt-BR-Caio:MAI-Voice-2.1&quot;, &quot;pt-BR-Grant:MAI-Voice-2.1&quot;, &quot;pt-BR-Harper:MAI-Voice-2.1&quot;, &quot;pt-BR-Luana:MAI-Voice-2.1&quot;, &quot;pt-BR-Pedro:MAI-Voice-2.1&quot;, &quot;pt-BR-Rafael:MAI-Voice-2.1&quot;, &quot;pt-PT-Grant:MAI-Voice-2.1&quot;, &quot;pt-PT-Harper:MAI-Voice-2.1&quot;, &quot;pt-PT-Rui:MAI-Voice-2.1&quot;, &quot;ro-RO-Andrei:MAI-Voice-2.1&quot;, &quot;ro-RO-Elena:MAI-Voice-2.1&quot;, &quot;ro-RO-Grant:MAI-Voice-2.1&quot;, &quot;ro-RO-Harper:MAI-Voice-2.1&quot;, &quot;ro-RO-Ioana:MAI-Voice-2.1&quot;, &quot;ro-RO-Radu:MAI-Voice-2.1&quot;, &quot;ru-RU-Grant:MAI-Voice-2.1&quot;, &quot;ru-RU-Harper:MAI-Voice-2.1&quot;, &quot;ru-RU-Lev:MAI-Voice-2.1&quot;, &quot;ru-RU-Masha:MAI-Voice-2.1&quot;, &quot;sv-SE-Grant:MAI-Voice-2.1&quot;, &quot;sv-SE-Harper:MAI-Voice-2.1&quot;, &quot;th-TH-Grant:MAI-Voice-2.1&quot;, &quot;th-TH-Harper:MAI-Voice-2.1&quot;, &quot;th-TH-Krit:MAI-Voice-2.1&quot;, &quot;th-TH-Nattapong:MAI-Voice-2.1&quot;, &quot;tr-TR-Aydin:MAI-Voice-2.1&quot;, &quot;tr-TR-Elif:MAI-Voice-2.1&quot;, &quot;tr-TR-Grant:MAI-Voice-2.1&quot;, &quot;tr-TR-Harper:MAI-Voice-2.1&quot;, &quot;vi-VN-Grant:MAI-Voice-2.1&quot;, &quot;vi-VN-Harper:MAI-Voice-2.1&quot;, &quot;zh-CN-Bo:MAI-Voice-2.1&quot;, &quot;zh-CN-Grant:MAI-Voice-2.1&quot;, &quot;zh-CN-Harper:MAI-Voice-2.1&quot;, &quot;zh-CN-Lan:MAI-Voice-2.1&quot;, &quot;zh-CN-Mei:MAI-Voice-2.1&quot;, &quot;zh-CN-Wei:MAI-Voice-2.1&quot;]&#39;)\nif voice not in allowed: raise SystemExit(&quot;Choose an accepted voice ID from this exact model profile&quot;)\np[&quot;voice&quot;]=voice\np[&quot;response_format&quot;]=&quot;mp3&quot;\nPath(&quot;request.json&quot;).write_text(json.dumps(p,ensure_ascii=False))\nPY_REQUEST\ncurl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/audio/speech \\\n  -H &quot;Authorization: Bearer $AILOOT_API_KEY&quot; -H &#39;Content-Type: application/json&#39; \\\n  --data-binary @request.json -D response-headers.txt -o speech.mp3\n</code></pre></div></div></div></section><section class=\"card-section\" data-card-section=\"results\"><h3 tabindex=\"-1\">Resultaten ophalen en opslaan</h3><h4>Ailoot Ultra · Spraakgeneratie</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>Lezen van andere inhoud</summary><div class=\"code-group\"><div class=\"cg-bar\"><div class=\"cg-tabs\" role=\"tablist\" aria-label=\"Codevarianten\"><button class=\"cg-tab\" id=\"model-code-1854-tab-0\" role=\"tab\" type=\"button\" aria-controls=\"model-code-1854-panel-0\" aria-selected=\"true\" tabindex=\"0\">Mediabibliotheek</button><button class=\"cg-tab\" id=\"model-code-1854-tab-1\" role=\"tab\" type=\"button\" aria-controls=\"model-code-1854-panel-1\" aria-selected=\"false\" tabindex=\"-1\">Taakstatus</button><button class=\"cg-tab\" id=\"model-code-1854-tab-2\" role=\"tab\" type=\"button\" aria-controls=\"model-code-1854-panel-2\" aria-selected=\"false\" tabindex=\"-1\">Bestandsdetails</button></div><div class=\"cg-tools\"><button class=\"cg-btn cg-copy\" type=\"button\" aria-label=\"Code kopiëren\"><svg class=\"cp\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.4\"><rect x=\"5.25\" y=\"5.25\" width=\"8.5\" height=\"8.5\" rx=\"1.75\"/><path d=\"M10.75 5.25V3.5a1.25 1.25 0 0 0-1.25-1.25H3.5A1.25 1.25 0 0 0 2.25 3.5v6a1.25 1.25 0 0 0 1.25 1.25h1.75\"/></svg><svg class=\"ok\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.4\"><path d=\"m3 8.5 3.25 3.25L13 5\"/></svg></button></div></div><div class=\"cg-body\"><div class=\"cg-pane\" id=\"model-code-1854-panel-0\" role=\"tabpanel\" aria-labelledby=\"model-code-1854-tab-0\"><pre data-lang=\"bash\"><code>set -eu\n: &quot;${AILOOT_API_KEY:?Set your Ailoot API key}&quot;\ncurl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/media/assets \\\n  -H &quot;Authorization: Bearer $AILOOT_API_KEY&quot; -o media-assets.json\n</code></pre></div><div class=\"cg-pane\" id=\"model-code-1854-panel-1\" role=\"tabpanel\" aria-labelledby=\"model-code-1854-tab-1\" hidden><pre data-lang=\"bash\"><code>set -eu\n: &quot;${AILOOT_API_KEY:?Set your Ailoot API key}&quot;\n: &quot;${AILOOT_MEDIA_TASK_ID:?Set the actual ID returned by the response or media-library metadata}&quot;\nexport AILOOT_MEDIA_TASK_ID\nresource_id=$(python3 -c &#39;import os,urllib.parse;print(urllib.parse.quote(os.environ[&quot;AILOOT_MEDIA_TASK_ID&quot;],safe=&quot;&quot;))&#39;)\ncurl --fail-with-body --silent --show-error &quot;https://api.ailoot.ai/v1/media/tasks/$resource_id&quot; \\\n  -H &quot;Authorization: Bearer $AILOOT_API_KEY&quot; -o media-task.json\npython3 - &lt;&lt;&#39;PY_RESULT&#39;\nimport json\nfrom pathlib import Path\nprint(json.dumps(json.loads(Path(&quot;media-task.json&quot;).read_text())))\nPY_RESULT\n</code></pre></div><div class=\"cg-pane\" id=\"model-code-1854-panel-2\" role=\"tabpanel\" aria-labelledby=\"model-code-1854-tab-2\" hidden><pre data-lang=\"bash\"><code>set -eu\n: &quot;${AILOOT_API_KEY:?Set your Ailoot API key}&quot;\n: &quot;${AILOOT_ASSET_ID:?Set the actual ID returned by the response or media-library metadata}&quot;\nexport AILOOT_ASSET_ID\nresource_id=$(python3 -c &#39;import os,urllib.parse;print(urllib.parse.quote(os.environ[&quot;AILOOT_ASSET_ID&quot;],safe=&quot;&quot;))&#39;)\ncurl --fail-with-body --silent --show-error &quot;https://api.ailoot.ai/v1/media/assets/$resource_id&quot; \\\n  -H &quot;Authorization: Bearer $AILOOT_API_KEY&quot; -o media-asset.json\npython3 - &lt;&lt;&#39;PY_RESULT&#39;\nimport json\nfrom pathlib import Path\nprint(json.dumps(json.loads(Path(&quot;media-asset.json&quot;).read_text())))\nPY_RESULT\n</code></pre></div></div></div></details><div class=\"card-result-process\" data-all-results><h5>Alle voltooide resultaten bewaren</h5><p class=\"note-s\">Bewaar elk volledig teruggegeven antwoord, bestand en inhoudsonderdeel.</p><p class=\"note-s\">Bewaar het volledige binaire resultaat en de headers. Als JSON of meerdere uitvoerresultaten worden teruggegeven, bewaar dan elk gegevensitem en haal elke daadwerkelijke ondertekende asset-URL op.</p></div><div class=\"card-result-process\" data-unknown-recovery><h5>Als het oorspronkelijke antwoord moet worden gecontroleerd</h5><p class=\"note-s\">Bewaar de oorspronkelijke operation_id/X-Client-Request-ID voor reconciliatie zonder de aanvraag opnieuw in te dienen; er is geen afzonderlijke route om de audiostatus te pollen.</p></div><details class=\"card-about\" data-output-fields><summary>Antwoordvelden</summary><div class=\"tw\" data-card-table=\"output\"><table><thead><tr><th>Veld</th><th>Type</th></tr></thead><tbody><tr><th data-cell-label=\"Veld\" scope=\"row\"><span class=\"card-cell-label\">Veld</span><code class=\"card-field-name\">binary audio</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span>bytes</td></tr><tr><th data-cell-label=\"Veld\" scope=\"row\"><span class=\"card-cell-label\">Veld</span><code class=\"card-field-name\">response headers</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span>headers</td></tr></tbody></table></div></details><details class=\"card-about\" data-method-errors><summary>Fouten en vervolgstappen</summary><div class=\"tw\" data-card-table=\"errors\"><table><thead><tr><th>Antwoord</th><th>Voorwaarde</th><th>Volgende stap</th></tr></thead><tbody><tr><th data-cell-label=\"Antwoord\" scope=\"row\"><span class=\"card-cell-label\">Antwoord</span>400 · <code>invalid_request_error</code></th><td data-cell-label=\"Voorwaarde\"><span class=\"card-cell-label\">Voorwaarde</span>Verplichte velden, de materiaalrepresentatie of een parameterwaarde zijn ongeldig</td><td data-cell-label=\"Volgende stap\"><span class=\"card-cell-label\">Volgende stap</span>Corrigeer de aangegeven velden vóór een nieuwe aanmaakaanvraag.</td></tr><tr><th data-cell-label=\"Antwoord\" scope=\"row\"><span class=\"card-cell-label\">Antwoord</span><code>server_error</code></th><td data-cell-label=\"Voorwaarde\"><span class=\"card-cell-label\">Voorwaarde</span>De teruggegeven respons geeft aan dat de bewerking of het resultaat gecontroleerd moet worden</td><td data-cell-label=\"Volgende stap\"><span class=\"card-cell-label\">Volgende stap</span>Bewaar de oorspronkelijk teruggegeven bewerkings-/taak-ID, aanvraagheaders en respons; blijf de oorspronkelijke bewerking uitlezen via de ondersteunde leesaanvragen. Dien de aanmaakaanvraag niet opnieuw in.</td></tr></tbody></table></div></details></section><section class=\"card-section\" data-card-section=\"aliases\"><h3 tabindex=\"-1\">Aliasnamen</h3><h4>Modelaliasnamen</h4><p class=\"note-s\"><span data-model-alias-route=\"Ultra\"><b>Ailoot Ultra</b> <a href=\"#m=microsoft%2Fmai-voice-2.1&amp;route=Ultra&amp;caller=microsoft%2Fmai-voice-2.1&amp;fmt=speech\"><code>microsoft/mai-voice-2.1</code></a></span></p><h4>Aliasnamen voor methodepaden</h4><p class=\"note-s\">Gebruik de hierboven getoonde methodepaden.</p><h4>Gerelateerde aanroeper-ID’s</h4><p class=\"note-s\"><a href=\"#m=microsoft%2Fmai-voice-2.1&amp;route=Ultra&amp;caller=microsoft%2Fmai-voice-2.1&amp;fmt=speech\"><code>microsoft/mai-voice-2.1</code></a></p></section></div>",
      "method_identity": {
        "effective_request_model_id": "microsoft/mai-voice-2.1",
        "fmt": "speech",
        "http": "POST",
        "path": "/v1/audio/speech",
        "request_model_id": "microsoft/mai-voice-2.1",
        "route_label": "Ultra"
      },
      "method_key": "Ultra|speech|/v1/audio/speech|microsoft%2Fmai-voice-2.1",
      "ordinal": 0,
      "rawMethod": {
        "available": null,
        "cache_read": null,
        "cache_write": null,
        "cache_write_1h": null,
        "contract": {
          "data": {
            "all_results": "Keep the complete binary result and headers. If JSON/multiple outputs are returned, retain every data item and fetch each actual signed asset URL.",
            "errors": [
              {
                "code": null,
                "condition": "Verplichte velden, de materiaalrepresentatie of een parameterwaarde zijn ongeldig",
                "http_status": 400,
                "recovery": "Corrigeer de aangegeven velden vóór een nieuwe aanmaakaanvraag.",
                "type": "invalid_request_error"
              },
              {
                "code": null,
                "condition": "De teruggegeven respons geeft aan dat de bewerking of het resultaat gecontroleerd moet worden",
                "http_status": null,
                "recovery": "Bewaar de oorspronkelijk teruggegeven bewerkings-/taak-ID, aanvraagheaders en respons; blijf de oorspronkelijke bewerking uitlezen via de ondersteunde leesaanvragen. Dien de aanmaakaanvraag niet opnieuw in.",
                "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": "Bewaar de oorspronkelijke operation_id/X-Client-Request-ID voor reconciliatie zonder de aanvraag opnieuw in te dienen; er is geen afzonderlijke route om de audiostatus te pollen."
            },
            "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": "Bewaar het volledige binaire resultaat en de headers. Als JSON of meerdere uitvoerresultaten worden teruggegeven, bewaar dan elk gegevensitem en haal elke daadwerkelijke ondertekende asset-URL op.",
              "family": "audio",
              "fields": [
                {
                  "description": null,
                  "name": "binary audio",
                  "type": "bytes"
                },
                {
                  "description": null,
                  "name": "response headers",
                  "type": "headers"
                }
              ],
              "format": "mp3",
              "http_success": 200
            },
            "parameters": [
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": [
                  "microsoft/mai-voice-2.1"
                ],
                "enum_known": true,
                "name": "model",
                "required": true,
                "type": "string"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": null,
                "enum_known": false,
                "limit_known": false,
                "maximum_length": null,
                "min_length": 1,
                "name": "input",
                "required": true,
                "type": "string",
                "unit": "Unicode-tekens"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": [
                  "cs-CZ-Grant:MAI-Voice-2.1",
                  "cs-CZ-Harper:MAI-Voice-2.1",
                  "da-DK-Grant:MAI-Voice-2.1",
                  "da-DK-Harper:MAI-Voice-2.1",
                  "de-DE-Grant:MAI-Voice-2.1",
                  "de-DE-Harper:MAI-Voice-2.1",
                  "de-DE-Klaus:MAI-Voice-2.1",
                  "de-DE-Mia:MAI-Voice-2.1",
                  "en-AU-Isla:MAI-Voice-2.1",
                  "en-GB-Emily:MAI-Voice-2.1",
                  "en-GB-Harry:MAI-Voice-2.1",
                  "en-IN-Dhruv:MAI-Voice-2.1",
                  "en-IN-Priya:MAI-Voice-2.1",
                  "en-US-Ethan:MAI-Voice-2.1",
                  "en-US-Grant:MAI-Voice-2.1",
                  "en-US-Harper:MAI-Voice-2.1",
                  "en-US-Iris:MAI-Voice-2.1",
                  "en-US-Jasper:MAI-Voice-2.1",
                  "en-US-Olivia:MAI-Voice-2.1",
                  "en-US-Sage:MAI-Voice-2.1",
                  "es-ES-Marta:MAI-Voice-2.1",
                  "es-MX-Alejo:MAI-Voice-2.1",
                  "es-MX-Grant:MAI-Voice-2.1",
                  "es-MX-Harper:MAI-Voice-2.1",
                  "es-MX-Valeria:MAI-Voice-2.1",
                  "fi-FI-Grant:MAI-Voice-2.1",
                  "fi-FI-Harper:MAI-Voice-2.1",
                  "fr-FR-Grant:MAI-Voice-2.1",
                  "fr-FR-Harper:MAI-Voice-2.1",
                  "fr-FR-Marc:MAI-Voice-2.1",
                  "fr-FR-Soleil:MAI-Voice-2.1",
                  "hi-IN-Arjun:MAI-Voice-2.1",
                  "hi-IN-Dhruv:MAI-Voice-2.1",
                  "hi-IN-Grant:MAI-Voice-2.1",
                  "hi-IN-Harper:MAI-Voice-2.1",
                  "hi-IN-Kavya:MAI-Voice-2.1",
                  "hi-IN-Priya:MAI-Voice-2.1",
                  "hu-HU-Bence:MAI-Voice-2.1",
                  "hu-HU-Grant:MAI-Voice-2.1",
                  "hu-HU-Harper:MAI-Voice-2.1",
                  "hu-HU-Levente:MAI-Voice-2.1",
                  "hu-HU-Lilla:MAI-Voice-2.1",
                  "hu-HU-Reka:MAI-Voice-2.1",
                  "id-ID-Grant:MAI-Voice-2.1",
                  "id-ID-Harper:MAI-Voice-2.1",
                  "it-IT-Grant:MAI-Voice-2.1",
                  "it-IT-Harper:MAI-Voice-2.1",
                  "it-IT-Luca:MAI-Voice-2.1",
                  "it-IT-Rosa:MAI-Voice-2.1",
                  "ko-KR-Grant:MAI-Voice-2.1",
                  "ko-KR-Haena:MAI-Voice-2.1",
                  "ko-KR-Harper:MAI-Voice-2.1",
                  "ko-KR-Junho:MAI-Voice-2.1",
                  "nb-NO-Grant:MAI-Voice-2.1",
                  "nb-NO-Harper:MAI-Voice-2.1",
                  "nl-NL-Grant:MAI-Voice-2.1",
                  "nl-NL-Harper:MAI-Voice-2.1",
                  "nl-NL-Sander:MAI-Voice-2.1",
                  "pl-PL-Grant:MAI-Voice-2.1",
                  "pl-PL-Harper:MAI-Voice-2.1",
                  "pt-BR-Caio:MAI-Voice-2.1",
                  "pt-BR-Grant:MAI-Voice-2.1",
                  "pt-BR-Harper:MAI-Voice-2.1",
                  "pt-BR-Luana:MAI-Voice-2.1",
                  "pt-BR-Pedro:MAI-Voice-2.1",
                  "pt-BR-Rafael:MAI-Voice-2.1",
                  "pt-PT-Grant:MAI-Voice-2.1",
                  "pt-PT-Harper:MAI-Voice-2.1",
                  "pt-PT-Rui:MAI-Voice-2.1",
                  "ro-RO-Andrei:MAI-Voice-2.1",
                  "ro-RO-Elena:MAI-Voice-2.1",
                  "ro-RO-Grant:MAI-Voice-2.1",
                  "ro-RO-Harper:MAI-Voice-2.1",
                  "ro-RO-Ioana:MAI-Voice-2.1",
                  "ro-RO-Radu:MAI-Voice-2.1",
                  "ru-RU-Grant:MAI-Voice-2.1",
                  "ru-RU-Harper:MAI-Voice-2.1",
                  "ru-RU-Lev:MAI-Voice-2.1",
                  "ru-RU-Masha:MAI-Voice-2.1",
                  "sv-SE-Grant:MAI-Voice-2.1",
                  "sv-SE-Harper:MAI-Voice-2.1",
                  "th-TH-Grant:MAI-Voice-2.1",
                  "th-TH-Harper:MAI-Voice-2.1",
                  "th-TH-Krit:MAI-Voice-2.1",
                  "th-TH-Nattapong:MAI-Voice-2.1",
                  "tr-TR-Aydin:MAI-Voice-2.1",
                  "tr-TR-Elif:MAI-Voice-2.1",
                  "tr-TR-Grant:MAI-Voice-2.1",
                  "tr-TR-Harper:MAI-Voice-2.1",
                  "vi-VN-Grant:MAI-Voice-2.1",
                  "vi-VN-Harper:MAI-Voice-2.1",
                  "zh-CN-Bo:MAI-Voice-2.1",
                  "zh-CN-Grant:MAI-Voice-2.1",
                  "zh-CN-Harper:MAI-Voice-2.1",
                  "zh-CN-Lan:MAI-Voice-2.1",
                  "zh-CN-Mei:MAI-Voice-2.1",
                  "zh-CN-Wei:MAI-Voice-2.1"
                ],
                "enum_known": true,
                "name": "voice",
                "required": true,
                "type": "string"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": [
                  "mp3"
                ],
                "enum_known": true,
                "name": "response_format",
                "required": true,
                "type": "string"
              }
            ],
            "profile_binding": "Exact existing Ailoot model and method; interface constraints below do not assert provider qualification.",
            "unsupported": [
              "every field outside exactmodel,input,voice,response_format",
              "stream/speed/reference speech options"
            ]
          },
          "hints": [
            "Selecteer de exacte stem uit dit modelprofiel.",
            "Invoertekens en audioseconden zijn verschillende meeteenheden."
          ],
          "input": {
            "content_type": "application/json",
            "input": "exacte UTF-8-tekst; aantal Unicode-tekens zonder normalisatie",
            "material_types": [
              "text"
            ],
            "max_input_characters": null,
            "other_options": false,
            "required": [
              "model",
              "input",
              "voice",
              "response_format"
            ],
            "response_format": [
              "mp3"
            ],
            "voice_ids": [
              "cs-CZ-Grant:MAI-Voice-2.1",
              "cs-CZ-Harper:MAI-Voice-2.1",
              "da-DK-Grant:MAI-Voice-2.1",
              "da-DK-Harper:MAI-Voice-2.1",
              "de-DE-Grant:MAI-Voice-2.1",
              "de-DE-Harper:MAI-Voice-2.1",
              "de-DE-Klaus:MAI-Voice-2.1",
              "de-DE-Mia:MAI-Voice-2.1",
              "en-AU-Isla:MAI-Voice-2.1",
              "en-GB-Emily:MAI-Voice-2.1",
              "en-GB-Harry:MAI-Voice-2.1",
              "en-IN-Dhruv:MAI-Voice-2.1",
              "en-IN-Priya:MAI-Voice-2.1",
              "en-US-Ethan:MAI-Voice-2.1",
              "en-US-Grant:MAI-Voice-2.1",
              "en-US-Harper:MAI-Voice-2.1",
              "en-US-Iris:MAI-Voice-2.1",
              "en-US-Jasper:MAI-Voice-2.1",
              "en-US-Olivia:MAI-Voice-2.1",
              "en-US-Sage:MAI-Voice-2.1",
              "es-ES-Marta:MAI-Voice-2.1",
              "es-MX-Alejo:MAI-Voice-2.1",
              "es-MX-Grant:MAI-Voice-2.1",
              "es-MX-Harper:MAI-Voice-2.1",
              "es-MX-Valeria:MAI-Voice-2.1",
              "fi-FI-Grant:MAI-Voice-2.1",
              "fi-FI-Harper:MAI-Voice-2.1",
              "fr-FR-Grant:MAI-Voice-2.1",
              "fr-FR-Harper:MAI-Voice-2.1",
              "fr-FR-Marc:MAI-Voice-2.1",
              "fr-FR-Soleil:MAI-Voice-2.1",
              "hi-IN-Arjun:MAI-Voice-2.1",
              "hi-IN-Dhruv:MAI-Voice-2.1",
              "hi-IN-Grant:MAI-Voice-2.1",
              "hi-IN-Harper:MAI-Voice-2.1",
              "hi-IN-Kavya:MAI-Voice-2.1",
              "hi-IN-Priya:MAI-Voice-2.1",
              "hu-HU-Bence:MAI-Voice-2.1",
              "hu-HU-Grant:MAI-Voice-2.1",
              "hu-HU-Harper:MAI-Voice-2.1",
              "hu-HU-Levente:MAI-Voice-2.1",
              "hu-HU-Lilla:MAI-Voice-2.1",
              "hu-HU-Reka:MAI-Voice-2.1",
              "id-ID-Grant:MAI-Voice-2.1",
              "id-ID-Harper:MAI-Voice-2.1",
              "it-IT-Grant:MAI-Voice-2.1",
              "it-IT-Harper:MAI-Voice-2.1",
              "it-IT-Luca:MAI-Voice-2.1",
              "it-IT-Rosa:MAI-Voice-2.1",
              "ko-KR-Grant:MAI-Voice-2.1",
              "ko-KR-Haena:MAI-Voice-2.1",
              "ko-KR-Harper:MAI-Voice-2.1",
              "ko-KR-Junho:MAI-Voice-2.1",
              "nb-NO-Grant:MAI-Voice-2.1",
              "nb-NO-Harper:MAI-Voice-2.1",
              "nl-NL-Grant:MAI-Voice-2.1",
              "nl-NL-Harper:MAI-Voice-2.1",
              "nl-NL-Sander:MAI-Voice-2.1",
              "pl-PL-Grant:MAI-Voice-2.1",
              "pl-PL-Harper:MAI-Voice-2.1",
              "pt-BR-Caio:MAI-Voice-2.1",
              "pt-BR-Grant:MAI-Voice-2.1",
              "pt-BR-Harper:MAI-Voice-2.1",
              "pt-BR-Luana:MAI-Voice-2.1",
              "pt-BR-Pedro:MAI-Voice-2.1",
              "pt-BR-Rafael:MAI-Voice-2.1",
              "pt-PT-Grant:MAI-Voice-2.1",
              "pt-PT-Harper:MAI-Voice-2.1",
              "pt-PT-Rui:MAI-Voice-2.1",
              "ro-RO-Andrei:MAI-Voice-2.1",
              "ro-RO-Elena:MAI-Voice-2.1",
              "ro-RO-Grant:MAI-Voice-2.1",
              "ro-RO-Harper:MAI-Voice-2.1",
              "ro-RO-Ioana:MAI-Voice-2.1",
              "ro-RO-Radu:MAI-Voice-2.1",
              "ru-RU-Grant:MAI-Voice-2.1",
              "ru-RU-Harper:MAI-Voice-2.1",
              "ru-RU-Lev:MAI-Voice-2.1",
              "ru-RU-Masha:MAI-Voice-2.1",
              "sv-SE-Grant:MAI-Voice-2.1",
              "sv-SE-Harper:MAI-Voice-2.1",
              "th-TH-Grant:MAI-Voice-2.1",
              "th-TH-Harper:MAI-Voice-2.1",
              "th-TH-Krit:MAI-Voice-2.1",
              "th-TH-Nattapong:MAI-Voice-2.1",
              "tr-TR-Aydin:MAI-Voice-2.1",
              "tr-TR-Elif:MAI-Voice-2.1",
              "tr-TR-Grant:MAI-Voice-2.1",
              "tr-TR-Harper:MAI-Voice-2.1",
              "vi-VN-Grant:MAI-Voice-2.1",
              "vi-VN-Harper:MAI-Voice-2.1",
              "zh-CN-Bo:MAI-Voice-2.1",
              "zh-CN-Grant:MAI-Voice-2.1",
              "zh-CN-Harper:MAI-Voice-2.1",
              "zh-CN-Lan:MAI-Voice-2.1",
              "zh-CN-Mei:MAI-Voice-2.1",
              "zh-CN-Wei:MAI-Voice-2.1"
            ]
          },
          "lifecycle": {
            "assets": [
              {
                "http": "GET",
                "path": "/v1/media/assets"
              },
              {
                "http": "GET",
                "path": "/v1/media/assets/{asset_id}"
              }
            ],
            "content": [
              {
                "http": "GET",
                "path": "/v1/media/assets/{asset_id}/content",
                "url_source": "exact returned signed URL; never construct token"
              }
            ],
            "mode": "synchronous_result_then_owned_library",
            "operation_id_is_not_task_id": true,
            "status": [
              {
                "http": "GET",
                "id_source": "daadwerkelijk teruggegeven task_id of record in de mediabibliotheek",
                "path": "/v1/media/tasks/{task_id}"
              }
            ],
            "unknown": "Retain original operation_id/X-Client-Request-ID for reconciliation without resubmission; no dedicated audio poll route."
          },
          "manufacturer_capability": null,
          "method": {
            "http": "POST",
            "path": "/v1/audio/speech"
          },
          "method_aliases": [],
          "operation_modes": [
            "text_to_speech"
          ],
          "output": {
            "family": "audio",
            "format": "mp3",
            "http_success": 200,
            "response": "full binary MP3 plus response headers",
            "result": "complete playable owned MP3"
          }
        },
        "ctx": null,
        "declared_pricing_profiles": [
          {
            "dimensions": {
              "regime": "base"
            },
            "label": "Base token rates",
            "units": [
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": true,
                "estimate_only": false,
                "key": "input_price",
                "label": "Input tokens",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "input_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": false,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "input_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": true,
                "estimate_only": false,
                "key": "output_price",
                "label": "Output tokens",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "output_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": false,
                "rate_role": "typed_native_retail_rate",
                "side": "out",
                "unit": "output_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": true,
                "estimate_only": false,
                "key": "cache_read_price",
                "label": "Cache read",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "cached_input_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": false,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "cached_input_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": true,
                "estimate_only": false,
                "key": "cache_write_price",
                "label": "Cache write",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "generic_cache_creation_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": false,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "generic_cache_creation_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": true,
                "estimate_only": false,
                "key": "cache_write_1h_price",
                "label": "Cache write, 1 hour",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "one_hour_cache_creation_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": false,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "one_hour_cache_creation_token"
              }
            ]
          },
          {
            "dimensions": {
              "quantity_meter": "utf8.RuneCountInString(validUTF8): one Han codepoint=1; no Han weighting",
              "quoted_unit": "per 1000 input character"
            },
            "label": "Ultra",
            "units": [
              {
                "amount": "0.044000",
                "amount_unit": "usd_per_1000_characters",
                "billing_input": true,
                "estimate_only": false,
                "key": "audio_input_character",
                "label": "input character",
                "native_amount_usd_per_unit": "0.000044",
                "native_quantity": 1,
                "public_unit_label": "per 1000 input character",
                "quantity": "1000",
                "quantity_is_estimate": false,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "input_character"
              }
            ]
          }
        ],
        "declared_tariff_references": [
          {
            "client_selectable": false,
            "key": "53ceea2ccaa50cadb12f",
            "label": "Microsoft AI: MAI-Voice-2.1",
            "profiles": [
              {
                "basis": "",
                "dimensions": {
                  "conditions": "Standaardconfiguratie"
                },
                "label": "Microsoft AI: MAI-Voice-2.1 · Standaardconfiguratie",
                "units": [
                  {
                    "amount": "0.000044",
                    "amount_unit": "usd_per_exact_physical_unit",
                    "billing_input": false,
                    "key": "8d1e4e9bf0f3647249d90a3c",
                    "label": "Input characters",
                    "public_unit_label": "per input character",
                    "quantity": "1",
                    "rate_role": "declared_tariff_rate",
                    "side": "in",
                    "unit": "input_character"
                  }
                ]
              }
            ]
          }
        ],
        "examples": [
          {
            "code": "set -eu\n: \"${AILOOT_API_KEY:?Set your Ailoot API key}\"\n: \"${AILOOT_VOICE_ID:?Choose an accepted voice ID from this exact model profile}\"\nexport AILOOT_VOICE_ID\npython3 - <<'PY_REQUEST'\nimport json,os\nfrom pathlib import Path\np=json.loads('{\"model\": \"microsoft/mai-voice-2.1\", \"input\": \"Good afternoon! This is a short voice take.\"}')\nvoice=os.environ[\"AILOOT_VOICE_ID\"]\nallowed=json.loads('[\"cs-CZ-Grant:MAI-Voice-2.1\", \"cs-CZ-Harper:MAI-Voice-2.1\", \"da-DK-Grant:MAI-Voice-2.1\", \"da-DK-Harper:MAI-Voice-2.1\", \"de-DE-Grant:MAI-Voice-2.1\", \"de-DE-Harper:MAI-Voice-2.1\", \"de-DE-Klaus:MAI-Voice-2.1\", \"de-DE-Mia:MAI-Voice-2.1\", \"en-AU-Isla:MAI-Voice-2.1\", \"en-GB-Emily:MAI-Voice-2.1\", \"en-GB-Harry:MAI-Voice-2.1\", \"en-IN-Dhruv:MAI-Voice-2.1\", \"en-IN-Priya:MAI-Voice-2.1\", \"en-US-Ethan:MAI-Voice-2.1\", \"en-US-Grant:MAI-Voice-2.1\", \"en-US-Harper:MAI-Voice-2.1\", \"en-US-Iris:MAI-Voice-2.1\", \"en-US-Jasper:MAI-Voice-2.1\", \"en-US-Olivia:MAI-Voice-2.1\", \"en-US-Sage:MAI-Voice-2.1\", \"es-ES-Marta:MAI-Voice-2.1\", \"es-MX-Alejo:MAI-Voice-2.1\", \"es-MX-Grant:MAI-Voice-2.1\", \"es-MX-Harper:MAI-Voice-2.1\", \"es-MX-Valeria:MAI-Voice-2.1\", \"fi-FI-Grant:MAI-Voice-2.1\", \"fi-FI-Harper:MAI-Voice-2.1\", \"fr-FR-Grant:MAI-Voice-2.1\", \"fr-FR-Harper:MAI-Voice-2.1\", \"fr-FR-Marc:MAI-Voice-2.1\", \"fr-FR-Soleil:MAI-Voice-2.1\", \"hi-IN-Arjun:MAI-Voice-2.1\", \"hi-IN-Dhruv:MAI-Voice-2.1\", \"hi-IN-Grant:MAI-Voice-2.1\", \"hi-IN-Harper:MAI-Voice-2.1\", \"hi-IN-Kavya:MAI-Voice-2.1\", \"hi-IN-Priya:MAI-Voice-2.1\", \"hu-HU-Bence:MAI-Voice-2.1\", \"hu-HU-Grant:MAI-Voice-2.1\", \"hu-HU-Harper:MAI-Voice-2.1\", \"hu-HU-Levente:MAI-Voice-2.1\", \"hu-HU-Lilla:MAI-Voice-2.1\", \"hu-HU-Reka:MAI-Voice-2.1\", \"id-ID-Grant:MAI-Voice-2.1\", \"id-ID-Harper:MAI-Voice-2.1\", \"it-IT-Grant:MAI-Voice-2.1\", \"it-IT-Harper:MAI-Voice-2.1\", \"it-IT-Luca:MAI-Voice-2.1\", \"it-IT-Rosa:MAI-Voice-2.1\", \"ko-KR-Grant:MAI-Voice-2.1\", \"ko-KR-Haena:MAI-Voice-2.1\", \"ko-KR-Harper:MAI-Voice-2.1\", \"ko-KR-Junho:MAI-Voice-2.1\", \"nb-NO-Grant:MAI-Voice-2.1\", \"nb-NO-Harper:MAI-Voice-2.1\", \"nl-NL-Grant:MAI-Voice-2.1\", \"nl-NL-Harper:MAI-Voice-2.1\", \"nl-NL-Sander:MAI-Voice-2.1\", \"pl-PL-Grant:MAI-Voice-2.1\", \"pl-PL-Harper:MAI-Voice-2.1\", \"pt-BR-Caio:MAI-Voice-2.1\", \"pt-BR-Grant:MAI-Voice-2.1\", \"pt-BR-Harper:MAI-Voice-2.1\", \"pt-BR-Luana:MAI-Voice-2.1\", \"pt-BR-Pedro:MAI-Voice-2.1\", \"pt-BR-Rafael:MAI-Voice-2.1\", \"pt-PT-Grant:MAI-Voice-2.1\", \"pt-PT-Harper:MAI-Voice-2.1\", \"pt-PT-Rui:MAI-Voice-2.1\", \"ro-RO-Andrei:MAI-Voice-2.1\", \"ro-RO-Elena:MAI-Voice-2.1\", \"ro-RO-Grant:MAI-Voice-2.1\", \"ro-RO-Harper:MAI-Voice-2.1\", \"ro-RO-Ioana:MAI-Voice-2.1\", \"ro-RO-Radu:MAI-Voice-2.1\", \"ru-RU-Grant:MAI-Voice-2.1\", \"ru-RU-Harper:MAI-Voice-2.1\", \"ru-RU-Lev:MAI-Voice-2.1\", \"ru-RU-Masha:MAI-Voice-2.1\", \"sv-SE-Grant:MAI-Voice-2.1\", \"sv-SE-Harper:MAI-Voice-2.1\", \"th-TH-Grant:MAI-Voice-2.1\", \"th-TH-Harper:MAI-Voice-2.1\", \"th-TH-Krit:MAI-Voice-2.1\", \"th-TH-Nattapong:MAI-Voice-2.1\", \"tr-TR-Aydin:MAI-Voice-2.1\", \"tr-TR-Elif:MAI-Voice-2.1\", \"tr-TR-Grant:MAI-Voice-2.1\", \"tr-TR-Harper:MAI-Voice-2.1\", \"vi-VN-Grant:MAI-Voice-2.1\", \"vi-VN-Harper:MAI-Voice-2.1\", \"zh-CN-Bo:MAI-Voice-2.1\", \"zh-CN-Grant:MAI-Voice-2.1\", \"zh-CN-Harper:MAI-Voice-2.1\", \"zh-CN-Lan:MAI-Voice-2.1\", \"zh-CN-Mei:MAI-Voice-2.1\", \"zh-CN-Wei:MAI-Voice-2.1\"]')\nif voice not in allowed: raise SystemExit(\"Choose an accepted voice ID from this exact model profile\")\np[\"voice\"]=voice\np[\"response_format\"]=\"mp3\"\nPath(\"request.json\").write_text(json.dumps(p,ensure_ascii=False))\nPY_REQUEST\ncurl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/audio/speech \\\n  -H \"Authorization: Bearer $AILOOT_API_KEY\" -H 'Content-Type: application/json' \\\n  --data-binary @request.json -D response-headers.txt -o speech.mp3\n",
            "label": "curl",
            "language": "bash"
          },
          {
            "code": "set -eu\n: \"${AILOOT_API_KEY:?Set your Ailoot API key}\"\ncurl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/media/assets \\\n  -H \"Authorization: Bearer $AILOOT_API_KEY\" -o media-assets.json\n",
            "label": "List actual media assets",
            "language": "bash"
          },
          {
            "code": "set -eu\n: \"${AILOOT_API_KEY:?Set your Ailoot API key}\"\n: \"${AILOOT_MEDIA_TASK_ID:?Set the actual ID returned by the response or media-library metadata}\"\nexport AILOOT_MEDIA_TASK_ID\nresource_id=$(python3 -c 'import os,urllib.parse;print(urllib.parse.quote(os.environ[\"AILOOT_MEDIA_TASK_ID\"],safe=\"\"))')\ncurl --fail-with-body --silent --show-error \"https://api.ailoot.ai/v1/media/tasks/$resource_id\" \\\n  -H \"Authorization: Bearer $AILOOT_API_KEY\" -o media-task.json\npython3 - <<'PY_RESULT'\nimport json\nfrom pathlib import Path\nprint(json.dumps(json.loads(Path(\"media-task.json\").read_text())))\nPY_RESULT\n",
            "label": "Read actual media task",
            "language": "bash"
          },
          {
            "code": "set -eu\n: \"${AILOOT_API_KEY:?Set your Ailoot API key}\"\n: \"${AILOOT_ASSET_ID:?Set the actual ID returned by the response or media-library metadata}\"\nexport AILOOT_ASSET_ID\nresource_id=$(python3 -c 'import os,urllib.parse;print(urllib.parse.quote(os.environ[\"AILOOT_ASSET_ID\"],safe=\"\"))')\ncurl --fail-with-body --silent --show-error \"https://api.ailoot.ai/v1/media/assets/$resource_id\" \\\n  -H \"Authorization: Bearer $AILOOT_API_KEY\" -o media-asset.json\npython3 - <<'PY_RESULT'\nimport json\nfrom pathlib import Path\nprint(json.dumps(json.loads(Path(\"media-asset.json\").read_text())))\nPY_RESULT\n",
            "label": "Read actual asset metadata",
            "language": "bash"
          }
        ],
        "family": "openai",
        "fast_multiplier": null,
        "flex_multiplier": null,
        "fmt": "speech",
        "hints": [
          "Select exact voice from this model profile.",
          "Input characters and audio seconds are different meters."
        ],
        "http": "POST",
        "in": null,
        "input": [
          "text"
        ],
        "label": "Озвучка текста",
        "max_out": null,
        "max_reasoning_effort_multiplier": null,
        "method_aliases": [],
        "out": null,
        "output": [
          "audio"
        ],
        "path": "/v1/audio/speech",
        "price_conditions": [
          {
            "label": "Fast mode",
            "value": "Not specified",
            "when": "When fast mode is selected"
          },
          {
            "label": "Flex mode",
            "value": "Not specified",
            "when": "When flex mode is selected"
          },
          {
            "label": "Maximum reasoning effort",
            "value": "Not specified",
            "when": "When maximum reasoning effort uses the default adjustment"
          }
        ],
        "pricing": {
          "billing_mode": "per_request",
          "image_input_price": null,
          "image_output_price": null,
          "per_request_price": null,
          "unit_prices": {
            "audio_input_character": 4.4e-05
          }
        },
        "pricing_profiles": [
          {
            "dimensions": {
              "regime": "base"
            },
            "label": "Base token rates",
            "units": [
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": true,
                "estimate_only": false,
                "key": "input_price",
                "label": "Input tokens",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "input_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": false,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "input_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": true,
                "estimate_only": false,
                "key": "output_price",
                "label": "Output tokens",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "output_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": false,
                "rate_role": "typed_native_retail_rate",
                "side": "out",
                "unit": "output_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": true,
                "estimate_only": false,
                "key": "cache_read_price",
                "label": "Cache read",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "cached_input_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": false,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "cached_input_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": true,
                "estimate_only": false,
                "key": "cache_write_price",
                "label": "Cache write",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "generic_cache_creation_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": false,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "generic_cache_creation_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": true,
                "estimate_only": false,
                "key": "cache_write_1h_price",
                "label": "Cache write, 1 hour",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "one_hour_cache_creation_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": false,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "one_hour_cache_creation_token"
              }
            ]
          },
          {
            "dimensions": {
              "quantity_meter": "utf8.RuneCountInString(validUTF8): one Han codepoint=1; no Han weighting",
              "quoted_unit": "per 1000 input character"
            },
            "label": "Ultra",
            "units": [
              {
                "amount": "0.044000",
                "amount_unit": "usd_per_1000_characters",
                "billing_input": true,
                "estimate_only": false,
                "key": "audio_input_character",
                "label": "input character",
                "native_amount_usd_per_unit": "0.000044",
                "native_quantity": 1,
                "public_unit_label": "per 1000 input character",
                "quantity": "1000",
                "quantity_is_estimate": false,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "input_character"
              }
            ]
          }
        ],
        "request_model_id": "microsoft/mai-voice-2.1",
        "route_label": "Ultra",
        "status_reads": [
          "GET /v1/media/tasks/{task_id}",
          "GET /v1/media/assets/{asset_id}/content"
        ],
        "tiers": [],
        "units": [
          {
            "amount": null,
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": true,
            "estimate_only": false,
            "key": "input_price",
            "label": "Input tokens",
            "native_amount_usd_per_unit": null,
            "native_quantity": 1,
            "native_unit": "input_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": false,
            "rate_role": "typed_native_retail_rate",
            "side": "in",
            "unit": "input_token"
          },
          {
            "amount": null,
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": true,
            "estimate_only": false,
            "key": "output_price",
            "label": "Output tokens",
            "native_amount_usd_per_unit": null,
            "native_quantity": 1,
            "native_unit": "output_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": false,
            "rate_role": "typed_native_retail_rate",
            "side": "out",
            "unit": "output_token"
          },
          {
            "amount": null,
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": true,
            "estimate_only": false,
            "key": "cache_read_price",
            "label": "Cache read",
            "native_amount_usd_per_unit": null,
            "native_quantity": 1,
            "native_unit": "cached_input_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": false,
            "rate_role": "typed_native_retail_rate",
            "side": "in",
            "unit": "cached_input_token"
          },
          {
            "amount": null,
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": true,
            "estimate_only": false,
            "key": "cache_write_price",
            "label": "Cache write",
            "native_amount_usd_per_unit": null,
            "native_quantity": 1,
            "native_unit": "generic_cache_creation_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": false,
            "rate_role": "typed_native_retail_rate",
            "side": "in",
            "unit": "generic_cache_creation_token"
          },
          {
            "amount": null,
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": true,
            "estimate_only": false,
            "key": "cache_write_1h_price",
            "label": "Cache write, 1 hour",
            "native_amount_usd_per_unit": null,
            "native_quantity": 1,
            "native_unit": "one_hour_cache_creation_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": false,
            "rate_role": "typed_native_retail_rate",
            "side": "in",
            "unit": "one_hour_cache_creation_token"
          },
          {
            "amount": "0.044000",
            "amount_unit": "usd_per_1000_characters",
            "billing_input": true,
            "estimate_only": false,
            "key": "audio_input_character",
            "label": "input character",
            "native_amount_usd_per_unit": "0.000044",
            "native_quantity": 1,
            "public_unit_label": "per 1000 input character",
            "quantity": "1000",
            "quantity_is_estimate": false,
            "rate_role": "typed_native_retail_rate",
            "side": "in",
            "unit": "input_character"
          }
        ]
      }
    }
  ],
  "model_id": "microsoft/mai-voice-2.1",
  "nativeProvenance": {
    "input_facts_canonical_sha256": "6f91dd76863ba8cd47bad227e4b8496b94c5081b18c1a598014405a4dac390b1",
    "input_html_sha256": "e06a69e7b0e47c7140e69e136fdb7714f9e95fe095d474bb4b089cdb37500774",
    "private_audit_sha256": "f1f95cdda07501434486401c975cf3c83b531cbd14a964e2ec107700181ae100",
    "role": "historical-normalized-input-audit-hashes",
    "schema": "ailoot-native-model-provenance-v2"
  },
  "page": {
    "canonical": "https://ailoot.ai/models/nl-be/microsoft-mai-voice-2-1/",
    "description": "MAI-Voice-2.1 van Microsoft AI genereert expressieve meertalige spraak voor vertelteksten, luisterboeken, educatieve content en voice-overs. Het profiel met 23 talen ondersteunt een consistente sprekeridentiteit, meerdere sprekers en gerichte controle over de voordracht.",
    "locale": "nl-be",
    "md_url": "https://ailoot.ai/models/nl-be/microsoft-mai-voice-2-1/index.md",
    "title": "Microsoft AI: MAI-Voice-2.1 — Ailoot",
    "url": "https://ailoot.ai/models/nl-be/microsoft-mai-voice-2-1/"
  },
  "rawModel": {
    "about": "MAI-Voice-2.1 is het met prompts aangestuurde tekst-naar-spraakmodel van Microsoft AI voor werk waarbij expressieve voordracht en geluidsgetrouwheid belangrijk zijn. De modelkaart omvat drieëntwintig talen en zesentwintig taalvarianten, met natuurlijke intonatie, ritme en emotionele nuances. De fabrikant noemt luisterboeken, vertelteksten voor media, contentcreatie en voice-overs als belangrijkste toepassingen. Deze versie legt de nadruk op langere expressieve content; MAI-Voice-2.1-Flash is de afzonderlijke keuze voor interacties waarbij een korte reactietijd belangrijk is.\n\n### Vertellen met een consistente spreker\n\nDe modelkaart beschrijft één stemidentiteit die consistent wordt weergegeven in alle ondersteunde talen. Voor het genereren van langere stukken wordt de tekst in delen verwerkt en wordt context meegenomen om de samenhang tussen passages te verbeteren. Dat is nuttig voor een les, een hoofdstuk van een luisterboek of een reeks verwante voice-overonderdelen waarin het karakter van de verteller behouden moet blijven. Bereid samenhangende passages met duidelijke grenzen voor en behoud dezelfde sprekerkeuze door het hele stuk.\n\nDe invoer is het definitieve transcript, met een optionele sprekerreferentie en SSML-regelaars voor expressiviteit. Een briefing voor een verteltekst moet onderscheid maken tussen wat de luisteraar hoort en productienotities. Schrijf voor een technische uitleg een duidelijke inleiding, vervolgens de concrete stappen en de afsluitende instructie. Schrijf productnamen en terugkerende termen steeds op dezelfde manier. Bereid voor een gelokaliseerde verteltekst het script in de doeltaal voor; de gekozen taal en stem bepalen hoe het wordt uitgesproken.\n\n### Sprekers, rollen en controle over expressiviteit\n\nMicrosoft biedt een zorgvuldig samengestelde stemmenbibliotheek en beschrijft ondersteuning voor meerdere sprekers in dialogen. Harper en Grant zijn voorbeelden van sprekeridentiteiten met vermeldingen voor verschillende taalvarianten. In een educatief gesprek tussen twee personen kunnen de vraag en de uitleg verschillende stemmen krijgen, waarbij dezelfde toewijzing behouden blijft wanneer een rol terugkomt. Label de gesproken regels duidelijk zodat het gewenste gesprek in de synthese-invoer is vastgelegd.\n\nToon en voordracht kunnen via SSML per spreekbeurt of zin worden vormgegeven. Stijlen zijn sprekergebonden: de beheerde catalogus vermeldt taakgerichte vertel- of onderwijsstijlen voor geschikte stemmen en emotionele keuzes zoals blij of opgelucht voor andere stemmen. De Amerikaanse vermelding van Harper ondersteunt die twee emotionele stijlen. Kies de spreker en diens gedocumenteerde voordrachtstijl samen, in plaats van een stijl van een andere stem over te nemen.\n\nIn een verhaal of presentatie kan expressiviteit een feitelijke uitleg, een beschouwende passage en een levendig citaat van elkaar onderscheiden. Een praktische zin is: “De eerste poging gaf ons een onvolledig beeld. Toen we de hele reeks bekeken, werd de ontbrekende stap duidelijk.” Bepaal waar de betekenis verandert en bereid de gesproken eenheden daarop voor. Luister naar de overgangen zodat de voordracht het verhaal volgt en niet elke zin even sterk benadrukt.\n\n### Referentiestem en audioresultaat\n\nDe optionele modus voor een aangepaste stem benadert een spreker die toestemming heeft gegeven op basis van een audioreferentie van vijf tot zestig seconden, zonder fine-tuning. Microsoft raadt een natuurlijke gesprekstoon en gematigde energie in die referentie aan, omdat het fragment de gegenereerde stem beïnvloedt. De workflow voor een aangepaste stem vereist goedkeuring van de fabrikant en een opgenomen toestemmingsverklaring. De bibliotheek met vooraf gebouwde stemmen vormt een afzonderlijke route voor stemselectie.\n\nDe fabrikant laat een uitvoerformaat kiezen en slaat in het gepubliceerde synthesevoorbeeld mono-MP3 op met 24 kHz en 160 kbit/s. Deze instellingen beschrijven één uitvoerworkflow. Kies de audiorepresentatie voor de volgende montage- of afspeelfase en houd het script, de spreker en de volgorde van de onderdelen gekoppeld aan de opname. Een voltooid hoofdstuk of een les kan meerdere gegenereerde passages bevatten en toch één samenhangende luisterervaring blijven.\n\n### Het langere resultaat gebruiken\n\nMAI-Voice-2.1 is gericht op natuurlijkheid en expressie wanneer een onmiddellijke reactie minder belangrijk is dan de gesproken uitvoering. Controleer bij een langer stuk terugkerende namen, grenzen tussen onderdelen, de stemmen die aan dialogen zijn toegewezen en veranderingen in emotioneel register. De documentatie beschrijft mogelijkheden voor lange content en mechanismen voor consistentie, zonder een onbeperkt script of een gegarandeerde maximale opnameduur vast te leggen. Het praktische resultaat is expressieve audio waarvan de verteller, formulering en opbouw overeenkomen met het voorbereide materiaal.",
    "alias_of": null,
    "aliases": [],
    "author": "Microsoft AI",
    "available": null,
    "canonical_model": "microsoft/mai-voice-2.1",
    "capabilities": {
      "context_length": 0,
      "manufacturer_input": [
        "text"
      ],
      "manufacturer_output": [
        "speech"
      ]
    },
    "card_routes": [
      {
        "label": "Ultra",
        "rates": [
          {
            "amount": "0.044000",
            "amount_unit": "usd_per_1000_characters",
            "billing_input": true,
            "estimate_only": false,
            "key": "audio_input_character",
            "label": "input character",
            "native_amount_usd_per_unit": "0.000044",
            "native_quantity": 1,
            "public_unit_label": "per 1000 input character",
            "quantity": "1000",
            "quantity_is_estimate": false,
            "rate_role": "typed_native_retail_rate",
            "side": "in",
            "unit": "input_character"
          }
        ],
        "summary": "De volledige prijsinformatie voor de configuratie vindt u bij de details."
      }
    ],
    "ctx": null,
    "entity_type": "model",
    "formats": [
      "speech"
    ],
    "id": "microsoft/mai-voice-2.1",
    "input": [
      "text"
    ],
    "kind": "speech",
    "max_out": null,
    "methods": [
      {
        "available": null,
        "cache_read": null,
        "cache_write": null,
        "cache_write_1h": null,
        "contract": {
          "data": {
            "all_results": "Keep the complete binary result and headers. If JSON/multiple outputs are returned, retain every data item and fetch each actual signed asset URL.",
            "errors": [
              {
                "code": null,
                "condition": "Verplichte velden, de materiaalrepresentatie of een parameterwaarde zijn ongeldig",
                "http_status": 400,
                "recovery": "Corrigeer de aangegeven velden vóór een nieuwe aanmaakaanvraag.",
                "type": "invalid_request_error"
              },
              {
                "code": null,
                "condition": "De teruggegeven respons geeft aan dat de bewerking of het resultaat gecontroleerd moet worden",
                "http_status": null,
                "recovery": "Bewaar de oorspronkelijk teruggegeven bewerkings-/taak-ID, aanvraagheaders en respons; blijf de oorspronkelijke bewerking uitlezen via de ondersteunde leesaanvragen. Dien de aanmaakaanvraag niet opnieuw in.",
                "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": "Bewaar de oorspronkelijke operation_id/X-Client-Request-ID voor reconciliatie zonder de aanvraag opnieuw in te dienen; er is geen afzonderlijke route om de audiostatus te pollen."
            },
            "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": "Bewaar het volledige binaire resultaat en de headers. Als JSON of meerdere uitvoerresultaten worden teruggegeven, bewaar dan elk gegevensitem en haal elke daadwerkelijke ondertekende asset-URL op.",
              "family": "audio",
              "fields": [
                {
                  "description": null,
                  "name": "binary audio",
                  "type": "bytes"
                },
                {
                  "description": null,
                  "name": "response headers",
                  "type": "headers"
                }
              ],
              "format": "mp3",
              "http_success": 200
            },
            "parameters": [
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": [
                  "microsoft/mai-voice-2.1"
                ],
                "enum_known": true,
                "name": "model",
                "required": true,
                "type": "string"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": null,
                "enum_known": false,
                "limit_known": false,
                "maximum_length": null,
                "min_length": 1,
                "name": "input",
                "required": true,
                "type": "string",
                "unit": "Unicode-tekens"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": [
                  "cs-CZ-Grant:MAI-Voice-2.1",
                  "cs-CZ-Harper:MAI-Voice-2.1",
                  "da-DK-Grant:MAI-Voice-2.1",
                  "da-DK-Harper:MAI-Voice-2.1",
                  "de-DE-Grant:MAI-Voice-2.1",
                  "de-DE-Harper:MAI-Voice-2.1",
                  "de-DE-Klaus:MAI-Voice-2.1",
                  "de-DE-Mia:MAI-Voice-2.1",
                  "en-AU-Isla:MAI-Voice-2.1",
                  "en-GB-Emily:MAI-Voice-2.1",
                  "en-GB-Harry:MAI-Voice-2.1",
                  "en-IN-Dhruv:MAI-Voice-2.1",
                  "en-IN-Priya:MAI-Voice-2.1",
                  "en-US-Ethan:MAI-Voice-2.1",
                  "en-US-Grant:MAI-Voice-2.1",
                  "en-US-Harper:MAI-Voice-2.1",
                  "en-US-Iris:MAI-Voice-2.1",
                  "en-US-Jasper:MAI-Voice-2.1",
                  "en-US-Olivia:MAI-Voice-2.1",
                  "en-US-Sage:MAI-Voice-2.1",
                  "es-ES-Marta:MAI-Voice-2.1",
                  "es-MX-Alejo:MAI-Voice-2.1",
                  "es-MX-Grant:MAI-Voice-2.1",
                  "es-MX-Harper:MAI-Voice-2.1",
                  "es-MX-Valeria:MAI-Voice-2.1",
                  "fi-FI-Grant:MAI-Voice-2.1",
                  "fi-FI-Harper:MAI-Voice-2.1",
                  "fr-FR-Grant:MAI-Voice-2.1",
                  "fr-FR-Harper:MAI-Voice-2.1",
                  "fr-FR-Marc:MAI-Voice-2.1",
                  "fr-FR-Soleil:MAI-Voice-2.1",
                  "hi-IN-Arjun:MAI-Voice-2.1",
                  "hi-IN-Dhruv:MAI-Voice-2.1",
                  "hi-IN-Grant:MAI-Voice-2.1",
                  "hi-IN-Harper:MAI-Voice-2.1",
                  "hi-IN-Kavya:MAI-Voice-2.1",
                  "hi-IN-Priya:MAI-Voice-2.1",
                  "hu-HU-Bence:MAI-Voice-2.1",
                  "hu-HU-Grant:MAI-Voice-2.1",
                  "hu-HU-Harper:MAI-Voice-2.1",
                  "hu-HU-Levente:MAI-Voice-2.1",
                  "hu-HU-Lilla:MAI-Voice-2.1",
                  "hu-HU-Reka:MAI-Voice-2.1",
                  "id-ID-Grant:MAI-Voice-2.1",
                  "id-ID-Harper:MAI-Voice-2.1",
                  "it-IT-Grant:MAI-Voice-2.1",
                  "it-IT-Harper:MAI-Voice-2.1",
                  "it-IT-Luca:MAI-Voice-2.1",
                  "it-IT-Rosa:MAI-Voice-2.1",
                  "ko-KR-Grant:MAI-Voice-2.1",
                  "ko-KR-Haena:MAI-Voice-2.1",
                  "ko-KR-Harper:MAI-Voice-2.1",
                  "ko-KR-Junho:MAI-Voice-2.1",
                  "nb-NO-Grant:MAI-Voice-2.1",
                  "nb-NO-Harper:MAI-Voice-2.1",
                  "nl-NL-Grant:MAI-Voice-2.1",
                  "nl-NL-Harper:MAI-Voice-2.1",
                  "nl-NL-Sander:MAI-Voice-2.1",
                  "pl-PL-Grant:MAI-Voice-2.1",
                  "pl-PL-Harper:MAI-Voice-2.1",
                  "pt-BR-Caio:MAI-Voice-2.1",
                  "pt-BR-Grant:MAI-Voice-2.1",
                  "pt-BR-Harper:MAI-Voice-2.1",
                  "pt-BR-Luana:MAI-Voice-2.1",
                  "pt-BR-Pedro:MAI-Voice-2.1",
                  "pt-BR-Rafael:MAI-Voice-2.1",
                  "pt-PT-Grant:MAI-Voice-2.1",
                  "pt-PT-Harper:MAI-Voice-2.1",
                  "pt-PT-Rui:MAI-Voice-2.1",
                  "ro-RO-Andrei:MAI-Voice-2.1",
                  "ro-RO-Elena:MAI-Voice-2.1",
                  "ro-RO-Grant:MAI-Voice-2.1",
                  "ro-RO-Harper:MAI-Voice-2.1",
                  "ro-RO-Ioana:MAI-Voice-2.1",
                  "ro-RO-Radu:MAI-Voice-2.1",
                  "ru-RU-Grant:MAI-Voice-2.1",
                  "ru-RU-Harper:MAI-Voice-2.1",
                  "ru-RU-Lev:MAI-Voice-2.1",
                  "ru-RU-Masha:MAI-Voice-2.1",
                  "sv-SE-Grant:MAI-Voice-2.1",
                  "sv-SE-Harper:MAI-Voice-2.1",
                  "th-TH-Grant:MAI-Voice-2.1",
                  "th-TH-Harper:MAI-Voice-2.1",
                  "th-TH-Krit:MAI-Voice-2.1",
                  "th-TH-Nattapong:MAI-Voice-2.1",
                  "tr-TR-Aydin:MAI-Voice-2.1",
                  "tr-TR-Elif:MAI-Voice-2.1",
                  "tr-TR-Grant:MAI-Voice-2.1",
                  "tr-TR-Harper:MAI-Voice-2.1",
                  "vi-VN-Grant:MAI-Voice-2.1",
                  "vi-VN-Harper:MAI-Voice-2.1",
                  "zh-CN-Bo:MAI-Voice-2.1",
                  "zh-CN-Grant:MAI-Voice-2.1",
                  "zh-CN-Harper:MAI-Voice-2.1",
                  "zh-CN-Lan:MAI-Voice-2.1",
                  "zh-CN-Mei:MAI-Voice-2.1",
                  "zh-CN-Wei:MAI-Voice-2.1"
                ],
                "enum_known": true,
                "name": "voice",
                "required": true,
                "type": "string"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": [
                  "mp3"
                ],
                "enum_known": true,
                "name": "response_format",
                "required": true,
                "type": "string"
              }
            ],
            "profile_binding": "Exact existing Ailoot model and method; interface constraints below do not assert provider qualification.",
            "unsupported": [
              "every field outside exactmodel,input,voice,response_format",
              "stream/speed/reference speech options"
            ]
          },
          "hints": [
            "Selecteer de exacte stem uit dit modelprofiel.",
            "Invoertekens en audioseconden zijn verschillende meeteenheden."
          ],
          "input": {
            "content_type": "application/json",
            "input": "exacte UTF-8-tekst; aantal Unicode-tekens zonder normalisatie",
            "material_types": [
              "text"
            ],
            "max_input_characters": null,
            "other_options": false,
            "required": [
              "model",
              "input",
              "voice",
              "response_format"
            ],
            "response_format": [
              "mp3"
            ],
            "voice_ids": [
              "cs-CZ-Grant:MAI-Voice-2.1",
              "cs-CZ-Harper:MAI-Voice-2.1",
              "da-DK-Grant:MAI-Voice-2.1",
              "da-DK-Harper:MAI-Voice-2.1",
              "de-DE-Grant:MAI-Voice-2.1",
              "de-DE-Harper:MAI-Voice-2.1",
              "de-DE-Klaus:MAI-Voice-2.1",
              "de-DE-Mia:MAI-Voice-2.1",
              "en-AU-Isla:MAI-Voice-2.1",
              "en-GB-Emily:MAI-Voice-2.1",
              "en-GB-Harry:MAI-Voice-2.1",
              "en-IN-Dhruv:MAI-Voice-2.1",
              "en-IN-Priya:MAI-Voice-2.1",
              "en-US-Ethan:MAI-Voice-2.1",
              "en-US-Grant:MAI-Voice-2.1",
              "en-US-Harper:MAI-Voice-2.1",
              "en-US-Iris:MAI-Voice-2.1",
              "en-US-Jasper:MAI-Voice-2.1",
              "en-US-Olivia:MAI-Voice-2.1",
              "en-US-Sage:MAI-Voice-2.1",
              "es-ES-Marta:MAI-Voice-2.1",
              "es-MX-Alejo:MAI-Voice-2.1",
              "es-MX-Grant:MAI-Voice-2.1",
              "es-MX-Harper:MAI-Voice-2.1",
              "es-MX-Valeria:MAI-Voice-2.1",
              "fi-FI-Grant:MAI-Voice-2.1",
              "fi-FI-Harper:MAI-Voice-2.1",
              "fr-FR-Grant:MAI-Voice-2.1",
              "fr-FR-Harper:MAI-Voice-2.1",
              "fr-FR-Marc:MAI-Voice-2.1",
              "fr-FR-Soleil:MAI-Voice-2.1",
              "hi-IN-Arjun:MAI-Voice-2.1",
              "hi-IN-Dhruv:MAI-Voice-2.1",
              "hi-IN-Grant:MAI-Voice-2.1",
              "hi-IN-Harper:MAI-Voice-2.1",
              "hi-IN-Kavya:MAI-Voice-2.1",
              "hi-IN-Priya:MAI-Voice-2.1",
              "hu-HU-Bence:MAI-Voice-2.1",
              "hu-HU-Grant:MAI-Voice-2.1",
              "hu-HU-Harper:MAI-Voice-2.1",
              "hu-HU-Levente:MAI-Voice-2.1",
              "hu-HU-Lilla:MAI-Voice-2.1",
              "hu-HU-Reka:MAI-Voice-2.1",
              "id-ID-Grant:MAI-Voice-2.1",
              "id-ID-Harper:MAI-Voice-2.1",
              "it-IT-Grant:MAI-Voice-2.1",
              "it-IT-Harper:MAI-Voice-2.1",
              "it-IT-Luca:MAI-Voice-2.1",
              "it-IT-Rosa:MAI-Voice-2.1",
              "ko-KR-Grant:MAI-Voice-2.1",
              "ko-KR-Haena:MAI-Voice-2.1",
              "ko-KR-Harper:MAI-Voice-2.1",
              "ko-KR-Junho:MAI-Voice-2.1",
              "nb-NO-Grant:MAI-Voice-2.1",
              "nb-NO-Harper:MAI-Voice-2.1",
              "nl-NL-Grant:MAI-Voice-2.1",
              "nl-NL-Harper:MAI-Voice-2.1",
              "nl-NL-Sander:MAI-Voice-2.1",
              "pl-PL-Grant:MAI-Voice-2.1",
              "pl-PL-Harper:MAI-Voice-2.1",
              "pt-BR-Caio:MAI-Voice-2.1",
              "pt-BR-Grant:MAI-Voice-2.1",
              "pt-BR-Harper:MAI-Voice-2.1",
              "pt-BR-Luana:MAI-Voice-2.1",
              "pt-BR-Pedro:MAI-Voice-2.1",
              "pt-BR-Rafael:MAI-Voice-2.1",
              "pt-PT-Grant:MAI-Voice-2.1",
              "pt-PT-Harper:MAI-Voice-2.1",
              "pt-PT-Rui:MAI-Voice-2.1",
              "ro-RO-Andrei:MAI-Voice-2.1",
              "ro-RO-Elena:MAI-Voice-2.1",
              "ro-RO-Grant:MAI-Voice-2.1",
              "ro-RO-Harper:MAI-Voice-2.1",
              "ro-RO-Ioana:MAI-Voice-2.1",
              "ro-RO-Radu:MAI-Voice-2.1",
              "ru-RU-Grant:MAI-Voice-2.1",
              "ru-RU-Harper:MAI-Voice-2.1",
              "ru-RU-Lev:MAI-Voice-2.1",
              "ru-RU-Masha:MAI-Voice-2.1",
              "sv-SE-Grant:MAI-Voice-2.1",
              "sv-SE-Harper:MAI-Voice-2.1",
              "th-TH-Grant:MAI-Voice-2.1",
              "th-TH-Harper:MAI-Voice-2.1",
              "th-TH-Krit:MAI-Voice-2.1",
              "th-TH-Nattapong:MAI-Voice-2.1",
              "tr-TR-Aydin:MAI-Voice-2.1",
              "tr-TR-Elif:MAI-Voice-2.1",
              "tr-TR-Grant:MAI-Voice-2.1",
              "tr-TR-Harper:MAI-Voice-2.1",
              "vi-VN-Grant:MAI-Voice-2.1",
              "vi-VN-Harper:MAI-Voice-2.1",
              "zh-CN-Bo:MAI-Voice-2.1",
              "zh-CN-Grant:MAI-Voice-2.1",
              "zh-CN-Harper:MAI-Voice-2.1",
              "zh-CN-Lan:MAI-Voice-2.1",
              "zh-CN-Mei:MAI-Voice-2.1",
              "zh-CN-Wei:MAI-Voice-2.1"
            ]
          },
          "lifecycle": {
            "assets": [
              {
                "http": "GET",
                "path": "/v1/media/assets"
              },
              {
                "http": "GET",
                "path": "/v1/media/assets/{asset_id}"
              }
            ],
            "content": [
              {
                "http": "GET",
                "path": "/v1/media/assets/{asset_id}/content",
                "url_source": "exact returned signed URL; never construct token"
              }
            ],
            "mode": "synchronous_result_then_owned_library",
            "operation_id_is_not_task_id": true,
            "status": [
              {
                "http": "GET",
                "id_source": "daadwerkelijk teruggegeven task_id of record in de mediabibliotheek",
                "path": "/v1/media/tasks/{task_id}"
              }
            ],
            "unknown": "Retain original operation_id/X-Client-Request-ID for reconciliation without resubmission; no dedicated audio poll route."
          },
          "manufacturer_capability": null,
          "method": {
            "http": "POST",
            "path": "/v1/audio/speech"
          },
          "method_aliases": [],
          "operation_modes": [
            "text_to_speech"
          ],
          "output": {
            "family": "audio",
            "format": "mp3",
            "http_success": 200,
            "response": "full binary MP3 plus response headers",
            "result": "complete playable owned MP3"
          }
        },
        "ctx": null,
        "declared_pricing_profiles": [
          {
            "dimensions": {
              "regime": "base"
            },
            "label": "Base token rates",
            "units": [
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": true,
                "estimate_only": false,
                "key": "input_price",
                "label": "Input tokens",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "input_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": false,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "input_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": true,
                "estimate_only": false,
                "key": "output_price",
                "label": "Output tokens",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "output_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": false,
                "rate_role": "typed_native_retail_rate",
                "side": "out",
                "unit": "output_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": true,
                "estimate_only": false,
                "key": "cache_read_price",
                "label": "Cache read",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "cached_input_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": false,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "cached_input_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": true,
                "estimate_only": false,
                "key": "cache_write_price",
                "label": "Cache write",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "generic_cache_creation_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": false,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "generic_cache_creation_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": true,
                "estimate_only": false,
                "key": "cache_write_1h_price",
                "label": "Cache write, 1 hour",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "one_hour_cache_creation_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": false,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "one_hour_cache_creation_token"
              }
            ]
          },
          {
            "dimensions": {
              "quantity_meter": "utf8.RuneCountInString(validUTF8): one Han codepoint=1; no Han weighting",
              "quoted_unit": "per 1000 input character"
            },
            "label": "Ultra",
            "units": [
              {
                "amount": "0.044000",
                "amount_unit": "usd_per_1000_characters",
                "billing_input": true,
                "estimate_only": false,
                "key": "audio_input_character",
                "label": "input character",
                "native_amount_usd_per_unit": "0.000044",
                "native_quantity": 1,
                "public_unit_label": "per 1000 input character",
                "quantity": "1000",
                "quantity_is_estimate": false,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "input_character"
              }
            ]
          }
        ],
        "declared_tariff_references": [
          {
            "client_selectable": false,
            "key": "53ceea2ccaa50cadb12f",
            "label": "Microsoft AI: MAI-Voice-2.1",
            "profiles": [
              {
                "basis": "",
                "dimensions": {
                  "conditions": "Standaardconfiguratie"
                },
                "label": "Microsoft AI: MAI-Voice-2.1 · Standaardconfiguratie",
                "units": [
                  {
                    "amount": "0.000044",
                    "amount_unit": "usd_per_exact_physical_unit",
                    "billing_input": false,
                    "key": "8d1e4e9bf0f3647249d90a3c",
                    "label": "Input characters",
                    "public_unit_label": "per input character",
                    "quantity": "1",
                    "rate_role": "declared_tariff_rate",
                    "side": "in",
                    "unit": "input_character"
                  }
                ]
              }
            ]
          }
        ],
        "examples": [
          {
            "code": "set -eu\n: \"${AILOOT_API_KEY:?Set your Ailoot API key}\"\n: \"${AILOOT_VOICE_ID:?Choose an accepted voice ID from this exact model profile}\"\nexport AILOOT_VOICE_ID\npython3 - <<'PY_REQUEST'\nimport json,os\nfrom pathlib import Path\np=json.loads('{\"model\": \"microsoft/mai-voice-2.1\", \"input\": \"Good afternoon! This is a short voice take.\"}')\nvoice=os.environ[\"AILOOT_VOICE_ID\"]\nallowed=json.loads('[\"cs-CZ-Grant:MAI-Voice-2.1\", \"cs-CZ-Harper:MAI-Voice-2.1\", \"da-DK-Grant:MAI-Voice-2.1\", \"da-DK-Harper:MAI-Voice-2.1\", \"de-DE-Grant:MAI-Voice-2.1\", \"de-DE-Harper:MAI-Voice-2.1\", \"de-DE-Klaus:MAI-Voice-2.1\", \"de-DE-Mia:MAI-Voice-2.1\", \"en-AU-Isla:MAI-Voice-2.1\", \"en-GB-Emily:MAI-Voice-2.1\", \"en-GB-Harry:MAI-Voice-2.1\", \"en-IN-Dhruv:MAI-Voice-2.1\", \"en-IN-Priya:MAI-Voice-2.1\", \"en-US-Ethan:MAI-Voice-2.1\", \"en-US-Grant:MAI-Voice-2.1\", \"en-US-Harper:MAI-Voice-2.1\", \"en-US-Iris:MAI-Voice-2.1\", \"en-US-Jasper:MAI-Voice-2.1\", \"en-US-Olivia:MAI-Voice-2.1\", \"en-US-Sage:MAI-Voice-2.1\", \"es-ES-Marta:MAI-Voice-2.1\", \"es-MX-Alejo:MAI-Voice-2.1\", \"es-MX-Grant:MAI-Voice-2.1\", \"es-MX-Harper:MAI-Voice-2.1\", \"es-MX-Valeria:MAI-Voice-2.1\", \"fi-FI-Grant:MAI-Voice-2.1\", \"fi-FI-Harper:MAI-Voice-2.1\", \"fr-FR-Grant:MAI-Voice-2.1\", \"fr-FR-Harper:MAI-Voice-2.1\", \"fr-FR-Marc:MAI-Voice-2.1\", \"fr-FR-Soleil:MAI-Voice-2.1\", \"hi-IN-Arjun:MAI-Voice-2.1\", \"hi-IN-Dhruv:MAI-Voice-2.1\", \"hi-IN-Grant:MAI-Voice-2.1\", \"hi-IN-Harper:MAI-Voice-2.1\", \"hi-IN-Kavya:MAI-Voice-2.1\", \"hi-IN-Priya:MAI-Voice-2.1\", \"hu-HU-Bence:MAI-Voice-2.1\", \"hu-HU-Grant:MAI-Voice-2.1\", \"hu-HU-Harper:MAI-Voice-2.1\", \"hu-HU-Levente:MAI-Voice-2.1\", \"hu-HU-Lilla:MAI-Voice-2.1\", \"hu-HU-Reka:MAI-Voice-2.1\", \"id-ID-Grant:MAI-Voice-2.1\", \"id-ID-Harper:MAI-Voice-2.1\", \"it-IT-Grant:MAI-Voice-2.1\", \"it-IT-Harper:MAI-Voice-2.1\", \"it-IT-Luca:MAI-Voice-2.1\", \"it-IT-Rosa:MAI-Voice-2.1\", \"ko-KR-Grant:MAI-Voice-2.1\", \"ko-KR-Haena:MAI-Voice-2.1\", \"ko-KR-Harper:MAI-Voice-2.1\", \"ko-KR-Junho:MAI-Voice-2.1\", \"nb-NO-Grant:MAI-Voice-2.1\", \"nb-NO-Harper:MAI-Voice-2.1\", \"nl-NL-Grant:MAI-Voice-2.1\", \"nl-NL-Harper:MAI-Voice-2.1\", \"nl-NL-Sander:MAI-Voice-2.1\", \"pl-PL-Grant:MAI-Voice-2.1\", \"pl-PL-Harper:MAI-Voice-2.1\", \"pt-BR-Caio:MAI-Voice-2.1\", \"pt-BR-Grant:MAI-Voice-2.1\", \"pt-BR-Harper:MAI-Voice-2.1\", \"pt-BR-Luana:MAI-Voice-2.1\", \"pt-BR-Pedro:MAI-Voice-2.1\", \"pt-BR-Rafael:MAI-Voice-2.1\", \"pt-PT-Grant:MAI-Voice-2.1\", \"pt-PT-Harper:MAI-Voice-2.1\", \"pt-PT-Rui:MAI-Voice-2.1\", \"ro-RO-Andrei:MAI-Voice-2.1\", \"ro-RO-Elena:MAI-Voice-2.1\", \"ro-RO-Grant:MAI-Voice-2.1\", \"ro-RO-Harper:MAI-Voice-2.1\", \"ro-RO-Ioana:MAI-Voice-2.1\", \"ro-RO-Radu:MAI-Voice-2.1\", \"ru-RU-Grant:MAI-Voice-2.1\", \"ru-RU-Harper:MAI-Voice-2.1\", \"ru-RU-Lev:MAI-Voice-2.1\", \"ru-RU-Masha:MAI-Voice-2.1\", \"sv-SE-Grant:MAI-Voice-2.1\", \"sv-SE-Harper:MAI-Voice-2.1\", \"th-TH-Grant:MAI-Voice-2.1\", \"th-TH-Harper:MAI-Voice-2.1\", \"th-TH-Krit:MAI-Voice-2.1\", \"th-TH-Nattapong:MAI-Voice-2.1\", \"tr-TR-Aydin:MAI-Voice-2.1\", \"tr-TR-Elif:MAI-Voice-2.1\", \"tr-TR-Grant:MAI-Voice-2.1\", \"tr-TR-Harper:MAI-Voice-2.1\", \"vi-VN-Grant:MAI-Voice-2.1\", \"vi-VN-Harper:MAI-Voice-2.1\", \"zh-CN-Bo:MAI-Voice-2.1\", \"zh-CN-Grant:MAI-Voice-2.1\", \"zh-CN-Harper:MAI-Voice-2.1\", \"zh-CN-Lan:MAI-Voice-2.1\", \"zh-CN-Mei:MAI-Voice-2.1\", \"zh-CN-Wei:MAI-Voice-2.1\"]')\nif voice not in allowed: raise SystemExit(\"Choose an accepted voice ID from this exact model profile\")\np[\"voice\"]=voice\np[\"response_format\"]=\"mp3\"\nPath(\"request.json\").write_text(json.dumps(p,ensure_ascii=False))\nPY_REQUEST\ncurl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/audio/speech \\\n  -H \"Authorization: Bearer $AILOOT_API_KEY\" -H 'Content-Type: application/json' \\\n  --data-binary @request.json -D response-headers.txt -o speech.mp3\n",
            "label": "curl",
            "language": "bash"
          },
          {
            "code": "set -eu\n: \"${AILOOT_API_KEY:?Set your Ailoot API key}\"\ncurl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/media/assets \\\n  -H \"Authorization: Bearer $AILOOT_API_KEY\" -o media-assets.json\n",
            "label": "List actual media assets",
            "language": "bash"
          },
          {
            "code": "set -eu\n: \"${AILOOT_API_KEY:?Set your Ailoot API key}\"\n: \"${AILOOT_MEDIA_TASK_ID:?Set the actual ID returned by the response or media-library metadata}\"\nexport AILOOT_MEDIA_TASK_ID\nresource_id=$(python3 -c 'import os,urllib.parse;print(urllib.parse.quote(os.environ[\"AILOOT_MEDIA_TASK_ID\"],safe=\"\"))')\ncurl --fail-with-body --silent --show-error \"https://api.ailoot.ai/v1/media/tasks/$resource_id\" \\\n  -H \"Authorization: Bearer $AILOOT_API_KEY\" -o media-task.json\npython3 - <<'PY_RESULT'\nimport json\nfrom pathlib import Path\nprint(json.dumps(json.loads(Path(\"media-task.json\").read_text())))\nPY_RESULT\n",
            "label": "Read actual media task",
            "language": "bash"
          },
          {
            "code": "set -eu\n: \"${AILOOT_API_KEY:?Set your Ailoot API key}\"\n: \"${AILOOT_ASSET_ID:?Set the actual ID returned by the response or media-library metadata}\"\nexport AILOOT_ASSET_ID\nresource_id=$(python3 -c 'import os,urllib.parse;print(urllib.parse.quote(os.environ[\"AILOOT_ASSET_ID\"],safe=\"\"))')\ncurl --fail-with-body --silent --show-error \"https://api.ailoot.ai/v1/media/assets/$resource_id\" \\\n  -H \"Authorization: Bearer $AILOOT_API_KEY\" -o media-asset.json\npython3 - <<'PY_RESULT'\nimport json\nfrom pathlib import Path\nprint(json.dumps(json.loads(Path(\"media-asset.json\").read_text())))\nPY_RESULT\n",
            "label": "Read actual asset metadata",
            "language": "bash"
          }
        ],
        "family": "openai",
        "fast_multiplier": null,
        "flex_multiplier": null,
        "fmt": "speech",
        "hints": [
          "Select exact voice from this model profile.",
          "Input characters and audio seconds are different meters."
        ],
        "http": "POST",
        "in": null,
        "input": [
          "text"
        ],
        "label": "Озвучка текста",
        "max_out": null,
        "max_reasoning_effort_multiplier": null,
        "method_aliases": [],
        "out": null,
        "output": [
          "audio"
        ],
        "path": "/v1/audio/speech",
        "price_conditions": [
          {
            "label": "Fast mode",
            "value": "Not specified",
            "when": "When fast mode is selected"
          },
          {
            "label": "Flex mode",
            "value": "Not specified",
            "when": "When flex mode is selected"
          },
          {
            "label": "Maximum reasoning effort",
            "value": "Not specified",
            "when": "When maximum reasoning effort uses the default adjustment"
          }
        ],
        "pricing": {
          "billing_mode": "per_request",
          "image_input_price": null,
          "image_output_price": null,
          "per_request_price": null,
          "unit_prices": {
            "audio_input_character": 4.4e-05
          }
        },
        "pricing_profiles": [
          {
            "dimensions": {
              "regime": "base"
            },
            "label": "Base token rates",
            "units": [
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": true,
                "estimate_only": false,
                "key": "input_price",
                "label": "Input tokens",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "input_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": false,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "input_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": true,
                "estimate_only": false,
                "key": "output_price",
                "label": "Output tokens",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "output_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": false,
                "rate_role": "typed_native_retail_rate",
                "side": "out",
                "unit": "output_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": true,
                "estimate_only": false,
                "key": "cache_read_price",
                "label": "Cache read",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "cached_input_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": false,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "cached_input_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": true,
                "estimate_only": false,
                "key": "cache_write_price",
                "label": "Cache write",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "generic_cache_creation_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": false,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "generic_cache_creation_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": true,
                "estimate_only": false,
                "key": "cache_write_1h_price",
                "label": "Cache write, 1 hour",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "one_hour_cache_creation_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": false,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "one_hour_cache_creation_token"
              }
            ]
          },
          {
            "dimensions": {
              "quantity_meter": "utf8.RuneCountInString(validUTF8): one Han codepoint=1; no Han weighting",
              "quoted_unit": "per 1000 input character"
            },
            "label": "Ultra",
            "units": [
              {
                "amount": "0.044000",
                "amount_unit": "usd_per_1000_characters",
                "billing_input": true,
                "estimate_only": false,
                "key": "audio_input_character",
                "label": "input character",
                "native_amount_usd_per_unit": "0.000044",
                "native_quantity": 1,
                "public_unit_label": "per 1000 input character",
                "quantity": "1000",
                "quantity_is_estimate": false,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "input_character"
              }
            ]
          }
        ],
        "request_model_id": "microsoft/mai-voice-2.1",
        "route_label": "Ultra",
        "status_reads": [
          "GET /v1/media/tasks/{task_id}",
          "GET /v1/media/assets/{asset_id}/content"
        ],
        "tiers": [],
        "units": [
          {
            "amount": null,
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": true,
            "estimate_only": false,
            "key": "input_price",
            "label": "Input tokens",
            "native_amount_usd_per_unit": null,
            "native_quantity": 1,
            "native_unit": "input_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": false,
            "rate_role": "typed_native_retail_rate",
            "side": "in",
            "unit": "input_token"
          },
          {
            "amount": null,
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": true,
            "estimate_only": false,
            "key": "output_price",
            "label": "Output tokens",
            "native_amount_usd_per_unit": null,
            "native_quantity": 1,
            "native_unit": "output_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": false,
            "rate_role": "typed_native_retail_rate",
            "side": "out",
            "unit": "output_token"
          },
          {
            "amount": null,
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": true,
            "estimate_only": false,
            "key": "cache_read_price",
            "label": "Cache read",
            "native_amount_usd_per_unit": null,
            "native_quantity": 1,
            "native_unit": "cached_input_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": false,
            "rate_role": "typed_native_retail_rate",
            "side": "in",
            "unit": "cached_input_token"
          },
          {
            "amount": null,
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": true,
            "estimate_only": false,
            "key": "cache_write_price",
            "label": "Cache write",
            "native_amount_usd_per_unit": null,
            "native_quantity": 1,
            "native_unit": "generic_cache_creation_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": false,
            "rate_role": "typed_native_retail_rate",
            "side": "in",
            "unit": "generic_cache_creation_token"
          },
          {
            "amount": null,
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": true,
            "estimate_only": false,
            "key": "cache_write_1h_price",
            "label": "Cache write, 1 hour",
            "native_amount_usd_per_unit": null,
            "native_quantity": 1,
            "native_unit": "one_hour_cache_creation_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": false,
            "rate_role": "typed_native_retail_rate",
            "side": "in",
            "unit": "one_hour_cache_creation_token"
          },
          {
            "amount": "0.044000",
            "amount_unit": "usd_per_1000_characters",
            "billing_input": true,
            "estimate_only": false,
            "key": "audio_input_character",
            "label": "input character",
            "native_amount_usd_per_unit": "0.000044",
            "native_quantity": 1,
            "public_unit_label": "per 1000 input character",
            "quantity": "1000",
            "quantity_is_estimate": false,
            "rate_role": "typed_native_retail_rate",
            "side": "in",
            "unit": "input_character"
          }
        ]
      }
    ],
    "model_aliases": [
      {
        "canonical_model_id": "microsoft/mai-voice-2.1",
        "request_model_id": "microsoft/mai-voice-2.1",
        "route_label": "Ultra"
      }
    ],
    "name": "Microsoft AI: MAI-Voice-2.1",
    "price": {
      "in": null,
      "in_label": null,
      "out": null,
      "out_label": null,
      "sort_in": null,
      "sort_out": null,
      "varies": true
    },
    "pricing_profiles": [
      {
        "applicability": {
          "client_selectable": false,
          "native_profile_selection_pending": true,
          "scope": "hosted_reference"
        },
        "dimensions": {
          "variant": null
        },
        "label": "Ultra",
        "units": [
          {
            "amount": "0.000044",
            "amount_unit": "usd_per_input_character",
            "conditions": {
              "variant": null
            },
            "key": "pricing.prompt",
            "label": "prompt",
            "profile_index": 0,
            "quantity": "1",
            "rate_role": "binding_component_rate",
            "side": "in",
            "unit": "input_character"
          },
          {
            "amount": "0",
            "amount_unit": "usd_per_not_separately_charged_output",
            "conditions": {
              "variant": null
            },
            "key": "pricing.completion",
            "label": "completion",
            "profile_index": 0,
            "quantity": "1",
            "rate_role": "binding_component_rate",
            "side": "out",
            "unit": "not_separately_charged_output"
          }
        ]
      }
    ],
    "public_id": "microsoft/mai-voice-2.1",
    "short": "MAI-Voice-2.1 van Microsoft AI genereert expressieve meertalige spraak voor vertelteksten, luisterboeken, educatieve content en voice-overs. Het profiel met 23 talen ondersteunt een consistente sprekeridentiteit, meerdere sprekers en gerichte controle over de voordracht."
  },
  "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": "MAI-Voice-2.1 van Microsoft AI genereert expressieve meertalige spraak voor vertelteksten, luisterboeken, educatieve content en voice-overs. Het profiel met 23 talen ondersteunt een consistente sprekeridentiteit, meerdere sprekers en gerichte controle over de voordracht.",
  "source": {
    "audit_sha256": "2e00086bcbfc28e64d0cebe97aa47c17d8d5618963027f8ffb9dc6123d7d25b1",
    "bridge_map_sha256": "1125275768b9636fc8461bc7da5061239a81ddfe508e2557843ca42c58ab0036",
    "raw_model_json_sha256": "a5359203e57b1366e729699dc8b510fef15e19cf039ff6df50cdf31d208acfa6",
    "renderer_sha256": "a5aefc67f30427b283b8d8bf7955908a0216c6e5e4ca3cc1887842431e2b1ee6"
  },
  "sourceRevision": "d69d21db20f473a8ce661edbf7fcba3ee633fa5d7e44a047b135e24d62641ec0"
}
