{
  "aboutHtml": "<h4>인터랙티브 응답을 위한 빠른 음성</h4><p>Speech 02 Turbo는 인터랙티브 음성 합성을 위한 모델입니다. 개발사는 속도, 안정적인 리듬, 자연스러운 소리의 조합을 설명합니다. 활용 사례에는 음성 응답, 게임의 대사, 인터랙티브 콘텐츠가 있습니다. 모델은 텍스트를 입력받고 음성 오디오를 생성합니다.</p><h4>소리의 성격 선택</h4><p>Speech 02 제품군은 목소리, 언어, 억양, 감정 표현을 결합할 수 있습니다. 함께 학습하는 자기회귀 Transformer와 화자 인코더가 음색을 내용과 연결합니다. 미리 준비된 목소리로 텍스트를 합성할 수 있습니다. 새로운 복제 목소리를 만드는 것은 별도의 준비 과정에 해당합니다.</p><p>모델은 텍스트에 따라 감정적 억양을 선택하거나, 지정한 기쁨, 슬픔, 분노, 두려움, 혐오, 놀람, 차분함을 사용합니다. 발화를 필요한 상호작용 속도에 맞추기 위해 속도, 음높이, 음량도 조절할 수 있습니다.</p><h4>언어와 단어 읽기</h4><p>러시아어와 함께 영어, 중국어, 광둥어, 일본어, 한국어, 프랑스어, 독일어, 스페인어, 포르투갈어, 튀르키예어, 아랍어, 우크라이나어 등 다른 언어를 지원합니다. 현재 Speech 02 사양에서는 페르시아어, 필리핀어, 타밀어를 별도로 제외합니다.</p><p>발음은 대체 사전, 국제 음성 표기, 중국어 병음, 일본어 읽기 변형으로 구체화할 수 있습니다. 읽는 부분 사이에 <strong>0.01~99.99초</strong>의 멈춤을 지정합니다. 멈춤 길이는 소수점 이하 두 자리까지 지정합니다. 표시는 읽는 구간 사이에 넣으며 연속으로 배치하지 않습니다. 모델은 속도 <strong>0.5~2</strong>, 0 초과부터 <strong>10</strong>까지의 음량, <strong>−12~12</strong>의 음높이 변화를 제공합니다.</p><h4>재생할 오디오</h4><p>동기 입력은 <strong>10 000자</strong> 미만의 텍스트로 제한됩니다. 3000자가 넘으면 개발사는 점진적 출력을 권장합니다. 모델의 기능에는 MP3, WAV, FLAC, PCM이 있습니다. 일반 설정에는 Opus, G.711 μ-law, 하나 또는 두 개의 오디오 채널도 설명되어 있습니다.</p><p>이 Ailoot 카드는 텍스트를 입력받고 음성을 반환합니다. Turbo의 속도는 모델 변형의 용도에 해당합니다. 특정 응답의 길이와 확장 형식의 이용 가능 여부는 선택한 호출 방식에 따라 결정됩니다.</p><p>추가 오디오 설정에는 <strong>8, 16, 22.05, 24, 32, 44.1kHz</strong>의 샘플링 주파수가 있습니다. MP3에는 <strong>32, 64, 128, 256kbit/s</strong>의 비트레이트를 제공합니다. 음색을 바꾸고 넓은 공간의 에코, 홀 에코, 전화 소리, 로봇 목소리 중 하나의 효과를 적용할 수도 있습니다. 목소리 변경 효과는 오디오를 한 번에 받을 때 MP3, WAV, FLAC을 지원하고, 스트리밍에서는 MP3만 지원합니다. G.711 μ-law 형식은 8kHz를 사용합니다. 이러한 기능은 MiniMax의 합성 설정에 해당합니다.</p><p>개발사는 문장별, 단어별, 점진적 출력에서의 단어별 타임스탬프로 음성과 텍스트를 동기화하는 기능을 제공합니다. 이 결과는 발화와 텍스트 표시를 맞추는 데 도움이 됩니다. 추가 기능을 사용하려면 해당 응답 형식이 지원되어야 합니다.</p>",
  "aboutText": "### 인터랙티브 응답을 위한 빠른 음성\n\nSpeech 02 Turbo는 인터랙티브 음성 합성을 위한 모델입니다. 개발사는 속도, 안정적인 리듬, 자연스러운 소리의 조합을 설명합니다. 활용 사례에는 음성 응답, 게임의 대사, 인터랙티브 콘텐츠가 있습니다. 모델은 텍스트를 입력받고 음성 오디오를 생성합니다.\n\n### 소리의 성격 선택\n\nSpeech 02 제품군은 목소리, 언어, 억양, 감정 표현을 결합할 수 있습니다. 함께 학습하는 자기회귀 Transformer와 화자 인코더가 음색을 내용과 연결합니다. 미리 준비된 목소리로 텍스트를 합성할 수 있습니다. 새로운 복제 목소리를 만드는 것은 별도의 준비 과정에 해당합니다.\n\n모델은 텍스트에 따라 감정적 억양을 선택하거나, 지정한 기쁨, 슬픔, 분노, 두려움, 혐오, 놀람, 차분함을 사용합니다. 발화를 필요한 상호작용 속도에 맞추기 위해 속도, 음높이, 음량도 조절할 수 있습니다.\n\n### 언어와 단어 읽기\n\n러시아어와 함께 영어, 중국어, 광둥어, 일본어, 한국어, 프랑스어, 독일어, 스페인어, 포르투갈어, 튀르키예어, 아랍어, 우크라이나어 등 다른 언어를 지원합니다. 현재 Speech 02 사양에서는 페르시아어, 필리핀어, 타밀어를 별도로 제외합니다.\n\n발음은 대체 사전, 국제 음성 표기, 중국어 병음, 일본어 읽기 변형으로 구체화할 수 있습니다. 읽는 부분 사이에 **0.01~99.99초**의 멈춤을 지정합니다. 멈춤 길이는 소수점 이하 두 자리까지 지정합니다. 표시는 읽는 구간 사이에 넣으며 연속으로 배치하지 않습니다. 모델은 속도 **0.5~2**, 0 초과부터 **10**까지의 음량, **−12~12**의 음높이 변화를 제공합니다.\n\n### 재생할 오디오\n\n동기 입력은 **10 000자** 미만의 텍스트로 제한됩니다. 3000자가 넘으면 개발사는 점진적 출력을 권장합니다. 모델의 기능에는 MP3, WAV, FLAC, PCM이 있습니다. 일반 설정에는 Opus, G.711 μ-law, 하나 또는 두 개의 오디오 채널도 설명되어 있습니다.\n\n이 Ailoot 카드는 텍스트를 입력받고 음성을 반환합니다. Turbo의 속도는 모델 변형의 용도에 해당합니다. 특정 응답의 길이와 확장 형식의 이용 가능 여부는 선택한 호출 방식에 따라 결정됩니다.\n\n추가 오디오 설정에는 **8, 16, 22.05, 24, 32, 44.1kHz**의 샘플링 주파수가 있습니다. MP3에는 **32, 64, 128, 256kbit/s**의 비트레이트를 제공합니다. 음색을 바꾸고 넓은 공간의 에코, 홀 에코, 전화 소리, 로봇 목소리 중 하나의 효과를 적용할 수도 있습니다. 목소리 변경 효과는 오디오를 한 번에 받을 때 MP3, WAV, FLAC을 지원하고, 스트리밍에서는 MP3만 지원합니다. G.711 μ-law 형식은 8kHz를 사용합니다. 이러한 기능은 MiniMax의 합성 설정에 해당합니다.\n\n개발사는 문장별, 단어별, 점진적 출력에서의 단어별 타임스탬프로 음성과 텍스트를 동기화하는 기능을 제공합니다. 이 결과는 발화와 텍스트 표시를 맞추는 데 도움이 됩니다. 추가 기능을 사용하려면 해당 응답 형식이 지원되어야 합니다.",
  "editorialOverlay": {
    "copy_fields": null,
    "copy_sha256": null,
    "copy_source": null,
    "html_sha256": "6c94b85452c7cc24bb9e7634864561e5a74d4a7cfe42ea19b9eb66ef584c64bd",
    "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\">MM</span><h2 id=\"sheet-title\">speech-02-turbo</h2><button class=\"icon-btn\" type=\"button\" data-close-sheet aria-label=\"닫기\">×</button></div><div class=\"idline\"><span>MiniMax /</span><code>speech-02-turbo</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=\"Core|speech|/v1/audio/speech|speech-02-turbo\">음성 합성</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\">Speech-02 Turbo는 안정적인 리듬과 다언어 음성을 빠르게 합성하도록 설계되었습니다.</p><dl class=\"card-io\" data-card-io><div><dt>허용 입력</dt><dd>텍스트</dd></div><div><dt>결과</dt><dd>speech</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\"><h4>인터랙티브 응답을 위한 빠른 음성</h4><p>Speech 02 Turbo는 인터랙티브 음성 합성을 위한 모델입니다. 개발사는 속도, 안정적인 리듬, 자연스러운 소리의 조합을 설명합니다. 활용 사례에는 음성 응답, 게임의 대사, 인터랙티브 콘텐츠가 있습니다. 모델은 텍스트를 입력받고 음성 오디오를 생성합니다.</p><h4>소리의 성격 선택</h4><p>Speech 02 제품군은 목소리, 언어, 억양, 감정 표현을 결합할 수 있습니다. 함께 학습하는 자기회귀 Transformer와 화자 인코더가 음색을 내용과 연결합니다. 미리 준비된 목소리로 텍스트를 합성할 수 있습니다. 새로운 복제 목소리를 만드는 것은 별도의 준비 과정에 해당합니다.</p><p>모델은 텍스트에 따라 감정적 억양을 선택하거나, 지정한 기쁨, 슬픔, 분노, 두려움, 혐오, 놀람, 차분함을 사용합니다. 발화를 필요한 상호작용 속도에 맞추기 위해 속도, 음높이, 음량도 조절할 수 있습니다.</p><h4>언어와 단어 읽기</h4><p>러시아어와 함께 영어, 중국어, 광둥어, 일본어, 한국어, 프랑스어, 독일어, 스페인어, 포르투갈어, 튀르키예어, 아랍어, 우크라이나어 등 다른 언어를 지원합니다. 현재 Speech 02 사양에서는 페르시아어, 필리핀어, 타밀어를 별도로 제외합니다.</p><p>발음은 대체 사전, 국제 음성 표기, 중국어 병음, 일본어 읽기 변형으로 구체화할 수 있습니다. 읽는 부분 사이에 <strong>0.01~99.99초</strong>의 멈춤을 지정합니다. 멈춤 길이는 소수점 이하 두 자리까지 지정합니다. 표시는 읽는 구간 사이에 넣으며 연속으로 배치하지 않습니다. 모델은 속도 <strong>0.5~2</strong>, 0 초과부터 <strong>10</strong>까지의 음량, <strong>−12~12</strong>의 음높이 변화를 제공합니다.</p><h4>재생할 오디오</h4><p>동기 입력은 <strong>10 000자</strong> 미만의 텍스트로 제한됩니다. 3000자가 넘으면 개발사는 점진적 출력을 권장합니다. 모델의 기능에는 MP3, WAV, FLAC, PCM이 있습니다. 일반 설정에는 Opus, G.711 μ-law, 하나 또는 두 개의 오디오 채널도 설명되어 있습니다.</p><p>이 Ailoot 카드는 텍스트를 입력받고 음성을 반환합니다. Turbo의 속도는 모델 변형의 용도에 해당합니다. 특정 응답의 길이와 확장 형식의 이용 가능 여부는 선택한 호출 방식에 따라 결정됩니다.</p><p>추가 오디오 설정에는 <strong>8, 16, 22.05, 24, 32, 44.1kHz</strong>의 샘플링 주파수가 있습니다. MP3에는 <strong>32, 64, 128, 256kbit/s</strong>의 비트레이트를 제공합니다. 음색을 바꾸고 넓은 공간의 에코, 홀 에코, 전화 소리, 로봇 목소리 중 하나의 효과를 적용할 수도 있습니다. 목소리 변경 효과는 오디오를 한 번에 받을 때 MP3, WAV, FLAC을 지원하고, 스트리밍에서는 MP3만 지원합니다. G.711 μ-law 형식은 8kHz를 사용합니다. 이러한 기능은 MiniMax의 합성 설정에 해당합니다.</p><p>개발사는 문장별, 단어별, 점진적 출력에서의 단어별 타임스탬프로 음성과 텍스트를 동기화하는 기능을 제공합니다. 이 결과는 발화와 텍스트 표시를 맞추는 데 도움이 됩니다. 추가 기능을 사용하려면 해당 응답 형식이 지원되어야 합니다.</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 · 음성 합성</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>speech</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>speech-02-turbo</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>최대 길이(상한 제외): 10,000</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>패턴: ^[A-Za-z0-9_-]{1,128}$</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>material_types</code></th><td data-cell-label=\"명세\"><span class=\"card-cell-label\">명세</span>text</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>null</td></tr><tr><th data-cell-label=\"매개변수\" scope=\"row\"><span class=\"card-cell-label\">매개변수</span><code>optional_controls</code></th><td data-cell-label=\"명세\"><span class=\"card-cell-label\">명세</span>null</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\">메서드 형식과 ID는 정확합니다. 공급자의 기능 지원과 요청 수락은 별개입니다.</p></details></details></section><section class=\"card-section\" data-card-section=\"pricing\"><h3 tabindex=\"-1\">요금</h3><h4>Ailoot 메서드 요금</h4><section class=\"meth\" data-route=\"Core\"><header><b><span class=\"alias\">Ailoot</span> 음성 합성</b><code>POST /v1/audio/speech</code></header><dl><div><dt>입력</dt><dd>US$60.00 <em>1백만 문자당</em></dd></div></dl></section><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 · 음성 합성</h4><div class=\"code-group\"><div class=\"cg-bar\"><div class=\"cg-tabs\" role=\"tablist\" aria-label=\"코드 예제 형식\"><button class=\"cg-tab\" id=\"model-code-468-tab-0\" role=\"tab\" type=\"button\" aria-controls=\"model-code-468-panel-0\" aria-selected=\"true\" tabindex=\"0\">음성 예제</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-468-panel-0\" role=\"tabpanel\" aria-labelledby=\"model-code-468-tab-0\"><pre data-lang=\"bash\"><code>set -eu\n: &quot;${AILOOT_API_KEY:?Set your Ailoot API key}&quot;\n: &quot;${AILOOT_TEXT_FILE:?Set your actual UTF-8 narration script}&quot;\nexport AILOOT_TEXT_FILE\n: &quot;${AILOOT_VOICE_ID:?Set the actual accepted voice ID for this model}&quot;\nexport AILOOT_VOICE_ID\npython3 - &lt;&lt;&#39;PY_REQUEST&#39;\nimport json,os\nfrom pathlib import Path\np=json.loads(&#39;{&quot;model&quot;: &quot;speech-02-turbo&quot;, &quot;input&quot;: &quot;&quot;}&#39;)\nf=Path(os.environ[&quot;AILOOT_TEXT_FILE&quot;])\nif not f.is_file():raise SystemExit(&quot;Choose your actual UTF-8 source material&quot;)\ntext=f.read_text(encoding=&quot;utf-8&quot;)\nif not text.strip():raise SystemExit(&quot;Source material must contain text&quot;)\np[&quot;input&quot;]=text\nimport re\nvoice=os.environ[&quot;AILOOT_VOICE_ID&quot;]\nif not re.fullmatch(r&quot;[A-Za-z0-9_-]{1,128}&quot;,voice):raise SystemExit(&quot;Set an actual accepted voice ID&quot;)\np[&quot;voice&quot;]=voice\nPath(&quot;request.json&quot;).write_text(json.dumps(p,ensure_ascii=False))\nPY_REQUEST\ncurl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/audio/speech \\\n  -H &quot;Authorization: Bearer $AILOOT_API_KEY&quot; -H &#39;Content-Type: application/json&#39; \\\n  --data-binary @request.json -D response-headers.txt -o speech.mp3\n</code></pre></div></div></div></section><section class=\"card-section\" data-card-section=\"results\"><h3 tabindex=\"-1\">결과 수신 및 저장</h3><h4>Ailoot · 음성 합성</h4><p class=\"note-s\">mp3</p><ul class=\"card-result-paths\"><li><code>GET /v1/media/tasks/{task_id}</code></li><li><code>GET /v1/media/assets/{asset_id}/content</code></li><li><code>GET /v1/media/assets</code></li><li><code>GET /v1/media/assets/{asset_id}</code></li></ul><div class=\"card-result-process\" data-all-results><h5>완료된 결과 모두 보관</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=\"Core\"><b>Ailoot</b> <a href=\"#m=speech-02-turbo&amp;route=Core&amp;caller=speech-02-turbo&amp;fmt=speech\"><code>speech-02-turbo</code></a></span></p><h4>메서드 경로 별칭</h4><p class=\"note-s\">위에 표시된 메서드 경로를 사용하세요.</p><h4>관련 호출용 ID</h4><p class=\"note-s\"><a href=\"#m=speech-02-turbo&amp;route=Core&amp;caller=speech-02-turbo&amp;fmt=speech\"><code>speech-02-turbo</code></a></p></section></div>",
      "method_identity": {
        "effective_request_model_id": "speech-02-turbo",
        "fmt": "speech",
        "http": "POST",
        "path": "/v1/audio/speech",
        "request_model_id": "speech-02-turbo",
        "route_label": "Core"
      },
      "method_key": "Core|speech|/v1/audio/speech|speech-02-turbo",
      "ordinal": 0,
      "rawMethod": {
        "cache_read": null,
        "cache_write": null,
        "cache_write_1h": null,
        "cache_write_5m": null,
        "conditional_meter": null,
        "contract": {
          "data": {
            "all_results": "Keep the complete binary result and headers. If JSON/multiple outputs are returned, retain every data item and fetch each actual signed asset URL.",
            "errors": [
              {
                "code": null,
                "condition": "필수 필드, 자료 표현 방식 또는 파라미터 값이 올바르지 않음",
                "http_status": 400,
                "recovery": "새 생성 요청 전에 표시된 필드를 수정하세요.",
                "type": "invalid_request_error"
              },
              {
                "code": null,
                "condition": "반환된 응답에 작업 또는 결과 확인이 필요하다고 표시되어 있습니다",
                "http_status": null,
                "recovery": "최초로 반환된 작업/태스크 ID, 요청 헤더와 응답을 보관하고, 지원되는 조회 방식으로 해당 최초 작업을 계속 조회하세요. 생성 요청을 다시 제출하지 마세요.",
                "type": "server_error"
              }
            ],
            "hints": [
              "MiniMax accepts optionalresponse_formatmp3. Actual voice IDs come from the selected model voice profile.",
              "The facade uses bufferedMP3; provider speed/volume/pitch/sample-rate fields are fixed by the adapter, not callercontrols."
            ],
            "ignored_fields": [],
            "lifecycle": {
              "all_results": "Follow everyactualreturnedoutputandownedasset; no result is discardedbecauseindex0orcontent_urlalreadyexists.",
              "assets": [
                {
                  "http": "GET",
                  "path": "/v1/media/assets"
                },
                {
                  "http": "GET",
                  "path": "/v1/media/assets/{asset_id}"
                }
              ],
              "content": [
                {
                  "http": "GET",
                  "path": "/v1/media/assets/{asset_id}/content",
                  "url_source": "exact returned signed URL; never construct token"
                }
              ],
              "mode": "synchronous_result_then_owned_library",
              "operation_id_is_not_task_id": true,
              "status": [
                {
                  "http": "GET",
                  "id_source": "actual returned task_id or media library record",
                  "path": "/v1/media/tasks/{task_id}"
                }
              ],
              "unknown": "다시 제출하지 말고 정산 대조를 위해 최초 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"
            },
            "parameters": [
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": [
                  "speech-02-turbo"
                ],
                "enum_known": true,
                "name": "model",
                "required": true,
                "type": "string"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": null,
                "enum_known": false,
                "maximum_length_exclusive": 10000,
                "min_length": 1,
                "name": "input",
                "required": true,
                "type": "string",
                "unit": "Unicode 문자"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": null,
                "enum_known": false,
                "name": "voice",
                "pattern": "^[A-Za-z0-9_-]{1,128}$",
                "required": true,
                "type": "string"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": [
                  "mp3"
                ],
                "enum_known": true,
                "name": "response_format",
                "required": false,
                "type": "string"
              }
            ],
            "profile_binding": "Exact existing Ailoot model and method; interface constraints below do not assert provider qualification.",
            "unsupported": []
          },
          "hints": [
            "메서드 형식과 ID는 정확합니다. 공급자의 기능 지원과 요청 수락은 별개입니다."
          ],
          "input": {
            "material_types": [
              "text"
            ],
            "optional_controls": null,
            "required": null
          },
          "lifecycle": {
            "assets": [
              {
                "http": "GET",
                "path": "/v1/media/assets"
              },
              {
                "http": "GET",
                "path": "/v1/media/assets/{asset_id}"
              }
            ],
            "content": [
              {
                "http": "GET",
                "path": "/v1/media/assets/{asset_id}/content",
                "url_source": "exact returned signed URL; never construct token"
              }
            ],
            "mode": "synchronous_result_then_owned_library",
            "operation_id_is_not_task_id": true,
            "status": [
              {
                "http": "GET",
                "id_source": "실제로 반환된 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."
          },
          "method": {
            "http": "POST",
            "path": "/v1/audio/speech"
          },
          "operation_modes": [
            "audio_speech"
          ],
          "output": {
            "family": [
              "speech"
            ],
            "format": null,
            "multioutputs": "retain every actual response output"
          }
        },
        "ctx": null,
        "examples": [
          {
            "code": "set -eu\n: \"${AILOOT_API_KEY:?Set your Ailoot API key}\"\n: \"${AILOOT_TEXT_FILE:?Set your actual UTF-8 narration script}\"\nexport AILOOT_TEXT_FILE\n: \"${AILOOT_VOICE_ID:?Set the actual accepted voice ID for this model}\"\nexport AILOOT_VOICE_ID\npython3 - <<'PY_REQUEST'\nimport json,os\nfrom pathlib import Path\np=json.loads('{\"model\": \"speech-02-turbo\", \"input\": \"\"}')\nf=Path(os.environ[\"AILOOT_TEXT_FILE\"])\nif not f.is_file():raise SystemExit(\"Choose your actual UTF-8 source material\")\ntext=f.read_text(encoding=\"utf-8\")\nif not text.strip():raise SystemExit(\"Source material must contain text\")\np[\"input\"]=text\nimport re\nvoice=os.environ[\"AILOOT_VOICE_ID\"]\nif not re.fullmatch(r\"[A-Za-z0-9_-]{1,128}\",voice):raise SystemExit(\"Set an actual accepted voice ID\")\np[\"voice\"]=voice\nPath(\"request.json\").write_text(json.dumps(p,ensure_ascii=False))\nPY_REQUEST\ncurl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/audio/speech \\\n  -H \"Authorization: Bearer $AILOOT_API_KEY\" -H 'Content-Type: application/json' \\\n  --data-binary @request.json -D response-headers.txt -o speech.mp3\n",
            "label": "Synthesize your actual script",
            "language": "bash"
          }
        ],
        "family": "openai",
        "fast_multiplier": null,
        "flex_multiplier": null,
        "fmt": "speech",
        "http": "POST",
        "img_in": null,
        "img_out": null,
        "in": null,
        "input": [
          "text"
        ],
        "label": "음성 합성",
        "max_out": null,
        "max_tool_calls": null,
        "out": null,
        "output": [
          "speech"
        ],
        "path": "/v1/audio/speech",
        "pricing_profiles": [
          {
            "dimensions": {},
            "label": "Core",
            "units": [
              {
                "amount": 60,
                "amount_unit": "usd_per_display_unit",
                "key": "tts_million_chars",
                "label": "per 1 million characters",
                "side": "in"
              }
            ]
          }
        ],
        "request_model_id": "speech-02-turbo",
        "route_label": "Core",
        "status_reads": [],
        "tiers": [],
        "tool_prices": null,
        "unit": "tts_million_chars",
        "units": [
          {
            "key": "tts_million_chars",
            "label": "per 1 million characters",
            "side": "in",
            "usd": 60
          }
        ]
      }
    }
  ],
  "model_id": "speech-02-turbo",
  "nativeProvenance": {
    "input_facts_canonical_sha256": "5d11d529906d6efdcf9b6abb387a51e16a74cd66ac2c81dad297df84ae0c5c1e",
    "input_html_sha256": "bfd1e3c5fe673875cc4947eb281a1bf04d5acd5cdae59170849e7c65091f1421",
    "private_audit_sha256": "0f9e59b1e09192ad97dc8fbfd8853070f2e9ebbf5ab4330b38c0f6e368a283d9",
    "role": "historical-normalized-input-audit-hashes",
    "schema": "ailoot-native-model-provenance-v2"
  },
  "page": {
    "canonical": "https://ailoot.ai/models/ko/speech-02-turbo/",
    "description": "Speech-02 Turbo는 안정적인 리듬과 다언어 음성을 빠르게 합성하도록 설계되었습니다.",
    "locale": "ko",
    "md_url": "https://ailoot.ai/models/ko/speech-02-turbo/index.md",
    "title": "speech-02-turbo — Ailoot",
    "url": "https://ailoot.ai/models/ko/speech-02-turbo/"
  },
  "rawModel": {
    "about": "### 인터랙티브 응답을 위한 빠른 음성\n\nSpeech 02 Turbo는 인터랙티브 음성 합성을 위한 모델입니다. 개발사는 속도, 안정적인 리듬, 자연스러운 소리의 조합을 설명합니다. 활용 사례에는 음성 응답, 게임의 대사, 인터랙티브 콘텐츠가 있습니다. 모델은 텍스트를 입력받고 음성 오디오를 생성합니다.\n\n### 소리의 성격 선택\n\nSpeech 02 제품군은 목소리, 언어, 억양, 감정 표현을 결합할 수 있습니다. 함께 학습하는 자기회귀 Transformer와 화자 인코더가 음색을 내용과 연결합니다. 미리 준비된 목소리로 텍스트를 합성할 수 있습니다. 새로운 복제 목소리를 만드는 것은 별도의 준비 과정에 해당합니다.\n\n모델은 텍스트에 따라 감정적 억양을 선택하거나, 지정한 기쁨, 슬픔, 분노, 두려움, 혐오, 놀람, 차분함을 사용합니다. 발화를 필요한 상호작용 속도에 맞추기 위해 속도, 음높이, 음량도 조절할 수 있습니다.\n\n### 언어와 단어 읽기\n\n러시아어와 함께 영어, 중국어, 광둥어, 일본어, 한국어, 프랑스어, 독일어, 스페인어, 포르투갈어, 튀르키예어, 아랍어, 우크라이나어 등 다른 언어를 지원합니다. 현재 Speech 02 사양에서는 페르시아어, 필리핀어, 타밀어를 별도로 제외합니다.\n\n발음은 대체 사전, 국제 음성 표기, 중국어 병음, 일본어 읽기 변형으로 구체화할 수 있습니다. 읽는 부분 사이에 **0.01~99.99초**의 멈춤을 지정합니다. 멈춤 길이는 소수점 이하 두 자리까지 지정합니다. 표시는 읽는 구간 사이에 넣으며 연속으로 배치하지 않습니다. 모델은 속도 **0.5~2**, 0 초과부터 **10**까지의 음량, **−12~12**의 음높이 변화를 제공합니다.\n\n### 재생할 오디오\n\n동기 입력은 **10 000자** 미만의 텍스트로 제한됩니다. 3000자가 넘으면 개발사는 점진적 출력을 권장합니다. 모델의 기능에는 MP3, WAV, FLAC, PCM이 있습니다. 일반 설정에는 Opus, G.711 μ-law, 하나 또는 두 개의 오디오 채널도 설명되어 있습니다.\n\n이 Ailoot 카드는 텍스트를 입력받고 음성을 반환합니다. Turbo의 속도는 모델 변형의 용도에 해당합니다. 특정 응답의 길이와 확장 형식의 이용 가능 여부는 선택한 호출 방식에 따라 결정됩니다.\n\n추가 오디오 설정에는 **8, 16, 22.05, 24, 32, 44.1kHz**의 샘플링 주파수가 있습니다. MP3에는 **32, 64, 128, 256kbit/s**의 비트레이트를 제공합니다. 음색을 바꾸고 넓은 공간의 에코, 홀 에코, 전화 소리, 로봇 목소리 중 하나의 효과를 적용할 수도 있습니다. 목소리 변경 효과는 오디오를 한 번에 받을 때 MP3, WAV, FLAC을 지원하고, 스트리밍에서는 MP3만 지원합니다. G.711 μ-law 형식은 8kHz를 사용합니다. 이러한 기능은 MiniMax의 합성 설정에 해당합니다.\n\n개발사는 문장별, 단어별, 점진적 출력에서의 단어별 타임스탬프로 음성과 텍스트를 동기화하는 기능을 제공합니다. 이 결과는 발화와 텍스트 표시를 맞추는 데 도움이 됩니다. 추가 기능을 사용하려면 해당 응답 형식이 지원되어야 합니다.",
    "alias_of": null,
    "aliases": [],
    "author": "MiniMax",
    "ctx": null,
    "formats": [
      "speech"
    ],
    "id": "speech-02-turbo",
    "input": [
      "text"
    ],
    "kind": "speech",
    "max_out": null,
    "methods": [
      {
        "cache_read": null,
        "cache_write": null,
        "cache_write_1h": null,
        "cache_write_5m": null,
        "conditional_meter": null,
        "contract": {
          "data": {
            "all_results": "Keep the complete binary result and headers. If JSON/multiple outputs are returned, retain every data item and fetch each actual signed asset URL.",
            "errors": [
              {
                "code": null,
                "condition": "필수 필드, 자료 표현 방식 또는 파라미터 값이 올바르지 않음",
                "http_status": 400,
                "recovery": "새 생성 요청 전에 표시된 필드를 수정하세요.",
                "type": "invalid_request_error"
              },
              {
                "code": null,
                "condition": "반환된 응답에 작업 또는 결과 확인이 필요하다고 표시되어 있습니다",
                "http_status": null,
                "recovery": "최초로 반환된 작업/태스크 ID, 요청 헤더와 응답을 보관하고, 지원되는 조회 방식으로 해당 최초 작업을 계속 조회하세요. 생성 요청을 다시 제출하지 마세요.",
                "type": "server_error"
              }
            ],
            "hints": [
              "MiniMax accepts optionalresponse_formatmp3. Actual voice IDs come from the selected model voice profile.",
              "The facade uses bufferedMP3; provider speed/volume/pitch/sample-rate fields are fixed by the adapter, not callercontrols."
            ],
            "ignored_fields": [],
            "lifecycle": {
              "all_results": "Follow everyactualreturnedoutputandownedasset; no result is discardedbecauseindex0orcontent_urlalreadyexists.",
              "assets": [
                {
                  "http": "GET",
                  "path": "/v1/media/assets"
                },
                {
                  "http": "GET",
                  "path": "/v1/media/assets/{asset_id}"
                }
              ],
              "content": [
                {
                  "http": "GET",
                  "path": "/v1/media/assets/{asset_id}/content",
                  "url_source": "exact returned signed URL; never construct token"
                }
              ],
              "mode": "synchronous_result_then_owned_library",
              "operation_id_is_not_task_id": true,
              "status": [
                {
                  "http": "GET",
                  "id_source": "actual returned task_id or media library record",
                  "path": "/v1/media/tasks/{task_id}"
                }
              ],
              "unknown": "다시 제출하지 말고 정산 대조를 위해 최초 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"
            },
            "parameters": [
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": [
                  "speech-02-turbo"
                ],
                "enum_known": true,
                "name": "model",
                "required": true,
                "type": "string"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": null,
                "enum_known": false,
                "maximum_length_exclusive": 10000,
                "min_length": 1,
                "name": "input",
                "required": true,
                "type": "string",
                "unit": "Unicode 문자"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": null,
                "enum_known": false,
                "name": "voice",
                "pattern": "^[A-Za-z0-9_-]{1,128}$",
                "required": true,
                "type": "string"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": [
                  "mp3"
                ],
                "enum_known": true,
                "name": "response_format",
                "required": false,
                "type": "string"
              }
            ],
            "profile_binding": "Exact existing Ailoot model and method; interface constraints below do not assert provider qualification.",
            "unsupported": []
          },
          "hints": [
            "메서드 형식과 ID는 정확합니다. 공급자의 기능 지원과 요청 수락은 별개입니다."
          ],
          "input": {
            "material_types": [
              "text"
            ],
            "optional_controls": null,
            "required": null
          },
          "lifecycle": {
            "assets": [
              {
                "http": "GET",
                "path": "/v1/media/assets"
              },
              {
                "http": "GET",
                "path": "/v1/media/assets/{asset_id}"
              }
            ],
            "content": [
              {
                "http": "GET",
                "path": "/v1/media/assets/{asset_id}/content",
                "url_source": "exact returned signed URL; never construct token"
              }
            ],
            "mode": "synchronous_result_then_owned_library",
            "operation_id_is_not_task_id": true,
            "status": [
              {
                "http": "GET",
                "id_source": "실제로 반환된 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."
          },
          "method": {
            "http": "POST",
            "path": "/v1/audio/speech"
          },
          "operation_modes": [
            "audio_speech"
          ],
          "output": {
            "family": [
              "speech"
            ],
            "format": null,
            "multioutputs": "retain every actual response output"
          }
        },
        "ctx": null,
        "examples": [
          {
            "code": "set -eu\n: \"${AILOOT_API_KEY:?Set your Ailoot API key}\"\n: \"${AILOOT_TEXT_FILE:?Set your actual UTF-8 narration script}\"\nexport AILOOT_TEXT_FILE\n: \"${AILOOT_VOICE_ID:?Set the actual accepted voice ID for this model}\"\nexport AILOOT_VOICE_ID\npython3 - <<'PY_REQUEST'\nimport json,os\nfrom pathlib import Path\np=json.loads('{\"model\": \"speech-02-turbo\", \"input\": \"\"}')\nf=Path(os.environ[\"AILOOT_TEXT_FILE\"])\nif not f.is_file():raise SystemExit(\"Choose your actual UTF-8 source material\")\ntext=f.read_text(encoding=\"utf-8\")\nif not text.strip():raise SystemExit(\"Source material must contain text\")\np[\"input\"]=text\nimport re\nvoice=os.environ[\"AILOOT_VOICE_ID\"]\nif not re.fullmatch(r\"[A-Za-z0-9_-]{1,128}\",voice):raise SystemExit(\"Set an actual accepted voice ID\")\np[\"voice\"]=voice\nPath(\"request.json\").write_text(json.dumps(p,ensure_ascii=False))\nPY_REQUEST\ncurl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/audio/speech \\\n  -H \"Authorization: Bearer $AILOOT_API_KEY\" -H 'Content-Type: application/json' \\\n  --data-binary @request.json -D response-headers.txt -o speech.mp3\n",
            "label": "Synthesize your actual script",
            "language": "bash"
          }
        ],
        "family": "openai",
        "fast_multiplier": null,
        "flex_multiplier": null,
        "fmt": "speech",
        "http": "POST",
        "img_in": null,
        "img_out": null,
        "in": null,
        "input": [
          "text"
        ],
        "label": "음성 합성",
        "max_out": null,
        "max_tool_calls": null,
        "out": null,
        "output": [
          "speech"
        ],
        "path": "/v1/audio/speech",
        "pricing_profiles": [
          {
            "dimensions": {},
            "label": "Core",
            "units": [
              {
                "amount": 60,
                "amount_unit": "usd_per_display_unit",
                "key": "tts_million_chars",
                "label": "per 1 million characters",
                "side": "in"
              }
            ]
          }
        ],
        "request_model_id": "speech-02-turbo",
        "route_label": "Core",
        "status_reads": [],
        "tiers": [],
        "tool_prices": null,
        "unit": "tts_million_chars",
        "units": [
          {
            "key": "tts_million_chars",
            "label": "per 1 million characters",
            "side": "in",
            "usd": 60
          }
        ]
      }
    ],
    "model_aliases": [
      {
        "canonical_model_id": "speech-02-turbo",
        "request_model_id": "speech-02-turbo",
        "route_label": "Core"
      }
    ],
    "name": "speech-02-turbo",
    "price": {
      "in": 60,
      "in_label": "per 1 million characters",
      "out": null,
      "out_label": null,
      "sort_in": null,
      "sort_out": null,
      "varies": false
    },
    "short": "Speech-02 Turbo는 안정적인 리듬과 다언어 음성을 빠르게 합성하도록 설계되었습니다."
  },
  "renderer_schema": {
    "method_order": "Original DTO methods order; every exact route/format/path/caller survives.",
    "prices": "Original public DTO fields and original native display HTML; no flattened or normalized offers."
  },
  "representation": "exact-public-dto-and-native-renderer-html",
  "representationNotes": {
    "current_reference": {
      "about_json_pointer": "/aboutHtml",
      "methods": [
        {
          "contract_json_pointer": "/methods/0/rawMethod/contract",
          "html_json_pointer": "/methods/0/html",
          "method_ordinal": 0
        }
      ],
      "role": "current-semantic-reference"
    },
    "raw_input": {
      "examples_role": "historical-input-not-current-ready-examples",
      "json_pointers": [
        "/rawModel",
        "/methods/0/rawMethod"
      ],
      "role": "historical-owner-input"
    },
    "schema": "ailoot-native-model-representations-v1"
  },
  "schema": "ailoot-static-model-facts-v1",
  "schema_version": 1,
  "shortText": "Speech-02 Turbo는 안정적인 리듬과 다언어 음성을 빠르게 합성하도록 설계되었습니다.",
  "source": {
    "audit_sha256": "2e00086bcbfc28e64d0cebe97aa47c17d8d5618963027f8ffb9dc6123d7d25b1",
    "bridge_map_sha256": "1125275768b9636fc8461bc7da5061239a81ddfe508e2557843ca42c58ab0036",
    "raw_model_json_sha256": "e5cdfd90f98cb01aef1ae83cc119a15cd36272928bbe5b7c48b31f5635a55465",
    "renderer_sha256": "6825a317438b70ab0939441dcebefece462384e77f7e96cce899605c4b208caa"
  },
  "sourceRevision": "063b0e141ed3b379cb4094f977d7d097ed78518fad89e143785a5f7f2fdcb43b"
}
