{
  "aboutHtml": "<p>MAI-Voice-2.1-Flash är Microsoft AI:s promptstyrda text-till-tal-modell byggd kring talad interaktion med snabb respons. Tillverkaren positionerar den för röstassistenter, kundsupportsamtal och telefonmenyer. Den genererar naturligt, uttrycksfullt tal på tjugotre språk med kontroll över ton och framförande. Flash är versionen inriktad på direktsvar; den separat namngivna MAI-Voice-2.1 prioriterar detaljerat uttryck och återgivning för längre innehåll.</p><h4>Text, talare och språk</h4><p>Indata är taltexten som ska läsas upp, med en vald röst och valfria uttrycksanvisningar i SSML. Den hanterade röstkatalogen skiljer mellan talare, lokal variant och modellversion. Harper och Grant är exempel på namngivna talare med språkspecifika poster. Använd den avsedda texten på målspråket och välj lämplig lokal variant; en förberedd engelsk hälsning och en spansk förklaring är separata talade avsnitt med varsin ordalydelse.</p><p>Modellkortet dokumenterar konsekvent röstidentitet mellan språk som stöds och flera talare för dialog. Det kan stödja en applikation som behöver en igenkännbar berättare mellan lokaliserade uppmaningar eller en kort dialog med olika roller. Tilldela replikerna uttryckligen till avsedda talare och håll tilldelningen stabil. Ljudet är den talade versionen av manuset, snarare än ett nytt svar som formuleras utifrån en öppen fråga.</p><h4>Ton och talstil</h4><p>Microsoft dokumenterar kontroll av känsla och framförande på menings- och samtalstursnivå genom SSML. Tillgängliga stilar beror på den valda rösten. Den hanterade katalogen omfattar uppgiftsstilar som narrator, educational och customer_call_center samt uttrycksfulla stilar för vissa talare. Den amerikanska Harper-posten omfattar till exempel joyful och relieved. Välj en stil som stöds av rösten i stället för att anta att alla talare accepterar samma uppsättning.</p><p>En praktisk supportreplik är: ”Jag kan hjälpa dig att hitta rätt dokument. Säg titeln eller beskriv ämnet.” Håll begäran tillräckligt kort för att lyssnaren ska kunna agera och välj ett lugnt eller uppmuntrande framförande som passar interaktionen. Skriv förklaringen och nästa fråga som separata talade enheter i en läraktivitet. Uttrycksfullheten tjänar innebörden när manuset tydliggör avsiktens förändring.</p><h4>Strömning och ljudleverans</h4><p>Flash-modellkortet dokumenterar specifikt strömmande utdata för dialog i realtid, inklusive arbetsflöden som hanterar att en lyssnare börjar tala medan ett svar spelas upp. Applikationen kan spela upp ljud när det anländer och samordna avbrottet och nästa samtalstur. Det gör timingen för det talade meddelandet till en del av interaktionen i stället för att kräva att varje svar först förbereds som en komplett inspelning.</p><p>Tillverkaren låter syntesarbetsflödet ange sitt utdataformat. Det publicerade exemplet skapar en mono-MP3-fil vid 24 kHz och 160 kbit/s. Det är en dokumenterad utdatakonfiguration, inte en fast begränsning till ett inbyggt format. Välj en ljudrepresentation som den avsedda uppspelningsvägen accepterar och håll talaren och den talade ordalydelsen tillgängliga för resultatgranskning.</p><h4>Valfritt läge för referensröst</h4><p>Microsofts läge för anpassad röst kan matcha en talare som lämnat samtycke från ett referensklipp på fem till sextio sekunder utan finjustering. Modellkortet rekommenderar ett naturligt samtalsmässigt framförande med måttlig energi eftersom referensen påverkar det genererade framförandet. Läget har en separat process för tillverkargodkännande och inspelat samtycke; förinställda biblioteksröster utgör en annan förberedelseväg.</p><p>Använd ett rent, representativt avsnitt för en referens som ska definiera en varumärkesberättare och avgör vilket framförande som ska följa med till det nya manuset. För förinställt tal förbereder du de faktiska namn, kommandon och fraser på målspråket som applikationen ska använda. Lyssna på avsnitten med den valda rösten och granska övergången mellan samtalsturer. Det användbara resultatet är uttrycksfull talad interaktion med en avsiktligt vald talare, tydlig text och ljud anpassat till lyssnarens uppspelningsmiljö.</p>",
  "aboutText": "MAI-Voice-2.1-Flash är Microsoft AI:s promptstyrda text-till-tal-modell byggd kring talad interaktion med snabb respons. Tillverkaren positionerar den för röstassistenter, kundsupportsamtal och telefonmenyer. Den genererar naturligt, uttrycksfullt tal på tjugotre språk med kontroll över ton och framförande. Flash är versionen inriktad på direktsvar; den separat namngivna MAI-Voice-2.1 prioriterar detaljerat uttryck och återgivning för längre innehåll.\n\n### Text, talare och språk\n\nIndata är taltexten som ska läsas upp, med en vald röst och valfria uttrycksanvisningar i SSML. Den hanterade röstkatalogen skiljer mellan talare, lokal variant och modellversion. Harper och Grant är exempel på namngivna talare med språkspecifika poster. Använd den avsedda texten på målspråket och välj lämplig lokal variant; en förberedd engelsk hälsning och en spansk förklaring är separata talade avsnitt med varsin ordalydelse.\n\nModellkortet dokumenterar konsekvent röstidentitet mellan språk som stöds och flera talare för dialog. Det kan stödja en applikation som behöver en igenkännbar berättare mellan lokaliserade uppmaningar eller en kort dialog med olika roller. Tilldela replikerna uttryckligen till avsedda talare och håll tilldelningen stabil. Ljudet är den talade versionen av manuset, snarare än ett nytt svar som formuleras utifrån en öppen fråga.\n\n### Ton och talstil\n\nMicrosoft dokumenterar kontroll av känsla och framförande på menings- och samtalstursnivå genom SSML. Tillgängliga stilar beror på den valda rösten. Den hanterade katalogen omfattar uppgiftsstilar som narrator, educational och customer_call_center samt uttrycksfulla stilar för vissa talare. Den amerikanska Harper-posten omfattar till exempel joyful och relieved. Välj en stil som stöds av rösten i stället för att anta att alla talare accepterar samma uppsättning.\n\nEn praktisk supportreplik är: ”Jag kan hjälpa dig att hitta rätt dokument. Säg titeln eller beskriv ämnet.” Håll begäran tillräckligt kort för att lyssnaren ska kunna agera och välj ett lugnt eller uppmuntrande framförande som passar interaktionen. Skriv förklaringen och nästa fråga som separata talade enheter i en läraktivitet. Uttrycksfullheten tjänar innebörden när manuset tydliggör avsiktens förändring.\n\n### Strömning och ljudleverans\n\nFlash-modellkortet dokumenterar specifikt strömmande utdata för dialog i realtid, inklusive arbetsflöden som hanterar att en lyssnare börjar tala medan ett svar spelas upp. Applikationen kan spela upp ljud när det anländer och samordna avbrottet och nästa samtalstur. Det gör timingen för det talade meddelandet till en del av interaktionen i stället för att kräva att varje svar först förbereds som en komplett inspelning.\n\nTillverkaren låter syntesarbetsflödet ange sitt utdataformat. Det publicerade exemplet skapar en mono-MP3-fil vid 24 kHz och 160 kbit/s. Det är en dokumenterad utdatakonfiguration, inte en fast begränsning till ett inbyggt format. Välj en ljudrepresentation som den avsedda uppspelningsvägen accepterar och håll talaren och den talade ordalydelsen tillgängliga för resultatgranskning.\n\n### Valfritt läge för referensröst\n\nMicrosofts läge för anpassad röst kan matcha en talare som lämnat samtycke från ett referensklipp på fem till sextio sekunder utan finjustering. Modellkortet rekommenderar ett naturligt samtalsmässigt framförande med måttlig energi eftersom referensen påverkar det genererade framförandet. Läget har en separat process för tillverkargodkännande och inspelat samtycke; förinställda biblioteksröster utgör en annan förberedelseväg.\n\nAnvänd ett rent, representativt avsnitt för en referens som ska definiera en varumärkesberättare och avgör vilket framförande som ska följa med till det nya manuset. För förinställt tal förbereder du de faktiska namn, kommandon och fraser på målspråket som applikationen ska använda. Lyssna på avsnitten med den valda rösten och granska övergången mellan samtalsturer. Det användbara resultatet är uttrycksfull talad interaktion med en avsiktligt vald talare, tydlig text och ljud anpassat till lyssnarens uppspelningsmiljö.",
  "editorialOverlay": {
    "copy_fields": null,
    "copy_sha256": null,
    "copy_source": null,
    "html_sha256": "0eac9b54bbbf7921a76b6c75c3ed6faa8ef30ec0d522962fbb07b610d7fd5059",
    "module_sha256": "ee9dc1c50b1e6a8fb7fa062030fcb4646b9aaaeb08be513b723a5a92a7290f06",
    "raw_model_unchanged": true,
    "schema": "ailoot-native-model-editorial-v1"
  },
  "locale": "sv",
  "methods": [
    {
      "html": "<div class=\"sheet-head\"><span class=\"mav\" aria-hidden=\"true\">•</span><h2 id=\"sheet-title\">Microsoft AI: MAI-Voice-2.1-Flash</h2><button class=\"icon-btn\" type=\"button\" data-close-sheet aria-label=\"Stäng\">×</button></div><div class=\"idline\"><span>Microsoft AI /</span><code>microsoft/mai-voice-2.1-flash</code><button type=\"button\" id=\"copy-id\">Kopiera ID</button></div><nav class=\"card-jump-nav\" aria-label=\"Modellkortets avsnitt\"><button type=\"button\" data-card-jump=\"overview\">Start</button><button type=\"button\" data-card-jump=\"methods\">Indata &amp; metoder</button><button type=\"button\" data-card-jump=\"pricing\">Priser</button><button type=\"button\" data-card-jump=\"examples\">Exempel</button><button type=\"button\" data-card-jump=\"results\">Resultat</button><button type=\"button\" data-card-jump=\"aliases\">Alias</button></nav><div class=\"card-method-tabs\" role=\"tablist\" aria-label=\"API-metoder\"><button type=\"button\" role=\"tab\" tabindex=\"0\" aria-controls=\"card-method-content\" aria-selected=\"true\" id=\"card-method-tab-0\" data-card-method=\"Ultra|speech|/v1/audio/speech|microsoft%2Fmai-voice-2.1-flash\">Talproduktion</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\">Start</h3><p class=\"mdesc-full\">Microsoft AI:s MAI-Voice-2.1-Flash genererar uttrycksfullt tal på 23 språk för interaktiva röstapplikationer. Den stöder strömning, flera talare och kontroll av framförande på meningsnivå, med ett kurerat röstbibliotek.</p><dl class=\"card-io\" data-card-io><div><dt>Godkända indata</dt><dd>Text</dd></div><div><dt>Resultat</dt><dd>Ljud</dd></div></dl><details class=\"card-about\"><summary>Om modellen</summary><p class=\"note-s\" data-model-method-boundary>Den här beskrivningen omfattar modellens förmågor. Tillgängliga indata, utdata och alternativ i Ailoot anges nedan för den valda metoden.</p><div class=\"mabout\" id=\"m-about\"><p>MAI-Voice-2.1-Flash är Microsoft AI:s promptstyrda text-till-tal-modell byggd kring talad interaktion med snabb respons. Tillverkaren positionerar den för röstassistenter, kundsupportsamtal och telefonmenyer. Den genererar naturligt, uttrycksfullt tal på tjugotre språk med kontroll över ton och framförande. Flash är versionen inriktad på direktsvar; den separat namngivna MAI-Voice-2.1 prioriterar detaljerat uttryck och återgivning för längre innehåll.</p><h4>Text, talare och språk</h4><p>Indata är taltexten som ska läsas upp, med en vald röst och valfria uttrycksanvisningar i SSML. Den hanterade röstkatalogen skiljer mellan talare, lokal variant och modellversion. Harper och Grant är exempel på namngivna talare med språkspecifika poster. Använd den avsedda texten på målspråket och välj lämplig lokal variant; en förberedd engelsk hälsning och en spansk förklaring är separata talade avsnitt med varsin ordalydelse.</p><p>Modellkortet dokumenterar konsekvent röstidentitet mellan språk som stöds och flera talare för dialog. Det kan stödja en applikation som behöver en igenkännbar berättare mellan lokaliserade uppmaningar eller en kort dialog med olika roller. Tilldela replikerna uttryckligen till avsedda talare och håll tilldelningen stabil. Ljudet är den talade versionen av manuset, snarare än ett nytt svar som formuleras utifrån en öppen fråga.</p><h4>Ton och talstil</h4><p>Microsoft dokumenterar kontroll av känsla och framförande på menings- och samtalstursnivå genom SSML. Tillgängliga stilar beror på den valda rösten. Den hanterade katalogen omfattar uppgiftsstilar som narrator, educational och customer_call_center samt uttrycksfulla stilar för vissa talare. Den amerikanska Harper-posten omfattar till exempel joyful och relieved. Välj en stil som stöds av rösten i stället för att anta att alla talare accepterar samma uppsättning.</p><p>En praktisk supportreplik är: ”Jag kan hjälpa dig att hitta rätt dokument. Säg titeln eller beskriv ämnet.” Håll begäran tillräckligt kort för att lyssnaren ska kunna agera och välj ett lugnt eller uppmuntrande framförande som passar interaktionen. Skriv förklaringen och nästa fråga som separata talade enheter i en läraktivitet. Uttrycksfullheten tjänar innebörden när manuset tydliggör avsiktens förändring.</p><h4>Strömning och ljudleverans</h4><p>Flash-modellkortet dokumenterar specifikt strömmande utdata för dialog i realtid, inklusive arbetsflöden som hanterar att en lyssnare börjar tala medan ett svar spelas upp. Applikationen kan spela upp ljud när det anländer och samordna avbrottet och nästa samtalstur. Det gör timingen för det talade meddelandet till en del av interaktionen i stället för att kräva att varje svar först förbereds som en komplett inspelning.</p><p>Tillverkaren låter syntesarbetsflödet ange sitt utdataformat. Det publicerade exemplet skapar en mono-MP3-fil vid 24 kHz och 160 kbit/s. Det är en dokumenterad utdatakonfiguration, inte en fast begränsning till ett inbyggt format. Välj en ljudrepresentation som den avsedda uppspelningsvägen accepterar och håll talaren och den talade ordalydelsen tillgängliga för resultatgranskning.</p><h4>Valfritt läge för referensröst</h4><p>Microsofts läge för anpassad röst kan matcha en talare som lämnat samtycke från ett referensklipp på fem till sextio sekunder utan finjustering. Modellkortet rekommenderar ett naturligt samtalsmässigt framförande med måttlig energi eftersom referensen påverkar det genererade framförandet. Läget har en separat process för tillverkargodkännande och inspelat samtycke; förinställda biblioteksröster utgör en annan förberedelseväg.</p><p>Använd ett rent, representativt avsnitt för en referens som ska definiera en varumärkesberättare och avgör vilket framförande som ska följa med till det nya manuset. För förinställt tal förbereder du de faktiska namn, kommandon och fraser på målspråket som applikationen ska använda. Lyssna på avsnitten med den valda rösten och granska övergången mellan samtalsturer. Det användbara resultatet är uttrycksfull talad interaktion med en avsiktligt vald talare, tydlig text och ljud anpassat till lyssnarens uppspelningsmiljö.</p></div></details></section><section class=\"card-section\" data-card-section=\"methods\"><h3 tabindex=\"-1\">Tillgängligt i Ailoot · indata &amp; metoder</h3><details class=\"card-method\" open><summary><b>Ailoot Ultra · Talproduktion</b> <code>POST /v1/audio/speech</code></summary><dl class=\"method-capabilities\"><div><dt>Indatatyper</dt><dd><code>text</code></dd></div><div><dt>Utdatatyper</dt><dd><code>audio</code></dd></div><div><dt>Utdataformat</dt><dd>mp3</dd></div></dl><div class=\"tw\" data-card-parameters data-typed-parameters><table><thead><tr><th>Fält</th><th>Typ</th><th>Krav</th><th>Värden &amp; gränser</th><th>Standard</th></tr></thead><tbody><tr data-parameter-availability=\"source_interface\"><th data-cell-label=\"Fält\" scope=\"row\"><span class=\"card-cell-label\">Fält</span><code class=\"card-field-name\">model</code></th><td data-cell-label=\"Typ\" data-field-type><span class=\"card-cell-label\">Typ</span><code>string</code></td><td data-cell-label=\"Krav\"><span class=\"card-cell-label\">Krav</span>Obligatoriskt</td><td data-cell-label=\"Värden &amp; gränser\"><span class=\"card-cell-label\">Värden &amp; gränser</span><div>microsoft/mai-voice-2.1-flash</div></td><td data-cell-label=\"Standard\" data-default=\"unspecified\"><span class=\"card-cell-label\">Standard</span>—</td></tr><tr data-parameter-availability=\"source_interface\"><th data-cell-label=\"Fält\" scope=\"row\"><span class=\"card-cell-label\">Fält</span><code class=\"card-field-name\">input</code></th><td data-cell-label=\"Typ\" data-field-type><span class=\"card-cell-label\">Typ</span><code>string</code></td><td data-cell-label=\"Krav\"><span class=\"card-cell-label\">Krav</span>Obligatoriskt</td><td data-cell-label=\"Värden &amp; gränser\"><span class=\"card-cell-label\">Värden &amp; gränser</span><div>Minsta längd: 1</div><div>Enhet: Unicode-tecken</div></td><td data-cell-label=\"Standard\" data-default=\"unspecified\"><span class=\"card-cell-label\">Standard</span>—</td></tr><tr data-parameter-availability=\"source_interface\"><th data-cell-label=\"Fält\" scope=\"row\"><span class=\"card-cell-label\">Fält</span><code class=\"card-field-name\">voice</code></th><td data-cell-label=\"Typ\" data-field-type><span class=\"card-cell-label\">Typ</span><code>string</code></td><td data-cell-label=\"Krav\"><span class=\"card-cell-label\">Krav</span>Obligatoriskt</td><td data-cell-label=\"Värden &amp; gränser\"><span class=\"card-cell-label\">Värden &amp; gränser</span><div>cs-CZ-Grant:MAI-Voice-2.1-Flash, cs-CZ-Harper:MAI-Voice-2.1-Flash, da-DK-Grant:MAI-Voice-2.1-Flash, da-DK-Harper:MAI-Voice-2.1-Flash, de-DE-Grant:MAI-Voice-2.1-Flash, de-DE-Harper:MAI-Voice-2.1-Flash, de-DE-Klaus:MAI-Voice-2.1-Flash, de-DE-Mia:MAI-Voice-2.1-Flash, en-AU-Isla:MAI-Voice-2.1-Flash, en-GB-Emily:MAI-Voice-2.1-Flash, en-GB-Harry:MAI-Voice-2.1-Flash, en-IN-Dhruv:MAI-Voice-2.1-Flash, en-IN-Priya:MAI-Voice-2.1-Flash, en-US-Ethan:MAI-Voice-2.1-Flash, en-US-Grant:MAI-Voice-2.1-Flash, en-US-Harper:MAI-Voice-2.1-Flash, en-US-Iris:MAI-Voice-2.1-Flash, en-US-Jasper:MAI-Voice-2.1-Flash, en-US-Olivia:MAI-Voice-2.1-Flash, en-US-Sage:MAI-Voice-2.1-Flash, es-ES-Marta:MAI-Voice-2.1-Flash, es-MX-Alejo:MAI-Voice-2.1-Flash, es-MX-Grant:MAI-Voice-2.1-Flash, es-MX-Harper:MAI-Voice-2.1-Flash, es-MX-Valeria:MAI-Voice-2.1-Flash, fi-FI-Grant:MAI-Voice-2.1-Flash, fi-FI-Harper:MAI-Voice-2.1-Flash, fr-FR-Grant:MAI-Voice-2.1-Flash, fr-FR-Harper:MAI-Voice-2.1-Flash, fr-FR-Marc:MAI-Voice-2.1-Flash, fr-FR-Soleil:MAI-Voice-2.1-Flash, hi-IN-Arjun:MAI-Voice-2.1-Flash, hi-IN-Dhruv:MAI-Voice-2.1-Flash, hi-IN-Grant:MAI-Voice-2.1-Flash, hi-IN-Harper:MAI-Voice-2.1-Flash, hi-IN-Kavya:MAI-Voice-2.1-Flash, hi-IN-Priya:MAI-Voice-2.1-Flash, hu-HU-Bence:MAI-Voice-2.1-Flash, hu-HU-Grant:MAI-Voice-2.1-Flash, hu-HU-Harper:MAI-Voice-2.1-Flash, hu-HU-Levente:MAI-Voice-2.1-Flash, hu-HU-Lilla:MAI-Voice-2.1-Flash, hu-HU-Reka:MAI-Voice-2.1-Flash, id-ID-Grant:MAI-Voice-2.1-Flash, id-ID-Harper:MAI-Voice-2.1-Flash, it-IT-Grant:MAI-Voice-2.1-Flash, it-IT-Harper:MAI-Voice-2.1-Flash, it-IT-Luca:MAI-Voice-2.1-Flash, it-IT-Rosa:MAI-Voice-2.1-Flash, ko-KR-Grant:MAI-Voice-2.1-Flash, ko-KR-Haena:MAI-Voice-2.1-Flash, ko-KR-Harper:MAI-Voice-2.1-Flash, ko-KR-Junho:MAI-Voice-2.1-Flash, nb-NO-Grant:MAI-Voice-2.1-Flash, nb-NO-Harper:MAI-Voice-2.1-Flash, nl-NL-Grant:MAI-Voice-2.1-Flash, nl-NL-Harper:MAI-Voice-2.1-Flash, nl-NL-Sander:MAI-Voice-2.1-Flash, pl-PL-Grant:MAI-Voice-2.1-Flash, pl-PL-Harper:MAI-Voice-2.1-Flash, pt-BR-Caio:MAI-Voice-2.1-Flash, pt-BR-Grant:MAI-Voice-2.1-Flash, pt-BR-Harper:MAI-Voice-2.1-Flash, pt-BR-Luana:MAI-Voice-2.1-Flash, pt-BR-Pedro:MAI-Voice-2.1-Flash, pt-BR-Rafael:MAI-Voice-2.1-Flash, pt-PT-Grant:MAI-Voice-2.1-Flash, pt-PT-Harper:MAI-Voice-2.1-Flash, pt-PT-Rui:MAI-Voice-2.1-Flash, ro-RO-Andrei:MAI-Voice-2.1-Flash, ro-RO-Elena:MAI-Voice-2.1-Flash, ro-RO-Grant:MAI-Voice-2.1-Flash, ro-RO-Harper:MAI-Voice-2.1-Flash, ro-RO-Ioana:MAI-Voice-2.1-Flash, ro-RO-Radu:MAI-Voice-2.1-Flash, ru-RU-Grant:MAI-Voice-2.1-Flash, ru-RU-Harper:MAI-Voice-2.1-Flash, ru-RU-Lev:MAI-Voice-2.1-Flash, ru-RU-Masha:MAI-Voice-2.1-Flash, sv-SE-Grant:MAI-Voice-2.1-Flash, sv-SE-Harper:MAI-Voice-2.1-Flash, th-TH-Grant:MAI-Voice-2.1-Flash, th-TH-Harper:MAI-Voice-2.1-Flash, th-TH-Krit:MAI-Voice-2.1-Flash, th-TH-Nattapong:MAI-Voice-2.1-Flash, tr-TR-Aydin:MAI-Voice-2.1-Flash, tr-TR-Elif:MAI-Voice-2.1-Flash, tr-TR-Grant:MAI-Voice-2.1-Flash, tr-TR-Harper:MAI-Voice-2.1-Flash, vi-VN-Grant:MAI-Voice-2.1-Flash, vi-VN-Harper:MAI-Voice-2.1-Flash, zh-CN-Bo:MAI-Voice-2.1-Flash, zh-CN-Grant:MAI-Voice-2.1-Flash, zh-CN-Harper:MAI-Voice-2.1-Flash, zh-CN-Lan:MAI-Voice-2.1-Flash, zh-CN-Mei:MAI-Voice-2.1-Flash, zh-CN-Wei:MAI-Voice-2.1-Flash</div></td><td data-cell-label=\"Standard\" data-default=\"unspecified\"><span class=\"card-cell-label\">Standard</span>—</td></tr><tr data-parameter-availability=\"source_interface\"><th data-cell-label=\"Fält\" scope=\"row\"><span class=\"card-cell-label\">Fält</span><code class=\"card-field-name\">response_format</code></th><td data-cell-label=\"Typ\" data-field-type><span class=\"card-cell-label\">Typ</span><code>string</code></td><td data-cell-label=\"Krav\"><span class=\"card-cell-label\">Krav</span>Obligatoriskt</td><td data-cell-label=\"Värden &amp; gränser\"><span class=\"card-cell-label\">Värden &amp; gränser</span><div>mp3</div></td><td data-cell-label=\"Standard\" data-default=\"unspecified\"><span class=\"card-cell-label\">Standard</span>—</td></tr></tbody></table></div><details class=\"card-about\" data-material-combinations><summary>Kombinationer av indatamaterial</summary><p class=\"note-s\"><b>text_to_speech</b> · Krävs: input</p></details><details class=\"note-s\" data-method-contract><summary>Metodparametrar och livscykel</summary><div class=\"tw\" data-card-table=\"contract\"><table><thead><tr><th>Parameter</th><th>Avtal</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=\"Avtal\"><span class=\"card-cell-label\">Avtal</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=\"Avtal\"><span class=\"card-cell-label\">Avtal</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=\"Avtal\"><span class=\"card-cell-label\">Avtal</span>cs-CZ-Grant:MAI-Voice-2.1-Flash, cs-CZ-Harper:MAI-Voice-2.1-Flash, da-DK-Grant:MAI-Voice-2.1-Flash, da-DK-Harper:MAI-Voice-2.1-Flash, de-DE-Grant:MAI-Voice-2.1-Flash, de-DE-Harper:MAI-Voice-2.1-Flash, de-DE-Klaus:MAI-Voice-2.1-Flash, de-DE-Mia:MAI-Voice-2.1-Flash, en-AU-Isla:MAI-Voice-2.1-Flash, en-GB-Emily:MAI-Voice-2.1-Flash, en-GB-Harry:MAI-Voice-2.1-Flash, en-IN-Dhruv:MAI-Voice-2.1-Flash, en-IN-Priya:MAI-Voice-2.1-Flash, en-US-Ethan:MAI-Voice-2.1-Flash, en-US-Grant:MAI-Voice-2.1-Flash, en-US-Harper:MAI-Voice-2.1-Flash, en-US-Iris:MAI-Voice-2.1-Flash, en-US-Jasper:MAI-Voice-2.1-Flash, en-US-Olivia:MAI-Voice-2.1-Flash, en-US-Sage:MAI-Voice-2.1-Flash, es-ES-Marta:MAI-Voice-2.1-Flash, es-MX-Alejo:MAI-Voice-2.1-Flash, es-MX-Grant:MAI-Voice-2.1-Flash, es-MX-Harper:MAI-Voice-2.1-Flash, es-MX-Valeria:MAI-Voice-2.1-Flash, fi-FI-Grant:MAI-Voice-2.1-Flash, fi-FI-Harper:MAI-Voice-2.1-Flash, fr-FR-Grant:MAI-Voice-2.1-Flash, fr-FR-Harper:MAI-Voice-2.1-Flash, fr-FR-Marc:MAI-Voice-2.1-Flash, fr-FR-Soleil:MAI-Voice-2.1-Flash, hi-IN-Arjun:MAI-Voice-2.1-Flash, hi-IN-Dhruv:MAI-Voice-2.1-Flash, hi-IN-Grant:MAI-Voice-2.1-Flash, hi-IN-Harper:MAI-Voice-2.1-Flash, hi-IN-Kavya:MAI-Voice-2.1-Flash, hi-IN-Priya:MAI-Voice-2.1-Flash, hu-HU-Bence:MAI-Voice-2.1-Flash, hu-HU-Grant:MAI-Voice-2.1-Flash, hu-HU-Harper:MAI-Voice-2.1-Flash, hu-HU-Levente:MAI-Voice-2.1-Flash, hu-HU-Lilla:MAI-Voice-2.1-Flash, hu-HU-Reka:MAI-Voice-2.1-Flash, id-ID-Grant:MAI-Voice-2.1-Flash, id-ID-Harper:MAI-Voice-2.1-Flash, it-IT-Grant:MAI-Voice-2.1-Flash, it-IT-Harper:MAI-Voice-2.1-Flash, it-IT-Luca:MAI-Voice-2.1-Flash, it-IT-Rosa:MAI-Voice-2.1-Flash, ko-KR-Grant:MAI-Voice-2.1-Flash, ko-KR-Haena:MAI-Voice-2.1-Flash, ko-KR-Harper:MAI-Voice-2.1-Flash, ko-KR-Junho:MAI-Voice-2.1-Flash, nb-NO-Grant:MAI-Voice-2.1-Flash, nb-NO-Harper:MAI-Voice-2.1-Flash, nl-NL-Grant:MAI-Voice-2.1-Flash, nl-NL-Harper:MAI-Voice-2.1-Flash, nl-NL-Sander:MAI-Voice-2.1-Flash, pl-PL-Grant:MAI-Voice-2.1-Flash, pl-PL-Harper:MAI-Voice-2.1-Flash, pt-BR-Caio:MAI-Voice-2.1-Flash, pt-BR-Grant:MAI-Voice-2.1-Flash, pt-BR-Harper:MAI-Voice-2.1-Flash, pt-BR-Luana:MAI-Voice-2.1-Flash, pt-BR-Pedro:MAI-Voice-2.1-Flash, pt-BR-Rafael:MAI-Voice-2.1-Flash, pt-PT-Grant:MAI-Voice-2.1-Flash, pt-PT-Harper:MAI-Voice-2.1-Flash, pt-PT-Rui:MAI-Voice-2.1-Flash, ro-RO-Andrei:MAI-Voice-2.1-Flash, ro-RO-Elena:MAI-Voice-2.1-Flash, ro-RO-Grant:MAI-Voice-2.1-Flash, ro-RO-Harper:MAI-Voice-2.1-Flash, ro-RO-Ioana:MAI-Voice-2.1-Flash, ro-RO-Radu:MAI-Voice-2.1-Flash, ru-RU-Grant:MAI-Voice-2.1-Flash, ru-RU-Harper:MAI-Voice-2.1-Flash, ru-RU-Lev:MAI-Voice-2.1-Flash, ru-RU-Masha:MAI-Voice-2.1-Flash, sv-SE-Grant:MAI-Voice-2.1-Flash, sv-SE-Harper:MAI-Voice-2.1-Flash, th-TH-Grant:MAI-Voice-2.1-Flash, th-TH-Harper:MAI-Voice-2.1-Flash, th-TH-Krit:MAI-Voice-2.1-Flash, th-TH-Nattapong:MAI-Voice-2.1-Flash, tr-TR-Aydin:MAI-Voice-2.1-Flash, tr-TR-Elif:MAI-Voice-2.1-Flash, tr-TR-Grant:MAI-Voice-2.1-Flash, tr-TR-Harper:MAI-Voice-2.1-Flash, vi-VN-Grant:MAI-Voice-2.1-Flash, vi-VN-Harper:MAI-Voice-2.1-Flash, zh-CN-Bo:MAI-Voice-2.1-Flash, zh-CN-Grant:MAI-Voice-2.1-Flash, zh-CN-Harper:MAI-Voice-2.1-Flash, zh-CN-Lan:MAI-Voice-2.1-Flash, zh-CN-Mei:MAI-Voice-2.1-Flash, zh-CN-Wei:MAI-Voice-2.1-Flash</td></tr><tr><th data-cell-label=\"Parameter\" scope=\"row\"><span class=\"card-cell-label\">Parameter</span><code>response_format</code></th><td data-cell-label=\"Avtal\"><span class=\"card-cell-label\">Avtal</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=\"Avtal\"><span class=\"card-cell-label\">Avtal</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=\"Avtal\"><span class=\"card-cell-label\">Avtal</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=\"Avtal\"><span class=\"card-cell-label\">Avtal</span>exakt UTF-8-text; antal Unicode-tecken utan normalisering</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=\"Avtal\"><span class=\"card-cell-label\">Avtal</span>text</td></tr></tbody></table></div><p>Livscykel: <code>synchronous_result_then_owned_library</code></p><p class=\"note-s\"><code>GET /v1/media/tasks/{task_id}</code> · Det task_id som faktiskt returnerades eller en post i mediebiblioteket</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\">Välj den exakta rösten från denna modellprofil.</p><p class=\"note-s\">Indatatecken och ljudsekunder är olika mätenheter.</p></details></details></section><section class=\"card-section\" data-card-section=\"pricing\"><h3 tabindex=\"-1\">Priser</h3><div data-native-semantic-method=\"v1\" data-tariff-reference-only><p class=\"note-s\" data-rate-support-note>Tariffuppgifter lägger inte till begäransalternativ. Parametrar som stöds anges för den valda metoden.</p><dl data-price-conditions><dt>Snabbt läge</dt><dd>Ej angivet <span class=\"note-s\">När snabbt läge är valt</span></dd><dt>Flex-läge</dt><dd>Ej angivet <span class=\"note-s\">När läget flex är valt</span></dd><dt>Högsta resonemangsnivå</dt><dd>Ej angivet <span class=\"note-s\">När den högsta resonemangsnivån använder standardjusteringen (default)</span></dd></dl></div><div data-declared-tariff-pricing><h4>Ailoot-priser</h4><h4>Priser efter konfiguration</h4><p class=\"note-s\">Matcha varje avgift mot de visade villkoren. Använd ett pris för varje uppsättning alternativa konfigurationer.</p><div class=\"tw\" data-pricing-profiles><table><thead><tr><th>Konfiguration</th><th>Prislista</th><th>Debiterbar mängd</th><th>Debiteringsenhet</th><th>Avgift</th></tr></thead><tbody><tr><th data-cell-label=\"Konfiguration\" scope=\"row\"><span class=\"card-cell-label\">Konfiguration</span>Grundpriser för token</th><td data-cell-label=\"Prislista\"><span class=\"card-cell-label\">Prislista</span>Grundpris</td><td data-cell-label=\"Debiterbar mängd\"><span class=\"card-cell-label\">Debiterbar mängd</span>—</td><td data-cell-label=\"Debiteringsenhet\"><span class=\"card-cell-label\">Debiteringsenhet</span>—</td><td data-cell-label=\"Avgift\"><span class=\"card-cell-label\">Avgift</span><div><span>Indata · Indatatoken</span> <b>—</b> <span class=\"price-unit\">/ 1K token</span></div><div><span>Utdata · Utdatatoken</span> <b>—</b> <span class=\"price-unit\">/ 1K token</span></div><div><span>Indata · Cacheläsning</span> <b>—</b> <span class=\"price-unit\">/ 1K token</span></div><div><span>Indata · Skrivning till cache</span> <b>—</b> <span class=\"price-unit\">/ 1K token</span></div><div><span>Indata · Skrivning till cache, 1 tim</span> <b>—</b> <span class=\"price-unit\">/ 1K token</span></div></td></tr><tr><th data-cell-label=\"Konfiguration\" scope=\"row\"><span class=\"card-cell-label\">Konfiguration</span>Ultra</th><td data-cell-label=\"Prislista\"><span class=\"card-cell-label\">Prislista</span>—</td><td data-cell-label=\"Debiterbar mängd\"><span class=\"card-cell-label\">Debiterbar mängd</span>Varje Unicode-kodpunkt räknas som ett tecken, även Han-tecken.</td><td data-cell-label=\"Debiteringsenhet\"><span class=\"card-cell-label\">Debiteringsenhet</span>per 1K indatatecken</td><td data-cell-label=\"Avgift\"><span class=\"card-cell-label\">Avgift</span><div><span>Indata · indatatecken</span> <b>$0.03</b> <span class=\"price-unit\">per 1K indatatecken</span></div></td></tr></tbody></table></div></div><div data-declared-reference-pricing><h4>Detaljer om referenstariffen</h4><p class=\"note-s\">Referensprislistor på modellnivå ändrar inte metodval, prisuppgifter eller avgifter. Aktiva avgifter använder priserna för den valda Ailoot-metoden.</p><details class=\"card-price-reference\" data-declared-reference-group data-client-selectable=\"false\"><summary>Microsoft AI: MAI-Voice-2.1-Flash</summary><h4>Priser efter konfiguration</h4><div class=\"tw\" data-pricing-profiles><table><thead><tr><th>Konfiguration</th><th>Debiteringsvillkor</th><th>Avgift</th></tr></thead><tbody><tr><th data-cell-label=\"Konfiguration\" scope=\"row\"><span class=\"card-cell-label\">Konfiguration</span>Microsoft AI: MAI-Voice-2.1-Flash · Standardkonfiguration</th><td data-cell-label=\"Debiteringsvillkor\"><span class=\"card-cell-label\">Debiteringsvillkor</span>Standardkonfiguration</td><td data-cell-label=\"Avgift\"><span class=\"card-cell-label\">Avgift</span><div><span>Indata · Indatatecken</span> <b>0,00003 US$</b> <span class=\"price-unit\">per indatatecken</span></div></td></tr></tbody></table></div></details></div><p class=\"note-s\">Ailoot reserverar ett uppskattat belopp före en begäran. Efter resultatet slutregleras avgiften utifrån uppmätt förbrukning. Slutreglering för strömning använder den slutliga förbrukningsposten. <a href=\"/docs/sv/billing/reserve/\">Så fungerar reservation och slutreglering →</a></p></section><section class=\"card-section\" data-card-section=\"examples\"><h3 tabindex=\"-1\">Exempelbegäranden</h3><h4>Ailoot Ultra · Talproduktion</h4><div class=\"code-group\"><div class=\"cg-bar\"><div class=\"cg-tabs\" role=\"tablist\" aria-label=\"Kodvarianter\"><button class=\"cg-tab\" id=\"model-code-1855-tab-0\" role=\"tab\" type=\"button\" aria-controls=\"model-code-1855-panel-0\" aria-selected=\"true\" tabindex=\"0\">curl</button></div><div class=\"cg-tools\"><button class=\"cg-btn cg-copy\" type=\"button\" aria-label=\"Kopiera kod\"><svg class=\"cp\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.4\"><rect x=\"5.25\" y=\"5.25\" width=\"8.5\" height=\"8.5\" rx=\"1.75\"/><path d=\"M10.75 5.25V3.5a1.25 1.25 0 0 0-1.25-1.25H3.5A1.25 1.25 0 0 0 2.25 3.5v6a1.25 1.25 0 0 0 1.25 1.25h1.75\"/></svg><svg class=\"ok\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.4\"><path d=\"m3 8.5 3.25 3.25L13 5\"/></svg></button></div></div><div class=\"cg-body\"><div class=\"cg-pane\" id=\"model-code-1855-panel-0\" role=\"tabpanel\" aria-labelledby=\"model-code-1855-tab-0\"><pre data-lang=\"bash\"><code>set -eu\n: &quot;${AILOOT_API_KEY:?Set your Ailoot API key}&quot;\n: &quot;${AILOOT_VOICE_ID:?Choose an accepted voice ID from this exact model profile}&quot;\nexport AILOOT_VOICE_ID\npython3 - &lt;&lt;&#39;PY_REQUEST&#39;\nimport json,os\nfrom pathlib import Path\np=json.loads(&#39;{&quot;model&quot;: &quot;microsoft/mai-voice-2.1-flash&quot;, &quot;input&quot;: &quot;Good afternoon! This is a short voice take.&quot;}&#39;)\nvoice=os.environ[&quot;AILOOT_VOICE_ID&quot;]\nallowed=json.loads(&#39;[&quot;cs-CZ-Grant:MAI-Voice-2.1-Flash&quot;, &quot;cs-CZ-Harper:MAI-Voice-2.1-Flash&quot;, &quot;da-DK-Grant:MAI-Voice-2.1-Flash&quot;, &quot;da-DK-Harper:MAI-Voice-2.1-Flash&quot;, &quot;de-DE-Grant:MAI-Voice-2.1-Flash&quot;, &quot;de-DE-Harper:MAI-Voice-2.1-Flash&quot;, &quot;de-DE-Klaus:MAI-Voice-2.1-Flash&quot;, &quot;de-DE-Mia:MAI-Voice-2.1-Flash&quot;, &quot;en-AU-Isla:MAI-Voice-2.1-Flash&quot;, &quot;en-GB-Emily:MAI-Voice-2.1-Flash&quot;, &quot;en-GB-Harry:MAI-Voice-2.1-Flash&quot;, &quot;en-IN-Dhruv:MAI-Voice-2.1-Flash&quot;, &quot;en-IN-Priya:MAI-Voice-2.1-Flash&quot;, &quot;en-US-Ethan:MAI-Voice-2.1-Flash&quot;, &quot;en-US-Grant:MAI-Voice-2.1-Flash&quot;, &quot;en-US-Harper:MAI-Voice-2.1-Flash&quot;, &quot;en-US-Iris:MAI-Voice-2.1-Flash&quot;, &quot;en-US-Jasper:MAI-Voice-2.1-Flash&quot;, &quot;en-US-Olivia:MAI-Voice-2.1-Flash&quot;, &quot;en-US-Sage:MAI-Voice-2.1-Flash&quot;, &quot;es-ES-Marta:MAI-Voice-2.1-Flash&quot;, &quot;es-MX-Alejo:MAI-Voice-2.1-Flash&quot;, &quot;es-MX-Grant:MAI-Voice-2.1-Flash&quot;, &quot;es-MX-Harper:MAI-Voice-2.1-Flash&quot;, &quot;es-MX-Valeria:MAI-Voice-2.1-Flash&quot;, &quot;fi-FI-Grant:MAI-Voice-2.1-Flash&quot;, &quot;fi-FI-Harper:MAI-Voice-2.1-Flash&quot;, &quot;fr-FR-Grant:MAI-Voice-2.1-Flash&quot;, &quot;fr-FR-Harper:MAI-Voice-2.1-Flash&quot;, &quot;fr-FR-Marc:MAI-Voice-2.1-Flash&quot;, &quot;fr-FR-Soleil:MAI-Voice-2.1-Flash&quot;, &quot;hi-IN-Arjun:MAI-Voice-2.1-Flash&quot;, &quot;hi-IN-Dhruv:MAI-Voice-2.1-Flash&quot;, &quot;hi-IN-Grant:MAI-Voice-2.1-Flash&quot;, &quot;hi-IN-Harper:MAI-Voice-2.1-Flash&quot;, &quot;hi-IN-Kavya:MAI-Voice-2.1-Flash&quot;, &quot;hi-IN-Priya:MAI-Voice-2.1-Flash&quot;, &quot;hu-HU-Bence:MAI-Voice-2.1-Flash&quot;, &quot;hu-HU-Grant:MAI-Voice-2.1-Flash&quot;, &quot;hu-HU-Harper:MAI-Voice-2.1-Flash&quot;, &quot;hu-HU-Levente:MAI-Voice-2.1-Flash&quot;, &quot;hu-HU-Lilla:MAI-Voice-2.1-Flash&quot;, &quot;hu-HU-Reka:MAI-Voice-2.1-Flash&quot;, &quot;id-ID-Grant:MAI-Voice-2.1-Flash&quot;, &quot;id-ID-Harper:MAI-Voice-2.1-Flash&quot;, &quot;it-IT-Grant:MAI-Voice-2.1-Flash&quot;, &quot;it-IT-Harper:MAI-Voice-2.1-Flash&quot;, &quot;it-IT-Luca:MAI-Voice-2.1-Flash&quot;, &quot;it-IT-Rosa:MAI-Voice-2.1-Flash&quot;, &quot;ko-KR-Grant:MAI-Voice-2.1-Flash&quot;, &quot;ko-KR-Haena:MAI-Voice-2.1-Flash&quot;, &quot;ko-KR-Harper:MAI-Voice-2.1-Flash&quot;, &quot;ko-KR-Junho:MAI-Voice-2.1-Flash&quot;, &quot;nb-NO-Grant:MAI-Voice-2.1-Flash&quot;, &quot;nb-NO-Harper:MAI-Voice-2.1-Flash&quot;, &quot;nl-NL-Grant:MAI-Voice-2.1-Flash&quot;, &quot;nl-NL-Harper:MAI-Voice-2.1-Flash&quot;, &quot;nl-NL-Sander:MAI-Voice-2.1-Flash&quot;, &quot;pl-PL-Grant:MAI-Voice-2.1-Flash&quot;, &quot;pl-PL-Harper:MAI-Voice-2.1-Flash&quot;, &quot;pt-BR-Caio:MAI-Voice-2.1-Flash&quot;, &quot;pt-BR-Grant:MAI-Voice-2.1-Flash&quot;, &quot;pt-BR-Harper:MAI-Voice-2.1-Flash&quot;, &quot;pt-BR-Luana:MAI-Voice-2.1-Flash&quot;, &quot;pt-BR-Pedro:MAI-Voice-2.1-Flash&quot;, &quot;pt-BR-Rafael:MAI-Voice-2.1-Flash&quot;, &quot;pt-PT-Grant:MAI-Voice-2.1-Flash&quot;, &quot;pt-PT-Harper:MAI-Voice-2.1-Flash&quot;, &quot;pt-PT-Rui:MAI-Voice-2.1-Flash&quot;, &quot;ro-RO-Andrei:MAI-Voice-2.1-Flash&quot;, &quot;ro-RO-Elena:MAI-Voice-2.1-Flash&quot;, &quot;ro-RO-Grant:MAI-Voice-2.1-Flash&quot;, &quot;ro-RO-Harper:MAI-Voice-2.1-Flash&quot;, &quot;ro-RO-Ioana:MAI-Voice-2.1-Flash&quot;, &quot;ro-RO-Radu:MAI-Voice-2.1-Flash&quot;, &quot;ru-RU-Grant:MAI-Voice-2.1-Flash&quot;, &quot;ru-RU-Harper:MAI-Voice-2.1-Flash&quot;, &quot;ru-RU-Lev:MAI-Voice-2.1-Flash&quot;, &quot;ru-RU-Masha:MAI-Voice-2.1-Flash&quot;, &quot;sv-SE-Grant:MAI-Voice-2.1-Flash&quot;, &quot;sv-SE-Harper:MAI-Voice-2.1-Flash&quot;, &quot;th-TH-Grant:MAI-Voice-2.1-Flash&quot;, &quot;th-TH-Harper:MAI-Voice-2.1-Flash&quot;, &quot;th-TH-Krit:MAI-Voice-2.1-Flash&quot;, &quot;th-TH-Nattapong:MAI-Voice-2.1-Flash&quot;, &quot;tr-TR-Aydin:MAI-Voice-2.1-Flash&quot;, &quot;tr-TR-Elif:MAI-Voice-2.1-Flash&quot;, &quot;tr-TR-Grant:MAI-Voice-2.1-Flash&quot;, &quot;tr-TR-Harper:MAI-Voice-2.1-Flash&quot;, &quot;vi-VN-Grant:MAI-Voice-2.1-Flash&quot;, &quot;vi-VN-Harper:MAI-Voice-2.1-Flash&quot;, &quot;zh-CN-Bo:MAI-Voice-2.1-Flash&quot;, &quot;zh-CN-Grant:MAI-Voice-2.1-Flash&quot;, &quot;zh-CN-Harper:MAI-Voice-2.1-Flash&quot;, &quot;zh-CN-Lan:MAI-Voice-2.1-Flash&quot;, &quot;zh-CN-Mei:MAI-Voice-2.1-Flash&quot;, &quot;zh-CN-Wei:MAI-Voice-2.1-Flash&quot;]&#39;)\nif voice not in allowed: raise SystemExit(&quot;Choose an accepted voice ID from this exact model profile&quot;)\np[&quot;voice&quot;]=voice\np[&quot;response_format&quot;]=&quot;mp3&quot;\nPath(&quot;request.json&quot;).write_text(json.dumps(p,ensure_ascii=False))\nPY_REQUEST\ncurl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/audio/speech \\\n  -H &quot;Authorization: Bearer $AILOOT_API_KEY&quot; -H &#39;Content-Type: application/json&#39; \\\n  --data-binary @request.json -D response-headers.txt -o speech.mp3\n</code></pre></div></div></div></section><section class=\"card-section\" data-card-section=\"results\"><h3 tabindex=\"-1\">Ta emot och spara resultat</h3><h4>Ailoot Ultra · Talproduktion</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>Andra innehållsläsningar</summary><div class=\"code-group\"><div class=\"cg-bar\"><div class=\"cg-tabs\" role=\"tablist\" aria-label=\"Kodvarianter\"><button class=\"cg-tab\" id=\"model-code-1856-tab-0\" role=\"tab\" type=\"button\" aria-controls=\"model-code-1856-panel-0\" aria-selected=\"true\" tabindex=\"0\">Mediebibliotek</button><button class=\"cg-tab\" id=\"model-code-1856-tab-1\" role=\"tab\" type=\"button\" aria-controls=\"model-code-1856-panel-1\" aria-selected=\"false\" tabindex=\"-1\">Uppgiftsstatus</button><button class=\"cg-tab\" id=\"model-code-1856-tab-2\" role=\"tab\" type=\"button\" aria-controls=\"model-code-1856-panel-2\" aria-selected=\"false\" tabindex=\"-1\">Resursinformation</button></div><div class=\"cg-tools\"><button class=\"cg-btn cg-copy\" type=\"button\" aria-label=\"Kopiera kod\"><svg class=\"cp\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.4\"><rect x=\"5.25\" y=\"5.25\" width=\"8.5\" height=\"8.5\" rx=\"1.75\"/><path d=\"M10.75 5.25V3.5a1.25 1.25 0 0 0-1.25-1.25H3.5A1.25 1.25 0 0 0 2.25 3.5v6a1.25 1.25 0 0 0 1.25 1.25h1.75\"/></svg><svg class=\"ok\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.4\"><path d=\"m3 8.5 3.25 3.25L13 5\"/></svg></button></div></div><div class=\"cg-body\"><div class=\"cg-pane\" id=\"model-code-1856-panel-0\" role=\"tabpanel\" aria-labelledby=\"model-code-1856-tab-0\"><pre data-lang=\"bash\"><code>set -eu\n: &quot;${AILOOT_API_KEY:?Set your Ailoot API key}&quot;\ncurl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/media/assets \\\n  -H &quot;Authorization: Bearer $AILOOT_API_KEY&quot; -o media-assets.json\n</code></pre></div><div class=\"cg-pane\" id=\"model-code-1856-panel-1\" role=\"tabpanel\" aria-labelledby=\"model-code-1856-tab-1\" hidden><pre data-lang=\"bash\"><code>set -eu\n: &quot;${AILOOT_API_KEY:?Set your Ailoot API key}&quot;\n: &quot;${AILOOT_MEDIA_TASK_ID:?Set the actual ID returned by the response or media-library metadata}&quot;\nexport AILOOT_MEDIA_TASK_ID\nresource_id=$(python3 -c &#39;import os,urllib.parse;print(urllib.parse.quote(os.environ[&quot;AILOOT_MEDIA_TASK_ID&quot;],safe=&quot;&quot;))&#39;)\ncurl --fail-with-body --silent --show-error &quot;https://api.ailoot.ai/v1/media/tasks/$resource_id&quot; \\\n  -H &quot;Authorization: Bearer $AILOOT_API_KEY&quot; -o media-task.json\npython3 - &lt;&lt;&#39;PY_RESULT&#39;\nimport json\nfrom pathlib import Path\nprint(json.dumps(json.loads(Path(&quot;media-task.json&quot;).read_text())))\nPY_RESULT\n</code></pre></div><div class=\"cg-pane\" id=\"model-code-1856-panel-2\" role=\"tabpanel\" aria-labelledby=\"model-code-1856-tab-2\" hidden><pre data-lang=\"bash\"><code>set -eu\n: &quot;${AILOOT_API_KEY:?Set your Ailoot API key}&quot;\n: &quot;${AILOOT_ASSET_ID:?Set the actual ID returned by the response or media-library metadata}&quot;\nexport AILOOT_ASSET_ID\nresource_id=$(python3 -c &#39;import os,urllib.parse;print(urllib.parse.quote(os.environ[&quot;AILOOT_ASSET_ID&quot;],safe=&quot;&quot;))&#39;)\ncurl --fail-with-body --silent --show-error &quot;https://api.ailoot.ai/v1/media/assets/$resource_id&quot; \\\n  -H &quot;Authorization: Bearer $AILOOT_API_KEY&quot; -o media-asset.json\npython3 - &lt;&lt;&#39;PY_RESULT&#39;\nimport json\nfrom pathlib import Path\nprint(json.dumps(json.loads(Path(&quot;media-asset.json&quot;).read_text())))\nPY_RESULT\n</code></pre></div></div></div></details><div class=\"card-result-process\" data-all-results><h5>Behåll alla färdiga resultat</h5><p class=\"note-s\">Behåll varje fullständigt returnerat svar, fil och innehållsdel.</p><p class=\"note-s\">Spara hela det binära resultatet och dess headers. Om JSON eller flera resultat returneras ska du behålla varje dataobjekt och hämta innehållet via varje faktisk signerad URL till en resurs.</p></div><div class=\"card-result-process\" data-unknown-recovery><h5>Om det ursprungliga svaret behöver kontrolleras</h5><p class=\"note-s\">Behåll de ursprungliga värdena för operation_id/X-Client-Request-ID för avstämning utan att skicka förfrågan igen; det finns ingen särskild rutt för statusavläsning av ljud.</p></div><details class=\"card-about\" data-output-fields><summary>Svarsfält</summary><div class=\"tw\" data-card-table=\"output\"><table><thead><tr><th>Fält</th><th>Typ</th></tr></thead><tbody><tr><th data-cell-label=\"Fält\" scope=\"row\"><span class=\"card-cell-label\">Fält</span><code class=\"card-field-name\">binary audio</code></th><td data-cell-label=\"Typ\" data-field-type><span class=\"card-cell-label\">Typ</span>bytes</td></tr><tr><th data-cell-label=\"Fält\" scope=\"row\"><span class=\"card-cell-label\">Fält</span><code class=\"card-field-name\">response headers</code></th><td data-cell-label=\"Typ\" data-field-type><span class=\"card-cell-label\">Typ</span>headers</td></tr></tbody></table></div></details><details class=\"card-about\" data-method-errors><summary>Fel och nästa steg</summary><div class=\"tw\" data-card-table=\"errors\"><table><thead><tr><th>Svar</th><th>Villkor</th><th>Nästa steg</th></tr></thead><tbody><tr><th data-cell-label=\"Svar\" scope=\"row\"><span class=\"card-cell-label\">Svar</span>400 · <code>invalid_request_error</code></th><td data-cell-label=\"Villkor\"><span class=\"card-cell-label\">Villkor</span>Ogiltiga obligatoriska fält, ogiltig representation av underlaget eller ogiltigt parametervärde</td><td data-cell-label=\"Nästa steg\"><span class=\"card-cell-label\">Nästa steg</span>Korrigera de angivna fälten före en ny begäran om att skapa.</td></tr><tr><th data-cell-label=\"Svar\" scope=\"row\"><span class=\"card-cell-label\">Svar</span><code>server_error</code></th><td data-cell-label=\"Villkor\"><span class=\"card-cell-label\">Villkor</span>Det returnerade svaret anger att operationen eller resultatet behöver kontrolleras</td><td data-cell-label=\"Nästa steg\"><span class=\"card-cell-label\">Nästa steg</span>Spara det ursprungliga operations- eller uppgifts-ID som returnerades, förfrågans headers och svaret. Fortsätt att läsa den ursprungliga operationen med de läsmetoder som stöds. Skicka inte skapandeförfrågan igen.</td></tr></tbody></table></div></details></section><section class=\"card-section\" data-card-section=\"aliases\"><h3 tabindex=\"-1\">Alias</h3><h4>Modellalias</h4><p class=\"note-s\"><span data-model-alias-route=\"Ultra\"><b>Ailoot Ultra</b> <a href=\"#m=microsoft%2Fmai-voice-2.1-flash&amp;route=Ultra&amp;caller=microsoft%2Fmai-voice-2.1-flash&amp;fmt=speech\"><code>microsoft/mai-voice-2.1-flash</code></a></span></p><h4>Alias för metodsökvägar</h4><p class=\"note-s\">Använd metodsökvägarna som visas ovan.</p><h4>Relaterade anropar-ID:n</h4><p class=\"note-s\"><a href=\"#m=microsoft%2Fmai-voice-2.1-flash&amp;route=Ultra&amp;caller=microsoft%2Fmai-voice-2.1-flash&amp;fmt=speech\"><code>microsoft/mai-voice-2.1-flash</code></a></p></section></div>",
      "method_identity": {
        "effective_request_model_id": "microsoft/mai-voice-2.1-flash",
        "fmt": "speech",
        "http": "POST",
        "path": "/v1/audio/speech",
        "request_model_id": "microsoft/mai-voice-2.1-flash",
        "route_label": "Ultra"
      },
      "method_key": "Ultra|speech|/v1/audio/speech|microsoft%2Fmai-voice-2.1-flash",
      "ordinal": 0,
      "rawMethod": {
        "available": null,
        "cache_read": null,
        "cache_write": null,
        "cache_write_1h": null,
        "contract": {
          "data": {
            "all_results": "Keep the complete binary result and headers. If JSON/multiple outputs are returned, retain every data item and fetch each actual signed asset URL.",
            "errors": [
              {
                "code": null,
                "condition": "Ogiltiga obligatoriska fält, ogiltig representation av underlaget eller ogiltigt parametervärde",
                "http_status": 400,
                "recovery": "Korrigera de angivna fälten före en ny begäran om att skapa.",
                "type": "invalid_request_error"
              },
              {
                "code": null,
                "condition": "Det returnerade svaret anger att operationen eller resultatet behöver kontrolleras",
                "http_status": null,
                "recovery": "Spara det ursprungliga operations- eller uppgifts-ID som returnerades, förfrågans headers och svaret. Fortsätt att läsa den ursprungliga operationen med de läsmetoder som stöds. Skicka inte skapandeförfrågan igen.",
                "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": "Behåll de ursprungliga värdena för operation_id/X-Client-Request-ID för avstämning utan att skicka förfrågan igen; det finns ingen särskild rutt för statusavläsning av ljud."
            },
            "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": "Spara hela det binära resultatet och dess headers. Om JSON eller flera resultat returneras ska du behålla varje dataobjekt och hämta innehållet via varje faktisk signerad URL till en resurs.",
              "family": "audio",
              "fields": [
                {
                  "description": null,
                  "name": "binary audio",
                  "type": "bytes"
                },
                {
                  "description": null,
                  "name": "response headers",
                  "type": "headers"
                }
              ],
              "format": "mp3",
              "http_success": 200
            },
            "parameters": [
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": [
                  "microsoft/mai-voice-2.1-flash"
                ],
                "enum_known": true,
                "name": "model",
                "required": true,
                "type": "string"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": null,
                "enum_known": false,
                "limit_known": false,
                "maximum_length": null,
                "min_length": 1,
                "name": "input",
                "required": true,
                "type": "string",
                "unit": "Unicode-tecken"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": [
                  "cs-CZ-Grant:MAI-Voice-2.1-Flash",
                  "cs-CZ-Harper:MAI-Voice-2.1-Flash",
                  "da-DK-Grant:MAI-Voice-2.1-Flash",
                  "da-DK-Harper:MAI-Voice-2.1-Flash",
                  "de-DE-Grant:MAI-Voice-2.1-Flash",
                  "de-DE-Harper:MAI-Voice-2.1-Flash",
                  "de-DE-Klaus:MAI-Voice-2.1-Flash",
                  "de-DE-Mia:MAI-Voice-2.1-Flash",
                  "en-AU-Isla:MAI-Voice-2.1-Flash",
                  "en-GB-Emily:MAI-Voice-2.1-Flash",
                  "en-GB-Harry:MAI-Voice-2.1-Flash",
                  "en-IN-Dhruv:MAI-Voice-2.1-Flash",
                  "en-IN-Priya:MAI-Voice-2.1-Flash",
                  "en-US-Ethan:MAI-Voice-2.1-Flash",
                  "en-US-Grant:MAI-Voice-2.1-Flash",
                  "en-US-Harper:MAI-Voice-2.1-Flash",
                  "en-US-Iris:MAI-Voice-2.1-Flash",
                  "en-US-Jasper:MAI-Voice-2.1-Flash",
                  "en-US-Olivia:MAI-Voice-2.1-Flash",
                  "en-US-Sage:MAI-Voice-2.1-Flash",
                  "es-ES-Marta:MAI-Voice-2.1-Flash",
                  "es-MX-Alejo:MAI-Voice-2.1-Flash",
                  "es-MX-Grant:MAI-Voice-2.1-Flash",
                  "es-MX-Harper:MAI-Voice-2.1-Flash",
                  "es-MX-Valeria:MAI-Voice-2.1-Flash",
                  "fi-FI-Grant:MAI-Voice-2.1-Flash",
                  "fi-FI-Harper:MAI-Voice-2.1-Flash",
                  "fr-FR-Grant:MAI-Voice-2.1-Flash",
                  "fr-FR-Harper:MAI-Voice-2.1-Flash",
                  "fr-FR-Marc:MAI-Voice-2.1-Flash",
                  "fr-FR-Soleil:MAI-Voice-2.1-Flash",
                  "hi-IN-Arjun:MAI-Voice-2.1-Flash",
                  "hi-IN-Dhruv:MAI-Voice-2.1-Flash",
                  "hi-IN-Grant:MAI-Voice-2.1-Flash",
                  "hi-IN-Harper:MAI-Voice-2.1-Flash",
                  "hi-IN-Kavya:MAI-Voice-2.1-Flash",
                  "hi-IN-Priya:MAI-Voice-2.1-Flash",
                  "hu-HU-Bence:MAI-Voice-2.1-Flash",
                  "hu-HU-Grant:MAI-Voice-2.1-Flash",
                  "hu-HU-Harper:MAI-Voice-2.1-Flash",
                  "hu-HU-Levente:MAI-Voice-2.1-Flash",
                  "hu-HU-Lilla:MAI-Voice-2.1-Flash",
                  "hu-HU-Reka:MAI-Voice-2.1-Flash",
                  "id-ID-Grant:MAI-Voice-2.1-Flash",
                  "id-ID-Harper:MAI-Voice-2.1-Flash",
                  "it-IT-Grant:MAI-Voice-2.1-Flash",
                  "it-IT-Harper:MAI-Voice-2.1-Flash",
                  "it-IT-Luca:MAI-Voice-2.1-Flash",
                  "it-IT-Rosa:MAI-Voice-2.1-Flash",
                  "ko-KR-Grant:MAI-Voice-2.1-Flash",
                  "ko-KR-Haena:MAI-Voice-2.1-Flash",
                  "ko-KR-Harper:MAI-Voice-2.1-Flash",
                  "ko-KR-Junho:MAI-Voice-2.1-Flash",
                  "nb-NO-Grant:MAI-Voice-2.1-Flash",
                  "nb-NO-Harper:MAI-Voice-2.1-Flash",
                  "nl-NL-Grant:MAI-Voice-2.1-Flash",
                  "nl-NL-Harper:MAI-Voice-2.1-Flash",
                  "nl-NL-Sander:MAI-Voice-2.1-Flash",
                  "pl-PL-Grant:MAI-Voice-2.1-Flash",
                  "pl-PL-Harper:MAI-Voice-2.1-Flash",
                  "pt-BR-Caio:MAI-Voice-2.1-Flash",
                  "pt-BR-Grant:MAI-Voice-2.1-Flash",
                  "pt-BR-Harper:MAI-Voice-2.1-Flash",
                  "pt-BR-Luana:MAI-Voice-2.1-Flash",
                  "pt-BR-Pedro:MAI-Voice-2.1-Flash",
                  "pt-BR-Rafael:MAI-Voice-2.1-Flash",
                  "pt-PT-Grant:MAI-Voice-2.1-Flash",
                  "pt-PT-Harper:MAI-Voice-2.1-Flash",
                  "pt-PT-Rui:MAI-Voice-2.1-Flash",
                  "ro-RO-Andrei:MAI-Voice-2.1-Flash",
                  "ro-RO-Elena:MAI-Voice-2.1-Flash",
                  "ro-RO-Grant:MAI-Voice-2.1-Flash",
                  "ro-RO-Harper:MAI-Voice-2.1-Flash",
                  "ro-RO-Ioana:MAI-Voice-2.1-Flash",
                  "ro-RO-Radu:MAI-Voice-2.1-Flash",
                  "ru-RU-Grant:MAI-Voice-2.1-Flash",
                  "ru-RU-Harper:MAI-Voice-2.1-Flash",
                  "ru-RU-Lev:MAI-Voice-2.1-Flash",
                  "ru-RU-Masha:MAI-Voice-2.1-Flash",
                  "sv-SE-Grant:MAI-Voice-2.1-Flash",
                  "sv-SE-Harper:MAI-Voice-2.1-Flash",
                  "th-TH-Grant:MAI-Voice-2.1-Flash",
                  "th-TH-Harper:MAI-Voice-2.1-Flash",
                  "th-TH-Krit:MAI-Voice-2.1-Flash",
                  "th-TH-Nattapong:MAI-Voice-2.1-Flash",
                  "tr-TR-Aydin:MAI-Voice-2.1-Flash",
                  "tr-TR-Elif:MAI-Voice-2.1-Flash",
                  "tr-TR-Grant:MAI-Voice-2.1-Flash",
                  "tr-TR-Harper:MAI-Voice-2.1-Flash",
                  "vi-VN-Grant:MAI-Voice-2.1-Flash",
                  "vi-VN-Harper:MAI-Voice-2.1-Flash",
                  "zh-CN-Bo:MAI-Voice-2.1-Flash",
                  "zh-CN-Grant:MAI-Voice-2.1-Flash",
                  "zh-CN-Harper:MAI-Voice-2.1-Flash",
                  "zh-CN-Lan:MAI-Voice-2.1-Flash",
                  "zh-CN-Mei:MAI-Voice-2.1-Flash",
                  "zh-CN-Wei:MAI-Voice-2.1-Flash"
                ],
                "enum_known": true,
                "name": "voice",
                "required": true,
                "type": "string"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": [
                  "mp3"
                ],
                "enum_known": true,
                "name": "response_format",
                "required": true,
                "type": "string"
              }
            ],
            "profile_binding": "Exact existing Ailoot model and method; interface constraints below do not assert provider qualification.",
            "unsupported": [
              "every field outside exactmodel,input,voice,response_format",
              "stream/speed/reference speech options"
            ]
          },
          "hints": [
            "Välj den exakta rösten från denna modellprofil.",
            "Indatatecken och ljudsekunder är olika mätenheter."
          ],
          "input": {
            "content_type": "application/json",
            "input": "exakt UTF-8-text; antal Unicode-tecken utan normalisering",
            "material_types": [
              "text"
            ],
            "max_input_characters": null,
            "other_options": false,
            "required": [
              "model",
              "input",
              "voice",
              "response_format"
            ],
            "response_format": [
              "mp3"
            ],
            "voice_ids": [
              "cs-CZ-Grant:MAI-Voice-2.1-Flash",
              "cs-CZ-Harper:MAI-Voice-2.1-Flash",
              "da-DK-Grant:MAI-Voice-2.1-Flash",
              "da-DK-Harper:MAI-Voice-2.1-Flash",
              "de-DE-Grant:MAI-Voice-2.1-Flash",
              "de-DE-Harper:MAI-Voice-2.1-Flash",
              "de-DE-Klaus:MAI-Voice-2.1-Flash",
              "de-DE-Mia:MAI-Voice-2.1-Flash",
              "en-AU-Isla:MAI-Voice-2.1-Flash",
              "en-GB-Emily:MAI-Voice-2.1-Flash",
              "en-GB-Harry:MAI-Voice-2.1-Flash",
              "en-IN-Dhruv:MAI-Voice-2.1-Flash",
              "en-IN-Priya:MAI-Voice-2.1-Flash",
              "en-US-Ethan:MAI-Voice-2.1-Flash",
              "en-US-Grant:MAI-Voice-2.1-Flash",
              "en-US-Harper:MAI-Voice-2.1-Flash",
              "en-US-Iris:MAI-Voice-2.1-Flash",
              "en-US-Jasper:MAI-Voice-2.1-Flash",
              "en-US-Olivia:MAI-Voice-2.1-Flash",
              "en-US-Sage:MAI-Voice-2.1-Flash",
              "es-ES-Marta:MAI-Voice-2.1-Flash",
              "es-MX-Alejo:MAI-Voice-2.1-Flash",
              "es-MX-Grant:MAI-Voice-2.1-Flash",
              "es-MX-Harper:MAI-Voice-2.1-Flash",
              "es-MX-Valeria:MAI-Voice-2.1-Flash",
              "fi-FI-Grant:MAI-Voice-2.1-Flash",
              "fi-FI-Harper:MAI-Voice-2.1-Flash",
              "fr-FR-Grant:MAI-Voice-2.1-Flash",
              "fr-FR-Harper:MAI-Voice-2.1-Flash",
              "fr-FR-Marc:MAI-Voice-2.1-Flash",
              "fr-FR-Soleil:MAI-Voice-2.1-Flash",
              "hi-IN-Arjun:MAI-Voice-2.1-Flash",
              "hi-IN-Dhruv:MAI-Voice-2.1-Flash",
              "hi-IN-Grant:MAI-Voice-2.1-Flash",
              "hi-IN-Harper:MAI-Voice-2.1-Flash",
              "hi-IN-Kavya:MAI-Voice-2.1-Flash",
              "hi-IN-Priya:MAI-Voice-2.1-Flash",
              "hu-HU-Bence:MAI-Voice-2.1-Flash",
              "hu-HU-Grant:MAI-Voice-2.1-Flash",
              "hu-HU-Harper:MAI-Voice-2.1-Flash",
              "hu-HU-Levente:MAI-Voice-2.1-Flash",
              "hu-HU-Lilla:MAI-Voice-2.1-Flash",
              "hu-HU-Reka:MAI-Voice-2.1-Flash",
              "id-ID-Grant:MAI-Voice-2.1-Flash",
              "id-ID-Harper:MAI-Voice-2.1-Flash",
              "it-IT-Grant:MAI-Voice-2.1-Flash",
              "it-IT-Harper:MAI-Voice-2.1-Flash",
              "it-IT-Luca:MAI-Voice-2.1-Flash",
              "it-IT-Rosa:MAI-Voice-2.1-Flash",
              "ko-KR-Grant:MAI-Voice-2.1-Flash",
              "ko-KR-Haena:MAI-Voice-2.1-Flash",
              "ko-KR-Harper:MAI-Voice-2.1-Flash",
              "ko-KR-Junho:MAI-Voice-2.1-Flash",
              "nb-NO-Grant:MAI-Voice-2.1-Flash",
              "nb-NO-Harper:MAI-Voice-2.1-Flash",
              "nl-NL-Grant:MAI-Voice-2.1-Flash",
              "nl-NL-Harper:MAI-Voice-2.1-Flash",
              "nl-NL-Sander:MAI-Voice-2.1-Flash",
              "pl-PL-Grant:MAI-Voice-2.1-Flash",
              "pl-PL-Harper:MAI-Voice-2.1-Flash",
              "pt-BR-Caio:MAI-Voice-2.1-Flash",
              "pt-BR-Grant:MAI-Voice-2.1-Flash",
              "pt-BR-Harper:MAI-Voice-2.1-Flash",
              "pt-BR-Luana:MAI-Voice-2.1-Flash",
              "pt-BR-Pedro:MAI-Voice-2.1-Flash",
              "pt-BR-Rafael:MAI-Voice-2.1-Flash",
              "pt-PT-Grant:MAI-Voice-2.1-Flash",
              "pt-PT-Harper:MAI-Voice-2.1-Flash",
              "pt-PT-Rui:MAI-Voice-2.1-Flash",
              "ro-RO-Andrei:MAI-Voice-2.1-Flash",
              "ro-RO-Elena:MAI-Voice-2.1-Flash",
              "ro-RO-Grant:MAI-Voice-2.1-Flash",
              "ro-RO-Harper:MAI-Voice-2.1-Flash",
              "ro-RO-Ioana:MAI-Voice-2.1-Flash",
              "ro-RO-Radu:MAI-Voice-2.1-Flash",
              "ru-RU-Grant:MAI-Voice-2.1-Flash",
              "ru-RU-Harper:MAI-Voice-2.1-Flash",
              "ru-RU-Lev:MAI-Voice-2.1-Flash",
              "ru-RU-Masha:MAI-Voice-2.1-Flash",
              "sv-SE-Grant:MAI-Voice-2.1-Flash",
              "sv-SE-Harper:MAI-Voice-2.1-Flash",
              "th-TH-Grant:MAI-Voice-2.1-Flash",
              "th-TH-Harper:MAI-Voice-2.1-Flash",
              "th-TH-Krit:MAI-Voice-2.1-Flash",
              "th-TH-Nattapong:MAI-Voice-2.1-Flash",
              "tr-TR-Aydin:MAI-Voice-2.1-Flash",
              "tr-TR-Elif:MAI-Voice-2.1-Flash",
              "tr-TR-Grant:MAI-Voice-2.1-Flash",
              "tr-TR-Harper:MAI-Voice-2.1-Flash",
              "vi-VN-Grant:MAI-Voice-2.1-Flash",
              "vi-VN-Harper:MAI-Voice-2.1-Flash",
              "zh-CN-Bo:MAI-Voice-2.1-Flash",
              "zh-CN-Grant:MAI-Voice-2.1-Flash",
              "zh-CN-Harper:MAI-Voice-2.1-Flash",
              "zh-CN-Lan:MAI-Voice-2.1-Flash",
              "zh-CN-Mei:MAI-Voice-2.1-Flash",
              "zh-CN-Wei:MAI-Voice-2.1-Flash"
            ]
          },
          "lifecycle": {
            "assets": [
              {
                "http": "GET",
                "path": "/v1/media/assets"
              },
              {
                "http": "GET",
                "path": "/v1/media/assets/{asset_id}"
              }
            ],
            "content": [
              {
                "http": "GET",
                "path": "/v1/media/assets/{asset_id}/content",
                "url_source": "exact returned signed URL; never construct token"
              }
            ],
            "mode": "synchronous_result_then_owned_library",
            "operation_id_is_not_task_id": true,
            "status": [
              {
                "http": "GET",
                "id_source": "Det task_id som faktiskt returnerades eller en post i mediebiblioteket",
                "path": "/v1/media/tasks/{task_id}"
              }
            ],
            "unknown": "Retain original operation_id/X-Client-Request-ID for reconciliation without resubmission; no dedicated audio poll route."
          },
          "manufacturer_capability": null,
          "method": {
            "http": "POST",
            "path": "/v1/audio/speech"
          },
          "method_aliases": [],
          "operation_modes": [
            "text_to_speech"
          ],
          "output": {
            "family": "audio",
            "format": "mp3",
            "http_success": 200,
            "response": "full binary MP3 plus response headers",
            "result": "complete playable owned MP3"
          }
        },
        "ctx": null,
        "declared_pricing_profiles": [
          {
            "dimensions": {
              "regime": "base"
            },
            "label": "Base token rates",
            "units": [
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": true,
                "estimate_only": false,
                "key": "input_price",
                "label": "Input tokens",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "input_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": false,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "input_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": true,
                "estimate_only": false,
                "key": "output_price",
                "label": "Output tokens",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "output_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": false,
                "rate_role": "typed_native_retail_rate",
                "side": "out",
                "unit": "output_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": true,
                "estimate_only": false,
                "key": "cache_read_price",
                "label": "Cache read",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "cached_input_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": false,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "cached_input_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": true,
                "estimate_only": false,
                "key": "cache_write_price",
                "label": "Cache write",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "generic_cache_creation_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": false,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "generic_cache_creation_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": true,
                "estimate_only": false,
                "key": "cache_write_1h_price",
                "label": "Cache write, 1 hour",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "one_hour_cache_creation_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": false,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "one_hour_cache_creation_token"
              }
            ]
          },
          {
            "dimensions": {
              "quantity_meter": "utf8.RuneCountInString(validUTF8): one Han codepoint=1; no Han weighting",
              "quoted_unit": "per 1000 input character"
            },
            "label": "Ultra",
            "units": [
              {
                "amount": "0.03000",
                "amount_unit": "usd_per_1000_characters",
                "billing_input": true,
                "estimate_only": false,
                "key": "audio_input_character",
                "label": "input character",
                "native_amount_usd_per_unit": "0.00003",
                "native_quantity": 1,
                "public_unit_label": "per 1000 input character",
                "quantity": "1000",
                "quantity_is_estimate": false,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "input_character"
              }
            ]
          }
        ],
        "declared_tariff_references": [
          {
            "client_selectable": false,
            "key": "768d1dc9b9da20eb0942",
            "label": "Microsoft AI: MAI-Voice-2.1-Flash",
            "profiles": [
              {
                "basis": "",
                "dimensions": {
                  "conditions": "Standardkonfiguration"
                },
                "label": "Microsoft AI: MAI-Voice-2.1-Flash · Standardkonfiguration",
                "units": [
                  {
                    "amount": "0.000030",
                    "amount_unit": "usd_per_exact_physical_unit",
                    "billing_input": false,
                    "key": "a7f384d81db64c9b1e8c0855",
                    "label": "Input characters",
                    "public_unit_label": "per input character",
                    "quantity": "1",
                    "rate_role": "declared_tariff_rate",
                    "side": "in",
                    "unit": "input_character"
                  }
                ]
              }
            ]
          }
        ],
        "examples": [
          {
            "code": "set -eu\n: \"${AILOOT_API_KEY:?Set your Ailoot API key}\"\n: \"${AILOOT_VOICE_ID:?Choose an accepted voice ID from this exact model profile}\"\nexport AILOOT_VOICE_ID\npython3 - <<'PY_REQUEST'\nimport json,os\nfrom pathlib import Path\np=json.loads('{\"model\": \"microsoft/mai-voice-2.1-flash\", \"input\": \"Good afternoon! This is a short voice take.\"}')\nvoice=os.environ[\"AILOOT_VOICE_ID\"]\nallowed=json.loads('[\"cs-CZ-Grant:MAI-Voice-2.1-Flash\", \"cs-CZ-Harper:MAI-Voice-2.1-Flash\", \"da-DK-Grant:MAI-Voice-2.1-Flash\", \"da-DK-Harper:MAI-Voice-2.1-Flash\", \"de-DE-Grant:MAI-Voice-2.1-Flash\", \"de-DE-Harper:MAI-Voice-2.1-Flash\", \"de-DE-Klaus:MAI-Voice-2.1-Flash\", \"de-DE-Mia:MAI-Voice-2.1-Flash\", \"en-AU-Isla:MAI-Voice-2.1-Flash\", \"en-GB-Emily:MAI-Voice-2.1-Flash\", \"en-GB-Harry:MAI-Voice-2.1-Flash\", \"en-IN-Dhruv:MAI-Voice-2.1-Flash\", \"en-IN-Priya:MAI-Voice-2.1-Flash\", \"en-US-Ethan:MAI-Voice-2.1-Flash\", \"en-US-Grant:MAI-Voice-2.1-Flash\", \"en-US-Harper:MAI-Voice-2.1-Flash\", \"en-US-Iris:MAI-Voice-2.1-Flash\", \"en-US-Jasper:MAI-Voice-2.1-Flash\", \"en-US-Olivia:MAI-Voice-2.1-Flash\", \"en-US-Sage:MAI-Voice-2.1-Flash\", \"es-ES-Marta:MAI-Voice-2.1-Flash\", \"es-MX-Alejo:MAI-Voice-2.1-Flash\", \"es-MX-Grant:MAI-Voice-2.1-Flash\", \"es-MX-Harper:MAI-Voice-2.1-Flash\", \"es-MX-Valeria:MAI-Voice-2.1-Flash\", \"fi-FI-Grant:MAI-Voice-2.1-Flash\", \"fi-FI-Harper:MAI-Voice-2.1-Flash\", \"fr-FR-Grant:MAI-Voice-2.1-Flash\", \"fr-FR-Harper:MAI-Voice-2.1-Flash\", \"fr-FR-Marc:MAI-Voice-2.1-Flash\", \"fr-FR-Soleil:MAI-Voice-2.1-Flash\", \"hi-IN-Arjun:MAI-Voice-2.1-Flash\", \"hi-IN-Dhruv:MAI-Voice-2.1-Flash\", \"hi-IN-Grant:MAI-Voice-2.1-Flash\", \"hi-IN-Harper:MAI-Voice-2.1-Flash\", \"hi-IN-Kavya:MAI-Voice-2.1-Flash\", \"hi-IN-Priya:MAI-Voice-2.1-Flash\", \"hu-HU-Bence:MAI-Voice-2.1-Flash\", \"hu-HU-Grant:MAI-Voice-2.1-Flash\", \"hu-HU-Harper:MAI-Voice-2.1-Flash\", \"hu-HU-Levente:MAI-Voice-2.1-Flash\", \"hu-HU-Lilla:MAI-Voice-2.1-Flash\", \"hu-HU-Reka:MAI-Voice-2.1-Flash\", \"id-ID-Grant:MAI-Voice-2.1-Flash\", \"id-ID-Harper:MAI-Voice-2.1-Flash\", \"it-IT-Grant:MAI-Voice-2.1-Flash\", \"it-IT-Harper:MAI-Voice-2.1-Flash\", \"it-IT-Luca:MAI-Voice-2.1-Flash\", \"it-IT-Rosa:MAI-Voice-2.1-Flash\", \"ko-KR-Grant:MAI-Voice-2.1-Flash\", \"ko-KR-Haena:MAI-Voice-2.1-Flash\", \"ko-KR-Harper:MAI-Voice-2.1-Flash\", \"ko-KR-Junho:MAI-Voice-2.1-Flash\", \"nb-NO-Grant:MAI-Voice-2.1-Flash\", \"nb-NO-Harper:MAI-Voice-2.1-Flash\", \"nl-NL-Grant:MAI-Voice-2.1-Flash\", \"nl-NL-Harper:MAI-Voice-2.1-Flash\", \"nl-NL-Sander:MAI-Voice-2.1-Flash\", \"pl-PL-Grant:MAI-Voice-2.1-Flash\", \"pl-PL-Harper:MAI-Voice-2.1-Flash\", \"pt-BR-Caio:MAI-Voice-2.1-Flash\", \"pt-BR-Grant:MAI-Voice-2.1-Flash\", \"pt-BR-Harper:MAI-Voice-2.1-Flash\", \"pt-BR-Luana:MAI-Voice-2.1-Flash\", \"pt-BR-Pedro:MAI-Voice-2.1-Flash\", \"pt-BR-Rafael:MAI-Voice-2.1-Flash\", \"pt-PT-Grant:MAI-Voice-2.1-Flash\", \"pt-PT-Harper:MAI-Voice-2.1-Flash\", \"pt-PT-Rui:MAI-Voice-2.1-Flash\", \"ro-RO-Andrei:MAI-Voice-2.1-Flash\", \"ro-RO-Elena:MAI-Voice-2.1-Flash\", \"ro-RO-Grant:MAI-Voice-2.1-Flash\", \"ro-RO-Harper:MAI-Voice-2.1-Flash\", \"ro-RO-Ioana:MAI-Voice-2.1-Flash\", \"ro-RO-Radu:MAI-Voice-2.1-Flash\", \"ru-RU-Grant:MAI-Voice-2.1-Flash\", \"ru-RU-Harper:MAI-Voice-2.1-Flash\", \"ru-RU-Lev:MAI-Voice-2.1-Flash\", \"ru-RU-Masha:MAI-Voice-2.1-Flash\", \"sv-SE-Grant:MAI-Voice-2.1-Flash\", \"sv-SE-Harper:MAI-Voice-2.1-Flash\", \"th-TH-Grant:MAI-Voice-2.1-Flash\", \"th-TH-Harper:MAI-Voice-2.1-Flash\", \"th-TH-Krit:MAI-Voice-2.1-Flash\", \"th-TH-Nattapong:MAI-Voice-2.1-Flash\", \"tr-TR-Aydin:MAI-Voice-2.1-Flash\", \"tr-TR-Elif:MAI-Voice-2.1-Flash\", \"tr-TR-Grant:MAI-Voice-2.1-Flash\", \"tr-TR-Harper:MAI-Voice-2.1-Flash\", \"vi-VN-Grant:MAI-Voice-2.1-Flash\", \"vi-VN-Harper:MAI-Voice-2.1-Flash\", \"zh-CN-Bo:MAI-Voice-2.1-Flash\", \"zh-CN-Grant:MAI-Voice-2.1-Flash\", \"zh-CN-Harper:MAI-Voice-2.1-Flash\", \"zh-CN-Lan:MAI-Voice-2.1-Flash\", \"zh-CN-Mei:MAI-Voice-2.1-Flash\", \"zh-CN-Wei:MAI-Voice-2.1-Flash\"]')\nif voice not in allowed: raise SystemExit(\"Choose an accepted voice ID from this exact model profile\")\np[\"voice\"]=voice\np[\"response_format\"]=\"mp3\"\nPath(\"request.json\").write_text(json.dumps(p,ensure_ascii=False))\nPY_REQUEST\ncurl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/audio/speech \\\n  -H \"Authorization: Bearer $AILOOT_API_KEY\" -H 'Content-Type: application/json' \\\n  --data-binary @request.json -D response-headers.txt -o speech.mp3\n",
            "label": "curl",
            "language": "bash"
          },
          {
            "code": "set -eu\n: \"${AILOOT_API_KEY:?Set your Ailoot API key}\"\ncurl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/media/assets \\\n  -H \"Authorization: Bearer $AILOOT_API_KEY\" -o media-assets.json\n",
            "label": "List actual media assets",
            "language": "bash"
          },
          {
            "code": "set -eu\n: \"${AILOOT_API_KEY:?Set your Ailoot API key}\"\n: \"${AILOOT_MEDIA_TASK_ID:?Set the actual ID returned by the response or media-library metadata}\"\nexport AILOOT_MEDIA_TASK_ID\nresource_id=$(python3 -c 'import os,urllib.parse;print(urllib.parse.quote(os.environ[\"AILOOT_MEDIA_TASK_ID\"],safe=\"\"))')\ncurl --fail-with-body --silent --show-error \"https://api.ailoot.ai/v1/media/tasks/$resource_id\" \\\n  -H \"Authorization: Bearer $AILOOT_API_KEY\" -o media-task.json\npython3 - <<'PY_RESULT'\nimport json\nfrom pathlib import Path\nprint(json.dumps(json.loads(Path(\"media-task.json\").read_text())))\nPY_RESULT\n",
            "label": "Read actual media task",
            "language": "bash"
          },
          {
            "code": "set -eu\n: \"${AILOOT_API_KEY:?Set your Ailoot API key}\"\n: \"${AILOOT_ASSET_ID:?Set the actual ID returned by the response or media-library metadata}\"\nexport AILOOT_ASSET_ID\nresource_id=$(python3 -c 'import os,urllib.parse;print(urllib.parse.quote(os.environ[\"AILOOT_ASSET_ID\"],safe=\"\"))')\ncurl --fail-with-body --silent --show-error \"https://api.ailoot.ai/v1/media/assets/$resource_id\" \\\n  -H \"Authorization: Bearer $AILOOT_API_KEY\" -o media-asset.json\npython3 - <<'PY_RESULT'\nimport json\nfrom pathlib import Path\nprint(json.dumps(json.loads(Path(\"media-asset.json\").read_text())))\nPY_RESULT\n",
            "label": "Read actual asset metadata",
            "language": "bash"
          }
        ],
        "family": "openai",
        "fast_multiplier": null,
        "flex_multiplier": null,
        "fmt": "speech",
        "hints": [
          "Select exact voice from this model profile.",
          "Input characters and audio seconds are different meters."
        ],
        "http": "POST",
        "in": null,
        "input": [
          "text"
        ],
        "label": "Озвучка текста",
        "max_out": null,
        "max_reasoning_effort_multiplier": null,
        "method_aliases": [],
        "out": null,
        "output": [
          "audio"
        ],
        "path": "/v1/audio/speech",
        "price_conditions": [
          {
            "label": "Fast mode",
            "value": "Not specified",
            "when": "When fast mode is selected"
          },
          {
            "label": "Flex mode",
            "value": "Not specified",
            "when": "When flex mode is selected"
          },
          {
            "label": "Maximum reasoning effort",
            "value": "Not specified",
            "when": "When maximum reasoning effort uses the default adjustment"
          }
        ],
        "pricing": {
          "billing_mode": "per_request",
          "image_input_price": null,
          "image_output_price": null,
          "per_request_price": null,
          "unit_prices": {
            "audio_input_character": 3e-05
          }
        },
        "pricing_profiles": [
          {
            "dimensions": {
              "regime": "base"
            },
            "label": "Base token rates",
            "units": [
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": true,
                "estimate_only": false,
                "key": "input_price",
                "label": "Input tokens",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "input_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": false,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "input_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": true,
                "estimate_only": false,
                "key": "output_price",
                "label": "Output tokens",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "output_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": false,
                "rate_role": "typed_native_retail_rate",
                "side": "out",
                "unit": "output_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": true,
                "estimate_only": false,
                "key": "cache_read_price",
                "label": "Cache read",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "cached_input_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": false,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "cached_input_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": true,
                "estimate_only": false,
                "key": "cache_write_price",
                "label": "Cache write",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "generic_cache_creation_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": false,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "generic_cache_creation_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": true,
                "estimate_only": false,
                "key": "cache_write_1h_price",
                "label": "Cache write, 1 hour",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "one_hour_cache_creation_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": false,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "one_hour_cache_creation_token"
              }
            ]
          },
          {
            "dimensions": {
              "quantity_meter": "utf8.RuneCountInString(validUTF8): one Han codepoint=1; no Han weighting",
              "quoted_unit": "per 1000 input character"
            },
            "label": "Ultra",
            "units": [
              {
                "amount": "0.03000",
                "amount_unit": "usd_per_1000_characters",
                "billing_input": true,
                "estimate_only": false,
                "key": "audio_input_character",
                "label": "input character",
                "native_amount_usd_per_unit": "0.00003",
                "native_quantity": 1,
                "public_unit_label": "per 1000 input character",
                "quantity": "1000",
                "quantity_is_estimate": false,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "input_character"
              }
            ]
          }
        ],
        "request_model_id": "microsoft/mai-voice-2.1-flash",
        "route_label": "Ultra",
        "status_reads": [
          "GET /v1/media/tasks/{task_id}",
          "GET /v1/media/assets/{asset_id}/content"
        ],
        "tiers": [],
        "units": [
          {
            "amount": null,
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": true,
            "estimate_only": false,
            "key": "input_price",
            "label": "Input tokens",
            "native_amount_usd_per_unit": null,
            "native_quantity": 1,
            "native_unit": "input_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": false,
            "rate_role": "typed_native_retail_rate",
            "side": "in",
            "unit": "input_token"
          },
          {
            "amount": null,
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": true,
            "estimate_only": false,
            "key": "output_price",
            "label": "Output tokens",
            "native_amount_usd_per_unit": null,
            "native_quantity": 1,
            "native_unit": "output_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": false,
            "rate_role": "typed_native_retail_rate",
            "side": "out",
            "unit": "output_token"
          },
          {
            "amount": null,
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": true,
            "estimate_only": false,
            "key": "cache_read_price",
            "label": "Cache read",
            "native_amount_usd_per_unit": null,
            "native_quantity": 1,
            "native_unit": "cached_input_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": false,
            "rate_role": "typed_native_retail_rate",
            "side": "in",
            "unit": "cached_input_token"
          },
          {
            "amount": null,
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": true,
            "estimate_only": false,
            "key": "cache_write_price",
            "label": "Cache write",
            "native_amount_usd_per_unit": null,
            "native_quantity": 1,
            "native_unit": "generic_cache_creation_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": false,
            "rate_role": "typed_native_retail_rate",
            "side": "in",
            "unit": "generic_cache_creation_token"
          },
          {
            "amount": null,
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": true,
            "estimate_only": false,
            "key": "cache_write_1h_price",
            "label": "Cache write, 1 hour",
            "native_amount_usd_per_unit": null,
            "native_quantity": 1,
            "native_unit": "one_hour_cache_creation_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": false,
            "rate_role": "typed_native_retail_rate",
            "side": "in",
            "unit": "one_hour_cache_creation_token"
          },
          {
            "amount": "0.03000",
            "amount_unit": "usd_per_1000_characters",
            "billing_input": true,
            "estimate_only": false,
            "key": "audio_input_character",
            "label": "input character",
            "native_amount_usd_per_unit": "0.00003",
            "native_quantity": 1,
            "public_unit_label": "per 1000 input character",
            "quantity": "1000",
            "quantity_is_estimate": false,
            "rate_role": "typed_native_retail_rate",
            "side": "in",
            "unit": "input_character"
          }
        ]
      }
    }
  ],
  "model_id": "microsoft/mai-voice-2.1-flash",
  "nativeProvenance": {
    "input_facts_canonical_sha256": "60b0a934b012cf967b12eff376bcd2bbf77afcf070e335f96e162aa18ced13c4",
    "input_html_sha256": "92356f477555afd81cb3e1d3f68c8b6b62781b1e4929df591e96bbe00232e2c6",
    "private_audit_sha256": "6374e5932e8a9f764f4df185b757e84d4f6e21dfaa60637b7fa9120751cbfd66",
    "role": "historical-normalized-input-audit-hashes",
    "schema": "ailoot-native-model-provenance-v2"
  },
  "page": {
    "canonical": "https://ailoot.ai/models/sv/microsoft-mai-voice-2-1-flash/",
    "description": "Microsoft AI:s MAI-Voice-2.1-Flash genererar uttrycksfullt tal på 23 språk för interaktiva röstapplikationer. Den stöder strömning, flera talare och kontroll av framförande på meningsnivå, med ett kurerat röstbibliotek.",
    "locale": "sv",
    "md_url": "https://ailoot.ai/models/sv/microsoft-mai-voice-2-1-flash/index.md",
    "title": "Microsoft AI: MAI-Voice-2.1-Flash — Ailoot",
    "url": "https://ailoot.ai/models/sv/microsoft-mai-voice-2-1-flash/"
  },
  "rawModel": {
    "about": "MAI-Voice-2.1-Flash är Microsoft AI:s promptstyrda text-till-tal-modell byggd kring talad interaktion med snabb respons. Tillverkaren positionerar den för röstassistenter, kundsupportsamtal och telefonmenyer. Den genererar naturligt, uttrycksfullt tal på tjugotre språk med kontroll över ton och framförande. Flash är versionen inriktad på direktsvar; den separat namngivna MAI-Voice-2.1 prioriterar detaljerat uttryck och återgivning för längre innehåll.\n\n### Text, talare och språk\n\nIndata är taltexten som ska läsas upp, med en vald röst och valfria uttrycksanvisningar i SSML. Den hanterade röstkatalogen skiljer mellan talare, lokal variant och modellversion. Harper och Grant är exempel på namngivna talare med språkspecifika poster. Använd den avsedda texten på målspråket och välj lämplig lokal variant; en förberedd engelsk hälsning och en spansk förklaring är separata talade avsnitt med varsin ordalydelse.\n\nModellkortet dokumenterar konsekvent röstidentitet mellan språk som stöds och flera talare för dialog. Det kan stödja en applikation som behöver en igenkännbar berättare mellan lokaliserade uppmaningar eller en kort dialog med olika roller. Tilldela replikerna uttryckligen till avsedda talare och håll tilldelningen stabil. Ljudet är den talade versionen av manuset, snarare än ett nytt svar som formuleras utifrån en öppen fråga.\n\n### Ton och talstil\n\nMicrosoft dokumenterar kontroll av känsla och framförande på menings- och samtalstursnivå genom SSML. Tillgängliga stilar beror på den valda rösten. Den hanterade katalogen omfattar uppgiftsstilar som narrator, educational och customer_call_center samt uttrycksfulla stilar för vissa talare. Den amerikanska Harper-posten omfattar till exempel joyful och relieved. Välj en stil som stöds av rösten i stället för att anta att alla talare accepterar samma uppsättning.\n\nEn praktisk supportreplik är: ”Jag kan hjälpa dig att hitta rätt dokument. Säg titeln eller beskriv ämnet.” Håll begäran tillräckligt kort för att lyssnaren ska kunna agera och välj ett lugnt eller uppmuntrande framförande som passar interaktionen. Skriv förklaringen och nästa fråga som separata talade enheter i en läraktivitet. Uttrycksfullheten tjänar innebörden när manuset tydliggör avsiktens förändring.\n\n### Strömning och ljudleverans\n\nFlash-modellkortet dokumenterar specifikt strömmande utdata för dialog i realtid, inklusive arbetsflöden som hanterar att en lyssnare börjar tala medan ett svar spelas upp. Applikationen kan spela upp ljud när det anländer och samordna avbrottet och nästa samtalstur. Det gör timingen för det talade meddelandet till en del av interaktionen i stället för att kräva att varje svar först förbereds som en komplett inspelning.\n\nTillverkaren låter syntesarbetsflödet ange sitt utdataformat. Det publicerade exemplet skapar en mono-MP3-fil vid 24 kHz och 160 kbit/s. Det är en dokumenterad utdatakonfiguration, inte en fast begränsning till ett inbyggt format. Välj en ljudrepresentation som den avsedda uppspelningsvägen accepterar och håll talaren och den talade ordalydelsen tillgängliga för resultatgranskning.\n\n### Valfritt läge för referensröst\n\nMicrosofts läge för anpassad röst kan matcha en talare som lämnat samtycke från ett referensklipp på fem till sextio sekunder utan finjustering. Modellkortet rekommenderar ett naturligt samtalsmässigt framförande med måttlig energi eftersom referensen påverkar det genererade framförandet. Läget har en separat process för tillverkargodkännande och inspelat samtycke; förinställda biblioteksröster utgör en annan förberedelseväg.\n\nAnvänd ett rent, representativt avsnitt för en referens som ska definiera en varumärkesberättare och avgör vilket framförande som ska följa med till det nya manuset. För förinställt tal förbereder du de faktiska namn, kommandon och fraser på målspråket som applikationen ska använda. Lyssna på avsnitten med den valda rösten och granska övergången mellan samtalsturer. Det användbara resultatet är uttrycksfull talad interaktion med en avsiktligt vald talare, tydlig text och ljud anpassat till lyssnarens uppspelningsmiljö.",
    "alias_of": null,
    "aliases": [],
    "author": "Microsoft AI",
    "available": null,
    "canonical_model": "microsoft/mai-voice-2.1-flash",
    "capabilities": {
      "context_length": 0,
      "manufacturer_input": [
        "text"
      ],
      "manufacturer_output": [
        "speech"
      ]
    },
    "card_routes": [
      {
        "label": "Ultra",
        "rates": [
          {
            "amount": "0.03000",
            "amount_unit": "usd_per_1000_characters",
            "billing_input": true,
            "estimate_only": false,
            "key": "audio_input_character",
            "label": "input character",
            "native_amount_usd_per_unit": "0.00003",
            "native_quantity": 1,
            "public_unit_label": "per 1000 input character",
            "quantity": "1000",
            "quantity_is_estimate": false,
            "rate_role": "typed_native_retail_rate",
            "side": "in",
            "unit": "input_character"
          }
        ],
        "summary": "Fullständig prissättning för konfigurationen finns i detaljerna."
      }
    ],
    "ctx": null,
    "entity_type": "model",
    "formats": [
      "speech"
    ],
    "id": "microsoft/mai-voice-2.1-flash",
    "input": [
      "text"
    ],
    "kind": "speech",
    "max_out": null,
    "methods": [
      {
        "available": null,
        "cache_read": null,
        "cache_write": null,
        "cache_write_1h": null,
        "contract": {
          "data": {
            "all_results": "Keep the complete binary result and headers. If JSON/multiple outputs are returned, retain every data item and fetch each actual signed asset URL.",
            "errors": [
              {
                "code": null,
                "condition": "Ogiltiga obligatoriska fält, ogiltig representation av underlaget eller ogiltigt parametervärde",
                "http_status": 400,
                "recovery": "Korrigera de angivna fälten före en ny begäran om att skapa.",
                "type": "invalid_request_error"
              },
              {
                "code": null,
                "condition": "Det returnerade svaret anger att operationen eller resultatet behöver kontrolleras",
                "http_status": null,
                "recovery": "Spara det ursprungliga operations- eller uppgifts-ID som returnerades, förfrågans headers och svaret. Fortsätt att läsa den ursprungliga operationen med de läsmetoder som stöds. Skicka inte skapandeförfrågan igen.",
                "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": "Behåll de ursprungliga värdena för operation_id/X-Client-Request-ID för avstämning utan att skicka förfrågan igen; det finns ingen särskild rutt för statusavläsning av ljud."
            },
            "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": "Spara hela det binära resultatet och dess headers. Om JSON eller flera resultat returneras ska du behålla varje dataobjekt och hämta innehållet via varje faktisk signerad URL till en resurs.",
              "family": "audio",
              "fields": [
                {
                  "description": null,
                  "name": "binary audio",
                  "type": "bytes"
                },
                {
                  "description": null,
                  "name": "response headers",
                  "type": "headers"
                }
              ],
              "format": "mp3",
              "http_success": 200
            },
            "parameters": [
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": [
                  "microsoft/mai-voice-2.1-flash"
                ],
                "enum_known": true,
                "name": "model",
                "required": true,
                "type": "string"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": null,
                "enum_known": false,
                "limit_known": false,
                "maximum_length": null,
                "min_length": 1,
                "name": "input",
                "required": true,
                "type": "string",
                "unit": "Unicode-tecken"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": [
                  "cs-CZ-Grant:MAI-Voice-2.1-Flash",
                  "cs-CZ-Harper:MAI-Voice-2.1-Flash",
                  "da-DK-Grant:MAI-Voice-2.1-Flash",
                  "da-DK-Harper:MAI-Voice-2.1-Flash",
                  "de-DE-Grant:MAI-Voice-2.1-Flash",
                  "de-DE-Harper:MAI-Voice-2.1-Flash",
                  "de-DE-Klaus:MAI-Voice-2.1-Flash",
                  "de-DE-Mia:MAI-Voice-2.1-Flash",
                  "en-AU-Isla:MAI-Voice-2.1-Flash",
                  "en-GB-Emily:MAI-Voice-2.1-Flash",
                  "en-GB-Harry:MAI-Voice-2.1-Flash",
                  "en-IN-Dhruv:MAI-Voice-2.1-Flash",
                  "en-IN-Priya:MAI-Voice-2.1-Flash",
                  "en-US-Ethan:MAI-Voice-2.1-Flash",
                  "en-US-Grant:MAI-Voice-2.1-Flash",
                  "en-US-Harper:MAI-Voice-2.1-Flash",
                  "en-US-Iris:MAI-Voice-2.1-Flash",
                  "en-US-Jasper:MAI-Voice-2.1-Flash",
                  "en-US-Olivia:MAI-Voice-2.1-Flash",
                  "en-US-Sage:MAI-Voice-2.1-Flash",
                  "es-ES-Marta:MAI-Voice-2.1-Flash",
                  "es-MX-Alejo:MAI-Voice-2.1-Flash",
                  "es-MX-Grant:MAI-Voice-2.1-Flash",
                  "es-MX-Harper:MAI-Voice-2.1-Flash",
                  "es-MX-Valeria:MAI-Voice-2.1-Flash",
                  "fi-FI-Grant:MAI-Voice-2.1-Flash",
                  "fi-FI-Harper:MAI-Voice-2.1-Flash",
                  "fr-FR-Grant:MAI-Voice-2.1-Flash",
                  "fr-FR-Harper:MAI-Voice-2.1-Flash",
                  "fr-FR-Marc:MAI-Voice-2.1-Flash",
                  "fr-FR-Soleil:MAI-Voice-2.1-Flash",
                  "hi-IN-Arjun:MAI-Voice-2.1-Flash",
                  "hi-IN-Dhruv:MAI-Voice-2.1-Flash",
                  "hi-IN-Grant:MAI-Voice-2.1-Flash",
                  "hi-IN-Harper:MAI-Voice-2.1-Flash",
                  "hi-IN-Kavya:MAI-Voice-2.1-Flash",
                  "hi-IN-Priya:MAI-Voice-2.1-Flash",
                  "hu-HU-Bence:MAI-Voice-2.1-Flash",
                  "hu-HU-Grant:MAI-Voice-2.1-Flash",
                  "hu-HU-Harper:MAI-Voice-2.1-Flash",
                  "hu-HU-Levente:MAI-Voice-2.1-Flash",
                  "hu-HU-Lilla:MAI-Voice-2.1-Flash",
                  "hu-HU-Reka:MAI-Voice-2.1-Flash",
                  "id-ID-Grant:MAI-Voice-2.1-Flash",
                  "id-ID-Harper:MAI-Voice-2.1-Flash",
                  "it-IT-Grant:MAI-Voice-2.1-Flash",
                  "it-IT-Harper:MAI-Voice-2.1-Flash",
                  "it-IT-Luca:MAI-Voice-2.1-Flash",
                  "it-IT-Rosa:MAI-Voice-2.1-Flash",
                  "ko-KR-Grant:MAI-Voice-2.1-Flash",
                  "ko-KR-Haena:MAI-Voice-2.1-Flash",
                  "ko-KR-Harper:MAI-Voice-2.1-Flash",
                  "ko-KR-Junho:MAI-Voice-2.1-Flash",
                  "nb-NO-Grant:MAI-Voice-2.1-Flash",
                  "nb-NO-Harper:MAI-Voice-2.1-Flash",
                  "nl-NL-Grant:MAI-Voice-2.1-Flash",
                  "nl-NL-Harper:MAI-Voice-2.1-Flash",
                  "nl-NL-Sander:MAI-Voice-2.1-Flash",
                  "pl-PL-Grant:MAI-Voice-2.1-Flash",
                  "pl-PL-Harper:MAI-Voice-2.1-Flash",
                  "pt-BR-Caio:MAI-Voice-2.1-Flash",
                  "pt-BR-Grant:MAI-Voice-2.1-Flash",
                  "pt-BR-Harper:MAI-Voice-2.1-Flash",
                  "pt-BR-Luana:MAI-Voice-2.1-Flash",
                  "pt-BR-Pedro:MAI-Voice-2.1-Flash",
                  "pt-BR-Rafael:MAI-Voice-2.1-Flash",
                  "pt-PT-Grant:MAI-Voice-2.1-Flash",
                  "pt-PT-Harper:MAI-Voice-2.1-Flash",
                  "pt-PT-Rui:MAI-Voice-2.1-Flash",
                  "ro-RO-Andrei:MAI-Voice-2.1-Flash",
                  "ro-RO-Elena:MAI-Voice-2.1-Flash",
                  "ro-RO-Grant:MAI-Voice-2.1-Flash",
                  "ro-RO-Harper:MAI-Voice-2.1-Flash",
                  "ro-RO-Ioana:MAI-Voice-2.1-Flash",
                  "ro-RO-Radu:MAI-Voice-2.1-Flash",
                  "ru-RU-Grant:MAI-Voice-2.1-Flash",
                  "ru-RU-Harper:MAI-Voice-2.1-Flash",
                  "ru-RU-Lev:MAI-Voice-2.1-Flash",
                  "ru-RU-Masha:MAI-Voice-2.1-Flash",
                  "sv-SE-Grant:MAI-Voice-2.1-Flash",
                  "sv-SE-Harper:MAI-Voice-2.1-Flash",
                  "th-TH-Grant:MAI-Voice-2.1-Flash",
                  "th-TH-Harper:MAI-Voice-2.1-Flash",
                  "th-TH-Krit:MAI-Voice-2.1-Flash",
                  "th-TH-Nattapong:MAI-Voice-2.1-Flash",
                  "tr-TR-Aydin:MAI-Voice-2.1-Flash",
                  "tr-TR-Elif:MAI-Voice-2.1-Flash",
                  "tr-TR-Grant:MAI-Voice-2.1-Flash",
                  "tr-TR-Harper:MAI-Voice-2.1-Flash",
                  "vi-VN-Grant:MAI-Voice-2.1-Flash",
                  "vi-VN-Harper:MAI-Voice-2.1-Flash",
                  "zh-CN-Bo:MAI-Voice-2.1-Flash",
                  "zh-CN-Grant:MAI-Voice-2.1-Flash",
                  "zh-CN-Harper:MAI-Voice-2.1-Flash",
                  "zh-CN-Lan:MAI-Voice-2.1-Flash",
                  "zh-CN-Mei:MAI-Voice-2.1-Flash",
                  "zh-CN-Wei:MAI-Voice-2.1-Flash"
                ],
                "enum_known": true,
                "name": "voice",
                "required": true,
                "type": "string"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": [
                  "mp3"
                ],
                "enum_known": true,
                "name": "response_format",
                "required": true,
                "type": "string"
              }
            ],
            "profile_binding": "Exact existing Ailoot model and method; interface constraints below do not assert provider qualification.",
            "unsupported": [
              "every field outside exactmodel,input,voice,response_format",
              "stream/speed/reference speech options"
            ]
          },
          "hints": [
            "Välj den exakta rösten från denna modellprofil.",
            "Indatatecken och ljudsekunder är olika mätenheter."
          ],
          "input": {
            "content_type": "application/json",
            "input": "exakt UTF-8-text; antal Unicode-tecken utan normalisering",
            "material_types": [
              "text"
            ],
            "max_input_characters": null,
            "other_options": false,
            "required": [
              "model",
              "input",
              "voice",
              "response_format"
            ],
            "response_format": [
              "mp3"
            ],
            "voice_ids": [
              "cs-CZ-Grant:MAI-Voice-2.1-Flash",
              "cs-CZ-Harper:MAI-Voice-2.1-Flash",
              "da-DK-Grant:MAI-Voice-2.1-Flash",
              "da-DK-Harper:MAI-Voice-2.1-Flash",
              "de-DE-Grant:MAI-Voice-2.1-Flash",
              "de-DE-Harper:MAI-Voice-2.1-Flash",
              "de-DE-Klaus:MAI-Voice-2.1-Flash",
              "de-DE-Mia:MAI-Voice-2.1-Flash",
              "en-AU-Isla:MAI-Voice-2.1-Flash",
              "en-GB-Emily:MAI-Voice-2.1-Flash",
              "en-GB-Harry:MAI-Voice-2.1-Flash",
              "en-IN-Dhruv:MAI-Voice-2.1-Flash",
              "en-IN-Priya:MAI-Voice-2.1-Flash",
              "en-US-Ethan:MAI-Voice-2.1-Flash",
              "en-US-Grant:MAI-Voice-2.1-Flash",
              "en-US-Harper:MAI-Voice-2.1-Flash",
              "en-US-Iris:MAI-Voice-2.1-Flash",
              "en-US-Jasper:MAI-Voice-2.1-Flash",
              "en-US-Olivia:MAI-Voice-2.1-Flash",
              "en-US-Sage:MAI-Voice-2.1-Flash",
              "es-ES-Marta:MAI-Voice-2.1-Flash",
              "es-MX-Alejo:MAI-Voice-2.1-Flash",
              "es-MX-Grant:MAI-Voice-2.1-Flash",
              "es-MX-Harper:MAI-Voice-2.1-Flash",
              "es-MX-Valeria:MAI-Voice-2.1-Flash",
              "fi-FI-Grant:MAI-Voice-2.1-Flash",
              "fi-FI-Harper:MAI-Voice-2.1-Flash",
              "fr-FR-Grant:MAI-Voice-2.1-Flash",
              "fr-FR-Harper:MAI-Voice-2.1-Flash",
              "fr-FR-Marc:MAI-Voice-2.1-Flash",
              "fr-FR-Soleil:MAI-Voice-2.1-Flash",
              "hi-IN-Arjun:MAI-Voice-2.1-Flash",
              "hi-IN-Dhruv:MAI-Voice-2.1-Flash",
              "hi-IN-Grant:MAI-Voice-2.1-Flash",
              "hi-IN-Harper:MAI-Voice-2.1-Flash",
              "hi-IN-Kavya:MAI-Voice-2.1-Flash",
              "hi-IN-Priya:MAI-Voice-2.1-Flash",
              "hu-HU-Bence:MAI-Voice-2.1-Flash",
              "hu-HU-Grant:MAI-Voice-2.1-Flash",
              "hu-HU-Harper:MAI-Voice-2.1-Flash",
              "hu-HU-Levente:MAI-Voice-2.1-Flash",
              "hu-HU-Lilla:MAI-Voice-2.1-Flash",
              "hu-HU-Reka:MAI-Voice-2.1-Flash",
              "id-ID-Grant:MAI-Voice-2.1-Flash",
              "id-ID-Harper:MAI-Voice-2.1-Flash",
              "it-IT-Grant:MAI-Voice-2.1-Flash",
              "it-IT-Harper:MAI-Voice-2.1-Flash",
              "it-IT-Luca:MAI-Voice-2.1-Flash",
              "it-IT-Rosa:MAI-Voice-2.1-Flash",
              "ko-KR-Grant:MAI-Voice-2.1-Flash",
              "ko-KR-Haena:MAI-Voice-2.1-Flash",
              "ko-KR-Harper:MAI-Voice-2.1-Flash",
              "ko-KR-Junho:MAI-Voice-2.1-Flash",
              "nb-NO-Grant:MAI-Voice-2.1-Flash",
              "nb-NO-Harper:MAI-Voice-2.1-Flash",
              "nl-NL-Grant:MAI-Voice-2.1-Flash",
              "nl-NL-Harper:MAI-Voice-2.1-Flash",
              "nl-NL-Sander:MAI-Voice-2.1-Flash",
              "pl-PL-Grant:MAI-Voice-2.1-Flash",
              "pl-PL-Harper:MAI-Voice-2.1-Flash",
              "pt-BR-Caio:MAI-Voice-2.1-Flash",
              "pt-BR-Grant:MAI-Voice-2.1-Flash",
              "pt-BR-Harper:MAI-Voice-2.1-Flash",
              "pt-BR-Luana:MAI-Voice-2.1-Flash",
              "pt-BR-Pedro:MAI-Voice-2.1-Flash",
              "pt-BR-Rafael:MAI-Voice-2.1-Flash",
              "pt-PT-Grant:MAI-Voice-2.1-Flash",
              "pt-PT-Harper:MAI-Voice-2.1-Flash",
              "pt-PT-Rui:MAI-Voice-2.1-Flash",
              "ro-RO-Andrei:MAI-Voice-2.1-Flash",
              "ro-RO-Elena:MAI-Voice-2.1-Flash",
              "ro-RO-Grant:MAI-Voice-2.1-Flash",
              "ro-RO-Harper:MAI-Voice-2.1-Flash",
              "ro-RO-Ioana:MAI-Voice-2.1-Flash",
              "ro-RO-Radu:MAI-Voice-2.1-Flash",
              "ru-RU-Grant:MAI-Voice-2.1-Flash",
              "ru-RU-Harper:MAI-Voice-2.1-Flash",
              "ru-RU-Lev:MAI-Voice-2.1-Flash",
              "ru-RU-Masha:MAI-Voice-2.1-Flash",
              "sv-SE-Grant:MAI-Voice-2.1-Flash",
              "sv-SE-Harper:MAI-Voice-2.1-Flash",
              "th-TH-Grant:MAI-Voice-2.1-Flash",
              "th-TH-Harper:MAI-Voice-2.1-Flash",
              "th-TH-Krit:MAI-Voice-2.1-Flash",
              "th-TH-Nattapong:MAI-Voice-2.1-Flash",
              "tr-TR-Aydin:MAI-Voice-2.1-Flash",
              "tr-TR-Elif:MAI-Voice-2.1-Flash",
              "tr-TR-Grant:MAI-Voice-2.1-Flash",
              "tr-TR-Harper:MAI-Voice-2.1-Flash",
              "vi-VN-Grant:MAI-Voice-2.1-Flash",
              "vi-VN-Harper:MAI-Voice-2.1-Flash",
              "zh-CN-Bo:MAI-Voice-2.1-Flash",
              "zh-CN-Grant:MAI-Voice-2.1-Flash",
              "zh-CN-Harper:MAI-Voice-2.1-Flash",
              "zh-CN-Lan:MAI-Voice-2.1-Flash",
              "zh-CN-Mei:MAI-Voice-2.1-Flash",
              "zh-CN-Wei:MAI-Voice-2.1-Flash"
            ]
          },
          "lifecycle": {
            "assets": [
              {
                "http": "GET",
                "path": "/v1/media/assets"
              },
              {
                "http": "GET",
                "path": "/v1/media/assets/{asset_id}"
              }
            ],
            "content": [
              {
                "http": "GET",
                "path": "/v1/media/assets/{asset_id}/content",
                "url_source": "exact returned signed URL; never construct token"
              }
            ],
            "mode": "synchronous_result_then_owned_library",
            "operation_id_is_not_task_id": true,
            "status": [
              {
                "http": "GET",
                "id_source": "Det task_id som faktiskt returnerades eller en post i mediebiblioteket",
                "path": "/v1/media/tasks/{task_id}"
              }
            ],
            "unknown": "Retain original operation_id/X-Client-Request-ID for reconciliation without resubmission; no dedicated audio poll route."
          },
          "manufacturer_capability": null,
          "method": {
            "http": "POST",
            "path": "/v1/audio/speech"
          },
          "method_aliases": [],
          "operation_modes": [
            "text_to_speech"
          ],
          "output": {
            "family": "audio",
            "format": "mp3",
            "http_success": 200,
            "response": "full binary MP3 plus response headers",
            "result": "complete playable owned MP3"
          }
        },
        "ctx": null,
        "declared_pricing_profiles": [
          {
            "dimensions": {
              "regime": "base"
            },
            "label": "Base token rates",
            "units": [
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": true,
                "estimate_only": false,
                "key": "input_price",
                "label": "Input tokens",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "input_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": false,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "input_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": true,
                "estimate_only": false,
                "key": "output_price",
                "label": "Output tokens",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "output_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": false,
                "rate_role": "typed_native_retail_rate",
                "side": "out",
                "unit": "output_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": true,
                "estimate_only": false,
                "key": "cache_read_price",
                "label": "Cache read",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "cached_input_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": false,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "cached_input_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": true,
                "estimate_only": false,
                "key": "cache_write_price",
                "label": "Cache write",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "generic_cache_creation_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": false,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "generic_cache_creation_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": true,
                "estimate_only": false,
                "key": "cache_write_1h_price",
                "label": "Cache write, 1 hour",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "one_hour_cache_creation_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": false,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "one_hour_cache_creation_token"
              }
            ]
          },
          {
            "dimensions": {
              "quantity_meter": "utf8.RuneCountInString(validUTF8): one Han codepoint=1; no Han weighting",
              "quoted_unit": "per 1000 input character"
            },
            "label": "Ultra",
            "units": [
              {
                "amount": "0.03000",
                "amount_unit": "usd_per_1000_characters",
                "billing_input": true,
                "estimate_only": false,
                "key": "audio_input_character",
                "label": "input character",
                "native_amount_usd_per_unit": "0.00003",
                "native_quantity": 1,
                "public_unit_label": "per 1000 input character",
                "quantity": "1000",
                "quantity_is_estimate": false,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "input_character"
              }
            ]
          }
        ],
        "declared_tariff_references": [
          {
            "client_selectable": false,
            "key": "768d1dc9b9da20eb0942",
            "label": "Microsoft AI: MAI-Voice-2.1-Flash",
            "profiles": [
              {
                "basis": "",
                "dimensions": {
                  "conditions": "Standardkonfiguration"
                },
                "label": "Microsoft AI: MAI-Voice-2.1-Flash · Standardkonfiguration",
                "units": [
                  {
                    "amount": "0.000030",
                    "amount_unit": "usd_per_exact_physical_unit",
                    "billing_input": false,
                    "key": "a7f384d81db64c9b1e8c0855",
                    "label": "Input characters",
                    "public_unit_label": "per input character",
                    "quantity": "1",
                    "rate_role": "declared_tariff_rate",
                    "side": "in",
                    "unit": "input_character"
                  }
                ]
              }
            ]
          }
        ],
        "examples": [
          {
            "code": "set -eu\n: \"${AILOOT_API_KEY:?Set your Ailoot API key}\"\n: \"${AILOOT_VOICE_ID:?Choose an accepted voice ID from this exact model profile}\"\nexport AILOOT_VOICE_ID\npython3 - <<'PY_REQUEST'\nimport json,os\nfrom pathlib import Path\np=json.loads('{\"model\": \"microsoft/mai-voice-2.1-flash\", \"input\": \"Good afternoon! This is a short voice take.\"}')\nvoice=os.environ[\"AILOOT_VOICE_ID\"]\nallowed=json.loads('[\"cs-CZ-Grant:MAI-Voice-2.1-Flash\", \"cs-CZ-Harper:MAI-Voice-2.1-Flash\", \"da-DK-Grant:MAI-Voice-2.1-Flash\", \"da-DK-Harper:MAI-Voice-2.1-Flash\", \"de-DE-Grant:MAI-Voice-2.1-Flash\", \"de-DE-Harper:MAI-Voice-2.1-Flash\", \"de-DE-Klaus:MAI-Voice-2.1-Flash\", \"de-DE-Mia:MAI-Voice-2.1-Flash\", \"en-AU-Isla:MAI-Voice-2.1-Flash\", \"en-GB-Emily:MAI-Voice-2.1-Flash\", \"en-GB-Harry:MAI-Voice-2.1-Flash\", \"en-IN-Dhruv:MAI-Voice-2.1-Flash\", \"en-IN-Priya:MAI-Voice-2.1-Flash\", \"en-US-Ethan:MAI-Voice-2.1-Flash\", \"en-US-Grant:MAI-Voice-2.1-Flash\", \"en-US-Harper:MAI-Voice-2.1-Flash\", \"en-US-Iris:MAI-Voice-2.1-Flash\", \"en-US-Jasper:MAI-Voice-2.1-Flash\", \"en-US-Olivia:MAI-Voice-2.1-Flash\", \"en-US-Sage:MAI-Voice-2.1-Flash\", \"es-ES-Marta:MAI-Voice-2.1-Flash\", \"es-MX-Alejo:MAI-Voice-2.1-Flash\", \"es-MX-Grant:MAI-Voice-2.1-Flash\", \"es-MX-Harper:MAI-Voice-2.1-Flash\", \"es-MX-Valeria:MAI-Voice-2.1-Flash\", \"fi-FI-Grant:MAI-Voice-2.1-Flash\", \"fi-FI-Harper:MAI-Voice-2.1-Flash\", \"fr-FR-Grant:MAI-Voice-2.1-Flash\", \"fr-FR-Harper:MAI-Voice-2.1-Flash\", \"fr-FR-Marc:MAI-Voice-2.1-Flash\", \"fr-FR-Soleil:MAI-Voice-2.1-Flash\", \"hi-IN-Arjun:MAI-Voice-2.1-Flash\", \"hi-IN-Dhruv:MAI-Voice-2.1-Flash\", \"hi-IN-Grant:MAI-Voice-2.1-Flash\", \"hi-IN-Harper:MAI-Voice-2.1-Flash\", \"hi-IN-Kavya:MAI-Voice-2.1-Flash\", \"hi-IN-Priya:MAI-Voice-2.1-Flash\", \"hu-HU-Bence:MAI-Voice-2.1-Flash\", \"hu-HU-Grant:MAI-Voice-2.1-Flash\", \"hu-HU-Harper:MAI-Voice-2.1-Flash\", \"hu-HU-Levente:MAI-Voice-2.1-Flash\", \"hu-HU-Lilla:MAI-Voice-2.1-Flash\", \"hu-HU-Reka:MAI-Voice-2.1-Flash\", \"id-ID-Grant:MAI-Voice-2.1-Flash\", \"id-ID-Harper:MAI-Voice-2.1-Flash\", \"it-IT-Grant:MAI-Voice-2.1-Flash\", \"it-IT-Harper:MAI-Voice-2.1-Flash\", \"it-IT-Luca:MAI-Voice-2.1-Flash\", \"it-IT-Rosa:MAI-Voice-2.1-Flash\", \"ko-KR-Grant:MAI-Voice-2.1-Flash\", \"ko-KR-Haena:MAI-Voice-2.1-Flash\", \"ko-KR-Harper:MAI-Voice-2.1-Flash\", \"ko-KR-Junho:MAI-Voice-2.1-Flash\", \"nb-NO-Grant:MAI-Voice-2.1-Flash\", \"nb-NO-Harper:MAI-Voice-2.1-Flash\", \"nl-NL-Grant:MAI-Voice-2.1-Flash\", \"nl-NL-Harper:MAI-Voice-2.1-Flash\", \"nl-NL-Sander:MAI-Voice-2.1-Flash\", \"pl-PL-Grant:MAI-Voice-2.1-Flash\", \"pl-PL-Harper:MAI-Voice-2.1-Flash\", \"pt-BR-Caio:MAI-Voice-2.1-Flash\", \"pt-BR-Grant:MAI-Voice-2.1-Flash\", \"pt-BR-Harper:MAI-Voice-2.1-Flash\", \"pt-BR-Luana:MAI-Voice-2.1-Flash\", \"pt-BR-Pedro:MAI-Voice-2.1-Flash\", \"pt-BR-Rafael:MAI-Voice-2.1-Flash\", \"pt-PT-Grant:MAI-Voice-2.1-Flash\", \"pt-PT-Harper:MAI-Voice-2.1-Flash\", \"pt-PT-Rui:MAI-Voice-2.1-Flash\", \"ro-RO-Andrei:MAI-Voice-2.1-Flash\", \"ro-RO-Elena:MAI-Voice-2.1-Flash\", \"ro-RO-Grant:MAI-Voice-2.1-Flash\", \"ro-RO-Harper:MAI-Voice-2.1-Flash\", \"ro-RO-Ioana:MAI-Voice-2.1-Flash\", \"ro-RO-Radu:MAI-Voice-2.1-Flash\", \"ru-RU-Grant:MAI-Voice-2.1-Flash\", \"ru-RU-Harper:MAI-Voice-2.1-Flash\", \"ru-RU-Lev:MAI-Voice-2.1-Flash\", \"ru-RU-Masha:MAI-Voice-2.1-Flash\", \"sv-SE-Grant:MAI-Voice-2.1-Flash\", \"sv-SE-Harper:MAI-Voice-2.1-Flash\", \"th-TH-Grant:MAI-Voice-2.1-Flash\", \"th-TH-Harper:MAI-Voice-2.1-Flash\", \"th-TH-Krit:MAI-Voice-2.1-Flash\", \"th-TH-Nattapong:MAI-Voice-2.1-Flash\", \"tr-TR-Aydin:MAI-Voice-2.1-Flash\", \"tr-TR-Elif:MAI-Voice-2.1-Flash\", \"tr-TR-Grant:MAI-Voice-2.1-Flash\", \"tr-TR-Harper:MAI-Voice-2.1-Flash\", \"vi-VN-Grant:MAI-Voice-2.1-Flash\", \"vi-VN-Harper:MAI-Voice-2.1-Flash\", \"zh-CN-Bo:MAI-Voice-2.1-Flash\", \"zh-CN-Grant:MAI-Voice-2.1-Flash\", \"zh-CN-Harper:MAI-Voice-2.1-Flash\", \"zh-CN-Lan:MAI-Voice-2.1-Flash\", \"zh-CN-Mei:MAI-Voice-2.1-Flash\", \"zh-CN-Wei:MAI-Voice-2.1-Flash\"]')\nif voice not in allowed: raise SystemExit(\"Choose an accepted voice ID from this exact model profile\")\np[\"voice\"]=voice\np[\"response_format\"]=\"mp3\"\nPath(\"request.json\").write_text(json.dumps(p,ensure_ascii=False))\nPY_REQUEST\ncurl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/audio/speech \\\n  -H \"Authorization: Bearer $AILOOT_API_KEY\" -H 'Content-Type: application/json' \\\n  --data-binary @request.json -D response-headers.txt -o speech.mp3\n",
            "label": "curl",
            "language": "bash"
          },
          {
            "code": "set -eu\n: \"${AILOOT_API_KEY:?Set your Ailoot API key}\"\ncurl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/media/assets \\\n  -H \"Authorization: Bearer $AILOOT_API_KEY\" -o media-assets.json\n",
            "label": "List actual media assets",
            "language": "bash"
          },
          {
            "code": "set -eu\n: \"${AILOOT_API_KEY:?Set your Ailoot API key}\"\n: \"${AILOOT_MEDIA_TASK_ID:?Set the actual ID returned by the response or media-library metadata}\"\nexport AILOOT_MEDIA_TASK_ID\nresource_id=$(python3 -c 'import os,urllib.parse;print(urllib.parse.quote(os.environ[\"AILOOT_MEDIA_TASK_ID\"],safe=\"\"))')\ncurl --fail-with-body --silent --show-error \"https://api.ailoot.ai/v1/media/tasks/$resource_id\" \\\n  -H \"Authorization: Bearer $AILOOT_API_KEY\" -o media-task.json\npython3 - <<'PY_RESULT'\nimport json\nfrom pathlib import Path\nprint(json.dumps(json.loads(Path(\"media-task.json\").read_text())))\nPY_RESULT\n",
            "label": "Read actual media task",
            "language": "bash"
          },
          {
            "code": "set -eu\n: \"${AILOOT_API_KEY:?Set your Ailoot API key}\"\n: \"${AILOOT_ASSET_ID:?Set the actual ID returned by the response or media-library metadata}\"\nexport AILOOT_ASSET_ID\nresource_id=$(python3 -c 'import os,urllib.parse;print(urllib.parse.quote(os.environ[\"AILOOT_ASSET_ID\"],safe=\"\"))')\ncurl --fail-with-body --silent --show-error \"https://api.ailoot.ai/v1/media/assets/$resource_id\" \\\n  -H \"Authorization: Bearer $AILOOT_API_KEY\" -o media-asset.json\npython3 - <<'PY_RESULT'\nimport json\nfrom pathlib import Path\nprint(json.dumps(json.loads(Path(\"media-asset.json\").read_text())))\nPY_RESULT\n",
            "label": "Read actual asset metadata",
            "language": "bash"
          }
        ],
        "family": "openai",
        "fast_multiplier": null,
        "flex_multiplier": null,
        "fmt": "speech",
        "hints": [
          "Select exact voice from this model profile.",
          "Input characters and audio seconds are different meters."
        ],
        "http": "POST",
        "in": null,
        "input": [
          "text"
        ],
        "label": "Озвучка текста",
        "max_out": null,
        "max_reasoning_effort_multiplier": null,
        "method_aliases": [],
        "out": null,
        "output": [
          "audio"
        ],
        "path": "/v1/audio/speech",
        "price_conditions": [
          {
            "label": "Fast mode",
            "value": "Not specified",
            "when": "When fast mode is selected"
          },
          {
            "label": "Flex mode",
            "value": "Not specified",
            "when": "When flex mode is selected"
          },
          {
            "label": "Maximum reasoning effort",
            "value": "Not specified",
            "when": "When maximum reasoning effort uses the default adjustment"
          }
        ],
        "pricing": {
          "billing_mode": "per_request",
          "image_input_price": null,
          "image_output_price": null,
          "per_request_price": null,
          "unit_prices": {
            "audio_input_character": 3e-05
          }
        },
        "pricing_profiles": [
          {
            "dimensions": {
              "regime": "base"
            },
            "label": "Base token rates",
            "units": [
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": true,
                "estimate_only": false,
                "key": "input_price",
                "label": "Input tokens",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "input_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": false,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "input_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": true,
                "estimate_only": false,
                "key": "output_price",
                "label": "Output tokens",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "output_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": false,
                "rate_role": "typed_native_retail_rate",
                "side": "out",
                "unit": "output_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": true,
                "estimate_only": false,
                "key": "cache_read_price",
                "label": "Cache read",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "cached_input_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": false,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "cached_input_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": true,
                "estimate_only": false,
                "key": "cache_write_price",
                "label": "Cache write",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "generic_cache_creation_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": false,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "generic_cache_creation_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": true,
                "estimate_only": false,
                "key": "cache_write_1h_price",
                "label": "Cache write, 1 hour",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "one_hour_cache_creation_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": false,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "one_hour_cache_creation_token"
              }
            ]
          },
          {
            "dimensions": {
              "quantity_meter": "utf8.RuneCountInString(validUTF8): one Han codepoint=1; no Han weighting",
              "quoted_unit": "per 1000 input character"
            },
            "label": "Ultra",
            "units": [
              {
                "amount": "0.03000",
                "amount_unit": "usd_per_1000_characters",
                "billing_input": true,
                "estimate_only": false,
                "key": "audio_input_character",
                "label": "input character",
                "native_amount_usd_per_unit": "0.00003",
                "native_quantity": 1,
                "public_unit_label": "per 1000 input character",
                "quantity": "1000",
                "quantity_is_estimate": false,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "input_character"
              }
            ]
          }
        ],
        "request_model_id": "microsoft/mai-voice-2.1-flash",
        "route_label": "Ultra",
        "status_reads": [
          "GET /v1/media/tasks/{task_id}",
          "GET /v1/media/assets/{asset_id}/content"
        ],
        "tiers": [],
        "units": [
          {
            "amount": null,
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": true,
            "estimate_only": false,
            "key": "input_price",
            "label": "Input tokens",
            "native_amount_usd_per_unit": null,
            "native_quantity": 1,
            "native_unit": "input_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": false,
            "rate_role": "typed_native_retail_rate",
            "side": "in",
            "unit": "input_token"
          },
          {
            "amount": null,
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": true,
            "estimate_only": false,
            "key": "output_price",
            "label": "Output tokens",
            "native_amount_usd_per_unit": null,
            "native_quantity": 1,
            "native_unit": "output_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": false,
            "rate_role": "typed_native_retail_rate",
            "side": "out",
            "unit": "output_token"
          },
          {
            "amount": null,
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": true,
            "estimate_only": false,
            "key": "cache_read_price",
            "label": "Cache read",
            "native_amount_usd_per_unit": null,
            "native_quantity": 1,
            "native_unit": "cached_input_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": false,
            "rate_role": "typed_native_retail_rate",
            "side": "in",
            "unit": "cached_input_token"
          },
          {
            "amount": null,
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": true,
            "estimate_only": false,
            "key": "cache_write_price",
            "label": "Cache write",
            "native_amount_usd_per_unit": null,
            "native_quantity": 1,
            "native_unit": "generic_cache_creation_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": false,
            "rate_role": "typed_native_retail_rate",
            "side": "in",
            "unit": "generic_cache_creation_token"
          },
          {
            "amount": null,
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": true,
            "estimate_only": false,
            "key": "cache_write_1h_price",
            "label": "Cache write, 1 hour",
            "native_amount_usd_per_unit": null,
            "native_quantity": 1,
            "native_unit": "one_hour_cache_creation_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": false,
            "rate_role": "typed_native_retail_rate",
            "side": "in",
            "unit": "one_hour_cache_creation_token"
          },
          {
            "amount": "0.03000",
            "amount_unit": "usd_per_1000_characters",
            "billing_input": true,
            "estimate_only": false,
            "key": "audio_input_character",
            "label": "input character",
            "native_amount_usd_per_unit": "0.00003",
            "native_quantity": 1,
            "public_unit_label": "per 1000 input character",
            "quantity": "1000",
            "quantity_is_estimate": false,
            "rate_role": "typed_native_retail_rate",
            "side": "in",
            "unit": "input_character"
          }
        ]
      }
    ],
    "model_aliases": [
      {
        "canonical_model_id": "microsoft/mai-voice-2.1-flash",
        "request_model_id": "microsoft/mai-voice-2.1-flash",
        "route_label": "Ultra"
      }
    ],
    "name": "Microsoft AI: MAI-Voice-2.1-Flash",
    "price": {
      "in": null,
      "in_label": null,
      "out": null,
      "out_label": null,
      "sort_in": null,
      "sort_out": null,
      "varies": true
    },
    "pricing_profiles": [
      {
        "applicability": {
          "client_selectable": false,
          "native_profile_selection_pending": true,
          "scope": "hosted_reference"
        },
        "dimensions": {
          "variant": null
        },
        "label": "Ultra",
        "units": [
          {
            "amount": "0.000030",
            "amount_unit": "usd_per_input_character",
            "conditions": {
              "variant": null
            },
            "key": "pricing.prompt",
            "label": "prompt",
            "profile_index": 0,
            "quantity": "1",
            "rate_role": "binding_component_rate",
            "side": "in",
            "unit": "input_character"
          },
          {
            "amount": "0",
            "amount_unit": "usd_per_not_separately_charged_output",
            "conditions": {
              "variant": null
            },
            "key": "pricing.completion",
            "label": "completion",
            "profile_index": 0,
            "quantity": "1",
            "rate_role": "binding_component_rate",
            "side": "out",
            "unit": "not_separately_charged_output"
          }
        ]
      }
    ],
    "public_id": "microsoft/mai-voice-2.1-flash",
    "short": "Microsoft AI:s MAI-Voice-2.1-Flash genererar uttrycksfullt tal på 23 språk för interaktiva röstapplikationer. Den stöder strömning, flera talare och kontroll av framförande på meningsnivå, med ett kurerat röstbibliotek."
  },
  "renderer_schema": {
    "method_order": "Original DTO methods order; every exact route/format/path/caller survives.",
    "prices": "Original public DTO fields and original native display HTML; no flattened or normalized offers."
  },
  "representation": "exact-public-dto-and-native-renderer-html",
  "representationNotes": {
    "current_reference": {
      "about_json_pointer": "/aboutHtml",
      "methods": [
        {
          "contract_json_pointer": "/methods/0/rawMethod/contract",
          "html_json_pointer": "/methods/0/html",
          "method_ordinal": 0
        }
      ],
      "role": "current-semantic-reference"
    },
    "raw_input": {
      "examples_role": "historical-input-not-current-ready-examples",
      "json_pointers": [
        "/rawModel",
        "/methods/0/rawMethod"
      ],
      "role": "historical-owner-input"
    },
    "schema": "ailoot-native-model-representations-v1"
  },
  "schema": "ailoot-static-model-facts-v1",
  "schema_version": 1,
  "shortText": "Microsoft AI:s MAI-Voice-2.1-Flash genererar uttrycksfullt tal på 23 språk för interaktiva röstapplikationer. Den stöder strömning, flera talare och kontroll av framförande på meningsnivå, med ett kurerat röstbibliotek.",
  "source": {
    "audit_sha256": "2e00086bcbfc28e64d0cebe97aa47c17d8d5618963027f8ffb9dc6123d7d25b1",
    "bridge_map_sha256": "1125275768b9636fc8461bc7da5061239a81ddfe508e2557843ca42c58ab0036",
    "raw_model_json_sha256": "53513824b1c22f268ed6b2235dd986aa6d04405038f18ad26a2a0300fd1d2a27",
    "renderer_sha256": "8a45bb31b83d2551e6d975cf4683518c7cb445a54b9394a01947f4dd103f1051"
  },
  "sourceRevision": "b4e4b72c95c66ce26318dce4713947178385b948600fa3fa506eae0ff1ffdc59"
}
