{
  "aboutHtml": "<p>MAI-Voice-2는 자연스럽고 표현력 있는 음성 콘텐츠를 위한 Microsoft AI의 프롬프트 기반 텍스트 음성 변환 모델입니다. 제조사는 음향 충실도, 화자 일관성, 감정 표현 범위를 강조합니다. 문서에 명시된 작업에는 어시스턴트, 오디오북, 팟캐스트, 강의, 교육용 캐릭터, 접근성 내레이션이 포함됩니다. 발화문 텍스트는 선택한 목소리의 오디오가 됩니다. 즉각적인 응답을 우선하는 상호작용에는 자체 특성을 가진 Voice-2-Flash 변형이 있습니다.</p><h4>언어와 화자</h4><p>Microsoft의 Voice-2 발표는 영어, 프랑스어, 독일어, 이탈리아어, 스페인어, 포르투갈어, 힌디어, 한국어, 중국어 간체, 튀르키예어, 러시아어, 태국어, 네덜란드어, 루마니아어, 헝가리어를 포함하는 15개 언어를 설명합니다. 일부 언어에는 별도의 지역 변형이 있습니다. 발표는 힌디어·영어 및 스페인어·영어 코드 전환도 설명하므로 해당 언어가 섞인 문단에서 화자가 자연스럽게 언어를 바꾸는 방식을 유지할 수 있습니다.</p><p>실제로 말할 단어를 준비하고 의도한 언어를 보존하세요. 이중 언어 교육 문단은 이름과 인용을 그대로 유지하면서 한 언어로 용어를 소개하고 다른 언어로 설명할 수 있습니다. 모든 로캘을 서로 바꿔 쓸 수 있다고 취급하지 말고 작품에 필요한 억양과 청중에 맞춰 음성 결과를 확인하세요.</p><p>모델 카드는 선별된 목소리 라이브러리와 별도의 참조 음성 프롬프트 경로를 제공합니다. 참조 음성은 미세 조정 없이 원하는 화자의 목소리 정체성을 제공합니다. 녹음이 리듬과 표현에 영향을 주므로 Microsoft는 적당한 에너지의 자연스러운 대화체를 권장합니다. 사용자 지정 목소리가 필요한 작업에서는 대표성이 있고 동의받은 녹음을 사용하세요.</p><h4>긴 내레이션과 대화</h4><p>모델 카드는 맥락을 전달하며 청크로 나누는 긴 콘텐츠 생성을 문서화합니다. 장, 수업, 연속되는 팟캐스트 문단처럼 이어지는 내레이션을 지원합니다. 의미 있는 구간 경계에서 대본을 나누고 용어와 화자 선택을 일관되게 유지하세요. 긴 설명에는 주제가 바뀌는 시점을 청취자에게 알려 주는 구어체 전환 문장이 도움이 됩니다.</p><p>다중 화자 지원을 통해 준비된 대화에서 서로 다른 역할을 맡길 수 있습니다. 질문과 응답을 의도한 화자에게 배정하고 같은 역할이 돌아오면 배정을 유지하세요. 입력에는 최종 대사와 관련 연기 지시를 담아야 하며, 음성 합성기에 대화를 새로 만들라고 개방형으로 요청해서는 안 됩니다.</p><h4>어조와 감정 표현</h4><p>Microsoft는 대화 차례 수준에서 어조, 표현, 감정을 세밀하게 제어한다고 설명합니다. 발표 예제는 표현력 있는 발화 역할과 감정적 문단을 보여 줍니다. 내러티브에서는 어떤 문장이 사실적이고 성찰적이며 흥분한 상태인지 정한 뒤 의미에 맞는 표현을 적용하세요. 예를 들어 “실험에서 가장 조용했던 부분이 가장 많은 것을 알려 주었습니다. 바로 그곳에서 패턴이 처음으로 분명해졌습니다.”라고 쓸 수 있습니다. 이 문구는 의도적인 강조 변화를 만들어 줍니다.</p><p>안내용 보이스오버에서는 행동을 명확히 하고 설명을 별도의 문장으로 두세요. 대화에서는 캐릭터의 실제 대사와 장면 메모를 구분하세요. 반복되는 이름과 문단 사이의 전환을 들어 보며 최종 흐름이 일관되도록 하세요.</p><h4>오디오 활용</h4><p>출력은 제공된 발화문에 대해 새로 생성한 음성입니다. 유용한 형태는 목소리와 표현이 대본을 따르는 내레이션, 대화, 애플리케이션의 음성 응답입니다. 텍스트, 화자, 구간 순서를 녹음에 연결해 보관하면 나머지 연기를 잃지 않고 의도한 문단을 수정할 수 있습니다.</p><p>MAI-Voice-2는 긴 청취 경험에서 자연스러움과 표현력에 중점을 둡니다. 긴 콘텐츠 생성 능력이 무제한 입력이나 보장된 최대 녹음 시간을 정해 주지는 않습니다. Voice-2의 정확한 설명은 이후 Voice-2.1 버전들의 확장된 언어 목록과 음성 설정과 구분해야 합니다.</p>",
  "aboutText": "MAI-Voice-2는 자연스럽고 표현력 있는 음성 콘텐츠를 위한 Microsoft AI의 프롬프트 기반 텍스트 음성 변환 모델입니다. 제조사는 음향 충실도, 화자 일관성, 감정 표현 범위를 강조합니다. 문서에 명시된 작업에는 어시스턴트, 오디오북, 팟캐스트, 강의, 교육용 캐릭터, 접근성 내레이션이 포함됩니다. 발화문 텍스트는 선택한 목소리의 오디오가 됩니다. 즉각적인 응답을 우선하는 상호작용에는 자체 특성을 가진 Voice-2-Flash 변형이 있습니다.\n\n### 언어와 화자\n\nMicrosoft의 Voice-2 발표는 영어, 프랑스어, 독일어, 이탈리아어, 스페인어, 포르투갈어, 힌디어, 한국어, 중국어 간체, 튀르키예어, 러시아어, 태국어, 네덜란드어, 루마니아어, 헝가리어를 포함하는 15개 언어를 설명합니다. 일부 언어에는 별도의 지역 변형이 있습니다. 발표는 힌디어·영어 및 스페인어·영어 코드 전환도 설명하므로 해당 언어가 섞인 문단에서 화자가 자연스럽게 언어를 바꾸는 방식을 유지할 수 있습니다.\n\n실제로 말할 단어를 준비하고 의도한 언어를 보존하세요. 이중 언어 교육 문단은 이름과 인용을 그대로 유지하면서 한 언어로 용어를 소개하고 다른 언어로 설명할 수 있습니다. 모든 로캘을 서로 바꿔 쓸 수 있다고 취급하지 말고 작품에 필요한 억양과 청중에 맞춰 음성 결과를 확인하세요.\n\n모델 카드는 선별된 목소리 라이브러리와 별도의 참조 음성 프롬프트 경로를 제공합니다. 참조 음성은 미세 조정 없이 원하는 화자의 목소리 정체성을 제공합니다. 녹음이 리듬과 표현에 영향을 주므로 Microsoft는 적당한 에너지의 자연스러운 대화체를 권장합니다. 사용자 지정 목소리가 필요한 작업에서는 대표성이 있고 동의받은 녹음을 사용하세요.\n\n### 긴 내레이션과 대화\n\n모델 카드는 맥락을 전달하며 청크로 나누는 긴 콘텐츠 생성을 문서화합니다. 장, 수업, 연속되는 팟캐스트 문단처럼 이어지는 내레이션을 지원합니다. 의미 있는 구간 경계에서 대본을 나누고 용어와 화자 선택을 일관되게 유지하세요. 긴 설명에는 주제가 바뀌는 시점을 청취자에게 알려 주는 구어체 전환 문장이 도움이 됩니다.\n\n다중 화자 지원을 통해 준비된 대화에서 서로 다른 역할을 맡길 수 있습니다. 질문과 응답을 의도한 화자에게 배정하고 같은 역할이 돌아오면 배정을 유지하세요. 입력에는 최종 대사와 관련 연기 지시를 담아야 하며, 음성 합성기에 대화를 새로 만들라고 개방형으로 요청해서는 안 됩니다.\n\n### 어조와 감정 표현\n\nMicrosoft는 대화 차례 수준에서 어조, 표현, 감정을 세밀하게 제어한다고 설명합니다. 발표 예제는 표현력 있는 발화 역할과 감정적 문단을 보여 줍니다. 내러티브에서는 어떤 문장이 사실적이고 성찰적이며 흥분한 상태인지 정한 뒤 의미에 맞는 표현을 적용하세요. 예를 들어 “실험에서 가장 조용했던 부분이 가장 많은 것을 알려 주었습니다. 바로 그곳에서 패턴이 처음으로 분명해졌습니다.”라고 쓸 수 있습니다. 이 문구는 의도적인 강조 변화를 만들어 줍니다.\n\n안내용 보이스오버에서는 행동을 명확히 하고 설명을 별도의 문장으로 두세요. 대화에서는 캐릭터의 실제 대사와 장면 메모를 구분하세요. 반복되는 이름과 문단 사이의 전환을 들어 보며 최종 흐름이 일관되도록 하세요.\n\n### 오디오 활용\n\n출력은 제공된 발화문에 대해 새로 생성한 음성입니다. 유용한 형태는 목소리와 표현이 대본을 따르는 내레이션, 대화, 애플리케이션의 음성 응답입니다. 텍스트, 화자, 구간 순서를 녹음에 연결해 보관하면 나머지 연기를 잃지 않고 의도한 문단을 수정할 수 있습니다.\n\nMAI-Voice-2는 긴 청취 경험에서 자연스러움과 표현력에 중점을 둡니다. 긴 콘텐츠 생성 능력이 무제한 입력이나 보장된 최대 녹음 시간을 정해 주지는 않습니다. Voice-2의 정확한 설명은 이후 Voice-2.1 버전들의 확장된 언어 목록과 음성 설정과 구분해야 합니다.",
  "editorialOverlay": {
    "copy_fields": null,
    "copy_sha256": null,
    "copy_source": null,
    "html_sha256": "4b63961e79c10871f28b177bee66bf6ae5c57d830db943ce601711cc34fd0f46",
    "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</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</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\">음성 합성</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는 내레이션, 대화, 음성 애플리케이션을 위한 표현력 있는 다국어 음성을 생성합니다. 긴 콘텐츠의 일관성, 다중 화자, 대화 차례별 감정 제어를 통해 오디오북, 수업, 캐릭터 목소리에 활용할 수 있습니다.</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는 자연스럽고 표현력 있는 음성 콘텐츠를 위한 Microsoft AI의 프롬프트 기반 텍스트 음성 변환 모델입니다. 제조사는 음향 충실도, 화자 일관성, 감정 표현 범위를 강조합니다. 문서에 명시된 작업에는 어시스턴트, 오디오북, 팟캐스트, 강의, 교육용 캐릭터, 접근성 내레이션이 포함됩니다. 발화문 텍스트는 선택한 목소리의 오디오가 됩니다. 즉각적인 응답을 우선하는 상호작용에는 자체 특성을 가진 Voice-2-Flash 변형이 있습니다.</p><h4>언어와 화자</h4><p>Microsoft의 Voice-2 발표는 영어, 프랑스어, 독일어, 이탈리아어, 스페인어, 포르투갈어, 힌디어, 한국어, 중국어 간체, 튀르키예어, 러시아어, 태국어, 네덜란드어, 루마니아어, 헝가리어를 포함하는 15개 언어를 설명합니다. 일부 언어에는 별도의 지역 변형이 있습니다. 발표는 힌디어·영어 및 스페인어·영어 코드 전환도 설명하므로 해당 언어가 섞인 문단에서 화자가 자연스럽게 언어를 바꾸는 방식을 유지할 수 있습니다.</p><p>실제로 말할 단어를 준비하고 의도한 언어를 보존하세요. 이중 언어 교육 문단은 이름과 인용을 그대로 유지하면서 한 언어로 용어를 소개하고 다른 언어로 설명할 수 있습니다. 모든 로캘을 서로 바꿔 쓸 수 있다고 취급하지 말고 작품에 필요한 억양과 청중에 맞춰 음성 결과를 확인하세요.</p><p>모델 카드는 선별된 목소리 라이브러리와 별도의 참조 음성 프롬프트 경로를 제공합니다. 참조 음성은 미세 조정 없이 원하는 화자의 목소리 정체성을 제공합니다. 녹음이 리듬과 표현에 영향을 주므로 Microsoft는 적당한 에너지의 자연스러운 대화체를 권장합니다. 사용자 지정 목소리가 필요한 작업에서는 대표성이 있고 동의받은 녹음을 사용하세요.</p><h4>긴 내레이션과 대화</h4><p>모델 카드는 맥락을 전달하며 청크로 나누는 긴 콘텐츠 생성을 문서화합니다. 장, 수업, 연속되는 팟캐스트 문단처럼 이어지는 내레이션을 지원합니다. 의미 있는 구간 경계에서 대본을 나누고 용어와 화자 선택을 일관되게 유지하세요. 긴 설명에는 주제가 바뀌는 시점을 청취자에게 알려 주는 구어체 전환 문장이 도움이 됩니다.</p><p>다중 화자 지원을 통해 준비된 대화에서 서로 다른 역할을 맡길 수 있습니다. 질문과 응답을 의도한 화자에게 배정하고 같은 역할이 돌아오면 배정을 유지하세요. 입력에는 최종 대사와 관련 연기 지시를 담아야 하며, 음성 합성기에 대화를 새로 만들라고 개방형으로 요청해서는 안 됩니다.</p><h4>어조와 감정 표현</h4><p>Microsoft는 대화 차례 수준에서 어조, 표현, 감정을 세밀하게 제어한다고 설명합니다. 발표 예제는 표현력 있는 발화 역할과 감정적 문단을 보여 줍니다. 내러티브에서는 어떤 문장이 사실적이고 성찰적이며 흥분한 상태인지 정한 뒤 의미에 맞는 표현을 적용하세요. 예를 들어 “실험에서 가장 조용했던 부분이 가장 많은 것을 알려 주었습니다. 바로 그곳에서 패턴이 처음으로 분명해졌습니다.”라고 쓸 수 있습니다. 이 문구는 의도적인 강조 변화를 만들어 줍니다.</p><p>안내용 보이스오버에서는 행동을 명확히 하고 설명을 별도의 문장으로 두세요. 대화에서는 캐릭터의 실제 대사와 장면 메모를 구분하세요. 반복되는 이름과 문단 사이의 전환을 들어 보며 최종 흐름이 일관되도록 하세요.</p><h4>오디오 활용</h4><p>출력은 제공된 발화문에 대해 새로 생성한 음성입니다. 유용한 형태는 목소리와 표현이 대본을 따르는 내레이션, 대화, 애플리케이션의 음성 응답입니다. 텍스트, 화자, 구간 순서를 녹음에 연결해 보관하면 나머지 연기를 잃지 않고 의도한 문단을 수정할 수 있습니다.</p><p>MAI-Voice-2는 긴 청취 경험에서 자연스러움과 표현력에 중점을 둡니다. 긴 콘텐츠 생성 능력이 무제한 입력이나 보장된 최대 녹음 시간을 정해 주지는 않습니다. Voice-2의 정확한 설명은 이후 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</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>en-US-Harper:MAI-Voice-2, es-MX-Valeria:MAI-Voice-2, fr-FR-Soleil:MAI-Voice-2, de-DE-Klaus:MAI-Voice-2</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>en-US-Harper:MAI-Voice-2, es-MX-Valeria:MAI-Voice-2, fr-FR-Soleil:MAI-Voice-2, de-DE-Klaus:MAI-Voice-2</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</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 · 기본 설정</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-1849-tab-0\" role=\"tab\" type=\"button\" aria-controls=\"model-code-1849-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-1849-panel-0\" role=\"tabpanel\" aria-labelledby=\"model-code-1849-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&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;en-US-Harper:MAI-Voice-2&quot;, &quot;es-MX-Valeria:MAI-Voice-2&quot;, &quot;fr-FR-Soleil:MAI-Voice-2&quot;, &quot;de-DE-Klaus:MAI-Voice-2&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-1850-tab-0\" role=\"tab\" type=\"button\" aria-controls=\"model-code-1850-panel-0\" aria-selected=\"true\" tabindex=\"0\">미디어 라이브러리</button><button class=\"cg-tab\" id=\"model-code-1850-tab-1\" role=\"tab\" type=\"button\" aria-controls=\"model-code-1850-panel-1\" aria-selected=\"false\" tabindex=\"-1\">작업 상태</button><button class=\"cg-tab\" id=\"model-code-1850-tab-2\" role=\"tab\" type=\"button\" aria-controls=\"model-code-1850-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-1850-panel-0\" role=\"tabpanel\" aria-labelledby=\"model-code-1850-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-1850-panel-1\" role=\"tabpanel\" aria-labelledby=\"model-code-1850-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-1850-panel-2\" role=\"tabpanel\" aria-labelledby=\"model-code-1850-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&amp;route=Ultra&amp;caller=microsoft%2Fmai-voice-2&amp;fmt=speech\"><code>microsoft/mai-voice-2</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&amp;route=Ultra&amp;caller=microsoft%2Fmai-voice-2&amp;fmt=speech\"><code>microsoft/mai-voice-2</code></a></p></section></div>",
      "method_identity": {
        "effective_request_model_id": "microsoft/mai-voice-2",
        "fmt": "speech",
        "http": "POST",
        "path": "/v1/audio/speech",
        "request_model_id": "microsoft/mai-voice-2",
        "route_label": "Ultra"
      },
      "method_key": "Ultra|speech|/v1/audio/speech|microsoft%2Fmai-voice-2",
      "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"
                ],
                "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": [
                  "en-US-Harper:MAI-Voice-2",
                  "es-MX-Valeria:MAI-Voice-2",
                  "fr-FR-Soleil:MAI-Voice-2",
                  "de-DE-Klaus:MAI-Voice-2"
                ],
                "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": [
              "en-US-Harper:MAI-Voice-2",
              "es-MX-Valeria:MAI-Voice-2",
              "fr-FR-Soleil:MAI-Voice-2",
              "de-DE-Klaus:MAI-Voice-2"
            ]
          },
          "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": "8157c682f7b978ff1719",
            "label": "Microsoft AI: MAI-Voice-2",
            "profiles": [
              {
                "basis": "",
                "dimensions": {
                  "conditions": "기본 설정"
                },
                "label": "Microsoft AI: MAI-Voice-2 · 기본 설정",
                "units": [
                  {
                    "amount": "0.000044",
                    "amount_unit": "usd_per_exact_physical_unit",
                    "billing_input": false,
                    "key": "6e89648d2231d4f746c612d8",
                    "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\", \"input\": \"Good afternoon! This is a short voice take.\"}')\nvoice=os.environ[\"AILOOT_VOICE_ID\"]\nallowed=json.loads('[\"en-US-Harper:MAI-Voice-2\", \"es-MX-Valeria:MAI-Voice-2\", \"fr-FR-Soleil:MAI-Voice-2\", \"de-DE-Klaus:MAI-Voice-2\"]')\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",
        "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",
  "nativeProvenance": {
    "input_facts_canonical_sha256": "433bd5ab1361e1363e565a20eff518401c6de08ec982d661bac7f74822dd590a",
    "input_html_sha256": "d8a1db2c232fefcca7cf9497f75cd626174473fc64efb7d73c1d2c7c0f410c75",
    "private_audit_sha256": "bdc9a9a802efab1e142d0f736e9962896cca48ebb06d5d76a8468101e38e83fd",
    "role": "historical-normalized-input-audit-hashes",
    "schema": "ailoot-native-model-provenance-v2"
  },
  "page": {
    "canonical": "https://ailoot.ai/models/ko/microsoft-mai-voice-2/",
    "description": "Microsoft AI의 MAI-Voice-2는 내레이션, 대화, 음성 애플리케이션을 위한 표현력 있는 다국어 음성을 생성합니다. 긴 콘텐츠의 일관성, 다중 화자, 대화 차례별 감정 제어를 통해 오디오북, 수업, 캐릭터 목소리에 활용할 수 있습니다.",
    "locale": "ko",
    "md_url": "https://ailoot.ai/models/ko/microsoft-mai-voice-2/index.md",
    "title": "Microsoft AI: MAI-Voice-2 — Ailoot",
    "url": "https://ailoot.ai/models/ko/microsoft-mai-voice-2/"
  },
  "rawModel": {
    "about": "MAI-Voice-2는 자연스럽고 표현력 있는 음성 콘텐츠를 위한 Microsoft AI의 프롬프트 기반 텍스트 음성 변환 모델입니다. 제조사는 음향 충실도, 화자 일관성, 감정 표현 범위를 강조합니다. 문서에 명시된 작업에는 어시스턴트, 오디오북, 팟캐스트, 강의, 교육용 캐릭터, 접근성 내레이션이 포함됩니다. 발화문 텍스트는 선택한 목소리의 오디오가 됩니다. 즉각적인 응답을 우선하는 상호작용에는 자체 특성을 가진 Voice-2-Flash 변형이 있습니다.\n\n### 언어와 화자\n\nMicrosoft의 Voice-2 발표는 영어, 프랑스어, 독일어, 이탈리아어, 스페인어, 포르투갈어, 힌디어, 한국어, 중국어 간체, 튀르키예어, 러시아어, 태국어, 네덜란드어, 루마니아어, 헝가리어를 포함하는 15개 언어를 설명합니다. 일부 언어에는 별도의 지역 변형이 있습니다. 발표는 힌디어·영어 및 스페인어·영어 코드 전환도 설명하므로 해당 언어가 섞인 문단에서 화자가 자연스럽게 언어를 바꾸는 방식을 유지할 수 있습니다.\n\n실제로 말할 단어를 준비하고 의도한 언어를 보존하세요. 이중 언어 교육 문단은 이름과 인용을 그대로 유지하면서 한 언어로 용어를 소개하고 다른 언어로 설명할 수 있습니다. 모든 로캘을 서로 바꿔 쓸 수 있다고 취급하지 말고 작품에 필요한 억양과 청중에 맞춰 음성 결과를 확인하세요.\n\n모델 카드는 선별된 목소리 라이브러리와 별도의 참조 음성 프롬프트 경로를 제공합니다. 참조 음성은 미세 조정 없이 원하는 화자의 목소리 정체성을 제공합니다. 녹음이 리듬과 표현에 영향을 주므로 Microsoft는 적당한 에너지의 자연스러운 대화체를 권장합니다. 사용자 지정 목소리가 필요한 작업에서는 대표성이 있고 동의받은 녹음을 사용하세요.\n\n### 긴 내레이션과 대화\n\n모델 카드는 맥락을 전달하며 청크로 나누는 긴 콘텐츠 생성을 문서화합니다. 장, 수업, 연속되는 팟캐스트 문단처럼 이어지는 내레이션을 지원합니다. 의미 있는 구간 경계에서 대본을 나누고 용어와 화자 선택을 일관되게 유지하세요. 긴 설명에는 주제가 바뀌는 시점을 청취자에게 알려 주는 구어체 전환 문장이 도움이 됩니다.\n\n다중 화자 지원을 통해 준비된 대화에서 서로 다른 역할을 맡길 수 있습니다. 질문과 응답을 의도한 화자에게 배정하고 같은 역할이 돌아오면 배정을 유지하세요. 입력에는 최종 대사와 관련 연기 지시를 담아야 하며, 음성 합성기에 대화를 새로 만들라고 개방형으로 요청해서는 안 됩니다.\n\n### 어조와 감정 표현\n\nMicrosoft는 대화 차례 수준에서 어조, 표현, 감정을 세밀하게 제어한다고 설명합니다. 발표 예제는 표현력 있는 발화 역할과 감정적 문단을 보여 줍니다. 내러티브에서는 어떤 문장이 사실적이고 성찰적이며 흥분한 상태인지 정한 뒤 의미에 맞는 표현을 적용하세요. 예를 들어 “실험에서 가장 조용했던 부분이 가장 많은 것을 알려 주었습니다. 바로 그곳에서 패턴이 처음으로 분명해졌습니다.”라고 쓸 수 있습니다. 이 문구는 의도적인 강조 변화를 만들어 줍니다.\n\n안내용 보이스오버에서는 행동을 명확히 하고 설명을 별도의 문장으로 두세요. 대화에서는 캐릭터의 실제 대사와 장면 메모를 구분하세요. 반복되는 이름과 문단 사이의 전환을 들어 보며 최종 흐름이 일관되도록 하세요.\n\n### 오디오 활용\n\n출력은 제공된 발화문에 대해 새로 생성한 음성입니다. 유용한 형태는 목소리와 표현이 대본을 따르는 내레이션, 대화, 애플리케이션의 음성 응답입니다. 텍스트, 화자, 구간 순서를 녹음에 연결해 보관하면 나머지 연기를 잃지 않고 의도한 문단을 수정할 수 있습니다.\n\nMAI-Voice-2는 긴 청취 경험에서 자연스러움과 표현력에 중점을 둡니다. 긴 콘텐츠 생성 능력이 무제한 입력이나 보장된 최대 녹음 시간을 정해 주지는 않습니다. Voice-2의 정확한 설명은 이후 Voice-2.1 버전들의 확장된 언어 목록과 음성 설정과 구분해야 합니다.",
    "alias_of": null,
    "aliases": [],
    "author": "Microsoft AI",
    "available": null,
    "canonical_model": "microsoft/mai-voice-2",
    "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",
    "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"
                ],
                "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": [
                  "en-US-Harper:MAI-Voice-2",
                  "es-MX-Valeria:MAI-Voice-2",
                  "fr-FR-Soleil:MAI-Voice-2",
                  "de-DE-Klaus:MAI-Voice-2"
                ],
                "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": [
              "en-US-Harper:MAI-Voice-2",
              "es-MX-Valeria:MAI-Voice-2",
              "fr-FR-Soleil:MAI-Voice-2",
              "de-DE-Klaus:MAI-Voice-2"
            ]
          },
          "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": "8157c682f7b978ff1719",
            "label": "Microsoft AI: MAI-Voice-2",
            "profiles": [
              {
                "basis": "",
                "dimensions": {
                  "conditions": "기본 설정"
                },
                "label": "Microsoft AI: MAI-Voice-2 · 기본 설정",
                "units": [
                  {
                    "amount": "0.000044",
                    "amount_unit": "usd_per_exact_physical_unit",
                    "billing_input": false,
                    "key": "6e89648d2231d4f746c612d8",
                    "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\", \"input\": \"Good afternoon! This is a short voice take.\"}')\nvoice=os.environ[\"AILOOT_VOICE_ID\"]\nallowed=json.loads('[\"en-US-Harper:MAI-Voice-2\", \"es-MX-Valeria:MAI-Voice-2\", \"fr-FR-Soleil:MAI-Voice-2\", \"de-DE-Klaus:MAI-Voice-2\"]')\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",
        "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",
        "request_model_id": "microsoft/mai-voice-2",
        "route_label": "Ultra"
      }
    ],
    "name": "Microsoft AI: MAI-Voice-2",
    "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",
    "short": "Microsoft AI의 MAI-Voice-2는 내레이션, 대화, 음성 애플리케이션을 위한 표현력 있는 다국어 음성을 생성합니다. 긴 콘텐츠의 일관성, 다중 화자, 대화 차례별 감정 제어를 통해 오디오북, 수업, 캐릭터 목소리에 활용할 수 있습니다."
  },
  "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는 내레이션, 대화, 음성 애플리케이션을 위한 표현력 있는 다국어 음성을 생성합니다. 긴 콘텐츠의 일관성, 다중 화자, 대화 차례별 감정 제어를 통해 오디오북, 수업, 캐릭터 목소리에 활용할 수 있습니다.",
  "source": {
    "audit_sha256": "2e00086bcbfc28e64d0cebe97aa47c17d8d5618963027f8ffb9dc6123d7d25b1",
    "bridge_map_sha256": "1125275768b9636fc8461bc7da5061239a81ddfe508e2557843ca42c58ab0036",
    "raw_model_json_sha256": "59e7520bcfc71d703b4832ef2d9e38fca83b94be67761eaa2fd255c82bd41344",
    "renderer_sha256": "6825a317438b70ab0939441dcebefece462384e77f7e96cce899605c4b208caa"
  },
  "sourceRevision": "d437789833fef3fdd6bb2baaad172f9ffa37fff045c3c29ff9ca199ac16a84a2"
}
