{
  "aboutHtml": "<p>MAI-Voice-2.1은 표현력과 오디오 충실도가 중요한 작업을 위한 Microsoft AI의 프롬프트 기반 텍스트 음성 변환 모델입니다. 모델 카드는 23개 언어와 26개 로캘을 다루며 자연스러운 억양, 리듬, 감정의 미묘한 차이를 설명합니다. 제조사는 오디오북, 미디어 내레이션, 콘텐츠 제작, 보이스오버를 핵심 용도로 제시합니다. 이 버전은 길고 표현력 있는 콘텐츠에 중점을 둡니다. 지연에 민감한 상호작용에는 별도로 설계된 MAI-Voice-2.1-Flash가 있습니다.</p><h4>일관된 화자의 내레이션</h4><p>모델 카드는 지원 언어 전반에서 하나의 목소리 정체성을 일관되게 구현한다고 설명합니다. 긴 콘텐츠 생성은 청크 분할과 맥락 전달을 사용해 문단 사이의 연속성을 높입니다. 내레이터의 특성을 유지해야 하는 수업, 오디오북의 한 장, 관련 보이스오버 구간의 연속 작업에 유용합니다. 경계가 분명하고 내용이 이어지는 문단을 준비하고 작품 전반에서 같은 화자를 유지하세요.</p><p>입력은 최종 발화문이며, 선택적으로 화자 참조 음성과 SSML 표현 제어를 추가할 수 있습니다. 내레이션 제작 요구사항에서는 청취자가 들을 내용과 제작 메모를 구분해야 합니다. 기술 설명이라면 명확한 도입, 실제 단계, 마무리 안내를 작성하세요. 제품 이름과 반복되는 용어는 같은 표기를 유지하세요. 현지화 내레이션에는 목표 언어 대본을 준비합니다. 선택한 언어와 목소리가 그 대본의 발화 표현을 결정합니다.</p><h4>화자, 역할, 표현 제어</h4><p>Microsoft는 선별된 목소리 라이브러리를 제공하며 대화용 다중 화자를 문서화합니다. Harper와 Grant는 여러 로캘에 항목이 있는 화자 정체성의 예입니다. 두 사람이 주고받는 교육 대화에서는 질문과 설명을 서로 다른 목소리에 배정하고 같은 역할이 다시 등장할 때도 배정을 유지할 수 있습니다. 원하는 대화가 합성 입력에 나타나도록 발화 문장에 명확한 라벨을 붙이세요.</p><p>SSML로 대화 차례나 문장 수준에서 어조와 표현을 조절할 수 있습니다. 스타일은 화자별로 다릅니다. 관리형 목록에는 적합한 목소리의 작업 중심 내레이터·교육 스타일과 다른 목소리의 기쁨·안도 같은 감정 선택지가 나열됩니다. 미국 Harper 항목은 이 두 감정 스타일을 지원합니다. 다른 목소리의 스타일을 가져오지 말고 화자와 그 화자에 대해 문서화된 표현 스타일을 함께 선택하세요.</p><p>이야기나 프레젠테이션에서는 표현력으로 사실 설명, 성찰하는 문단, 생동감 있는 인용을 구분할 수 있습니다. 예를 들어 “첫 시도에서는 전체 모습을 제대로 볼 수 없었습니다. 전체 과정을 살펴보니 빠진 단계가 분명해졌습니다.”라는 문장을 사용할 수 있습니다. 의미가 바뀌는 지점을 정하고 그에 맞게 발화 단위를 준비하세요. 모든 문장을 똑같이 강조하기보다 내러티브를 따라 표현이 바뀌도록 전환 부분을 들어 보세요.</p><h4>참조 목소리와 오디오 결과</h4><p>선택적인 사용자 지정 목소리 모드는 미세 조정 없이 5~60초의 오디오 참조에서 동의받은 화자의 목소리를 재현합니다. 샘플이 생성 목소리에 영향을 주므로 Microsoft는 적당한 에너지의 자연스러운 대화체를 권장합니다. 사용자 지정 목소리 워크플로에는 제조사 승인과 녹음된 동의 진술이 필요합니다. 미리 만들어진 라이브러리는 별도의 목소리 선택 경로입니다.</p><p>제조사는 출력 형식을 선택할 수 있게 하며 공개 합성 예제에서는 24 kHz, 160 kbit/s의 모노 MP3로 저장합니다. 이 설정은 하나의 출력 워크플로를 설명합니다. 다음 편집이나 재생 단계에 맞는 오디오 표현 방식을 선택하고 대본, 화자, 구간 순서를 녹음과 연결해 보관하세요. 완성된 장이나 수업은 여러 생성 문단을 포함하면서도 일관된 하나의 청취 경험을 유지할 수 있습니다.</p><h4>긴 결과 활용</h4><p>MAI-Voice-2.1은 즉각적인 응답 시간보다 음성 연기가 중요한 상황에서 자연스러움과 표현력에 초점을 둡니다. 긴 작품에서는 반복되는 이름, 구간 경계, 대화에 배정된 목소리, 감정적 어조의 변화를 검토하세요. 문서는 긴 콘텐츠 생성 능력과 일관성 유지 장치를 확립하지만 무제한 대본이나 보장된 최대 녹음 시간을 지정하지는 않습니다. 실용적인 결과물은 내레이터, 문구, 전개가 준비한 자료와 일치하는 표현력 있는 오디오입니다.</p>",
  "aboutText": "MAI-Voice-2.1은 표현력과 오디오 충실도가 중요한 작업을 위한 Microsoft AI의 프롬프트 기반 텍스트 음성 변환 모델입니다. 모델 카드는 23개 언어와 26개 로캘을 다루며 자연스러운 억양, 리듬, 감정의 미묘한 차이를 설명합니다. 제조사는 오디오북, 미디어 내레이션, 콘텐츠 제작, 보이스오버를 핵심 용도로 제시합니다. 이 버전은 길고 표현력 있는 콘텐츠에 중점을 둡니다. 지연에 민감한 상호작용에는 별도로 설계된 MAI-Voice-2.1-Flash가 있습니다.\n\n### 일관된 화자의 내레이션\n\n모델 카드는 지원 언어 전반에서 하나의 목소리 정체성을 일관되게 구현한다고 설명합니다. 긴 콘텐츠 생성은 청크 분할과 맥락 전달을 사용해 문단 사이의 연속성을 높입니다. 내레이터의 특성을 유지해야 하는 수업, 오디오북의 한 장, 관련 보이스오버 구간의 연속 작업에 유용합니다. 경계가 분명하고 내용이 이어지는 문단을 준비하고 작품 전반에서 같은 화자를 유지하세요.\n\n입력은 최종 발화문이며, 선택적으로 화자 참조 음성과 SSML 표현 제어를 추가할 수 있습니다. 내레이션 제작 요구사항에서는 청취자가 들을 내용과 제작 메모를 구분해야 합니다. 기술 설명이라면 명확한 도입, 실제 단계, 마무리 안내를 작성하세요. 제품 이름과 반복되는 용어는 같은 표기를 유지하세요. 현지화 내레이션에는 목표 언어 대본을 준비합니다. 선택한 언어와 목소리가 그 대본의 발화 표현을 결정합니다.\n\n### 화자, 역할, 표현 제어\n\nMicrosoft는 선별된 목소리 라이브러리를 제공하며 대화용 다중 화자를 문서화합니다. Harper와 Grant는 여러 로캘에 항목이 있는 화자 정체성의 예입니다. 두 사람이 주고받는 교육 대화에서는 질문과 설명을 서로 다른 목소리에 배정하고 같은 역할이 다시 등장할 때도 배정을 유지할 수 있습니다. 원하는 대화가 합성 입력에 나타나도록 발화 문장에 명확한 라벨을 붙이세요.\n\nSSML로 대화 차례나 문장 수준에서 어조와 표현을 조절할 수 있습니다. 스타일은 화자별로 다릅니다. 관리형 목록에는 적합한 목소리의 작업 중심 내레이터·교육 스타일과 다른 목소리의 기쁨·안도 같은 감정 선택지가 나열됩니다. 미국 Harper 항목은 이 두 감정 스타일을 지원합니다. 다른 목소리의 스타일을 가져오지 말고 화자와 그 화자에 대해 문서화된 표현 스타일을 함께 선택하세요.\n\n이야기나 프레젠테이션에서는 표현력으로 사실 설명, 성찰하는 문단, 생동감 있는 인용을 구분할 수 있습니다. 예를 들어 “첫 시도에서는 전체 모습을 제대로 볼 수 없었습니다. 전체 과정을 살펴보니 빠진 단계가 분명해졌습니다.”라는 문장을 사용할 수 있습니다. 의미가 바뀌는 지점을 정하고 그에 맞게 발화 단위를 준비하세요. 모든 문장을 똑같이 강조하기보다 내러티브를 따라 표현이 바뀌도록 전환 부분을 들어 보세요.\n\n### 참조 목소리와 오디오 결과\n\n선택적인 사용자 지정 목소리 모드는 미세 조정 없이 5~60초의 오디오 참조에서 동의받은 화자의 목소리를 재현합니다. 샘플이 생성 목소리에 영향을 주므로 Microsoft는 적당한 에너지의 자연스러운 대화체를 권장합니다. 사용자 지정 목소리 워크플로에는 제조사 승인과 녹음된 동의 진술이 필요합니다. 미리 만들어진 라이브러리는 별도의 목소리 선택 경로입니다.\n\n제조사는 출력 형식을 선택할 수 있게 하며 공개 합성 예제에서는 24 kHz, 160 kbit/s의 모노 MP3로 저장합니다. 이 설정은 하나의 출력 워크플로를 설명합니다. 다음 편집이나 재생 단계에 맞는 오디오 표현 방식을 선택하고 대본, 화자, 구간 순서를 녹음과 연결해 보관하세요. 완성된 장이나 수업은 여러 생성 문단을 포함하면서도 일관된 하나의 청취 경험을 유지할 수 있습니다.\n\n### 긴 결과 활용\n\nMAI-Voice-2.1은 즉각적인 응답 시간보다 음성 연기가 중요한 상황에서 자연스러움과 표현력에 초점을 둡니다. 긴 작품에서는 반복되는 이름, 구간 경계, 대화에 배정된 목소리, 감정적 어조의 변화를 검토하세요. 문서는 긴 콘텐츠 생성 능력과 일관성 유지 장치를 확립하지만 무제한 대본이나 보장된 최대 녹음 시간을 지정하지는 않습니다. 실용적인 결과물은 내레이터, 문구, 전개가 준비한 자료와 일치하는 표현력 있는 오디오입니다.",
  "editorialOverlay": {
    "copy_fields": null,
    "copy_sha256": null,
    "copy_source": null,
    "html_sha256": "66b3184c514cef15865cbb9d5ac55359df5884ec787635a40dfea7bb6c921422",
    "module_sha256": "ee9dc1c50b1e6a8fb7fa062030fcb4646b9aaaeb08be513b723a5a92a7290f06",
    "raw_model_unchanged": true,
    "schema": "ailoot-native-model-editorial-v1"
  },
  "locale": "ko",
  "methods": [
    {
      "html": "<div class=\"sheet-head\"><span class=\"mav\" aria-hidden=\"true\">•</span><h2 id=\"sheet-title\">Microsoft AI: MAI-Voice-2.1</h2><button class=\"icon-btn\" type=\"button\" data-close-sheet aria-label=\"닫기\">×</button></div><div class=\"idline\"><span>Microsoft AI /</span><code>microsoft/mai-voice-2.1</code><button type=\"button\" id=\"copy-id\">ID 복사</button></div><nav class=\"card-jump-nav\" aria-label=\"모델 카드 섹션\"><button type=\"button\" data-card-jump=\"overview\">시작하기</button><button type=\"button\" data-card-jump=\"methods\">입력 및 메서드</button><button type=\"button\" data-card-jump=\"pricing\">요금</button><button type=\"button\" data-card-jump=\"examples\">예제</button><button type=\"button\" data-card-jump=\"results\">결과</button><button type=\"button\" data-card-jump=\"aliases\">별칭</button></nav><div class=\"card-method-tabs\" role=\"tablist\" aria-label=\"API 메서드\"><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\">음성 합성</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\">시작하기</h3><p class=\"mdesc-full\">Microsoft AI의 MAI-Voice-2.1은 내레이션, 오디오북, 교육 콘텐츠, 보이스오버를 위한 표현력 있는 다국어 음성을 생성합니다. 23개 언어를 제공하며 일관된 화자의 목소리, 여러 화자, 표현 제어를 지원합니다.</p><dl class=\"card-io\" data-card-io><div><dt>허용 입력</dt><dd>텍스트</dd></div><div><dt>결과</dt><dd>오디오</dd></div></dl><details class=\"card-about\"><summary>모델 소개</summary><p class=\"note-s\" data-model-method-boundary>이 설명은 모델의 기능을 다룹니다. Ailoot에서 사용할 수 있는 입력, 출력 및 옵션은 아래에 선택한 메서드별로 표시됩니다.</p><div class=\"mabout\" id=\"m-about\"><p>MAI-Voice-2.1은 표현력과 오디오 충실도가 중요한 작업을 위한 Microsoft AI의 프롬프트 기반 텍스트 음성 변환 모델입니다. 모델 카드는 23개 언어와 26개 로캘을 다루며 자연스러운 억양, 리듬, 감정의 미묘한 차이를 설명합니다. 제조사는 오디오북, 미디어 내레이션, 콘텐츠 제작, 보이스오버를 핵심 용도로 제시합니다. 이 버전은 길고 표현력 있는 콘텐츠에 중점을 둡니다. 지연에 민감한 상호작용에는 별도로 설계된 MAI-Voice-2.1-Flash가 있습니다.</p><h4>일관된 화자의 내레이션</h4><p>모델 카드는 지원 언어 전반에서 하나의 목소리 정체성을 일관되게 구현한다고 설명합니다. 긴 콘텐츠 생성은 청크 분할과 맥락 전달을 사용해 문단 사이의 연속성을 높입니다. 내레이터의 특성을 유지해야 하는 수업, 오디오북의 한 장, 관련 보이스오버 구간의 연속 작업에 유용합니다. 경계가 분명하고 내용이 이어지는 문단을 준비하고 작품 전반에서 같은 화자를 유지하세요.</p><p>입력은 최종 발화문이며, 선택적으로 화자 참조 음성과 SSML 표현 제어를 추가할 수 있습니다. 내레이션 제작 요구사항에서는 청취자가 들을 내용과 제작 메모를 구분해야 합니다. 기술 설명이라면 명확한 도입, 실제 단계, 마무리 안내를 작성하세요. 제품 이름과 반복되는 용어는 같은 표기를 유지하세요. 현지화 내레이션에는 목표 언어 대본을 준비합니다. 선택한 언어와 목소리가 그 대본의 발화 표현을 결정합니다.</p><h4>화자, 역할, 표현 제어</h4><p>Microsoft는 선별된 목소리 라이브러리를 제공하며 대화용 다중 화자를 문서화합니다. Harper와 Grant는 여러 로캘에 항목이 있는 화자 정체성의 예입니다. 두 사람이 주고받는 교육 대화에서는 질문과 설명을 서로 다른 목소리에 배정하고 같은 역할이 다시 등장할 때도 배정을 유지할 수 있습니다. 원하는 대화가 합성 입력에 나타나도록 발화 문장에 명확한 라벨을 붙이세요.</p><p>SSML로 대화 차례나 문장 수준에서 어조와 표현을 조절할 수 있습니다. 스타일은 화자별로 다릅니다. 관리형 목록에는 적합한 목소리의 작업 중심 내레이터·교육 스타일과 다른 목소리의 기쁨·안도 같은 감정 선택지가 나열됩니다. 미국 Harper 항목은 이 두 감정 스타일을 지원합니다. 다른 목소리의 스타일을 가져오지 말고 화자와 그 화자에 대해 문서화된 표현 스타일을 함께 선택하세요.</p><p>이야기나 프레젠테이션에서는 표현력으로 사실 설명, 성찰하는 문단, 생동감 있는 인용을 구분할 수 있습니다. 예를 들어 “첫 시도에서는 전체 모습을 제대로 볼 수 없었습니다. 전체 과정을 살펴보니 빠진 단계가 분명해졌습니다.”라는 문장을 사용할 수 있습니다. 의미가 바뀌는 지점을 정하고 그에 맞게 발화 단위를 준비하세요. 모든 문장을 똑같이 강조하기보다 내러티브를 따라 표현이 바뀌도록 전환 부분을 들어 보세요.</p><h4>참조 목소리와 오디오 결과</h4><p>선택적인 사용자 지정 목소리 모드는 미세 조정 없이 5~60초의 오디오 참조에서 동의받은 화자의 목소리를 재현합니다. 샘플이 생성 목소리에 영향을 주므로 Microsoft는 적당한 에너지의 자연스러운 대화체를 권장합니다. 사용자 지정 목소리 워크플로에는 제조사 승인과 녹음된 동의 진술이 필요합니다. 미리 만들어진 라이브러리는 별도의 목소리 선택 경로입니다.</p><p>제조사는 출력 형식을 선택할 수 있게 하며 공개 합성 예제에서는 24 kHz, 160 kbit/s의 모노 MP3로 저장합니다. 이 설정은 하나의 출력 워크플로를 설명합니다. 다음 편집이나 재생 단계에 맞는 오디오 표현 방식을 선택하고 대본, 화자, 구간 순서를 녹음과 연결해 보관하세요. 완성된 장이나 수업은 여러 생성 문단을 포함하면서도 일관된 하나의 청취 경험을 유지할 수 있습니다.</p><h4>긴 결과 활용</h4><p>MAI-Voice-2.1은 즉각적인 응답 시간보다 음성 연기가 중요한 상황에서 자연스러움과 표현력에 초점을 둡니다. 긴 작품에서는 반복되는 이름, 구간 경계, 대화에 배정된 목소리, 감정적 어조의 변화를 검토하세요. 문서는 긴 콘텐츠 생성 능력과 일관성 유지 장치를 확립하지만 무제한 대본이나 보장된 최대 녹음 시간을 지정하지는 않습니다. 실용적인 결과물은 내레이터, 문구, 전개가 준비한 자료와 일치하는 표현력 있는 오디오입니다.</p></div></details></section><section class=\"card-section\" data-card-section=\"methods\"><h3 tabindex=\"-1\">Ailoot에서 사용 가능 · 입력 및 메서드</h3><details class=\"card-method\" open><summary><b>Ailoot Ultra · 음성 합성</b> <code>POST /v1/audio/speech</code></summary><dl class=\"method-capabilities\"><div><dt>입력</dt><dd><code>text</code></dd></div><div><dt>출력</dt><dd><code>audio</code></dd></div><div><dt>출력 형식</dt><dd>mp3</dd></div></dl><div class=\"tw\" data-card-parameters data-typed-parameters><table><thead><tr><th>필드</th><th>유형</th><th>요건</th><th>값과 한도</th><th>기본값</th></tr></thead><tbody><tr data-parameter-availability=\"source_interface\"><th data-cell-label=\"필드\" scope=\"row\"><span class=\"card-cell-label\">필드</span><code class=\"card-field-name\">model</code></th><td data-cell-label=\"유형\" data-field-type><span class=\"card-cell-label\">유형</span><code>string</code></td><td data-cell-label=\"요건\"><span class=\"card-cell-label\">요건</span>필수</td><td data-cell-label=\"값과 한도\"><span class=\"card-cell-label\">값과 한도</span><div>microsoft/mai-voice-2.1</div></td><td data-cell-label=\"기본값\" data-default=\"unspecified\"><span class=\"card-cell-label\">기본값</span>—</td></tr><tr data-parameter-availability=\"source_interface\"><th data-cell-label=\"필드\" scope=\"row\"><span class=\"card-cell-label\">필드</span><code class=\"card-field-name\">input</code></th><td data-cell-label=\"유형\" data-field-type><span class=\"card-cell-label\">유형</span><code>string</code></td><td data-cell-label=\"요건\"><span class=\"card-cell-label\">요건</span>필수</td><td data-cell-label=\"값과 한도\"><span class=\"card-cell-label\">값과 한도</span><div>최소 길이: 1</div><div>단위: Unicode 문자</div></td><td data-cell-label=\"기본값\" data-default=\"unspecified\"><span class=\"card-cell-label\">기본값</span>—</td></tr><tr data-parameter-availability=\"source_interface\"><th data-cell-label=\"필드\" scope=\"row\"><span class=\"card-cell-label\">필드</span><code class=\"card-field-name\">voice</code></th><td data-cell-label=\"유형\" data-field-type><span class=\"card-cell-label\">유형</span><code>string</code></td><td data-cell-label=\"요건\"><span class=\"card-cell-label\">요건</span>필수</td><td data-cell-label=\"값과 한도\"><span class=\"card-cell-label\">값과 한도</span><div>cs-CZ-Grant:MAI-Voice-2.1, cs-CZ-Harper:MAI-Voice-2.1, da-DK-Grant:MAI-Voice-2.1, da-DK-Harper:MAI-Voice-2.1, de-DE-Grant:MAI-Voice-2.1, de-DE-Harper:MAI-Voice-2.1, de-DE-Klaus:MAI-Voice-2.1, de-DE-Mia:MAI-Voice-2.1, en-AU-Isla:MAI-Voice-2.1, en-GB-Emily:MAI-Voice-2.1, en-GB-Harry:MAI-Voice-2.1, en-IN-Dhruv:MAI-Voice-2.1, en-IN-Priya:MAI-Voice-2.1, en-US-Ethan:MAI-Voice-2.1, en-US-Grant:MAI-Voice-2.1, en-US-Harper:MAI-Voice-2.1, en-US-Iris:MAI-Voice-2.1, en-US-Jasper:MAI-Voice-2.1, en-US-Olivia:MAI-Voice-2.1, en-US-Sage:MAI-Voice-2.1, es-ES-Marta:MAI-Voice-2.1, es-MX-Alejo:MAI-Voice-2.1, es-MX-Grant:MAI-Voice-2.1, es-MX-Harper:MAI-Voice-2.1, es-MX-Valeria:MAI-Voice-2.1, fi-FI-Grant:MAI-Voice-2.1, fi-FI-Harper:MAI-Voice-2.1, fr-FR-Grant:MAI-Voice-2.1, fr-FR-Harper:MAI-Voice-2.1, fr-FR-Marc:MAI-Voice-2.1, fr-FR-Soleil:MAI-Voice-2.1, hi-IN-Arjun:MAI-Voice-2.1, hi-IN-Dhruv:MAI-Voice-2.1, hi-IN-Grant:MAI-Voice-2.1, hi-IN-Harper:MAI-Voice-2.1, hi-IN-Kavya:MAI-Voice-2.1, hi-IN-Priya:MAI-Voice-2.1, hu-HU-Bence:MAI-Voice-2.1, hu-HU-Grant:MAI-Voice-2.1, hu-HU-Harper:MAI-Voice-2.1, hu-HU-Levente:MAI-Voice-2.1, hu-HU-Lilla:MAI-Voice-2.1, hu-HU-Reka:MAI-Voice-2.1, id-ID-Grant:MAI-Voice-2.1, id-ID-Harper:MAI-Voice-2.1, it-IT-Grant:MAI-Voice-2.1, it-IT-Harper:MAI-Voice-2.1, it-IT-Luca:MAI-Voice-2.1, it-IT-Rosa:MAI-Voice-2.1, ko-KR-Grant:MAI-Voice-2.1, ko-KR-Haena:MAI-Voice-2.1, ko-KR-Harper:MAI-Voice-2.1, ko-KR-Junho:MAI-Voice-2.1, nb-NO-Grant:MAI-Voice-2.1, nb-NO-Harper:MAI-Voice-2.1, nl-NL-Grant:MAI-Voice-2.1, nl-NL-Harper:MAI-Voice-2.1, nl-NL-Sander:MAI-Voice-2.1, pl-PL-Grant:MAI-Voice-2.1, pl-PL-Harper:MAI-Voice-2.1, pt-BR-Caio:MAI-Voice-2.1, pt-BR-Grant:MAI-Voice-2.1, pt-BR-Harper:MAI-Voice-2.1, pt-BR-Luana:MAI-Voice-2.1, pt-BR-Pedro:MAI-Voice-2.1, pt-BR-Rafael:MAI-Voice-2.1, pt-PT-Grant:MAI-Voice-2.1, pt-PT-Harper:MAI-Voice-2.1, pt-PT-Rui:MAI-Voice-2.1, ro-RO-Andrei:MAI-Voice-2.1, ro-RO-Elena:MAI-Voice-2.1, ro-RO-Grant:MAI-Voice-2.1, ro-RO-Harper:MAI-Voice-2.1, ro-RO-Ioana:MAI-Voice-2.1, ro-RO-Radu:MAI-Voice-2.1, ru-RU-Grant:MAI-Voice-2.1, ru-RU-Harper:MAI-Voice-2.1, ru-RU-Lev:MAI-Voice-2.1, ru-RU-Masha:MAI-Voice-2.1, sv-SE-Grant:MAI-Voice-2.1, sv-SE-Harper:MAI-Voice-2.1, th-TH-Grant:MAI-Voice-2.1, th-TH-Harper:MAI-Voice-2.1, th-TH-Krit:MAI-Voice-2.1, th-TH-Nattapong:MAI-Voice-2.1, tr-TR-Aydin:MAI-Voice-2.1, tr-TR-Elif:MAI-Voice-2.1, tr-TR-Grant:MAI-Voice-2.1, tr-TR-Harper:MAI-Voice-2.1, vi-VN-Grant:MAI-Voice-2.1, vi-VN-Harper:MAI-Voice-2.1, zh-CN-Bo:MAI-Voice-2.1, zh-CN-Grant:MAI-Voice-2.1, zh-CN-Harper:MAI-Voice-2.1, zh-CN-Lan:MAI-Voice-2.1, zh-CN-Mei:MAI-Voice-2.1, zh-CN-Wei:MAI-Voice-2.1</div></td><td data-cell-label=\"기본값\" data-default=\"unspecified\"><span class=\"card-cell-label\">기본값</span>—</td></tr><tr data-parameter-availability=\"source_interface\"><th data-cell-label=\"필드\" scope=\"row\"><span class=\"card-cell-label\">필드</span><code class=\"card-field-name\">response_format</code></th><td data-cell-label=\"유형\" data-field-type><span class=\"card-cell-label\">유형</span><code>string</code></td><td data-cell-label=\"요건\"><span class=\"card-cell-label\">요건</span>필수</td><td data-cell-label=\"값과 한도\"><span class=\"card-cell-label\">값과 한도</span><div>mp3</div></td><td data-cell-label=\"기본값\" data-default=\"unspecified\"><span class=\"card-cell-label\">기본값</span>—</td></tr></tbody></table></div><details class=\"card-about\" data-material-combinations><summary>입력 자료 조합</summary><p class=\"note-s\"><b>text_to_speech</b> · 필수: input</p></details><details class=\"note-s\" data-method-contract><summary>메서드 매개변수와 수명 주기</summary><div class=\"tw\" data-card-table=\"contract\"><table><thead><tr><th>매개변수</th><th>명세</th></tr></thead><tbody><tr><th data-cell-label=\"매개변수\" scope=\"row\"><span class=\"card-cell-label\">매개변수</span><code>content_type</code></th><td data-cell-label=\"명세\"><span class=\"card-cell-label\">명세</span>application/json</td></tr><tr><th data-cell-label=\"매개변수\" scope=\"row\"><span class=\"card-cell-label\">매개변수</span><code>required</code></th><td data-cell-label=\"명세\"><span class=\"card-cell-label\">명세</span>model, input, voice, response_format</td></tr><tr><th data-cell-label=\"매개변수\" scope=\"row\"><span class=\"card-cell-label\">매개변수</span><code>voice_ids</code></th><td data-cell-label=\"명세\"><span class=\"card-cell-label\">명세</span>cs-CZ-Grant:MAI-Voice-2.1, cs-CZ-Harper:MAI-Voice-2.1, da-DK-Grant:MAI-Voice-2.1, da-DK-Harper:MAI-Voice-2.1, de-DE-Grant:MAI-Voice-2.1, de-DE-Harper:MAI-Voice-2.1, de-DE-Klaus:MAI-Voice-2.1, de-DE-Mia:MAI-Voice-2.1, en-AU-Isla:MAI-Voice-2.1, en-GB-Emily:MAI-Voice-2.1, en-GB-Harry:MAI-Voice-2.1, en-IN-Dhruv:MAI-Voice-2.1, en-IN-Priya:MAI-Voice-2.1, en-US-Ethan:MAI-Voice-2.1, en-US-Grant:MAI-Voice-2.1, en-US-Harper:MAI-Voice-2.1, en-US-Iris:MAI-Voice-2.1, en-US-Jasper:MAI-Voice-2.1, en-US-Olivia:MAI-Voice-2.1, en-US-Sage:MAI-Voice-2.1, es-ES-Marta:MAI-Voice-2.1, es-MX-Alejo:MAI-Voice-2.1, es-MX-Grant:MAI-Voice-2.1, es-MX-Harper:MAI-Voice-2.1, es-MX-Valeria:MAI-Voice-2.1, fi-FI-Grant:MAI-Voice-2.1, fi-FI-Harper:MAI-Voice-2.1, fr-FR-Grant:MAI-Voice-2.1, fr-FR-Harper:MAI-Voice-2.1, fr-FR-Marc:MAI-Voice-2.1, fr-FR-Soleil:MAI-Voice-2.1, hi-IN-Arjun:MAI-Voice-2.1, hi-IN-Dhruv:MAI-Voice-2.1, hi-IN-Grant:MAI-Voice-2.1, hi-IN-Harper:MAI-Voice-2.1, hi-IN-Kavya:MAI-Voice-2.1, hi-IN-Priya:MAI-Voice-2.1, hu-HU-Bence:MAI-Voice-2.1, hu-HU-Grant:MAI-Voice-2.1, hu-HU-Harper:MAI-Voice-2.1, hu-HU-Levente:MAI-Voice-2.1, hu-HU-Lilla:MAI-Voice-2.1, hu-HU-Reka:MAI-Voice-2.1, id-ID-Grant:MAI-Voice-2.1, id-ID-Harper:MAI-Voice-2.1, it-IT-Grant:MAI-Voice-2.1, it-IT-Harper:MAI-Voice-2.1, it-IT-Luca:MAI-Voice-2.1, it-IT-Rosa:MAI-Voice-2.1, ko-KR-Grant:MAI-Voice-2.1, ko-KR-Haena:MAI-Voice-2.1, ko-KR-Harper:MAI-Voice-2.1, ko-KR-Junho:MAI-Voice-2.1, nb-NO-Grant:MAI-Voice-2.1, nb-NO-Harper:MAI-Voice-2.1, nl-NL-Grant:MAI-Voice-2.1, nl-NL-Harper:MAI-Voice-2.1, nl-NL-Sander:MAI-Voice-2.1, pl-PL-Grant:MAI-Voice-2.1, pl-PL-Harper:MAI-Voice-2.1, pt-BR-Caio:MAI-Voice-2.1, pt-BR-Grant:MAI-Voice-2.1, pt-BR-Harper:MAI-Voice-2.1, pt-BR-Luana:MAI-Voice-2.1, pt-BR-Pedro:MAI-Voice-2.1, pt-BR-Rafael:MAI-Voice-2.1, pt-PT-Grant:MAI-Voice-2.1, pt-PT-Harper:MAI-Voice-2.1, pt-PT-Rui:MAI-Voice-2.1, ro-RO-Andrei:MAI-Voice-2.1, ro-RO-Elena:MAI-Voice-2.1, ro-RO-Grant:MAI-Voice-2.1, ro-RO-Harper:MAI-Voice-2.1, ro-RO-Ioana:MAI-Voice-2.1, ro-RO-Radu:MAI-Voice-2.1, ru-RU-Grant:MAI-Voice-2.1, ru-RU-Harper:MAI-Voice-2.1, ru-RU-Lev:MAI-Voice-2.1, ru-RU-Masha:MAI-Voice-2.1, sv-SE-Grant:MAI-Voice-2.1, sv-SE-Harper:MAI-Voice-2.1, th-TH-Grant:MAI-Voice-2.1, th-TH-Harper:MAI-Voice-2.1, th-TH-Krit:MAI-Voice-2.1, th-TH-Nattapong:MAI-Voice-2.1, tr-TR-Aydin:MAI-Voice-2.1, tr-TR-Elif:MAI-Voice-2.1, tr-TR-Grant:MAI-Voice-2.1, tr-TR-Harper:MAI-Voice-2.1, vi-VN-Grant:MAI-Voice-2.1, vi-VN-Harper:MAI-Voice-2.1, zh-CN-Bo:MAI-Voice-2.1, zh-CN-Grant:MAI-Voice-2.1, zh-CN-Harper:MAI-Voice-2.1, zh-CN-Lan:MAI-Voice-2.1, zh-CN-Mei:MAI-Voice-2.1, zh-CN-Wei:MAI-Voice-2.1</td></tr><tr><th data-cell-label=\"매개변수\" scope=\"row\"><span class=\"card-cell-label\">매개변수</span><code>response_format</code></th><td data-cell-label=\"명세\"><span class=\"card-cell-label\">명세</span>mp3</td></tr><tr><th data-cell-label=\"매개변수\" scope=\"row\"><span class=\"card-cell-label\">매개변수</span><code>max_input_characters</code></th><td data-cell-label=\"명세\"><span class=\"card-cell-label\">명세</span>null</td></tr><tr><th data-cell-label=\"매개변수\" scope=\"row\"><span class=\"card-cell-label\">매개변수</span><code>other_options</code></th><td data-cell-label=\"명세\"><span class=\"card-cell-label\">명세</span>false</td></tr><tr><th data-cell-label=\"매개변수\" scope=\"row\"><span class=\"card-cell-label\">매개변수</span><code>input</code></th><td data-cell-label=\"명세\"><span class=\"card-cell-label\">명세</span>정확한 UTF-8 텍스트; 정규화 없이 계산한 유니코드 문자 수</td></tr><tr><th data-cell-label=\"매개변수\" scope=\"row\"><span class=\"card-cell-label\">매개변수</span><code>material_types</code></th><td data-cell-label=\"명세\"><span class=\"card-cell-label\">명세</span>text</td></tr></tbody></table></div><p>수명 주기: <code>synchronous_result_then_owned_library</code></p><p class=\"note-s\"><code>GET /v1/media/tasks/{task_id}</code> · 실제로 반환된 task_id 또는 미디어 라이브러리 기록</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\">이 모델 프로필에 있는 정확한 음성을 선택하세요.</p><p class=\"note-s\">입력 문자 수와 오디오 초는 서로 다른 측정 단위입니다.</p></details></details></section><section class=\"card-section\" data-card-section=\"pricing\"><h3 tabindex=\"-1\">요금</h3><div data-native-semantic-method=\"v1\" data-tariff-reference-only><p class=\"note-s\" data-rate-support-note>요금 정보는 요청 옵션을 추가하지 않습니다. 지원되는 매개변수는 선택한 메서드에 표시됩니다.</p><dl data-price-conditions><dt>빠른 모드</dt><dd>미지정 <span class=\"note-s\">빠른 모드를 선택한 경우</span></dd><dt>Flex 모드</dt><dd>미지정 <span class=\"note-s\">flex 모드를 선택한 경우</span></dd><dt>최대 추론 수준</dt><dd>미지정 <span class=\"note-s\">최대 추론 수준에 default 조정값을 적용하는 경우</span></dd></dl></div><div data-declared-tariff-pricing><h4>Ailoot 요금</h4><h4>설정별 가격</h4><p class=\"note-s\">각 요금을 표시된 조건과 대조하세요. 서로 대체되는 설정 묶음마다 하나의 요금만 적용하세요.</p><div class=\"tw\" data-pricing-profiles><table><thead><tr><th>설정</th><th>요금표</th><th>과금 대상 수량</th><th>과금 단위</th><th>요금</th></tr></thead><tbody><tr><th data-cell-label=\"설정\" scope=\"row\"><span class=\"card-cell-label\">설정</span>기본 토큰 요금</th><td data-cell-label=\"요금표\"><span class=\"card-cell-label\">요금표</span>기본 요금</td><td data-cell-label=\"과금 대상 수량\"><span class=\"card-cell-label\">과금 대상 수량</span>—</td><td data-cell-label=\"과금 단위\"><span class=\"card-cell-label\">과금 단위</span>—</td><td data-cell-label=\"요금\"><span class=\"card-cell-label\">요금</span><div><span>입력 · 입력 토큰</span> <b>—</b> <span class=\"price-unit\">/ 1K 토큰</span></div><div><span>출력 · 출력 토큰</span> <b>—</b> <span class=\"price-unit\">/ 1K 토큰</span></div><div><span>입력 · 캐시 읽기</span> <b>—</b> <span class=\"price-unit\">/ 1K 토큰</span></div><div><span>입력 · 캐시 쓰기</span> <b>—</b> <span class=\"price-unit\">/ 1K 토큰</span></div><div><span>입력 · 캐시 쓰기, 1시간</span> <b>—</b> <span class=\"price-unit\">/ 1K 토큰</span></div></td></tr><tr><th data-cell-label=\"설정\" scope=\"row\"><span class=\"card-cell-label\">설정</span>Ultra</th><td data-cell-label=\"요금표\"><span class=\"card-cell-label\">요금표</span>—</td><td data-cell-label=\"과금 대상 수량\"><span class=\"card-cell-label\">과금 대상 수량</span>한자를 포함해 Unicode 코드 포인트 하나를 문자 하나로 계산합니다.</td><td data-cell-label=\"과금 단위\"><span class=\"card-cell-label\">과금 단위</span>입력 문자 1K개당</td><td data-cell-label=\"요금\"><span class=\"card-cell-label\">요금</span><div><span>입력 · 입력 문자</span> <b>$0.044</b> <span class=\"price-unit\">입력 문자 1K개당</span></div></td></tr></tbody></table></div></div><div data-declared-reference-pricing><h4>참조 요금 상세 정보</h4><p class=\"note-s\">모델 수준의 참조 요금표는 메서드 선택, 견적 또는 요금을 변경하지 않습니다. 실제 과금에는 선택한 Ailoot 메서드 요금이 적용됩니다.</p><details class=\"card-price-reference\" data-declared-reference-group data-client-selectable=\"false\"><summary>Microsoft AI: MAI-Voice-2.1</summary><h4>설정별 가격</h4><div class=\"tw\" data-pricing-profiles><table><thead><tr><th>설정</th><th>과금 조건</th><th>요금</th></tr></thead><tbody><tr><th data-cell-label=\"설정\" scope=\"row\"><span class=\"card-cell-label\">설정</span>Microsoft AI: MAI-Voice-2.1 · 기본 설정</th><td data-cell-label=\"과금 조건\"><span class=\"card-cell-label\">과금 조건</span>기본 설정</td><td data-cell-label=\"요금\"><span class=\"card-cell-label\">요금</span><div><span>입력 · 입력 문자 수</span> <b>US$0.000044</b> <span class=\"price-unit\">입력 문자당</span></div></td></tr></tbody></table></div></details></div><p class=\"note-s\">Ailoot는 요청 전에 예상 금액을 미리 확보합니다. 결과를 받은 뒤 측정된 사용량을 기준으로 최종 요금을 정산합니다. 스트리밍 정산에는 최종 사용량 기록을 사용합니다. <a href=\"/docs/ko/billing/reserve/\">금액 확보와 정산 방식 →</a></p></section><section class=\"card-section\" data-card-section=\"examples\"><h3 tabindex=\"-1\">요청 예제</h3><h4>Ailoot Ultra · 음성 합성</h4><div class=\"code-group\"><div class=\"cg-bar\"><div class=\"cg-tabs\" role=\"tablist\" aria-label=\"코드 예제 형식\"><button class=\"cg-tab\" id=\"model-code-1853-tab-0\" role=\"tab\" type=\"button\" aria-controls=\"model-code-1853-panel-0\" aria-selected=\"true\" tabindex=\"0\">curl</button></div><div class=\"cg-tools\"><button class=\"cg-btn cg-copy\" type=\"button\" aria-label=\"코드 복사\"><svg class=\"cp\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.4\"><rect x=\"5.25\" y=\"5.25\" width=\"8.5\" height=\"8.5\" rx=\"1.75\"/><path d=\"M10.75 5.25V3.5a1.25 1.25 0 0 0-1.25-1.25H3.5A1.25 1.25 0 0 0 2.25 3.5v6a1.25 1.25 0 0 0 1.25 1.25h1.75\"/></svg><svg class=\"ok\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.4\"><path d=\"m3 8.5 3.25 3.25L13 5\"/></svg></button></div></div><div class=\"cg-body\"><div class=\"cg-pane\" id=\"model-code-1853-panel-0\" role=\"tabpanel\" aria-labelledby=\"model-code-1853-tab-0\"><pre data-lang=\"bash\"><code>set -eu\n: &quot;${AILOOT_API_KEY:?Set your Ailoot API key}&quot;\n: &quot;${AILOOT_VOICE_ID:?Choose an accepted voice ID from this exact model profile}&quot;\nexport AILOOT_VOICE_ID\npython3 - &lt;&lt;&#39;PY_REQUEST&#39;\nimport json,os\nfrom pathlib import Path\np=json.loads(&#39;{&quot;model&quot;: &quot;microsoft/mai-voice-2.1&quot;, &quot;input&quot;: &quot;Good afternoon! This is a short voice take.&quot;}&#39;)\nvoice=os.environ[&quot;AILOOT_VOICE_ID&quot;]\nallowed=json.loads(&#39;[&quot;cs-CZ-Grant:MAI-Voice-2.1&quot;, &quot;cs-CZ-Harper:MAI-Voice-2.1&quot;, &quot;da-DK-Grant:MAI-Voice-2.1&quot;, &quot;da-DK-Harper:MAI-Voice-2.1&quot;, &quot;de-DE-Grant:MAI-Voice-2.1&quot;, &quot;de-DE-Harper:MAI-Voice-2.1&quot;, &quot;de-DE-Klaus:MAI-Voice-2.1&quot;, &quot;de-DE-Mia:MAI-Voice-2.1&quot;, &quot;en-AU-Isla:MAI-Voice-2.1&quot;, &quot;en-GB-Emily:MAI-Voice-2.1&quot;, &quot;en-GB-Harry:MAI-Voice-2.1&quot;, &quot;en-IN-Dhruv:MAI-Voice-2.1&quot;, &quot;en-IN-Priya:MAI-Voice-2.1&quot;, &quot;en-US-Ethan:MAI-Voice-2.1&quot;, &quot;en-US-Grant:MAI-Voice-2.1&quot;, &quot;en-US-Harper:MAI-Voice-2.1&quot;, &quot;en-US-Iris:MAI-Voice-2.1&quot;, &quot;en-US-Jasper:MAI-Voice-2.1&quot;, &quot;en-US-Olivia:MAI-Voice-2.1&quot;, &quot;en-US-Sage:MAI-Voice-2.1&quot;, &quot;es-ES-Marta:MAI-Voice-2.1&quot;, &quot;es-MX-Alejo:MAI-Voice-2.1&quot;, &quot;es-MX-Grant:MAI-Voice-2.1&quot;, &quot;es-MX-Harper:MAI-Voice-2.1&quot;, &quot;es-MX-Valeria:MAI-Voice-2.1&quot;, &quot;fi-FI-Grant:MAI-Voice-2.1&quot;, &quot;fi-FI-Harper:MAI-Voice-2.1&quot;, &quot;fr-FR-Grant:MAI-Voice-2.1&quot;, &quot;fr-FR-Harper:MAI-Voice-2.1&quot;, &quot;fr-FR-Marc:MAI-Voice-2.1&quot;, &quot;fr-FR-Soleil:MAI-Voice-2.1&quot;, &quot;hi-IN-Arjun:MAI-Voice-2.1&quot;, &quot;hi-IN-Dhruv:MAI-Voice-2.1&quot;, &quot;hi-IN-Grant:MAI-Voice-2.1&quot;, &quot;hi-IN-Harper:MAI-Voice-2.1&quot;, &quot;hi-IN-Kavya:MAI-Voice-2.1&quot;, &quot;hi-IN-Priya:MAI-Voice-2.1&quot;, &quot;hu-HU-Bence:MAI-Voice-2.1&quot;, &quot;hu-HU-Grant:MAI-Voice-2.1&quot;, &quot;hu-HU-Harper:MAI-Voice-2.1&quot;, &quot;hu-HU-Levente:MAI-Voice-2.1&quot;, &quot;hu-HU-Lilla:MAI-Voice-2.1&quot;, &quot;hu-HU-Reka:MAI-Voice-2.1&quot;, &quot;id-ID-Grant:MAI-Voice-2.1&quot;, &quot;id-ID-Harper:MAI-Voice-2.1&quot;, &quot;it-IT-Grant:MAI-Voice-2.1&quot;, &quot;it-IT-Harper:MAI-Voice-2.1&quot;, &quot;it-IT-Luca:MAI-Voice-2.1&quot;, &quot;it-IT-Rosa:MAI-Voice-2.1&quot;, &quot;ko-KR-Grant:MAI-Voice-2.1&quot;, &quot;ko-KR-Haena:MAI-Voice-2.1&quot;, &quot;ko-KR-Harper:MAI-Voice-2.1&quot;, &quot;ko-KR-Junho:MAI-Voice-2.1&quot;, &quot;nb-NO-Grant:MAI-Voice-2.1&quot;, &quot;nb-NO-Harper:MAI-Voice-2.1&quot;, &quot;nl-NL-Grant:MAI-Voice-2.1&quot;, &quot;nl-NL-Harper:MAI-Voice-2.1&quot;, &quot;nl-NL-Sander:MAI-Voice-2.1&quot;, &quot;pl-PL-Grant:MAI-Voice-2.1&quot;, &quot;pl-PL-Harper:MAI-Voice-2.1&quot;, &quot;pt-BR-Caio:MAI-Voice-2.1&quot;, &quot;pt-BR-Grant:MAI-Voice-2.1&quot;, &quot;pt-BR-Harper:MAI-Voice-2.1&quot;, &quot;pt-BR-Luana:MAI-Voice-2.1&quot;, &quot;pt-BR-Pedro:MAI-Voice-2.1&quot;, &quot;pt-BR-Rafael:MAI-Voice-2.1&quot;, &quot;pt-PT-Grant:MAI-Voice-2.1&quot;, &quot;pt-PT-Harper:MAI-Voice-2.1&quot;, &quot;pt-PT-Rui:MAI-Voice-2.1&quot;, &quot;ro-RO-Andrei:MAI-Voice-2.1&quot;, &quot;ro-RO-Elena:MAI-Voice-2.1&quot;, &quot;ro-RO-Grant:MAI-Voice-2.1&quot;, &quot;ro-RO-Harper:MAI-Voice-2.1&quot;, &quot;ro-RO-Ioana:MAI-Voice-2.1&quot;, &quot;ro-RO-Radu:MAI-Voice-2.1&quot;, &quot;ru-RU-Grant:MAI-Voice-2.1&quot;, &quot;ru-RU-Harper:MAI-Voice-2.1&quot;, &quot;ru-RU-Lev:MAI-Voice-2.1&quot;, &quot;ru-RU-Masha:MAI-Voice-2.1&quot;, &quot;sv-SE-Grant:MAI-Voice-2.1&quot;, &quot;sv-SE-Harper:MAI-Voice-2.1&quot;, &quot;th-TH-Grant:MAI-Voice-2.1&quot;, &quot;th-TH-Harper:MAI-Voice-2.1&quot;, &quot;th-TH-Krit:MAI-Voice-2.1&quot;, &quot;th-TH-Nattapong:MAI-Voice-2.1&quot;, &quot;tr-TR-Aydin:MAI-Voice-2.1&quot;, &quot;tr-TR-Elif:MAI-Voice-2.1&quot;, &quot;tr-TR-Grant:MAI-Voice-2.1&quot;, &quot;tr-TR-Harper:MAI-Voice-2.1&quot;, &quot;vi-VN-Grant:MAI-Voice-2.1&quot;, &quot;vi-VN-Harper:MAI-Voice-2.1&quot;, &quot;zh-CN-Bo:MAI-Voice-2.1&quot;, &quot;zh-CN-Grant:MAI-Voice-2.1&quot;, &quot;zh-CN-Harper:MAI-Voice-2.1&quot;, &quot;zh-CN-Lan:MAI-Voice-2.1&quot;, &quot;zh-CN-Mei:MAI-Voice-2.1&quot;, &quot;zh-CN-Wei:MAI-Voice-2.1&quot;]&#39;)\nif voice not in allowed: raise SystemExit(&quot;Choose an accepted voice ID from this exact model profile&quot;)\np[&quot;voice&quot;]=voice\np[&quot;response_format&quot;]=&quot;mp3&quot;\nPath(&quot;request.json&quot;).write_text(json.dumps(p,ensure_ascii=False))\nPY_REQUEST\ncurl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/audio/speech \\\n  -H &quot;Authorization: Bearer $AILOOT_API_KEY&quot; -H &#39;Content-Type: application/json&#39; \\\n  --data-binary @request.json -D response-headers.txt -o speech.mp3\n</code></pre></div></div></div></section><section class=\"card-section\" data-card-section=\"results\"><h3 tabindex=\"-1\">결과 수신 및 저장</h3><h4>Ailoot Ultra · 음성 합성</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>기타 콘텐츠 조회</summary><div class=\"code-group\"><div class=\"cg-bar\"><div class=\"cg-tabs\" role=\"tablist\" aria-label=\"코드 예제 형식\"><button class=\"cg-tab\" id=\"model-code-1854-tab-0\" role=\"tab\" type=\"button\" aria-controls=\"model-code-1854-panel-0\" aria-selected=\"true\" tabindex=\"0\">미디어 라이브러리</button><button class=\"cg-tab\" id=\"model-code-1854-tab-1\" role=\"tab\" type=\"button\" aria-controls=\"model-code-1854-panel-1\" aria-selected=\"false\" tabindex=\"-1\">작업 상태</button><button class=\"cg-tab\" id=\"model-code-1854-tab-2\" role=\"tab\" type=\"button\" aria-controls=\"model-code-1854-panel-2\" aria-selected=\"false\" tabindex=\"-1\">자산 세부 정보</button></div><div class=\"cg-tools\"><button class=\"cg-btn cg-copy\" type=\"button\" aria-label=\"코드 복사\"><svg class=\"cp\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.4\"><rect x=\"5.25\" y=\"5.25\" width=\"8.5\" height=\"8.5\" rx=\"1.75\"/><path d=\"M10.75 5.25V3.5a1.25 1.25 0 0 0-1.25-1.25H3.5A1.25 1.25 0 0 0 2.25 3.5v6a1.25 1.25 0 0 0 1.25 1.25h1.75\"/></svg><svg class=\"ok\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.4\"><path d=\"m3 8.5 3.25 3.25L13 5\"/></svg></button></div></div><div class=\"cg-body\"><div class=\"cg-pane\" id=\"model-code-1854-panel-0\" role=\"tabpanel\" aria-labelledby=\"model-code-1854-tab-0\"><pre data-lang=\"bash\"><code>set -eu\n: &quot;${AILOOT_API_KEY:?Set your Ailoot API key}&quot;\ncurl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/media/assets \\\n  -H &quot;Authorization: Bearer $AILOOT_API_KEY&quot; -o media-assets.json\n</code></pre></div><div class=\"cg-pane\" id=\"model-code-1854-panel-1\" role=\"tabpanel\" aria-labelledby=\"model-code-1854-tab-1\" hidden><pre data-lang=\"bash\"><code>set -eu\n: &quot;${AILOOT_API_KEY:?Set your Ailoot API key}&quot;\n: &quot;${AILOOT_MEDIA_TASK_ID:?Set the actual ID returned by the response or media-library metadata}&quot;\nexport AILOOT_MEDIA_TASK_ID\nresource_id=$(python3 -c &#39;import os,urllib.parse;print(urllib.parse.quote(os.environ[&quot;AILOOT_MEDIA_TASK_ID&quot;],safe=&quot;&quot;))&#39;)\ncurl --fail-with-body --silent --show-error &quot;https://api.ailoot.ai/v1/media/tasks/$resource_id&quot; \\\n  -H &quot;Authorization: Bearer $AILOOT_API_KEY&quot; -o media-task.json\npython3 - &lt;&lt;&#39;PY_RESULT&#39;\nimport json\nfrom pathlib import Path\nprint(json.dumps(json.loads(Path(&quot;media-task.json&quot;).read_text())))\nPY_RESULT\n</code></pre></div><div class=\"cg-pane\" id=\"model-code-1854-panel-2\" role=\"tabpanel\" aria-labelledby=\"model-code-1854-tab-2\" hidden><pre data-lang=\"bash\"><code>set -eu\n: &quot;${AILOOT_API_KEY:?Set your Ailoot API key}&quot;\n: &quot;${AILOOT_ASSET_ID:?Set the actual ID returned by the response or media-library metadata}&quot;\nexport AILOOT_ASSET_ID\nresource_id=$(python3 -c &#39;import os,urllib.parse;print(urllib.parse.quote(os.environ[&quot;AILOOT_ASSET_ID&quot;],safe=&quot;&quot;))&#39;)\ncurl --fail-with-body --silent --show-error &quot;https://api.ailoot.ai/v1/media/assets/$resource_id&quot; \\\n  -H &quot;Authorization: Bearer $AILOOT_API_KEY&quot; -o media-asset.json\npython3 - &lt;&lt;&#39;PY_RESULT&#39;\nimport json\nfrom pathlib import Path\nprint(json.dumps(json.loads(Path(&quot;media-asset.json&quot;).read_text())))\nPY_RESULT\n</code></pre></div></div></div></details><div class=\"card-result-process\" data-all-results><h5>완료된 결과 모두 보관</h5><p class=\"note-s\">반환된 완전한 응답, 파일, 콘텐츠 부분을 모두 보관하세요.</p><p class=\"note-s\">바이너리 결과 전체와 헤더를 보관하세요. JSON 또는 여러 출력이 반환되면 모든 데이터 항목을 보관하고 실제로 반환된 서명된 자산 URL을 각각 조회하세요.</p></div><div class=\"card-result-process\" data-unknown-recovery><h5>원래 응답을 확인해야 할 경우</h5><p class=\"note-s\">다시 제출하지 말고 정산 대조를 위해 최초 operation_id/X-Client-Request-ID를 보관하세요. 전용 오디오 폴링 라우트는 없습니다.</p></div><details class=\"card-about\" data-output-fields><summary>응답 필드</summary><div class=\"tw\" data-card-table=\"output\"><table><thead><tr><th>필드</th><th>유형</th></tr></thead><tbody><tr><th data-cell-label=\"필드\" scope=\"row\"><span class=\"card-cell-label\">필드</span><code class=\"card-field-name\">binary audio</code></th><td data-cell-label=\"유형\" data-field-type><span class=\"card-cell-label\">유형</span>bytes</td></tr><tr><th data-cell-label=\"필드\" scope=\"row\"><span class=\"card-cell-label\">필드</span><code class=\"card-field-name\">response headers</code></th><td data-cell-label=\"유형\" data-field-type><span class=\"card-cell-label\">유형</span>headers</td></tr></tbody></table></div></details><details class=\"card-about\" data-method-errors><summary>오류와 다음 단계</summary><div class=\"tw\" data-card-table=\"errors\"><table><thead><tr><th>응답</th><th>조건</th><th>다음 단계</th></tr></thead><tbody><tr><th data-cell-label=\"응답\" scope=\"row\"><span class=\"card-cell-label\">응답</span>400 · <code>invalid_request_error</code></th><td data-cell-label=\"조건\"><span class=\"card-cell-label\">조건</span>필수 필드, 자료 표현 방식 또는 파라미터 값이 올바르지 않음</td><td data-cell-label=\"다음 단계\"><span class=\"card-cell-label\">다음 단계</span>새 생성 요청 전에 표시된 필드를 수정하세요.</td></tr><tr><th data-cell-label=\"응답\" scope=\"row\"><span class=\"card-cell-label\">응답</span><code>server_error</code></th><td data-cell-label=\"조건\"><span class=\"card-cell-label\">조건</span>반환된 응답에 작업 또는 결과 확인이 필요하다고 표시되어 있습니다</td><td data-cell-label=\"다음 단계\"><span class=\"card-cell-label\">다음 단계</span>최초로 반환된 작업/태스크 ID, 요청 헤더와 응답을 보관하고, 지원되는 조회 방식으로 해당 최초 작업을 계속 조회하세요. 생성 요청을 다시 제출하지 마세요.</td></tr></tbody></table></div></details></section><section class=\"card-section\" data-card-section=\"aliases\"><h3 tabindex=\"-1\">별칭</h3><h4>모델 별칭</h4><p class=\"note-s\"><span data-model-alias-route=\"Ultra\"><b>Ailoot Ultra</b> <a href=\"#m=microsoft%2Fmai-voice-2.1&amp;route=Ultra&amp;caller=microsoft%2Fmai-voice-2.1&amp;fmt=speech\"><code>microsoft/mai-voice-2.1</code></a></span></p><h4>메서드 경로 별칭</h4><p class=\"note-s\">위에 표시된 메서드 경로를 사용하세요.</p><h4>관련 호출용 ID</h4><p class=\"note-s\"><a href=\"#m=microsoft%2Fmai-voice-2.1&amp;route=Ultra&amp;caller=microsoft%2Fmai-voice-2.1&amp;fmt=speech\"><code>microsoft/mai-voice-2.1</code></a></p></section></div>",
      "method_identity": {
        "effective_request_model_id": "microsoft/mai-voice-2.1",
        "fmt": "speech",
        "http": "POST",
        "path": "/v1/audio/speech",
        "request_model_id": "microsoft/mai-voice-2.1",
        "route_label": "Ultra"
      },
      "method_key": "Ultra|speech|/v1/audio/speech|microsoft%2Fmai-voice-2.1",
      "ordinal": 0,
      "rawMethod": {
        "available": null,
        "cache_read": null,
        "cache_write": null,
        "cache_write_1h": null,
        "contract": {
          "data": {
            "all_results": "Keep the complete binary result and headers. If JSON/multiple outputs are returned, retain every data item and fetch each actual signed asset URL.",
            "errors": [
              {
                "code": null,
                "condition": "필수 필드, 자료 표현 방식 또는 파라미터 값이 올바르지 않음",
                "http_status": 400,
                "recovery": "새 생성 요청 전에 표시된 필드를 수정하세요.",
                "type": "invalid_request_error"
              },
              {
                "code": null,
                "condition": "반환된 응답에 작업 또는 결과 확인이 필요하다고 표시되어 있습니다",
                "http_status": null,
                "recovery": "최초로 반환된 작업/태스크 ID, 요청 헤더와 응답을 보관하고, 지원되는 조회 방식으로 해당 최초 작업을 계속 조회하세요. 생성 요청을 다시 제출하지 마세요.",
                "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": "다시 제출하지 말고 정산 대조를 위해 최초 operation_id/X-Client-Request-ID를 보관하세요. 전용 오디오 폴링 라우트는 없습니다."
            },
            "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": "바이너리 결과 전체와 헤더를 보관하세요. JSON 또는 여러 출력이 반환되면 모든 데이터 항목을 보관하고 실제로 반환된 서명된 자산 URL을 각각 조회하세요.",
              "family": "audio",
              "fields": [
                {
                  "description": null,
                  "name": "binary audio",
                  "type": "bytes"
                },
                {
                  "description": null,
                  "name": "response headers",
                  "type": "headers"
                }
              ],
              "format": "mp3",
              "http_success": 200
            },
            "parameters": [
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": [
                  "microsoft/mai-voice-2.1"
                ],
                "enum_known": true,
                "name": "model",
                "required": true,
                "type": "string"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": null,
                "enum_known": false,
                "limit_known": false,
                "maximum_length": null,
                "min_length": 1,
                "name": "input",
                "required": true,
                "type": "string",
                "unit": "Unicode 문자"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": [
                  "cs-CZ-Grant:MAI-Voice-2.1",
                  "cs-CZ-Harper:MAI-Voice-2.1",
                  "da-DK-Grant:MAI-Voice-2.1",
                  "da-DK-Harper:MAI-Voice-2.1",
                  "de-DE-Grant:MAI-Voice-2.1",
                  "de-DE-Harper:MAI-Voice-2.1",
                  "de-DE-Klaus:MAI-Voice-2.1",
                  "de-DE-Mia:MAI-Voice-2.1",
                  "en-AU-Isla:MAI-Voice-2.1",
                  "en-GB-Emily:MAI-Voice-2.1",
                  "en-GB-Harry:MAI-Voice-2.1",
                  "en-IN-Dhruv:MAI-Voice-2.1",
                  "en-IN-Priya:MAI-Voice-2.1",
                  "en-US-Ethan:MAI-Voice-2.1",
                  "en-US-Grant:MAI-Voice-2.1",
                  "en-US-Harper:MAI-Voice-2.1",
                  "en-US-Iris:MAI-Voice-2.1",
                  "en-US-Jasper:MAI-Voice-2.1",
                  "en-US-Olivia:MAI-Voice-2.1",
                  "en-US-Sage:MAI-Voice-2.1",
                  "es-ES-Marta:MAI-Voice-2.1",
                  "es-MX-Alejo:MAI-Voice-2.1",
                  "es-MX-Grant:MAI-Voice-2.1",
                  "es-MX-Harper:MAI-Voice-2.1",
                  "es-MX-Valeria:MAI-Voice-2.1",
                  "fi-FI-Grant:MAI-Voice-2.1",
                  "fi-FI-Harper:MAI-Voice-2.1",
                  "fr-FR-Grant:MAI-Voice-2.1",
                  "fr-FR-Harper:MAI-Voice-2.1",
                  "fr-FR-Marc:MAI-Voice-2.1",
                  "fr-FR-Soleil:MAI-Voice-2.1",
                  "hi-IN-Arjun:MAI-Voice-2.1",
                  "hi-IN-Dhruv:MAI-Voice-2.1",
                  "hi-IN-Grant:MAI-Voice-2.1",
                  "hi-IN-Harper:MAI-Voice-2.1",
                  "hi-IN-Kavya:MAI-Voice-2.1",
                  "hi-IN-Priya:MAI-Voice-2.1",
                  "hu-HU-Bence:MAI-Voice-2.1",
                  "hu-HU-Grant:MAI-Voice-2.1",
                  "hu-HU-Harper:MAI-Voice-2.1",
                  "hu-HU-Levente:MAI-Voice-2.1",
                  "hu-HU-Lilla:MAI-Voice-2.1",
                  "hu-HU-Reka:MAI-Voice-2.1",
                  "id-ID-Grant:MAI-Voice-2.1",
                  "id-ID-Harper:MAI-Voice-2.1",
                  "it-IT-Grant:MAI-Voice-2.1",
                  "it-IT-Harper:MAI-Voice-2.1",
                  "it-IT-Luca:MAI-Voice-2.1",
                  "it-IT-Rosa:MAI-Voice-2.1",
                  "ko-KR-Grant:MAI-Voice-2.1",
                  "ko-KR-Haena:MAI-Voice-2.1",
                  "ko-KR-Harper:MAI-Voice-2.1",
                  "ko-KR-Junho:MAI-Voice-2.1",
                  "nb-NO-Grant:MAI-Voice-2.1",
                  "nb-NO-Harper:MAI-Voice-2.1",
                  "nl-NL-Grant:MAI-Voice-2.1",
                  "nl-NL-Harper:MAI-Voice-2.1",
                  "nl-NL-Sander:MAI-Voice-2.1",
                  "pl-PL-Grant:MAI-Voice-2.1",
                  "pl-PL-Harper:MAI-Voice-2.1",
                  "pt-BR-Caio:MAI-Voice-2.1",
                  "pt-BR-Grant:MAI-Voice-2.1",
                  "pt-BR-Harper:MAI-Voice-2.1",
                  "pt-BR-Luana:MAI-Voice-2.1",
                  "pt-BR-Pedro:MAI-Voice-2.1",
                  "pt-BR-Rafael:MAI-Voice-2.1",
                  "pt-PT-Grant:MAI-Voice-2.1",
                  "pt-PT-Harper:MAI-Voice-2.1",
                  "pt-PT-Rui:MAI-Voice-2.1",
                  "ro-RO-Andrei:MAI-Voice-2.1",
                  "ro-RO-Elena:MAI-Voice-2.1",
                  "ro-RO-Grant:MAI-Voice-2.1",
                  "ro-RO-Harper:MAI-Voice-2.1",
                  "ro-RO-Ioana:MAI-Voice-2.1",
                  "ro-RO-Radu:MAI-Voice-2.1",
                  "ru-RU-Grant:MAI-Voice-2.1",
                  "ru-RU-Harper:MAI-Voice-2.1",
                  "ru-RU-Lev:MAI-Voice-2.1",
                  "ru-RU-Masha:MAI-Voice-2.1",
                  "sv-SE-Grant:MAI-Voice-2.1",
                  "sv-SE-Harper:MAI-Voice-2.1",
                  "th-TH-Grant:MAI-Voice-2.1",
                  "th-TH-Harper:MAI-Voice-2.1",
                  "th-TH-Krit:MAI-Voice-2.1",
                  "th-TH-Nattapong:MAI-Voice-2.1",
                  "tr-TR-Aydin:MAI-Voice-2.1",
                  "tr-TR-Elif:MAI-Voice-2.1",
                  "tr-TR-Grant:MAI-Voice-2.1",
                  "tr-TR-Harper:MAI-Voice-2.1",
                  "vi-VN-Grant:MAI-Voice-2.1",
                  "vi-VN-Harper:MAI-Voice-2.1",
                  "zh-CN-Bo:MAI-Voice-2.1",
                  "zh-CN-Grant:MAI-Voice-2.1",
                  "zh-CN-Harper:MAI-Voice-2.1",
                  "zh-CN-Lan:MAI-Voice-2.1",
                  "zh-CN-Mei:MAI-Voice-2.1",
                  "zh-CN-Wei:MAI-Voice-2.1"
                ],
                "enum_known": true,
                "name": "voice",
                "required": true,
                "type": "string"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": [
                  "mp3"
                ],
                "enum_known": true,
                "name": "response_format",
                "required": true,
                "type": "string"
              }
            ],
            "profile_binding": "Exact existing Ailoot model and method; interface constraints below do not assert provider qualification.",
            "unsupported": [
              "every field outside exactmodel,input,voice,response_format",
              "stream/speed/reference speech options"
            ]
          },
          "hints": [
            "이 모델 프로필에 있는 정확한 음성을 선택하세요.",
            "입력 문자 수와 오디오 초는 서로 다른 측정 단위입니다."
          ],
          "input": {
            "content_type": "application/json",
            "input": "정확한 UTF-8 텍스트; 정규화 없이 계산한 유니코드 문자 수",
            "material_types": [
              "text"
            ],
            "max_input_characters": null,
            "other_options": false,
            "required": [
              "model",
              "input",
              "voice",
              "response_format"
            ],
            "response_format": [
              "mp3"
            ],
            "voice_ids": [
              "cs-CZ-Grant:MAI-Voice-2.1",
              "cs-CZ-Harper:MAI-Voice-2.1",
              "da-DK-Grant:MAI-Voice-2.1",
              "da-DK-Harper:MAI-Voice-2.1",
              "de-DE-Grant:MAI-Voice-2.1",
              "de-DE-Harper:MAI-Voice-2.1",
              "de-DE-Klaus:MAI-Voice-2.1",
              "de-DE-Mia:MAI-Voice-2.1",
              "en-AU-Isla:MAI-Voice-2.1",
              "en-GB-Emily:MAI-Voice-2.1",
              "en-GB-Harry:MAI-Voice-2.1",
              "en-IN-Dhruv:MAI-Voice-2.1",
              "en-IN-Priya:MAI-Voice-2.1",
              "en-US-Ethan:MAI-Voice-2.1",
              "en-US-Grant:MAI-Voice-2.1",
              "en-US-Harper:MAI-Voice-2.1",
              "en-US-Iris:MAI-Voice-2.1",
              "en-US-Jasper:MAI-Voice-2.1",
              "en-US-Olivia:MAI-Voice-2.1",
              "en-US-Sage:MAI-Voice-2.1",
              "es-ES-Marta:MAI-Voice-2.1",
              "es-MX-Alejo:MAI-Voice-2.1",
              "es-MX-Grant:MAI-Voice-2.1",
              "es-MX-Harper:MAI-Voice-2.1",
              "es-MX-Valeria:MAI-Voice-2.1",
              "fi-FI-Grant:MAI-Voice-2.1",
              "fi-FI-Harper:MAI-Voice-2.1",
              "fr-FR-Grant:MAI-Voice-2.1",
              "fr-FR-Harper:MAI-Voice-2.1",
              "fr-FR-Marc:MAI-Voice-2.1",
              "fr-FR-Soleil:MAI-Voice-2.1",
              "hi-IN-Arjun:MAI-Voice-2.1",
              "hi-IN-Dhruv:MAI-Voice-2.1",
              "hi-IN-Grant:MAI-Voice-2.1",
              "hi-IN-Harper:MAI-Voice-2.1",
              "hi-IN-Kavya:MAI-Voice-2.1",
              "hi-IN-Priya:MAI-Voice-2.1",
              "hu-HU-Bence:MAI-Voice-2.1",
              "hu-HU-Grant:MAI-Voice-2.1",
              "hu-HU-Harper:MAI-Voice-2.1",
              "hu-HU-Levente:MAI-Voice-2.1",
              "hu-HU-Lilla:MAI-Voice-2.1",
              "hu-HU-Reka:MAI-Voice-2.1",
              "id-ID-Grant:MAI-Voice-2.1",
              "id-ID-Harper:MAI-Voice-2.1",
              "it-IT-Grant:MAI-Voice-2.1",
              "it-IT-Harper:MAI-Voice-2.1",
              "it-IT-Luca:MAI-Voice-2.1",
              "it-IT-Rosa:MAI-Voice-2.1",
              "ko-KR-Grant:MAI-Voice-2.1",
              "ko-KR-Haena:MAI-Voice-2.1",
              "ko-KR-Harper:MAI-Voice-2.1",
              "ko-KR-Junho:MAI-Voice-2.1",
              "nb-NO-Grant:MAI-Voice-2.1",
              "nb-NO-Harper:MAI-Voice-2.1",
              "nl-NL-Grant:MAI-Voice-2.1",
              "nl-NL-Harper:MAI-Voice-2.1",
              "nl-NL-Sander:MAI-Voice-2.1",
              "pl-PL-Grant:MAI-Voice-2.1",
              "pl-PL-Harper:MAI-Voice-2.1",
              "pt-BR-Caio:MAI-Voice-2.1",
              "pt-BR-Grant:MAI-Voice-2.1",
              "pt-BR-Harper:MAI-Voice-2.1",
              "pt-BR-Luana:MAI-Voice-2.1",
              "pt-BR-Pedro:MAI-Voice-2.1",
              "pt-BR-Rafael:MAI-Voice-2.1",
              "pt-PT-Grant:MAI-Voice-2.1",
              "pt-PT-Harper:MAI-Voice-2.1",
              "pt-PT-Rui:MAI-Voice-2.1",
              "ro-RO-Andrei:MAI-Voice-2.1",
              "ro-RO-Elena:MAI-Voice-2.1",
              "ro-RO-Grant:MAI-Voice-2.1",
              "ro-RO-Harper:MAI-Voice-2.1",
              "ro-RO-Ioana:MAI-Voice-2.1",
              "ro-RO-Radu:MAI-Voice-2.1",
              "ru-RU-Grant:MAI-Voice-2.1",
              "ru-RU-Harper:MAI-Voice-2.1",
              "ru-RU-Lev:MAI-Voice-2.1",
              "ru-RU-Masha:MAI-Voice-2.1",
              "sv-SE-Grant:MAI-Voice-2.1",
              "sv-SE-Harper:MAI-Voice-2.1",
              "th-TH-Grant:MAI-Voice-2.1",
              "th-TH-Harper:MAI-Voice-2.1",
              "th-TH-Krit:MAI-Voice-2.1",
              "th-TH-Nattapong:MAI-Voice-2.1",
              "tr-TR-Aydin:MAI-Voice-2.1",
              "tr-TR-Elif:MAI-Voice-2.1",
              "tr-TR-Grant:MAI-Voice-2.1",
              "tr-TR-Harper:MAI-Voice-2.1",
              "vi-VN-Grant:MAI-Voice-2.1",
              "vi-VN-Harper:MAI-Voice-2.1",
              "zh-CN-Bo:MAI-Voice-2.1",
              "zh-CN-Grant:MAI-Voice-2.1",
              "zh-CN-Harper:MAI-Voice-2.1",
              "zh-CN-Lan:MAI-Voice-2.1",
              "zh-CN-Mei:MAI-Voice-2.1",
              "zh-CN-Wei:MAI-Voice-2.1"
            ]
          },
          "lifecycle": {
            "assets": [
              {
                "http": "GET",
                "path": "/v1/media/assets"
              },
              {
                "http": "GET",
                "path": "/v1/media/assets/{asset_id}"
              }
            ],
            "content": [
              {
                "http": "GET",
                "path": "/v1/media/assets/{asset_id}/content",
                "url_source": "exact returned signed URL; never construct token"
              }
            ],
            "mode": "synchronous_result_then_owned_library",
            "operation_id_is_not_task_id": true,
            "status": [
              {
                "http": "GET",
                "id_source": "실제로 반환된 task_id 또는 미디어 라이브러리 기록",
                "path": "/v1/media/tasks/{task_id}"
              }
            ],
            "unknown": "Retain original operation_id/X-Client-Request-ID for reconciliation without resubmission; no dedicated audio poll route."
          },
          "manufacturer_capability": null,
          "method": {
            "http": "POST",
            "path": "/v1/audio/speech"
          },
          "method_aliases": [],
          "operation_modes": [
            "text_to_speech"
          ],
          "output": {
            "family": "audio",
            "format": "mp3",
            "http_success": 200,
            "response": "full binary MP3 plus response headers",
            "result": "complete playable owned MP3"
          }
        },
        "ctx": null,
        "declared_pricing_profiles": [
          {
            "dimensions": {
              "regime": "base"
            },
            "label": "Base token rates",
            "units": [
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": true,
                "estimate_only": false,
                "key": "input_price",
                "label": "Input tokens",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "input_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": false,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "input_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": true,
                "estimate_only": false,
                "key": "output_price",
                "label": "Output tokens",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "output_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": false,
                "rate_role": "typed_native_retail_rate",
                "side": "out",
                "unit": "output_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": true,
                "estimate_only": false,
                "key": "cache_read_price",
                "label": "Cache read",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "cached_input_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": false,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "cached_input_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": true,
                "estimate_only": false,
                "key": "cache_write_price",
                "label": "Cache write",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "generic_cache_creation_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": false,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "generic_cache_creation_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": true,
                "estimate_only": false,
                "key": "cache_write_1h_price",
                "label": "Cache write, 1 hour",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "one_hour_cache_creation_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": false,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "one_hour_cache_creation_token"
              }
            ]
          },
          {
            "dimensions": {
              "quantity_meter": "utf8.RuneCountInString(validUTF8): one Han codepoint=1; no Han weighting",
              "quoted_unit": "per 1000 input character"
            },
            "label": "Ultra",
            "units": [
              {
                "amount": "0.044000",
                "amount_unit": "usd_per_1000_characters",
                "billing_input": true,
                "estimate_only": false,
                "key": "audio_input_character",
                "label": "input character",
                "native_amount_usd_per_unit": "0.000044",
                "native_quantity": 1,
                "public_unit_label": "per 1000 input character",
                "quantity": "1000",
                "quantity_is_estimate": false,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "input_character"
              }
            ]
          }
        ],
        "declared_tariff_references": [
          {
            "client_selectable": false,
            "key": "53ceea2ccaa50cadb12f",
            "label": "Microsoft AI: MAI-Voice-2.1",
            "profiles": [
              {
                "basis": "",
                "dimensions": {
                  "conditions": "기본 설정"
                },
                "label": "Microsoft AI: MAI-Voice-2.1 · 기본 설정",
                "units": [
                  {
                    "amount": "0.000044",
                    "amount_unit": "usd_per_exact_physical_unit",
                    "billing_input": false,
                    "key": "8d1e4e9bf0f3647249d90a3c",
                    "label": "Input characters",
                    "public_unit_label": "per input character",
                    "quantity": "1",
                    "rate_role": "declared_tariff_rate",
                    "side": "in",
                    "unit": "input_character"
                  }
                ]
              }
            ]
          }
        ],
        "examples": [
          {
            "code": "set -eu\n: \"${AILOOT_API_KEY:?Set your Ailoot API key}\"\n: \"${AILOOT_VOICE_ID:?Choose an accepted voice ID from this exact model profile}\"\nexport AILOOT_VOICE_ID\npython3 - <<'PY_REQUEST'\nimport json,os\nfrom pathlib import Path\np=json.loads('{\"model\": \"microsoft/mai-voice-2.1\", \"input\": \"Good afternoon! This is a short voice take.\"}')\nvoice=os.environ[\"AILOOT_VOICE_ID\"]\nallowed=json.loads('[\"cs-CZ-Grant:MAI-Voice-2.1\", \"cs-CZ-Harper:MAI-Voice-2.1\", \"da-DK-Grant:MAI-Voice-2.1\", \"da-DK-Harper:MAI-Voice-2.1\", \"de-DE-Grant:MAI-Voice-2.1\", \"de-DE-Harper:MAI-Voice-2.1\", \"de-DE-Klaus:MAI-Voice-2.1\", \"de-DE-Mia:MAI-Voice-2.1\", \"en-AU-Isla:MAI-Voice-2.1\", \"en-GB-Emily:MAI-Voice-2.1\", \"en-GB-Harry:MAI-Voice-2.1\", \"en-IN-Dhruv:MAI-Voice-2.1\", \"en-IN-Priya:MAI-Voice-2.1\", \"en-US-Ethan:MAI-Voice-2.1\", \"en-US-Grant:MAI-Voice-2.1\", \"en-US-Harper:MAI-Voice-2.1\", \"en-US-Iris:MAI-Voice-2.1\", \"en-US-Jasper:MAI-Voice-2.1\", \"en-US-Olivia:MAI-Voice-2.1\", \"en-US-Sage:MAI-Voice-2.1\", \"es-ES-Marta:MAI-Voice-2.1\", \"es-MX-Alejo:MAI-Voice-2.1\", \"es-MX-Grant:MAI-Voice-2.1\", \"es-MX-Harper:MAI-Voice-2.1\", \"es-MX-Valeria:MAI-Voice-2.1\", \"fi-FI-Grant:MAI-Voice-2.1\", \"fi-FI-Harper:MAI-Voice-2.1\", \"fr-FR-Grant:MAI-Voice-2.1\", \"fr-FR-Harper:MAI-Voice-2.1\", \"fr-FR-Marc:MAI-Voice-2.1\", \"fr-FR-Soleil:MAI-Voice-2.1\", \"hi-IN-Arjun:MAI-Voice-2.1\", \"hi-IN-Dhruv:MAI-Voice-2.1\", \"hi-IN-Grant:MAI-Voice-2.1\", \"hi-IN-Harper:MAI-Voice-2.1\", \"hi-IN-Kavya:MAI-Voice-2.1\", \"hi-IN-Priya:MAI-Voice-2.1\", \"hu-HU-Bence:MAI-Voice-2.1\", \"hu-HU-Grant:MAI-Voice-2.1\", \"hu-HU-Harper:MAI-Voice-2.1\", \"hu-HU-Levente:MAI-Voice-2.1\", \"hu-HU-Lilla:MAI-Voice-2.1\", \"hu-HU-Reka:MAI-Voice-2.1\", \"id-ID-Grant:MAI-Voice-2.1\", \"id-ID-Harper:MAI-Voice-2.1\", \"it-IT-Grant:MAI-Voice-2.1\", \"it-IT-Harper:MAI-Voice-2.1\", \"it-IT-Luca:MAI-Voice-2.1\", \"it-IT-Rosa:MAI-Voice-2.1\", \"ko-KR-Grant:MAI-Voice-2.1\", \"ko-KR-Haena:MAI-Voice-2.1\", \"ko-KR-Harper:MAI-Voice-2.1\", \"ko-KR-Junho:MAI-Voice-2.1\", \"nb-NO-Grant:MAI-Voice-2.1\", \"nb-NO-Harper:MAI-Voice-2.1\", \"nl-NL-Grant:MAI-Voice-2.1\", \"nl-NL-Harper:MAI-Voice-2.1\", \"nl-NL-Sander:MAI-Voice-2.1\", \"pl-PL-Grant:MAI-Voice-2.1\", \"pl-PL-Harper:MAI-Voice-2.1\", \"pt-BR-Caio:MAI-Voice-2.1\", \"pt-BR-Grant:MAI-Voice-2.1\", \"pt-BR-Harper:MAI-Voice-2.1\", \"pt-BR-Luana:MAI-Voice-2.1\", \"pt-BR-Pedro:MAI-Voice-2.1\", \"pt-BR-Rafael:MAI-Voice-2.1\", \"pt-PT-Grant:MAI-Voice-2.1\", \"pt-PT-Harper:MAI-Voice-2.1\", \"pt-PT-Rui:MAI-Voice-2.1\", \"ro-RO-Andrei:MAI-Voice-2.1\", \"ro-RO-Elena:MAI-Voice-2.1\", \"ro-RO-Grant:MAI-Voice-2.1\", \"ro-RO-Harper:MAI-Voice-2.1\", \"ro-RO-Ioana:MAI-Voice-2.1\", \"ro-RO-Radu:MAI-Voice-2.1\", \"ru-RU-Grant:MAI-Voice-2.1\", \"ru-RU-Harper:MAI-Voice-2.1\", \"ru-RU-Lev:MAI-Voice-2.1\", \"ru-RU-Masha:MAI-Voice-2.1\", \"sv-SE-Grant:MAI-Voice-2.1\", \"sv-SE-Harper:MAI-Voice-2.1\", \"th-TH-Grant:MAI-Voice-2.1\", \"th-TH-Harper:MAI-Voice-2.1\", \"th-TH-Krit:MAI-Voice-2.1\", \"th-TH-Nattapong:MAI-Voice-2.1\", \"tr-TR-Aydin:MAI-Voice-2.1\", \"tr-TR-Elif:MAI-Voice-2.1\", \"tr-TR-Grant:MAI-Voice-2.1\", \"tr-TR-Harper:MAI-Voice-2.1\", \"vi-VN-Grant:MAI-Voice-2.1\", \"vi-VN-Harper:MAI-Voice-2.1\", \"zh-CN-Bo:MAI-Voice-2.1\", \"zh-CN-Grant:MAI-Voice-2.1\", \"zh-CN-Harper:MAI-Voice-2.1\", \"zh-CN-Lan:MAI-Voice-2.1\", \"zh-CN-Mei:MAI-Voice-2.1\", \"zh-CN-Wei:MAI-Voice-2.1\"]')\nif voice not in allowed: raise SystemExit(\"Choose an accepted voice ID from this exact model profile\")\np[\"voice\"]=voice\np[\"response_format\"]=\"mp3\"\nPath(\"request.json\").write_text(json.dumps(p,ensure_ascii=False))\nPY_REQUEST\ncurl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/audio/speech \\\n  -H \"Authorization: Bearer $AILOOT_API_KEY\" -H 'Content-Type: application/json' \\\n  --data-binary @request.json -D response-headers.txt -o speech.mp3\n",
            "label": "curl",
            "language": "bash"
          },
          {
            "code": "set -eu\n: \"${AILOOT_API_KEY:?Set your Ailoot API key}\"\ncurl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/media/assets \\\n  -H \"Authorization: Bearer $AILOOT_API_KEY\" -o media-assets.json\n",
            "label": "List actual media assets",
            "language": "bash"
          },
          {
            "code": "set -eu\n: \"${AILOOT_API_KEY:?Set your Ailoot API key}\"\n: \"${AILOOT_MEDIA_TASK_ID:?Set the actual ID returned by the response or media-library metadata}\"\nexport AILOOT_MEDIA_TASK_ID\nresource_id=$(python3 -c 'import os,urllib.parse;print(urllib.parse.quote(os.environ[\"AILOOT_MEDIA_TASK_ID\"],safe=\"\"))')\ncurl --fail-with-body --silent --show-error \"https://api.ailoot.ai/v1/media/tasks/$resource_id\" \\\n  -H \"Authorization: Bearer $AILOOT_API_KEY\" -o media-task.json\npython3 - <<'PY_RESULT'\nimport json\nfrom pathlib import Path\nprint(json.dumps(json.loads(Path(\"media-task.json\").read_text())))\nPY_RESULT\n",
            "label": "Read actual media task",
            "language": "bash"
          },
          {
            "code": "set -eu\n: \"${AILOOT_API_KEY:?Set your Ailoot API key}\"\n: \"${AILOOT_ASSET_ID:?Set the actual ID returned by the response or media-library metadata}\"\nexport AILOOT_ASSET_ID\nresource_id=$(python3 -c 'import os,urllib.parse;print(urllib.parse.quote(os.environ[\"AILOOT_ASSET_ID\"],safe=\"\"))')\ncurl --fail-with-body --silent --show-error \"https://api.ailoot.ai/v1/media/assets/$resource_id\" \\\n  -H \"Authorization: Bearer $AILOOT_API_KEY\" -o media-asset.json\npython3 - <<'PY_RESULT'\nimport json\nfrom pathlib import Path\nprint(json.dumps(json.loads(Path(\"media-asset.json\").read_text())))\nPY_RESULT\n",
            "label": "Read actual asset metadata",
            "language": "bash"
          }
        ],
        "family": "openai",
        "fast_multiplier": null,
        "flex_multiplier": null,
        "fmt": "speech",
        "hints": [
          "Select exact voice from this model profile.",
          "Input characters and audio seconds are different meters."
        ],
        "http": "POST",
        "in": null,
        "input": [
          "text"
        ],
        "label": "Озвучка текста",
        "max_out": null,
        "max_reasoning_effort_multiplier": null,
        "method_aliases": [],
        "out": null,
        "output": [
          "audio"
        ],
        "path": "/v1/audio/speech",
        "price_conditions": [
          {
            "label": "Fast mode",
            "value": "Not specified",
            "when": "When fast mode is selected"
          },
          {
            "label": "Flex mode",
            "value": "Not specified",
            "when": "When flex mode is selected"
          },
          {
            "label": "Maximum reasoning effort",
            "value": "Not specified",
            "when": "When maximum reasoning effort uses the default adjustment"
          }
        ],
        "pricing": {
          "billing_mode": "per_request",
          "image_input_price": null,
          "image_output_price": null,
          "per_request_price": null,
          "unit_prices": {
            "audio_input_character": 4.4e-05
          }
        },
        "pricing_profiles": [
          {
            "dimensions": {
              "regime": "base"
            },
            "label": "Base token rates",
            "units": [
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": true,
                "estimate_only": false,
                "key": "input_price",
                "label": "Input tokens",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "input_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": false,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "input_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": true,
                "estimate_only": false,
                "key": "output_price",
                "label": "Output tokens",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "output_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": false,
                "rate_role": "typed_native_retail_rate",
                "side": "out",
                "unit": "output_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": true,
                "estimate_only": false,
                "key": "cache_read_price",
                "label": "Cache read",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "cached_input_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": false,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "cached_input_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": true,
                "estimate_only": false,
                "key": "cache_write_price",
                "label": "Cache write",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "generic_cache_creation_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": false,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "generic_cache_creation_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": true,
                "estimate_only": false,
                "key": "cache_write_1h_price",
                "label": "Cache write, 1 hour",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "one_hour_cache_creation_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": false,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "one_hour_cache_creation_token"
              }
            ]
          },
          {
            "dimensions": {
              "quantity_meter": "utf8.RuneCountInString(validUTF8): one Han codepoint=1; no Han weighting",
              "quoted_unit": "per 1000 input character"
            },
            "label": "Ultra",
            "units": [
              {
                "amount": "0.044000",
                "amount_unit": "usd_per_1000_characters",
                "billing_input": true,
                "estimate_only": false,
                "key": "audio_input_character",
                "label": "input character",
                "native_amount_usd_per_unit": "0.000044",
                "native_quantity": 1,
                "public_unit_label": "per 1000 input character",
                "quantity": "1000",
                "quantity_is_estimate": false,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "input_character"
              }
            ]
          }
        ],
        "request_model_id": "microsoft/mai-voice-2.1",
        "route_label": "Ultra",
        "status_reads": [
          "GET /v1/media/tasks/{task_id}",
          "GET /v1/media/assets/{asset_id}/content"
        ],
        "tiers": [],
        "units": [
          {
            "amount": null,
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": true,
            "estimate_only": false,
            "key": "input_price",
            "label": "Input tokens",
            "native_amount_usd_per_unit": null,
            "native_quantity": 1,
            "native_unit": "input_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": false,
            "rate_role": "typed_native_retail_rate",
            "side": "in",
            "unit": "input_token"
          },
          {
            "amount": null,
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": true,
            "estimate_only": false,
            "key": "output_price",
            "label": "Output tokens",
            "native_amount_usd_per_unit": null,
            "native_quantity": 1,
            "native_unit": "output_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": false,
            "rate_role": "typed_native_retail_rate",
            "side": "out",
            "unit": "output_token"
          },
          {
            "amount": null,
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": true,
            "estimate_only": false,
            "key": "cache_read_price",
            "label": "Cache read",
            "native_amount_usd_per_unit": null,
            "native_quantity": 1,
            "native_unit": "cached_input_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": false,
            "rate_role": "typed_native_retail_rate",
            "side": "in",
            "unit": "cached_input_token"
          },
          {
            "amount": null,
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": true,
            "estimate_only": false,
            "key": "cache_write_price",
            "label": "Cache write",
            "native_amount_usd_per_unit": null,
            "native_quantity": 1,
            "native_unit": "generic_cache_creation_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": false,
            "rate_role": "typed_native_retail_rate",
            "side": "in",
            "unit": "generic_cache_creation_token"
          },
          {
            "amount": null,
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": true,
            "estimate_only": false,
            "key": "cache_write_1h_price",
            "label": "Cache write, 1 hour",
            "native_amount_usd_per_unit": null,
            "native_quantity": 1,
            "native_unit": "one_hour_cache_creation_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": false,
            "rate_role": "typed_native_retail_rate",
            "side": "in",
            "unit": "one_hour_cache_creation_token"
          },
          {
            "amount": "0.044000",
            "amount_unit": "usd_per_1000_characters",
            "billing_input": true,
            "estimate_only": false,
            "key": "audio_input_character",
            "label": "input character",
            "native_amount_usd_per_unit": "0.000044",
            "native_quantity": 1,
            "public_unit_label": "per 1000 input character",
            "quantity": "1000",
            "quantity_is_estimate": false,
            "rate_role": "typed_native_retail_rate",
            "side": "in",
            "unit": "input_character"
          }
        ]
      }
    }
  ],
  "model_id": "microsoft/mai-voice-2.1",
  "nativeProvenance": {
    "input_facts_canonical_sha256": "cd1f47161f2e22fc8b66e0a352eb6f8d731cc29b22788f3b46e6aa39b83b3185",
    "input_html_sha256": "03312218e31a8cd95752e1022e8f4a50011c6b6c7f93a8a9a94a94d82632f9cc",
    "private_audit_sha256": "e7c8ff28749560e5906aff01d9d0c332f2079b00e77b7295cd5eb4598c7f1d57",
    "role": "historical-normalized-input-audit-hashes",
    "schema": "ailoot-native-model-provenance-v2"
  },
  "page": {
    "canonical": "https://ailoot.ai/models/ko/microsoft-mai-voice-2-1/",
    "description": "Microsoft AI의 MAI-Voice-2.1은 내레이션, 오디오북, 교육 콘텐츠, 보이스오버를 위한 표현력 있는 다국어 음성을 생성합니다. 23개 언어를 제공하며 일관된 화자의 목소리, 여러 화자, 표현 제어를 지원합니다.",
    "locale": "ko",
    "md_url": "https://ailoot.ai/models/ko/microsoft-mai-voice-2-1/index.md",
    "title": "Microsoft AI: MAI-Voice-2.1 — Ailoot",
    "url": "https://ailoot.ai/models/ko/microsoft-mai-voice-2-1/"
  },
  "rawModel": {
    "about": "MAI-Voice-2.1은 표현력과 오디오 충실도가 중요한 작업을 위한 Microsoft AI의 프롬프트 기반 텍스트 음성 변환 모델입니다. 모델 카드는 23개 언어와 26개 로캘을 다루며 자연스러운 억양, 리듬, 감정의 미묘한 차이를 설명합니다. 제조사는 오디오북, 미디어 내레이션, 콘텐츠 제작, 보이스오버를 핵심 용도로 제시합니다. 이 버전은 길고 표현력 있는 콘텐츠에 중점을 둡니다. 지연에 민감한 상호작용에는 별도로 설계된 MAI-Voice-2.1-Flash가 있습니다.\n\n### 일관된 화자의 내레이션\n\n모델 카드는 지원 언어 전반에서 하나의 목소리 정체성을 일관되게 구현한다고 설명합니다. 긴 콘텐츠 생성은 청크 분할과 맥락 전달을 사용해 문단 사이의 연속성을 높입니다. 내레이터의 특성을 유지해야 하는 수업, 오디오북의 한 장, 관련 보이스오버 구간의 연속 작업에 유용합니다. 경계가 분명하고 내용이 이어지는 문단을 준비하고 작품 전반에서 같은 화자를 유지하세요.\n\n입력은 최종 발화문이며, 선택적으로 화자 참조 음성과 SSML 표현 제어를 추가할 수 있습니다. 내레이션 제작 요구사항에서는 청취자가 들을 내용과 제작 메모를 구분해야 합니다. 기술 설명이라면 명확한 도입, 실제 단계, 마무리 안내를 작성하세요. 제품 이름과 반복되는 용어는 같은 표기를 유지하세요. 현지화 내레이션에는 목표 언어 대본을 준비합니다. 선택한 언어와 목소리가 그 대본의 발화 표현을 결정합니다.\n\n### 화자, 역할, 표현 제어\n\nMicrosoft는 선별된 목소리 라이브러리를 제공하며 대화용 다중 화자를 문서화합니다. Harper와 Grant는 여러 로캘에 항목이 있는 화자 정체성의 예입니다. 두 사람이 주고받는 교육 대화에서는 질문과 설명을 서로 다른 목소리에 배정하고 같은 역할이 다시 등장할 때도 배정을 유지할 수 있습니다. 원하는 대화가 합성 입력에 나타나도록 발화 문장에 명확한 라벨을 붙이세요.\n\nSSML로 대화 차례나 문장 수준에서 어조와 표현을 조절할 수 있습니다. 스타일은 화자별로 다릅니다. 관리형 목록에는 적합한 목소리의 작업 중심 내레이터·교육 스타일과 다른 목소리의 기쁨·안도 같은 감정 선택지가 나열됩니다. 미국 Harper 항목은 이 두 감정 스타일을 지원합니다. 다른 목소리의 스타일을 가져오지 말고 화자와 그 화자에 대해 문서화된 표현 스타일을 함께 선택하세요.\n\n이야기나 프레젠테이션에서는 표현력으로 사실 설명, 성찰하는 문단, 생동감 있는 인용을 구분할 수 있습니다. 예를 들어 “첫 시도에서는 전체 모습을 제대로 볼 수 없었습니다. 전체 과정을 살펴보니 빠진 단계가 분명해졌습니다.”라는 문장을 사용할 수 있습니다. 의미가 바뀌는 지점을 정하고 그에 맞게 발화 단위를 준비하세요. 모든 문장을 똑같이 강조하기보다 내러티브를 따라 표현이 바뀌도록 전환 부분을 들어 보세요.\n\n### 참조 목소리와 오디오 결과\n\n선택적인 사용자 지정 목소리 모드는 미세 조정 없이 5~60초의 오디오 참조에서 동의받은 화자의 목소리를 재현합니다. 샘플이 생성 목소리에 영향을 주므로 Microsoft는 적당한 에너지의 자연스러운 대화체를 권장합니다. 사용자 지정 목소리 워크플로에는 제조사 승인과 녹음된 동의 진술이 필요합니다. 미리 만들어진 라이브러리는 별도의 목소리 선택 경로입니다.\n\n제조사는 출력 형식을 선택할 수 있게 하며 공개 합성 예제에서는 24 kHz, 160 kbit/s의 모노 MP3로 저장합니다. 이 설정은 하나의 출력 워크플로를 설명합니다. 다음 편집이나 재생 단계에 맞는 오디오 표현 방식을 선택하고 대본, 화자, 구간 순서를 녹음과 연결해 보관하세요. 완성된 장이나 수업은 여러 생성 문단을 포함하면서도 일관된 하나의 청취 경험을 유지할 수 있습니다.\n\n### 긴 결과 활용\n\nMAI-Voice-2.1은 즉각적인 응답 시간보다 음성 연기가 중요한 상황에서 자연스러움과 표현력에 초점을 둡니다. 긴 작품에서는 반복되는 이름, 구간 경계, 대화에 배정된 목소리, 감정적 어조의 변화를 검토하세요. 문서는 긴 콘텐츠 생성 능력과 일관성 유지 장치를 확립하지만 무제한 대본이나 보장된 최대 녹음 시간을 지정하지는 않습니다. 실용적인 결과물은 내레이터, 문구, 전개가 준비한 자료와 일치하는 표현력 있는 오디오입니다.",
    "alias_of": null,
    "aliases": [],
    "author": "Microsoft AI",
    "available": null,
    "canonical_model": "microsoft/mai-voice-2.1",
    "capabilities": {
      "context_length": 0,
      "manufacturer_input": [
        "text"
      ],
      "manufacturer_output": [
        "speech"
      ]
    },
    "card_routes": [
      {
        "label": "Ultra",
        "rates": [
          {
            "amount": "0.044000",
            "amount_unit": "usd_per_1000_characters",
            "billing_input": true,
            "estimate_only": false,
            "key": "audio_input_character",
            "label": "input character",
            "native_amount_usd_per_unit": "0.000044",
            "native_quantity": 1,
            "public_unit_label": "per 1000 input character",
            "quantity": "1000",
            "quantity_is_estimate": false,
            "rate_role": "typed_native_retail_rate",
            "side": "in",
            "unit": "input_character"
          }
        ],
        "summary": "구성의 전체 요금 정보는 상세 정보에서 확인할 수 있습니다."
      }
    ],
    "ctx": null,
    "entity_type": "model",
    "formats": [
      "speech"
    ],
    "id": "microsoft/mai-voice-2.1",
    "input": [
      "text"
    ],
    "kind": "speech",
    "max_out": null,
    "methods": [
      {
        "available": null,
        "cache_read": null,
        "cache_write": null,
        "cache_write_1h": null,
        "contract": {
          "data": {
            "all_results": "Keep the complete binary result and headers. If JSON/multiple outputs are returned, retain every data item and fetch each actual signed asset URL.",
            "errors": [
              {
                "code": null,
                "condition": "필수 필드, 자료 표현 방식 또는 파라미터 값이 올바르지 않음",
                "http_status": 400,
                "recovery": "새 생성 요청 전에 표시된 필드를 수정하세요.",
                "type": "invalid_request_error"
              },
              {
                "code": null,
                "condition": "반환된 응답에 작업 또는 결과 확인이 필요하다고 표시되어 있습니다",
                "http_status": null,
                "recovery": "최초로 반환된 작업/태스크 ID, 요청 헤더와 응답을 보관하고, 지원되는 조회 방식으로 해당 최초 작업을 계속 조회하세요. 생성 요청을 다시 제출하지 마세요.",
                "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": "다시 제출하지 말고 정산 대조를 위해 최초 operation_id/X-Client-Request-ID를 보관하세요. 전용 오디오 폴링 라우트는 없습니다."
            },
            "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": "바이너리 결과 전체와 헤더를 보관하세요. JSON 또는 여러 출력이 반환되면 모든 데이터 항목을 보관하고 실제로 반환된 서명된 자산 URL을 각각 조회하세요.",
              "family": "audio",
              "fields": [
                {
                  "description": null,
                  "name": "binary audio",
                  "type": "bytes"
                },
                {
                  "description": null,
                  "name": "response headers",
                  "type": "headers"
                }
              ],
              "format": "mp3",
              "http_success": 200
            },
            "parameters": [
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": [
                  "microsoft/mai-voice-2.1"
                ],
                "enum_known": true,
                "name": "model",
                "required": true,
                "type": "string"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": null,
                "enum_known": false,
                "limit_known": false,
                "maximum_length": null,
                "min_length": 1,
                "name": "input",
                "required": true,
                "type": "string",
                "unit": "Unicode 문자"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": [
                  "cs-CZ-Grant:MAI-Voice-2.1",
                  "cs-CZ-Harper:MAI-Voice-2.1",
                  "da-DK-Grant:MAI-Voice-2.1",
                  "da-DK-Harper:MAI-Voice-2.1",
                  "de-DE-Grant:MAI-Voice-2.1",
                  "de-DE-Harper:MAI-Voice-2.1",
                  "de-DE-Klaus:MAI-Voice-2.1",
                  "de-DE-Mia:MAI-Voice-2.1",
                  "en-AU-Isla:MAI-Voice-2.1",
                  "en-GB-Emily:MAI-Voice-2.1",
                  "en-GB-Harry:MAI-Voice-2.1",
                  "en-IN-Dhruv:MAI-Voice-2.1",
                  "en-IN-Priya:MAI-Voice-2.1",
                  "en-US-Ethan:MAI-Voice-2.1",
                  "en-US-Grant:MAI-Voice-2.1",
                  "en-US-Harper:MAI-Voice-2.1",
                  "en-US-Iris:MAI-Voice-2.1",
                  "en-US-Jasper:MAI-Voice-2.1",
                  "en-US-Olivia:MAI-Voice-2.1",
                  "en-US-Sage:MAI-Voice-2.1",
                  "es-ES-Marta:MAI-Voice-2.1",
                  "es-MX-Alejo:MAI-Voice-2.1",
                  "es-MX-Grant:MAI-Voice-2.1",
                  "es-MX-Harper:MAI-Voice-2.1",
                  "es-MX-Valeria:MAI-Voice-2.1",
                  "fi-FI-Grant:MAI-Voice-2.1",
                  "fi-FI-Harper:MAI-Voice-2.1",
                  "fr-FR-Grant:MAI-Voice-2.1",
                  "fr-FR-Harper:MAI-Voice-2.1",
                  "fr-FR-Marc:MAI-Voice-2.1",
                  "fr-FR-Soleil:MAI-Voice-2.1",
                  "hi-IN-Arjun:MAI-Voice-2.1",
                  "hi-IN-Dhruv:MAI-Voice-2.1",
                  "hi-IN-Grant:MAI-Voice-2.1",
                  "hi-IN-Harper:MAI-Voice-2.1",
                  "hi-IN-Kavya:MAI-Voice-2.1",
                  "hi-IN-Priya:MAI-Voice-2.1",
                  "hu-HU-Bence:MAI-Voice-2.1",
                  "hu-HU-Grant:MAI-Voice-2.1",
                  "hu-HU-Harper:MAI-Voice-2.1",
                  "hu-HU-Levente:MAI-Voice-2.1",
                  "hu-HU-Lilla:MAI-Voice-2.1",
                  "hu-HU-Reka:MAI-Voice-2.1",
                  "id-ID-Grant:MAI-Voice-2.1",
                  "id-ID-Harper:MAI-Voice-2.1",
                  "it-IT-Grant:MAI-Voice-2.1",
                  "it-IT-Harper:MAI-Voice-2.1",
                  "it-IT-Luca:MAI-Voice-2.1",
                  "it-IT-Rosa:MAI-Voice-2.1",
                  "ko-KR-Grant:MAI-Voice-2.1",
                  "ko-KR-Haena:MAI-Voice-2.1",
                  "ko-KR-Harper:MAI-Voice-2.1",
                  "ko-KR-Junho:MAI-Voice-2.1",
                  "nb-NO-Grant:MAI-Voice-2.1",
                  "nb-NO-Harper:MAI-Voice-2.1",
                  "nl-NL-Grant:MAI-Voice-2.1",
                  "nl-NL-Harper:MAI-Voice-2.1",
                  "nl-NL-Sander:MAI-Voice-2.1",
                  "pl-PL-Grant:MAI-Voice-2.1",
                  "pl-PL-Harper:MAI-Voice-2.1",
                  "pt-BR-Caio:MAI-Voice-2.1",
                  "pt-BR-Grant:MAI-Voice-2.1",
                  "pt-BR-Harper:MAI-Voice-2.1",
                  "pt-BR-Luana:MAI-Voice-2.1",
                  "pt-BR-Pedro:MAI-Voice-2.1",
                  "pt-BR-Rafael:MAI-Voice-2.1",
                  "pt-PT-Grant:MAI-Voice-2.1",
                  "pt-PT-Harper:MAI-Voice-2.1",
                  "pt-PT-Rui:MAI-Voice-2.1",
                  "ro-RO-Andrei:MAI-Voice-2.1",
                  "ro-RO-Elena:MAI-Voice-2.1",
                  "ro-RO-Grant:MAI-Voice-2.1",
                  "ro-RO-Harper:MAI-Voice-2.1",
                  "ro-RO-Ioana:MAI-Voice-2.1",
                  "ro-RO-Radu:MAI-Voice-2.1",
                  "ru-RU-Grant:MAI-Voice-2.1",
                  "ru-RU-Harper:MAI-Voice-2.1",
                  "ru-RU-Lev:MAI-Voice-2.1",
                  "ru-RU-Masha:MAI-Voice-2.1",
                  "sv-SE-Grant:MAI-Voice-2.1",
                  "sv-SE-Harper:MAI-Voice-2.1",
                  "th-TH-Grant:MAI-Voice-2.1",
                  "th-TH-Harper:MAI-Voice-2.1",
                  "th-TH-Krit:MAI-Voice-2.1",
                  "th-TH-Nattapong:MAI-Voice-2.1",
                  "tr-TR-Aydin:MAI-Voice-2.1",
                  "tr-TR-Elif:MAI-Voice-2.1",
                  "tr-TR-Grant:MAI-Voice-2.1",
                  "tr-TR-Harper:MAI-Voice-2.1",
                  "vi-VN-Grant:MAI-Voice-2.1",
                  "vi-VN-Harper:MAI-Voice-2.1",
                  "zh-CN-Bo:MAI-Voice-2.1",
                  "zh-CN-Grant:MAI-Voice-2.1",
                  "zh-CN-Harper:MAI-Voice-2.1",
                  "zh-CN-Lan:MAI-Voice-2.1",
                  "zh-CN-Mei:MAI-Voice-2.1",
                  "zh-CN-Wei:MAI-Voice-2.1"
                ],
                "enum_known": true,
                "name": "voice",
                "required": true,
                "type": "string"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": [
                  "mp3"
                ],
                "enum_known": true,
                "name": "response_format",
                "required": true,
                "type": "string"
              }
            ],
            "profile_binding": "Exact existing Ailoot model and method; interface constraints below do not assert provider qualification.",
            "unsupported": [
              "every field outside exactmodel,input,voice,response_format",
              "stream/speed/reference speech options"
            ]
          },
          "hints": [
            "이 모델 프로필에 있는 정확한 음성을 선택하세요.",
            "입력 문자 수와 오디오 초는 서로 다른 측정 단위입니다."
          ],
          "input": {
            "content_type": "application/json",
            "input": "정확한 UTF-8 텍스트; 정규화 없이 계산한 유니코드 문자 수",
            "material_types": [
              "text"
            ],
            "max_input_characters": null,
            "other_options": false,
            "required": [
              "model",
              "input",
              "voice",
              "response_format"
            ],
            "response_format": [
              "mp3"
            ],
            "voice_ids": [
              "cs-CZ-Grant:MAI-Voice-2.1",
              "cs-CZ-Harper:MAI-Voice-2.1",
              "da-DK-Grant:MAI-Voice-2.1",
              "da-DK-Harper:MAI-Voice-2.1",
              "de-DE-Grant:MAI-Voice-2.1",
              "de-DE-Harper:MAI-Voice-2.1",
              "de-DE-Klaus:MAI-Voice-2.1",
              "de-DE-Mia:MAI-Voice-2.1",
              "en-AU-Isla:MAI-Voice-2.1",
              "en-GB-Emily:MAI-Voice-2.1",
              "en-GB-Harry:MAI-Voice-2.1",
              "en-IN-Dhruv:MAI-Voice-2.1",
              "en-IN-Priya:MAI-Voice-2.1",
              "en-US-Ethan:MAI-Voice-2.1",
              "en-US-Grant:MAI-Voice-2.1",
              "en-US-Harper:MAI-Voice-2.1",
              "en-US-Iris:MAI-Voice-2.1",
              "en-US-Jasper:MAI-Voice-2.1",
              "en-US-Olivia:MAI-Voice-2.1",
              "en-US-Sage:MAI-Voice-2.1",
              "es-ES-Marta:MAI-Voice-2.1",
              "es-MX-Alejo:MAI-Voice-2.1",
              "es-MX-Grant:MAI-Voice-2.1",
              "es-MX-Harper:MAI-Voice-2.1",
              "es-MX-Valeria:MAI-Voice-2.1",
              "fi-FI-Grant:MAI-Voice-2.1",
              "fi-FI-Harper:MAI-Voice-2.1",
              "fr-FR-Grant:MAI-Voice-2.1",
              "fr-FR-Harper:MAI-Voice-2.1",
              "fr-FR-Marc:MAI-Voice-2.1",
              "fr-FR-Soleil:MAI-Voice-2.1",
              "hi-IN-Arjun:MAI-Voice-2.1",
              "hi-IN-Dhruv:MAI-Voice-2.1",
              "hi-IN-Grant:MAI-Voice-2.1",
              "hi-IN-Harper:MAI-Voice-2.1",
              "hi-IN-Kavya:MAI-Voice-2.1",
              "hi-IN-Priya:MAI-Voice-2.1",
              "hu-HU-Bence:MAI-Voice-2.1",
              "hu-HU-Grant:MAI-Voice-2.1",
              "hu-HU-Harper:MAI-Voice-2.1",
              "hu-HU-Levente:MAI-Voice-2.1",
              "hu-HU-Lilla:MAI-Voice-2.1",
              "hu-HU-Reka:MAI-Voice-2.1",
              "id-ID-Grant:MAI-Voice-2.1",
              "id-ID-Harper:MAI-Voice-2.1",
              "it-IT-Grant:MAI-Voice-2.1",
              "it-IT-Harper:MAI-Voice-2.1",
              "it-IT-Luca:MAI-Voice-2.1",
              "it-IT-Rosa:MAI-Voice-2.1",
              "ko-KR-Grant:MAI-Voice-2.1",
              "ko-KR-Haena:MAI-Voice-2.1",
              "ko-KR-Harper:MAI-Voice-2.1",
              "ko-KR-Junho:MAI-Voice-2.1",
              "nb-NO-Grant:MAI-Voice-2.1",
              "nb-NO-Harper:MAI-Voice-2.1",
              "nl-NL-Grant:MAI-Voice-2.1",
              "nl-NL-Harper:MAI-Voice-2.1",
              "nl-NL-Sander:MAI-Voice-2.1",
              "pl-PL-Grant:MAI-Voice-2.1",
              "pl-PL-Harper:MAI-Voice-2.1",
              "pt-BR-Caio:MAI-Voice-2.1",
              "pt-BR-Grant:MAI-Voice-2.1",
              "pt-BR-Harper:MAI-Voice-2.1",
              "pt-BR-Luana:MAI-Voice-2.1",
              "pt-BR-Pedro:MAI-Voice-2.1",
              "pt-BR-Rafael:MAI-Voice-2.1",
              "pt-PT-Grant:MAI-Voice-2.1",
              "pt-PT-Harper:MAI-Voice-2.1",
              "pt-PT-Rui:MAI-Voice-2.1",
              "ro-RO-Andrei:MAI-Voice-2.1",
              "ro-RO-Elena:MAI-Voice-2.1",
              "ro-RO-Grant:MAI-Voice-2.1",
              "ro-RO-Harper:MAI-Voice-2.1",
              "ro-RO-Ioana:MAI-Voice-2.1",
              "ro-RO-Radu:MAI-Voice-2.1",
              "ru-RU-Grant:MAI-Voice-2.1",
              "ru-RU-Harper:MAI-Voice-2.1",
              "ru-RU-Lev:MAI-Voice-2.1",
              "ru-RU-Masha:MAI-Voice-2.1",
              "sv-SE-Grant:MAI-Voice-2.1",
              "sv-SE-Harper:MAI-Voice-2.1",
              "th-TH-Grant:MAI-Voice-2.1",
              "th-TH-Harper:MAI-Voice-2.1",
              "th-TH-Krit:MAI-Voice-2.1",
              "th-TH-Nattapong:MAI-Voice-2.1",
              "tr-TR-Aydin:MAI-Voice-2.1",
              "tr-TR-Elif:MAI-Voice-2.1",
              "tr-TR-Grant:MAI-Voice-2.1",
              "tr-TR-Harper:MAI-Voice-2.1",
              "vi-VN-Grant:MAI-Voice-2.1",
              "vi-VN-Harper:MAI-Voice-2.1",
              "zh-CN-Bo:MAI-Voice-2.1",
              "zh-CN-Grant:MAI-Voice-2.1",
              "zh-CN-Harper:MAI-Voice-2.1",
              "zh-CN-Lan:MAI-Voice-2.1",
              "zh-CN-Mei:MAI-Voice-2.1",
              "zh-CN-Wei:MAI-Voice-2.1"
            ]
          },
          "lifecycle": {
            "assets": [
              {
                "http": "GET",
                "path": "/v1/media/assets"
              },
              {
                "http": "GET",
                "path": "/v1/media/assets/{asset_id}"
              }
            ],
            "content": [
              {
                "http": "GET",
                "path": "/v1/media/assets/{asset_id}/content",
                "url_source": "exact returned signed URL; never construct token"
              }
            ],
            "mode": "synchronous_result_then_owned_library",
            "operation_id_is_not_task_id": true,
            "status": [
              {
                "http": "GET",
                "id_source": "실제로 반환된 task_id 또는 미디어 라이브러리 기록",
                "path": "/v1/media/tasks/{task_id}"
              }
            ],
            "unknown": "Retain original operation_id/X-Client-Request-ID for reconciliation without resubmission; no dedicated audio poll route."
          },
          "manufacturer_capability": null,
          "method": {
            "http": "POST",
            "path": "/v1/audio/speech"
          },
          "method_aliases": [],
          "operation_modes": [
            "text_to_speech"
          ],
          "output": {
            "family": "audio",
            "format": "mp3",
            "http_success": 200,
            "response": "full binary MP3 plus response headers",
            "result": "complete playable owned MP3"
          }
        },
        "ctx": null,
        "declared_pricing_profiles": [
          {
            "dimensions": {
              "regime": "base"
            },
            "label": "Base token rates",
            "units": [
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": true,
                "estimate_only": false,
                "key": "input_price",
                "label": "Input tokens",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "input_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": false,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "input_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": true,
                "estimate_only": false,
                "key": "output_price",
                "label": "Output tokens",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "output_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": false,
                "rate_role": "typed_native_retail_rate",
                "side": "out",
                "unit": "output_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": true,
                "estimate_only": false,
                "key": "cache_read_price",
                "label": "Cache read",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "cached_input_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": false,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "cached_input_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": true,
                "estimate_only": false,
                "key": "cache_write_price",
                "label": "Cache write",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "generic_cache_creation_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": false,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "generic_cache_creation_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": true,
                "estimate_only": false,
                "key": "cache_write_1h_price",
                "label": "Cache write, 1 hour",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "one_hour_cache_creation_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": false,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "one_hour_cache_creation_token"
              }
            ]
          },
          {
            "dimensions": {
              "quantity_meter": "utf8.RuneCountInString(validUTF8): one Han codepoint=1; no Han weighting",
              "quoted_unit": "per 1000 input character"
            },
            "label": "Ultra",
            "units": [
              {
                "amount": "0.044000",
                "amount_unit": "usd_per_1000_characters",
                "billing_input": true,
                "estimate_only": false,
                "key": "audio_input_character",
                "label": "input character",
                "native_amount_usd_per_unit": "0.000044",
                "native_quantity": 1,
                "public_unit_label": "per 1000 input character",
                "quantity": "1000",
                "quantity_is_estimate": false,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "input_character"
              }
            ]
          }
        ],
        "declared_tariff_references": [
          {
            "client_selectable": false,
            "key": "53ceea2ccaa50cadb12f",
            "label": "Microsoft AI: MAI-Voice-2.1",
            "profiles": [
              {
                "basis": "",
                "dimensions": {
                  "conditions": "기본 설정"
                },
                "label": "Microsoft AI: MAI-Voice-2.1 · 기본 설정",
                "units": [
                  {
                    "amount": "0.000044",
                    "amount_unit": "usd_per_exact_physical_unit",
                    "billing_input": false,
                    "key": "8d1e4e9bf0f3647249d90a3c",
                    "label": "Input characters",
                    "public_unit_label": "per input character",
                    "quantity": "1",
                    "rate_role": "declared_tariff_rate",
                    "side": "in",
                    "unit": "input_character"
                  }
                ]
              }
            ]
          }
        ],
        "examples": [
          {
            "code": "set -eu\n: \"${AILOOT_API_KEY:?Set your Ailoot API key}\"\n: \"${AILOOT_VOICE_ID:?Choose an accepted voice ID from this exact model profile}\"\nexport AILOOT_VOICE_ID\npython3 - <<'PY_REQUEST'\nimport json,os\nfrom pathlib import Path\np=json.loads('{\"model\": \"microsoft/mai-voice-2.1\", \"input\": \"Good afternoon! This is a short voice take.\"}')\nvoice=os.environ[\"AILOOT_VOICE_ID\"]\nallowed=json.loads('[\"cs-CZ-Grant:MAI-Voice-2.1\", \"cs-CZ-Harper:MAI-Voice-2.1\", \"da-DK-Grant:MAI-Voice-2.1\", \"da-DK-Harper:MAI-Voice-2.1\", \"de-DE-Grant:MAI-Voice-2.1\", \"de-DE-Harper:MAI-Voice-2.1\", \"de-DE-Klaus:MAI-Voice-2.1\", \"de-DE-Mia:MAI-Voice-2.1\", \"en-AU-Isla:MAI-Voice-2.1\", \"en-GB-Emily:MAI-Voice-2.1\", \"en-GB-Harry:MAI-Voice-2.1\", \"en-IN-Dhruv:MAI-Voice-2.1\", \"en-IN-Priya:MAI-Voice-2.1\", \"en-US-Ethan:MAI-Voice-2.1\", \"en-US-Grant:MAI-Voice-2.1\", \"en-US-Harper:MAI-Voice-2.1\", \"en-US-Iris:MAI-Voice-2.1\", \"en-US-Jasper:MAI-Voice-2.1\", \"en-US-Olivia:MAI-Voice-2.1\", \"en-US-Sage:MAI-Voice-2.1\", \"es-ES-Marta:MAI-Voice-2.1\", \"es-MX-Alejo:MAI-Voice-2.1\", \"es-MX-Grant:MAI-Voice-2.1\", \"es-MX-Harper:MAI-Voice-2.1\", \"es-MX-Valeria:MAI-Voice-2.1\", \"fi-FI-Grant:MAI-Voice-2.1\", \"fi-FI-Harper:MAI-Voice-2.1\", \"fr-FR-Grant:MAI-Voice-2.1\", \"fr-FR-Harper:MAI-Voice-2.1\", \"fr-FR-Marc:MAI-Voice-2.1\", \"fr-FR-Soleil:MAI-Voice-2.1\", \"hi-IN-Arjun:MAI-Voice-2.1\", \"hi-IN-Dhruv:MAI-Voice-2.1\", \"hi-IN-Grant:MAI-Voice-2.1\", \"hi-IN-Harper:MAI-Voice-2.1\", \"hi-IN-Kavya:MAI-Voice-2.1\", \"hi-IN-Priya:MAI-Voice-2.1\", \"hu-HU-Bence:MAI-Voice-2.1\", \"hu-HU-Grant:MAI-Voice-2.1\", \"hu-HU-Harper:MAI-Voice-2.1\", \"hu-HU-Levente:MAI-Voice-2.1\", \"hu-HU-Lilla:MAI-Voice-2.1\", \"hu-HU-Reka:MAI-Voice-2.1\", \"id-ID-Grant:MAI-Voice-2.1\", \"id-ID-Harper:MAI-Voice-2.1\", \"it-IT-Grant:MAI-Voice-2.1\", \"it-IT-Harper:MAI-Voice-2.1\", \"it-IT-Luca:MAI-Voice-2.1\", \"it-IT-Rosa:MAI-Voice-2.1\", \"ko-KR-Grant:MAI-Voice-2.1\", \"ko-KR-Haena:MAI-Voice-2.1\", \"ko-KR-Harper:MAI-Voice-2.1\", \"ko-KR-Junho:MAI-Voice-2.1\", \"nb-NO-Grant:MAI-Voice-2.1\", \"nb-NO-Harper:MAI-Voice-2.1\", \"nl-NL-Grant:MAI-Voice-2.1\", \"nl-NL-Harper:MAI-Voice-2.1\", \"nl-NL-Sander:MAI-Voice-2.1\", \"pl-PL-Grant:MAI-Voice-2.1\", \"pl-PL-Harper:MAI-Voice-2.1\", \"pt-BR-Caio:MAI-Voice-2.1\", \"pt-BR-Grant:MAI-Voice-2.1\", \"pt-BR-Harper:MAI-Voice-2.1\", \"pt-BR-Luana:MAI-Voice-2.1\", \"pt-BR-Pedro:MAI-Voice-2.1\", \"pt-BR-Rafael:MAI-Voice-2.1\", \"pt-PT-Grant:MAI-Voice-2.1\", \"pt-PT-Harper:MAI-Voice-2.1\", \"pt-PT-Rui:MAI-Voice-2.1\", \"ro-RO-Andrei:MAI-Voice-2.1\", \"ro-RO-Elena:MAI-Voice-2.1\", \"ro-RO-Grant:MAI-Voice-2.1\", \"ro-RO-Harper:MAI-Voice-2.1\", \"ro-RO-Ioana:MAI-Voice-2.1\", \"ro-RO-Radu:MAI-Voice-2.1\", \"ru-RU-Grant:MAI-Voice-2.1\", \"ru-RU-Harper:MAI-Voice-2.1\", \"ru-RU-Lev:MAI-Voice-2.1\", \"ru-RU-Masha:MAI-Voice-2.1\", \"sv-SE-Grant:MAI-Voice-2.1\", \"sv-SE-Harper:MAI-Voice-2.1\", \"th-TH-Grant:MAI-Voice-2.1\", \"th-TH-Harper:MAI-Voice-2.1\", \"th-TH-Krit:MAI-Voice-2.1\", \"th-TH-Nattapong:MAI-Voice-2.1\", \"tr-TR-Aydin:MAI-Voice-2.1\", \"tr-TR-Elif:MAI-Voice-2.1\", \"tr-TR-Grant:MAI-Voice-2.1\", \"tr-TR-Harper:MAI-Voice-2.1\", \"vi-VN-Grant:MAI-Voice-2.1\", \"vi-VN-Harper:MAI-Voice-2.1\", \"zh-CN-Bo:MAI-Voice-2.1\", \"zh-CN-Grant:MAI-Voice-2.1\", \"zh-CN-Harper:MAI-Voice-2.1\", \"zh-CN-Lan:MAI-Voice-2.1\", \"zh-CN-Mei:MAI-Voice-2.1\", \"zh-CN-Wei:MAI-Voice-2.1\"]')\nif voice not in allowed: raise SystemExit(\"Choose an accepted voice ID from this exact model profile\")\np[\"voice\"]=voice\np[\"response_format\"]=\"mp3\"\nPath(\"request.json\").write_text(json.dumps(p,ensure_ascii=False))\nPY_REQUEST\ncurl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/audio/speech \\\n  -H \"Authorization: Bearer $AILOOT_API_KEY\" -H 'Content-Type: application/json' \\\n  --data-binary @request.json -D response-headers.txt -o speech.mp3\n",
            "label": "curl",
            "language": "bash"
          },
          {
            "code": "set -eu\n: \"${AILOOT_API_KEY:?Set your Ailoot API key}\"\ncurl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/media/assets \\\n  -H \"Authorization: Bearer $AILOOT_API_KEY\" -o media-assets.json\n",
            "label": "List actual media assets",
            "language": "bash"
          },
          {
            "code": "set -eu\n: \"${AILOOT_API_KEY:?Set your Ailoot API key}\"\n: \"${AILOOT_MEDIA_TASK_ID:?Set the actual ID returned by the response or media-library metadata}\"\nexport AILOOT_MEDIA_TASK_ID\nresource_id=$(python3 -c 'import os,urllib.parse;print(urllib.parse.quote(os.environ[\"AILOOT_MEDIA_TASK_ID\"],safe=\"\"))')\ncurl --fail-with-body --silent --show-error \"https://api.ailoot.ai/v1/media/tasks/$resource_id\" \\\n  -H \"Authorization: Bearer $AILOOT_API_KEY\" -o media-task.json\npython3 - <<'PY_RESULT'\nimport json\nfrom pathlib import Path\nprint(json.dumps(json.loads(Path(\"media-task.json\").read_text())))\nPY_RESULT\n",
            "label": "Read actual media task",
            "language": "bash"
          },
          {
            "code": "set -eu\n: \"${AILOOT_API_KEY:?Set your Ailoot API key}\"\n: \"${AILOOT_ASSET_ID:?Set the actual ID returned by the response or media-library metadata}\"\nexport AILOOT_ASSET_ID\nresource_id=$(python3 -c 'import os,urllib.parse;print(urllib.parse.quote(os.environ[\"AILOOT_ASSET_ID\"],safe=\"\"))')\ncurl --fail-with-body --silent --show-error \"https://api.ailoot.ai/v1/media/assets/$resource_id\" \\\n  -H \"Authorization: Bearer $AILOOT_API_KEY\" -o media-asset.json\npython3 - <<'PY_RESULT'\nimport json\nfrom pathlib import Path\nprint(json.dumps(json.loads(Path(\"media-asset.json\").read_text())))\nPY_RESULT\n",
            "label": "Read actual asset metadata",
            "language": "bash"
          }
        ],
        "family": "openai",
        "fast_multiplier": null,
        "flex_multiplier": null,
        "fmt": "speech",
        "hints": [
          "Select exact voice from this model profile.",
          "Input characters and audio seconds are different meters."
        ],
        "http": "POST",
        "in": null,
        "input": [
          "text"
        ],
        "label": "Озвучка текста",
        "max_out": null,
        "max_reasoning_effort_multiplier": null,
        "method_aliases": [],
        "out": null,
        "output": [
          "audio"
        ],
        "path": "/v1/audio/speech",
        "price_conditions": [
          {
            "label": "Fast mode",
            "value": "Not specified",
            "when": "When fast mode is selected"
          },
          {
            "label": "Flex mode",
            "value": "Not specified",
            "when": "When flex mode is selected"
          },
          {
            "label": "Maximum reasoning effort",
            "value": "Not specified",
            "when": "When maximum reasoning effort uses the default adjustment"
          }
        ],
        "pricing": {
          "billing_mode": "per_request",
          "image_input_price": null,
          "image_output_price": null,
          "per_request_price": null,
          "unit_prices": {
            "audio_input_character": 4.4e-05
          }
        },
        "pricing_profiles": [
          {
            "dimensions": {
              "regime": "base"
            },
            "label": "Base token rates",
            "units": [
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": true,
                "estimate_only": false,
                "key": "input_price",
                "label": "Input tokens",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "input_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": false,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "input_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": true,
                "estimate_only": false,
                "key": "output_price",
                "label": "Output tokens",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "output_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": false,
                "rate_role": "typed_native_retail_rate",
                "side": "out",
                "unit": "output_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": true,
                "estimate_only": false,
                "key": "cache_read_price",
                "label": "Cache read",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "cached_input_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": false,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "cached_input_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": true,
                "estimate_only": false,
                "key": "cache_write_price",
                "label": "Cache write",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "generic_cache_creation_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": false,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "generic_cache_creation_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": true,
                "estimate_only": false,
                "key": "cache_write_1h_price",
                "label": "Cache write, 1 hour",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "one_hour_cache_creation_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": false,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "one_hour_cache_creation_token"
              }
            ]
          },
          {
            "dimensions": {
              "quantity_meter": "utf8.RuneCountInString(validUTF8): one Han codepoint=1; no Han weighting",
              "quoted_unit": "per 1000 input character"
            },
            "label": "Ultra",
            "units": [
              {
                "amount": "0.044000",
                "amount_unit": "usd_per_1000_characters",
                "billing_input": true,
                "estimate_only": false,
                "key": "audio_input_character",
                "label": "input character",
                "native_amount_usd_per_unit": "0.000044",
                "native_quantity": 1,
                "public_unit_label": "per 1000 input character",
                "quantity": "1000",
                "quantity_is_estimate": false,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "input_character"
              }
            ]
          }
        ],
        "request_model_id": "microsoft/mai-voice-2.1",
        "route_label": "Ultra",
        "status_reads": [
          "GET /v1/media/tasks/{task_id}",
          "GET /v1/media/assets/{asset_id}/content"
        ],
        "tiers": [],
        "units": [
          {
            "amount": null,
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": true,
            "estimate_only": false,
            "key": "input_price",
            "label": "Input tokens",
            "native_amount_usd_per_unit": null,
            "native_quantity": 1,
            "native_unit": "input_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": false,
            "rate_role": "typed_native_retail_rate",
            "side": "in",
            "unit": "input_token"
          },
          {
            "amount": null,
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": true,
            "estimate_only": false,
            "key": "output_price",
            "label": "Output tokens",
            "native_amount_usd_per_unit": null,
            "native_quantity": 1,
            "native_unit": "output_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": false,
            "rate_role": "typed_native_retail_rate",
            "side": "out",
            "unit": "output_token"
          },
          {
            "amount": null,
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": true,
            "estimate_only": false,
            "key": "cache_read_price",
            "label": "Cache read",
            "native_amount_usd_per_unit": null,
            "native_quantity": 1,
            "native_unit": "cached_input_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": false,
            "rate_role": "typed_native_retail_rate",
            "side": "in",
            "unit": "cached_input_token"
          },
          {
            "amount": null,
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": true,
            "estimate_only": false,
            "key": "cache_write_price",
            "label": "Cache write",
            "native_amount_usd_per_unit": null,
            "native_quantity": 1,
            "native_unit": "generic_cache_creation_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": false,
            "rate_role": "typed_native_retail_rate",
            "side": "in",
            "unit": "generic_cache_creation_token"
          },
          {
            "amount": null,
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": true,
            "estimate_only": false,
            "key": "cache_write_1h_price",
            "label": "Cache write, 1 hour",
            "native_amount_usd_per_unit": null,
            "native_quantity": 1,
            "native_unit": "one_hour_cache_creation_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": false,
            "rate_role": "typed_native_retail_rate",
            "side": "in",
            "unit": "one_hour_cache_creation_token"
          },
          {
            "amount": "0.044000",
            "amount_unit": "usd_per_1000_characters",
            "billing_input": true,
            "estimate_only": false,
            "key": "audio_input_character",
            "label": "input character",
            "native_amount_usd_per_unit": "0.000044",
            "native_quantity": 1,
            "public_unit_label": "per 1000 input character",
            "quantity": "1000",
            "quantity_is_estimate": false,
            "rate_role": "typed_native_retail_rate",
            "side": "in",
            "unit": "input_character"
          }
        ]
      }
    ],
    "model_aliases": [
      {
        "canonical_model_id": "microsoft/mai-voice-2.1",
        "request_model_id": "microsoft/mai-voice-2.1",
        "route_label": "Ultra"
      }
    ],
    "name": "Microsoft AI: MAI-Voice-2.1",
    "price": {
      "in": null,
      "in_label": null,
      "out": null,
      "out_label": null,
      "sort_in": null,
      "sort_out": null,
      "varies": true
    },
    "pricing_profiles": [
      {
        "applicability": {
          "client_selectable": false,
          "native_profile_selection_pending": true,
          "scope": "hosted_reference"
        },
        "dimensions": {
          "variant": null
        },
        "label": "Ultra",
        "units": [
          {
            "amount": "0.000044",
            "amount_unit": "usd_per_input_character",
            "conditions": {
              "variant": null
            },
            "key": "pricing.prompt",
            "label": "prompt",
            "profile_index": 0,
            "quantity": "1",
            "rate_role": "binding_component_rate",
            "side": "in",
            "unit": "input_character"
          },
          {
            "amount": "0",
            "amount_unit": "usd_per_not_separately_charged_output",
            "conditions": {
              "variant": null
            },
            "key": "pricing.completion",
            "label": "completion",
            "profile_index": 0,
            "quantity": "1",
            "rate_role": "binding_component_rate",
            "side": "out",
            "unit": "not_separately_charged_output"
          }
        ]
      }
    ],
    "public_id": "microsoft/mai-voice-2.1",
    "short": "Microsoft AI의 MAI-Voice-2.1은 내레이션, 오디오북, 교육 콘텐츠, 보이스오버를 위한 표현력 있는 다국어 음성을 생성합니다. 23개 언어를 제공하며 일관된 화자의 목소리, 여러 화자, 표현 제어를 지원합니다."
  },
  "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의 MAI-Voice-2.1은 내레이션, 오디오북, 교육 콘텐츠, 보이스오버를 위한 표현력 있는 다국어 음성을 생성합니다. 23개 언어를 제공하며 일관된 화자의 목소리, 여러 화자, 표현 제어를 지원합니다.",
  "source": {
    "audit_sha256": "2e00086bcbfc28e64d0cebe97aa47c17d8d5618963027f8ffb9dc6123d7d25b1",
    "bridge_map_sha256": "1125275768b9636fc8461bc7da5061239a81ddfe508e2557843ca42c58ab0036",
    "raw_model_json_sha256": "df9af4b3cf98670b1236715fa2eda3acceac66d3802d0949775e9fe76fff0012",
    "renderer_sha256": "6825a317438b70ab0939441dcebefece462384e77f7e96cce899605c4b208caa"
  },
  "sourceRevision": "5dfe351ef4c77a8c7410682fba4e3e2dd09a1a39c60dcb6b1cae33dd3e20b46b"
}
