{
  "aboutHtml": "<h4>음성 제작과 긴 글 읽기를 위한 목소리</h4><p>Speech 02 HD는 음질, 리듬, 음성의 안정성에 중점을 두어 음성을 만듭니다. 개발사는 목소리의 성격을 유지하며 긴 텍스트를 고르게 읽어야 하는 콘텐츠 음성화와 오디오북을 강조합니다. 텍스트를 입력받아 음성 오디오로 변환하는 합성 모델입니다.</p><h4>텍스트와 음색의 결합</h4><p>Speech 02 제품군은 자기회귀 Transformer 아키텍처와 학습 가능한 화자 인코더를 기반으로 합니다. 목소리의 특징을 내용과 일치시키기 위해 음색 추출과 음성 생성을 함께 학습했습니다. 제품군의 기능에는 미리 준비한 복제 목소리의 사용과 언어, 억양, 발음 방식의 결합이 포함됩니다.</p><h4>감정과 다언어 읽기</h4><p>감정 표현은 텍스트 의미에 따라 정하거나 수동으로 지정할 수 있습니다. 기쁨, 슬픔, 분노, 두려움, 혐오, 놀람, 차분함을 사용할 수 있습니다. 모델은 러시아어, 영어, 기타 언어를 처리합니다. 개발사는 영어의 여러 억양, 중국어와 광둥어, 일본어, 한국어, 유럽 언어 및 기타 언어를 설명합니다.</p><p>현재 Speech 02 설명에서는 페르시아어, 필리핀어, 타밀어를 별도로 제외합니다. 더 새로운 Speech 세대의 일반 언어 목록을 이 버전에 자동으로 적용해서는 안 됩니다.</p><h4>목소리 설정</h4><p>합성에는 목소리 선택, 속도 <strong>0.5~2</strong>, 0 초과부터 <strong>10</strong>까지의 음량, <strong>−12~12</strong>의 음높이 조절을 제공합니다. 발음 사전에서 표기를 원하는 읽기로 바꿀 수 있으며, 음성 표기와 일본어 발음 변형을 지원합니다. 이름과 모호한 단어가 어떻게 발음되는지 조절하는 데 도움이 됩니다.</p><h4>멈춤과 완성된 오디오</h4><p>개발사는 읽는 구간 사이에 <strong>0.01~99.99초</strong>의 멈춤을 지정할 수 있도록 합니다. 멈춤 길이는 소수점 이하 두 자리까지 지정합니다. 표시는 읽는 구간 사이에 넣으며 연속으로 배치하지 않습니다. 하나의 동기 요청 텍스트는 <strong>10 000자</strong> 미만이어야 합니다. 오디오를 한 번에 받거나 점진적으로 받을 수 있습니다. 3000자를 넘는 텍스트에는 스트리밍 출력을 권장합니다.</p><p>모델 형식에는 MP3, WAV, FLAC, PCM이 있습니다. 일반 합성 설정에는 Opus와 G.711 μ-law 변형도 설명되어 있습니다. 모노 또는 스테레오를 사용할 수 있습니다. 이 카드에서는 텍스트 음성화를 사용할 수 있으며, 별도의 목소리 준비와 확장 설정은 Ailoot에서 지원되는 호출 방식의 범위 안에서만 적용됩니다.</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 HD는 음질, 리듬, 음성의 안정성에 중점을 두어 음성을 만듭니다. 개발사는 목소리의 성격을 유지하며 긴 텍스트를 고르게 읽어야 하는 콘텐츠 음성화와 오디오북을 강조합니다. 텍스트를 입력받아 음성 오디오로 변환하는 합성 모델입니다.\n\n### 텍스트와 음색의 결합\n\nSpeech 02 제품군은 자기회귀 Transformer 아키텍처와 학습 가능한 화자 인코더를 기반으로 합니다. 목소리의 특징을 내용과 일치시키기 위해 음색 추출과 음성 생성을 함께 학습했습니다. 제품군의 기능에는 미리 준비한 복제 목소리의 사용과 언어, 억양, 발음 방식의 결합이 포함됩니다.\n\n### 감정과 다언어 읽기\n\n감정 표현은 텍스트 의미에 따라 정하거나 수동으로 지정할 수 있습니다. 기쁨, 슬픔, 분노, 두려움, 혐오, 놀람, 차분함을 사용할 수 있습니다. 모델은 러시아어, 영어, 기타 언어를 처리합니다. 개발사는 영어의 여러 억양, 중국어와 광둥어, 일본어, 한국어, 유럽 언어 및 기타 언어를 설명합니다.\n\n현재 Speech 02 설명에서는 페르시아어, 필리핀어, 타밀어를 별도로 제외합니다. 더 새로운 Speech 세대의 일반 언어 목록을 이 버전에 자동으로 적용해서는 안 됩니다.\n\n### 목소리 설정\n\n합성에는 목소리 선택, 속도 **0.5~2**, 0 초과부터 **10**까지의 음량, **−12~12**의 음높이 조절을 제공합니다. 발음 사전에서 표기를 원하는 읽기로 바꿀 수 있으며, 음성 표기와 일본어 발음 변형을 지원합니다. 이름과 모호한 단어가 어떻게 발음되는지 조절하는 데 도움이 됩니다.\n\n### 멈춤과 완성된 오디오\n\n개발사는 읽는 구간 사이에 **0.01~99.99초**의 멈춤을 지정할 수 있도록 합니다. 멈춤 길이는 소수점 이하 두 자리까지 지정합니다. 표시는 읽는 구간 사이에 넣으며 연속으로 배치하지 않습니다. 하나의 동기 요청 텍스트는 **10 000자** 미만이어야 합니다. 오디오를 한 번에 받거나 점진적으로 받을 수 있습니다. 3000자를 넘는 텍스트에는 스트리밍 출력을 권장합니다.\n\n모델 형식에는 MP3, WAV, FLAC, PCM이 있습니다. 일반 합성 설정에는 Opus와 G.711 μ-law 변형도 설명되어 있습니다. 모노 또는 스테레오를 사용할 수 있습니다. 이 카드에서는 텍스트 음성화를 사용할 수 있으며, 별도의 목소리 준비와 확장 설정은 Ailoot에서 지원되는 호출 방식의 범위 안에서만 적용됩니다.\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": "656e0b587831759e488e0c6a7a014208cf66d5260569c120ee53869d4f344161",
    "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-hd</h2><button class=\"icon-btn\" type=\"button\" data-close-sheet aria-label=\"닫기\">×</button></div><div class=\"idline\"><span>MiniMax /</span><code>speech-02-hd</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-hd\">음성 합성</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 HD는 음질과 목소리의 유사성에 중점을 둔 음성 합성 모델입니다.</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 HD는 음질, 리듬, 음성의 안정성에 중점을 두어 음성을 만듭니다. 개발사는 목소리의 성격을 유지하며 긴 텍스트를 고르게 읽어야 하는 콘텐츠 음성화와 오디오북을 강조합니다. 텍스트를 입력받아 음성 오디오로 변환하는 합성 모델입니다.</p><h4>텍스트와 음색의 결합</h4><p>Speech 02 제품군은 자기회귀 Transformer 아키텍처와 학습 가능한 화자 인코더를 기반으로 합니다. 목소리의 특징을 내용과 일치시키기 위해 음색 추출과 음성 생성을 함께 학습했습니다. 제품군의 기능에는 미리 준비한 복제 목소리의 사용과 언어, 억양, 발음 방식의 결합이 포함됩니다.</p><h4>감정과 다언어 읽기</h4><p>감정 표현은 텍스트 의미에 따라 정하거나 수동으로 지정할 수 있습니다. 기쁨, 슬픔, 분노, 두려움, 혐오, 놀람, 차분함을 사용할 수 있습니다. 모델은 러시아어, 영어, 기타 언어를 처리합니다. 개발사는 영어의 여러 억양, 중국어와 광둥어, 일본어, 한국어, 유럽 언어 및 기타 언어를 설명합니다.</p><p>현재 Speech 02 설명에서는 페르시아어, 필리핀어, 타밀어를 별도로 제외합니다. 더 새로운 Speech 세대의 일반 언어 목록을 이 버전에 자동으로 적용해서는 안 됩니다.</p><h4>목소리 설정</h4><p>합성에는 목소리 선택, 속도 <strong>0.5~2</strong>, 0 초과부터 <strong>10</strong>까지의 음량, <strong>−12~12</strong>의 음높이 조절을 제공합니다. 발음 사전에서 표기를 원하는 읽기로 바꿀 수 있으며, 음성 표기와 일본어 발음 변형을 지원합니다. 이름과 모호한 단어가 어떻게 발음되는지 조절하는 데 도움이 됩니다.</p><h4>멈춤과 완성된 오디오</h4><p>개발사는 읽는 구간 사이에 <strong>0.01~99.99초</strong>의 멈춤을 지정할 수 있도록 합니다. 멈춤 길이는 소수점 이하 두 자리까지 지정합니다. 표시는 읽는 구간 사이에 넣으며 연속으로 배치하지 않습니다. 하나의 동기 요청 텍스트는 <strong>10 000자</strong> 미만이어야 합니다. 오디오를 한 번에 받거나 점진적으로 받을 수 있습니다. 3000자를 넘는 텍스트에는 스트리밍 출력을 권장합니다.</p><p>모델 형식에는 MP3, WAV, FLAC, PCM이 있습니다. 일반 합성 설정에는 Opus와 G.711 μ-law 변형도 설명되어 있습니다. 모노 또는 스테레오를 사용할 수 있습니다. 이 카드에서는 텍스트 음성화를 사용할 수 있으며, 별도의 목소리 준비와 확장 설정은 Ailoot에서 지원되는 호출 방식의 범위 안에서만 적용됩니다.</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-hd</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$100.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-467-tab-0\" role=\"tab\" type=\"button\" aria-controls=\"model-code-467-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-467-panel-0\" role=\"tabpanel\" aria-labelledby=\"model-code-467-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-hd&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-hd&amp;route=Core&amp;caller=speech-02-hd&amp;fmt=speech\"><code>speech-02-hd</code></a></span></p><h4>메서드 경로 별칭</h4><p class=\"note-s\">위에 표시된 메서드 경로를 사용하세요.</p><h4>관련 호출용 ID</h4><p class=\"note-s\"><a href=\"#m=speech-02-hd&amp;route=Core&amp;caller=speech-02-hd&amp;fmt=speech\"><code>speech-02-hd</code></a></p></section></div>",
      "method_identity": {
        "effective_request_model_id": "speech-02-hd",
        "fmt": "speech",
        "http": "POST",
        "path": "/v1/audio/speech",
        "request_model_id": "speech-02-hd",
        "route_label": "Core"
      },
      "method_key": "Core|speech|/v1/audio/speech|speech-02-hd",
      "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-hd"
                ],
                "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-hd\", \"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": 100,
                "amount_unit": "usd_per_display_unit",
                "key": "tts_million_chars",
                "label": "per 1 million characters",
                "side": "in"
              }
            ]
          }
        ],
        "request_model_id": "speech-02-hd",
        "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": 100
          }
        ]
      }
    }
  ],
  "model_id": "speech-02-hd",
  "nativeProvenance": {
    "input_facts_canonical_sha256": "c55bff546838e718d208864a288d916c1a94eb75e8557c83251039b9befe62bb",
    "input_html_sha256": "42d7cfc23d64fb871955b4317afa446229174f24f0245e46ed309b44f5fd39bf",
    "private_audit_sha256": "89a6668155f59800e9bf3e24366491ca2dd4dd08d82bd6e637c0eb569683edcd",
    "role": "historical-normalized-input-audit-hashes",
    "schema": "ailoot-native-model-provenance-v2"
  },
  "page": {
    "canonical": "https://ailoot.ai/models/ko/speech-02-hd/",
    "description": "Speech-02 HD는 음질과 목소리의 유사성에 중점을 둔 음성 합성 모델입니다.",
    "locale": "ko",
    "md_url": "https://ailoot.ai/models/ko/speech-02-hd/index.md",
    "title": "speech-02-hd — Ailoot",
    "url": "https://ailoot.ai/models/ko/speech-02-hd/"
  },
  "rawModel": {
    "about": "### 음성 제작과 긴 글 읽기를 위한 목소리\n\nSpeech 02 HD는 음질, 리듬, 음성의 안정성에 중점을 두어 음성을 만듭니다. 개발사는 목소리의 성격을 유지하며 긴 텍스트를 고르게 읽어야 하는 콘텐츠 음성화와 오디오북을 강조합니다. 텍스트를 입력받아 음성 오디오로 변환하는 합성 모델입니다.\n\n### 텍스트와 음색의 결합\n\nSpeech 02 제품군은 자기회귀 Transformer 아키텍처와 학습 가능한 화자 인코더를 기반으로 합니다. 목소리의 특징을 내용과 일치시키기 위해 음색 추출과 음성 생성을 함께 학습했습니다. 제품군의 기능에는 미리 준비한 복제 목소리의 사용과 언어, 억양, 발음 방식의 결합이 포함됩니다.\n\n### 감정과 다언어 읽기\n\n감정 표현은 텍스트 의미에 따라 정하거나 수동으로 지정할 수 있습니다. 기쁨, 슬픔, 분노, 두려움, 혐오, 놀람, 차분함을 사용할 수 있습니다. 모델은 러시아어, 영어, 기타 언어를 처리합니다. 개발사는 영어의 여러 억양, 중국어와 광둥어, 일본어, 한국어, 유럽 언어 및 기타 언어를 설명합니다.\n\n현재 Speech 02 설명에서는 페르시아어, 필리핀어, 타밀어를 별도로 제외합니다. 더 새로운 Speech 세대의 일반 언어 목록을 이 버전에 자동으로 적용해서는 안 됩니다.\n\n### 목소리 설정\n\n합성에는 목소리 선택, 속도 **0.5~2**, 0 초과부터 **10**까지의 음량, **−12~12**의 음높이 조절을 제공합니다. 발음 사전에서 표기를 원하는 읽기로 바꿀 수 있으며, 음성 표기와 일본어 발음 변형을 지원합니다. 이름과 모호한 단어가 어떻게 발음되는지 조절하는 데 도움이 됩니다.\n\n### 멈춤과 완성된 오디오\n\n개발사는 읽는 구간 사이에 **0.01~99.99초**의 멈춤을 지정할 수 있도록 합니다. 멈춤 길이는 소수점 이하 두 자리까지 지정합니다. 표시는 읽는 구간 사이에 넣으며 연속으로 배치하지 않습니다. 하나의 동기 요청 텍스트는 **10 000자** 미만이어야 합니다. 오디오를 한 번에 받거나 점진적으로 받을 수 있습니다. 3000자를 넘는 텍스트에는 스트리밍 출력을 권장합니다.\n\n모델 형식에는 MP3, WAV, FLAC, PCM이 있습니다. 일반 합성 설정에는 Opus와 G.711 μ-law 변형도 설명되어 있습니다. 모노 또는 스테레오를 사용할 수 있습니다. 이 카드에서는 텍스트 음성화를 사용할 수 있으며, 별도의 목소리 준비와 확장 설정은 Ailoot에서 지원되는 호출 방식의 범위 안에서만 적용됩니다.\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-hd",
    "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-hd"
                ],
                "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-hd\", \"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": 100,
                "amount_unit": "usd_per_display_unit",
                "key": "tts_million_chars",
                "label": "per 1 million characters",
                "side": "in"
              }
            ]
          }
        ],
        "request_model_id": "speech-02-hd",
        "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": 100
          }
        ]
      }
    ],
    "model_aliases": [
      {
        "canonical_model_id": "speech-02-hd",
        "request_model_id": "speech-02-hd",
        "route_label": "Core"
      }
    ],
    "name": "speech-02-hd",
    "price": {
      "in": 100,
      "in_label": "per 1 million characters",
      "out": null,
      "out_label": null,
      "sort_in": null,
      "sort_out": null,
      "varies": false
    },
    "short": "Speech-02 HD는 음질과 목소리의 유사성에 중점을 둔 음성 합성 모델입니다."
  },
  "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 HD는 음질과 목소리의 유사성에 중점을 둔 음성 합성 모델입니다.",
  "source": {
    "audit_sha256": "2e00086bcbfc28e64d0cebe97aa47c17d8d5618963027f8ffb9dc6123d7d25b1",
    "bridge_map_sha256": "1125275768b9636fc8461bc7da5061239a81ddfe508e2557843ca42c58ab0036",
    "raw_model_json_sha256": "1ae8ed935aa6ab1cdd2eab2ac0067cd4e6b8593044022b52aa8e7e0df191f725",
    "renderer_sha256": "6825a317438b70ab0939441dcebefece462384e77f7e96cce899605c4b208caa"
  },
  "sourceRevision": "303ed99bc45af740cc61576a6a356b2ec7451a34b920d46a91d75a494242716f"
}
