{
  "aboutHtml": "<h4>음성 과정을 위한 발화</h4><p>Speech 2.6 Turbo는 속도에 초점을 맞춘 음성 합성 버전입니다. 개발사는 텍스트가 점진적으로 응답이 되는 음성 도우미와 인터랙티브 사례를 위한 모델로 설명합니다. Speech 2.6 세대의 자연스러운 억양을 유지하며 특별한 표기 형식을 처리할 수 있습니다.</p><h4>정확히 읽어야 하는 텍스트</h4><p>모델은 각 표기를 미리 수동으로 바꾸지 않고 날짜, 전화번호, 금액, 페이지 주소, 이메일을 읽도록 설계되었습니다. 이런 분석은 일반 단어와 함께 숫자 및 기호가 나오는 동적 메시지에 유용합니다. 개발사는 여러 언어에서의 형식 처리를 설명합니다.</p><h4>유창성과 감정 제어</h4><p>Speech 2.6는 Fluent LoRA를 지원합니다. 알아볼 수 있는 음색을 유지하면서 텍스트를 더 유창하게 읽는 기능입니다. 이미 준비한 목소리의 사용에 해당하며, 별도의 복제 목소리 준비는 일반 텍스트 요청의 일부가 아닙니다. 제품군에는 러시아어를 포함한 <strong>40개 언어</strong>가 있습니다.</p><p>Turbo에는 일곱 가지 기본 감정과 추가 모드 <code>fluent</code>, <code>whisper</code>가 있습니다. 모델이 내용에 따라 감정 표현을 선택하거나 지정한 상태를 사용할 수 있습니다. 소리의 깊이와 속도는 텍스트와 별도로 바꿀 수 있습니다.</p><h4>목소리, 멈춤, 발음</h4><p>MiniMax는 목소리 선택과 속도, 음량, 음높이 제어를 제공합니다. 속도는 <strong>0.5~2</strong>, 음량은 0 초과부터 <strong>10</strong>까지, 음높이 변화는 <strong>−12~12</strong>로 지정합니다. 감정은 텍스트의 의미에 따라 모델이 선택하게 하거나 기쁨, 슬픔, 분노, 두려움, 혐오, 놀람, 차분함 중에서 수동으로 지정할 수 있습니다.</p><p>발음은 대체 사전과 음성 표기로 구체화할 수 있습니다. 국제 음성 기호, 중국어 병음, 일본어 읽기 변형이 제공됩니다. 읽는 구간 사이에 <strong>0.01~99.99초</strong>의 멈춤을 지정합니다. 멈춤 길이는 소수점 이하 두 자리까지 지정합니다. 표시는 읽는 구간 사이에 넣으며 연속으로 배치하지 않습니다. 이런 설정으로 이름, 약어, 모호한 단어의 발음을 음성 제작 의도에 맞출 수 있습니다.</p><h4>오디오 받기</h4><p>합성은 <strong>10 000자</strong> 미만의 텍스트를 입력받습니다. 3000자를 넘는 긴 텍스트에는 개발사가 스트리밍 출력을 권장합니다. 완성된 오디오를 한 번에 받는 방식도 제공합니다. 일반 합성 설정에는 MP3, PCM, FLAC, WAV, Opus, G.711 μ-law 변형, 모노 또는 스테레오가 포함됩니다. 특정 요청에서 사용할 수 있는 형식은 Ailoot의 수단으로 정해집니다.</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 2.6 Turbo는 속도에 초점을 맞춘 음성 합성 버전입니다. 개발사는 텍스트가 점진적으로 응답이 되는 음성 도우미와 인터랙티브 사례를 위한 모델로 설명합니다. Speech 2.6 세대의 자연스러운 억양을 유지하며 특별한 표기 형식을 처리할 수 있습니다.\n\n### 정확히 읽어야 하는 텍스트\n\n모델은 각 표기를 미리 수동으로 바꾸지 않고 날짜, 전화번호, 금액, 페이지 주소, 이메일을 읽도록 설계되었습니다. 이런 분석은 일반 단어와 함께 숫자 및 기호가 나오는 동적 메시지에 유용합니다. 개발사는 여러 언어에서의 형식 처리를 설명합니다.\n\n### 유창성과 감정 제어\n\nSpeech 2.6는 Fluent LoRA를 지원합니다. 알아볼 수 있는 음색을 유지하면서 텍스트를 더 유창하게 읽는 기능입니다. 이미 준비한 목소리의 사용에 해당하며, 별도의 복제 목소리 준비는 일반 텍스트 요청의 일부가 아닙니다. 제품군에는 러시아어를 포함한 **40개 언어**가 있습니다.\n\nTurbo에는 일곱 가지 기본 감정과 추가 모드 `fluent`, `whisper`가 있습니다. 모델이 내용에 따라 감정 표현을 선택하거나 지정한 상태를 사용할 수 있습니다. 소리의 깊이와 속도는 텍스트와 별도로 바꿀 수 있습니다.\n\n### 목소리, 멈춤, 발음\n\nMiniMax는 목소리 선택과 속도, 음량, 음높이 제어를 제공합니다. 속도는 **0.5~2**, 음량은 0 초과부터 **10**까지, 음높이 변화는 **−12~12**로 지정합니다. 감정은 텍스트의 의미에 따라 모델이 선택하게 하거나 기쁨, 슬픔, 분노, 두려움, 혐오, 놀람, 차분함 중에서 수동으로 지정할 수 있습니다.\n\n발음은 대체 사전과 음성 표기로 구체화할 수 있습니다. 국제 음성 기호, 중국어 병음, 일본어 읽기 변형이 제공됩니다. 읽는 구간 사이에 **0.01~99.99초**의 멈춤을 지정합니다. 멈춤 길이는 소수점 이하 두 자리까지 지정합니다. 표시는 읽는 구간 사이에 넣으며 연속으로 배치하지 않습니다. 이런 설정으로 이름, 약어, 모호한 단어의 발음을 음성 제작 의도에 맞출 수 있습니다.\n\n### 오디오 받기\n\n합성은 **10 000자** 미만의 텍스트를 입력받습니다. 3000자를 넘는 긴 텍스트에는 개발사가 스트리밍 출력을 권장합니다. 완성된 오디오를 한 번에 받는 방식도 제공합니다. 일반 합성 설정에는 MP3, PCM, FLAC, WAV, Opus, G.711 μ-law 변형, 모노 또는 스테레오가 포함됩니다. 특정 요청에서 사용할 수 있는 형식은 Ailoot의 수단으로 정해집니다.\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": "b89cae66033203b2ca7539efc62bc9e218c6bde0d24b9d479cde406d74f5098c",
    "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-2.6-turbo</h2><button class=\"icon-btn\" type=\"button\" data-close-sheet aria-label=\"닫기\">×</button></div><div class=\"idline\"><span>MiniMax /</span><code>speech-2.6-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-2.6-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 2.6 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 2.6 Turbo는 속도에 초점을 맞춘 음성 합성 버전입니다. 개발사는 텍스트가 점진적으로 응답이 되는 음성 도우미와 인터랙티브 사례를 위한 모델로 설명합니다. Speech 2.6 세대의 자연스러운 억양을 유지하며 특별한 표기 형식을 처리할 수 있습니다.</p><h4>정확히 읽어야 하는 텍스트</h4><p>모델은 각 표기를 미리 수동으로 바꾸지 않고 날짜, 전화번호, 금액, 페이지 주소, 이메일을 읽도록 설계되었습니다. 이런 분석은 일반 단어와 함께 숫자 및 기호가 나오는 동적 메시지에 유용합니다. 개발사는 여러 언어에서의 형식 처리를 설명합니다.</p><h4>유창성과 감정 제어</h4><p>Speech 2.6는 Fluent LoRA를 지원합니다. 알아볼 수 있는 음색을 유지하면서 텍스트를 더 유창하게 읽는 기능입니다. 이미 준비한 목소리의 사용에 해당하며, 별도의 복제 목소리 준비는 일반 텍스트 요청의 일부가 아닙니다. 제품군에는 러시아어를 포함한 <strong>40개 언어</strong>가 있습니다.</p><p>Turbo에는 일곱 가지 기본 감정과 추가 모드 <code>fluent</code>, <code>whisper</code>가 있습니다. 모델이 내용에 따라 감정 표현을 선택하거나 지정한 상태를 사용할 수 있습니다. 소리의 깊이와 속도는 텍스트와 별도로 바꿀 수 있습니다.</p><h4>목소리, 멈춤, 발음</h4><p>MiniMax는 목소리 선택과 속도, 음량, 음높이 제어를 제공합니다. 속도는 <strong>0.5~2</strong>, 음량은 0 초과부터 <strong>10</strong>까지, 음높이 변화는 <strong>−12~12</strong>로 지정합니다. 감정은 텍스트의 의미에 따라 모델이 선택하게 하거나 기쁨, 슬픔, 분노, 두려움, 혐오, 놀람, 차분함 중에서 수동으로 지정할 수 있습니다.</p><p>발음은 대체 사전과 음성 표기로 구체화할 수 있습니다. 국제 음성 기호, 중국어 병음, 일본어 읽기 변형이 제공됩니다. 읽는 구간 사이에 <strong>0.01~99.99초</strong>의 멈춤을 지정합니다. 멈춤 길이는 소수점 이하 두 자리까지 지정합니다. 표시는 읽는 구간 사이에 넣으며 연속으로 배치하지 않습니다. 이런 설정으로 이름, 약어, 모호한 단어의 발음을 음성 제작 의도에 맞출 수 있습니다.</p><h4>오디오 받기</h4><p>합성은 <strong>10 000자</strong> 미만의 텍스트를 입력받습니다. 3000자를 넘는 긴 텍스트에는 개발사가 스트리밍 출력을 권장합니다. 완성된 오디오를 한 번에 받는 방식도 제공합니다. 일반 합성 설정에는 MP3, PCM, FLAC, WAV, Opus, G.711 μ-law 변형, 모노 또는 스테레오가 포함됩니다. 특정 요청에서 사용할 수 있는 형식은 Ailoot의 수단으로 정해집니다.</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-2.6-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-470-tab-0\" role=\"tab\" type=\"button\" aria-controls=\"model-code-470-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-470-panel-0\" role=\"tabpanel\" aria-labelledby=\"model-code-470-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-2.6-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-2.6-turbo&amp;route=Core&amp;caller=speech-2.6-turbo&amp;fmt=speech\"><code>speech-2.6-turbo</code></a></span></p><h4>메서드 경로 별칭</h4><p class=\"note-s\">위에 표시된 메서드 경로를 사용하세요.</p><h4>관련 호출용 ID</h4><p class=\"note-s\"><a href=\"#m=speech-2.6-turbo&amp;route=Core&amp;caller=speech-2.6-turbo&amp;fmt=speech\"><code>speech-2.6-turbo</code></a></p></section></div>",
      "method_identity": {
        "effective_request_model_id": "speech-2.6-turbo",
        "fmt": "speech",
        "http": "POST",
        "path": "/v1/audio/speech",
        "request_model_id": "speech-2.6-turbo",
        "route_label": "Core"
      },
      "method_key": "Core|speech|/v1/audio/speech|speech-2.6-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-2.6-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-2.6-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-2.6-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-2.6-turbo",
  "nativeProvenance": {
    "input_facts_canonical_sha256": "52113b73edad9edeb5bed3bd822904e70c287fc45214f7315b13fd59fc54201f",
    "input_html_sha256": "17f5b23001aede6e529185cbd9529e123b1242919276c37d340b389ef9a5eaca",
    "private_audit_sha256": "0e610ae688afecfd2b533d1a4812b2f567de4f463f3e9f9334898ba5b00ee8c9",
    "role": "historical-normalized-input-audit-hashes",
    "schema": "ailoot-native-model-provenance-v2"
  },
  "page": {
    "canonical": "https://ailoot.ai/models/ko/speech-2-6-turbo/",
    "description": "Speech 2.6 Turbo는 다언어 음성을 합성하며, 짧은 응답 지연 시간에 초점을 맞춥니다.",
    "locale": "ko",
    "md_url": "https://ailoot.ai/models/ko/speech-2-6-turbo/index.md",
    "title": "speech-2.6-turbo — Ailoot",
    "url": "https://ailoot.ai/models/ko/speech-2-6-turbo/"
  },
  "rawModel": {
    "about": "### 음성 과정을 위한 발화\n\nSpeech 2.6 Turbo는 속도에 초점을 맞춘 음성 합성 버전입니다. 개발사는 텍스트가 점진적으로 응답이 되는 음성 도우미와 인터랙티브 사례를 위한 모델로 설명합니다. Speech 2.6 세대의 자연스러운 억양을 유지하며 특별한 표기 형식을 처리할 수 있습니다.\n\n### 정확히 읽어야 하는 텍스트\n\n모델은 각 표기를 미리 수동으로 바꾸지 않고 날짜, 전화번호, 금액, 페이지 주소, 이메일을 읽도록 설계되었습니다. 이런 분석은 일반 단어와 함께 숫자 및 기호가 나오는 동적 메시지에 유용합니다. 개발사는 여러 언어에서의 형식 처리를 설명합니다.\n\n### 유창성과 감정 제어\n\nSpeech 2.6는 Fluent LoRA를 지원합니다. 알아볼 수 있는 음색을 유지하면서 텍스트를 더 유창하게 읽는 기능입니다. 이미 준비한 목소리의 사용에 해당하며, 별도의 복제 목소리 준비는 일반 텍스트 요청의 일부가 아닙니다. 제품군에는 러시아어를 포함한 **40개 언어**가 있습니다.\n\nTurbo에는 일곱 가지 기본 감정과 추가 모드 `fluent`, `whisper`가 있습니다. 모델이 내용에 따라 감정 표현을 선택하거나 지정한 상태를 사용할 수 있습니다. 소리의 깊이와 속도는 텍스트와 별도로 바꿀 수 있습니다.\n\n### 목소리, 멈춤, 발음\n\nMiniMax는 목소리 선택과 속도, 음량, 음높이 제어를 제공합니다. 속도는 **0.5~2**, 음량은 0 초과부터 **10**까지, 음높이 변화는 **−12~12**로 지정합니다. 감정은 텍스트의 의미에 따라 모델이 선택하게 하거나 기쁨, 슬픔, 분노, 두려움, 혐오, 놀람, 차분함 중에서 수동으로 지정할 수 있습니다.\n\n발음은 대체 사전과 음성 표기로 구체화할 수 있습니다. 국제 음성 기호, 중국어 병음, 일본어 읽기 변형이 제공됩니다. 읽는 구간 사이에 **0.01~99.99초**의 멈춤을 지정합니다. 멈춤 길이는 소수점 이하 두 자리까지 지정합니다. 표시는 읽는 구간 사이에 넣으며 연속으로 배치하지 않습니다. 이런 설정으로 이름, 약어, 모호한 단어의 발음을 음성 제작 의도에 맞출 수 있습니다.\n\n### 오디오 받기\n\n합성은 **10 000자** 미만의 텍스트를 입력받습니다. 3000자를 넘는 긴 텍스트에는 개발사가 스트리밍 출력을 권장합니다. 완성된 오디오를 한 번에 받는 방식도 제공합니다. 일반 합성 설정에는 MP3, PCM, FLAC, WAV, Opus, G.711 μ-law 변형, 모노 또는 스테레오가 포함됩니다. 특정 요청에서 사용할 수 있는 형식은 Ailoot의 수단으로 정해집니다.\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-2.6-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-2.6-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-2.6-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-2.6-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-2.6-turbo",
        "request_model_id": "speech-2.6-turbo",
        "route_label": "Core"
      }
    ],
    "name": "speech-2.6-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 2.6 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 2.6 Turbo는 다언어 음성을 합성하며, 짧은 응답 지연 시간에 초점을 맞춥니다.",
  "source": {
    "audit_sha256": "2e00086bcbfc28e64d0cebe97aa47c17d8d5618963027f8ffb9dc6123d7d25b1",
    "bridge_map_sha256": "1125275768b9636fc8461bc7da5061239a81ddfe508e2557843ca42c58ab0036",
    "raw_model_json_sha256": "885a1a5fe896860cd1fb885147ecbdae3f71fc54e301b1c3d11da98cded4cf12",
    "renderer_sha256": "6825a317438b70ab0939441dcebefece462384e77f7e96cce899605c4b208caa"
  },
  "sourceRevision": "b2e87747919528e78973afd72a447122195b284df7207b511d494e09f4194d30"
}
