{
  "aboutHtml": "<h4>Lời nói nhanh cho câu trả lời tương tác</h4><p>Speech 02 Turbo dành cho tổng hợp giọng nói tương tác. Nhà sản xuất mô tả sự kết hợp tốc độ với nhịp điệu ổn định và âm thanh tự nhiên; các kịch bản gồm câu trả lời bằng giọng nói, lời thoại trò chơi và nội dung tương tác. Mô hình nhận văn bản và tạo âm thanh lời nói.</p><h4>Chọn đặc trưng âm thanh</h4><p>Dòng Speech 02 cho phép kết hợp giọng, ngôn ngữ, giọng vùng miền và sắc thái cảm xúc. Transformer tự hồi quy cùng bộ mã hóa người nói được huấn luyện chung để liên kết âm sắc với nội dung. Có thể tổng hợp văn bản bằng giọng có sẵn; tạo giọng nhân bản mới thuộc bước chuẩn bị riêng.</p><p>Mô hình tự chọn ngữ điệu cảm xúc theo văn bản hoặc nhận trạng thái đã đặt: vui, buồn, giận dữ, sợ hãi, ghê tởm, ngạc nhiên hoặc bình tĩnh. Có thể điều khiển thêm tốc độ, cao độ và âm lượng để lượt lời phù hợp với nhịp tương tác mong muốn.</p><h4>Ngôn ngữ và cách đọc từ</h4><p>Mô hình hỗ trợ lời nói tiếng Nga và các ngôn ngữ khác, gồm tiếng Anh, Trung, Quảng Đông, Nhật, Hàn, Pháp, Đức, Tây Ban Nha, Bồ Đào Nha, Thổ Nhĩ Kỳ, Ả Rập và Ukraine. Với Speech 02, đặc tả hiện tại loại trừ riêng tiếng Ba Tư, Filipino và Tamil.</p><p>Có thể làm rõ phát âm bằng từ điển thay thế, ký hiệu phiên âm quốc tế, bính âm tiếng Trung và các cách đọc tiếng Nhật. Khoảng dừng giữa các phần lời được đặt trong phạm vi <strong>0,01–99,99 giây</strong>. Thời lượng khoảng dừng có độ chính xác đến hai chữ số sau dấu phẩy; dấu được đặt giữa các đoạn lời và không đặt liên tiếp. Mô hình cung cấp tốc độ <strong>0,5–2</strong>, âm lượng lớn hơn 0 và tối đa <strong>10</strong>, thay đổi cao độ từ <strong>−12 đến 12</strong>.</p><h4>Âm thanh để phát</h4><p>Đầu vào đồng bộ giới hạn văn bản ít hơn <strong>10 000 ký tự</strong>; với dung lượng dài hơn 3000 ký tự, nhà sản xuất khuyến nghị xuất dần. Khả năng của mô hình gồm MP3, WAV, FLAC và PCM; cài đặt chung còn mô tả Opus, G.711 μ-law, một hoặc hai kênh âm thanh.</p><p>Thẻ Ailoot này nhận văn bản và trả về lời nói. Tốc độ của Turbo thuộc mục đích biến thể mô hình; thời gian của từng câu trả lời và khả năng sử dụng định dạng mở rộng phụ thuộc vào cách truy cập đã chọn.</p><p>Cài đặt âm thanh bổ sung gồm các tần số lấy mẫu <strong>8, 16, 22,05, 24, 32 và 44,1 kHz</strong>. MP3 có các mức bitrate <strong>32, 64, 128 hoặc 256 kbit/s</strong>. Có thể thay đổi màu giọng và áp dụng một hiệu ứng: tiếng vang không gian rộng, tiếng vang hội trường, âm thanh điện thoại hoặc giọng robot. Hiệu ứng thay đổi giọng được hỗ trợ cho MP3, WAV và FLAC khi nhận toàn bộ âm thanh, còn với đầu ra truyền luồng chỉ hỗ trợ MP3. Các định dạng G.711 μ-law sử dụng tần số 8 kHz. Những khả năng này thuộc cài đặt tổng hợp của MiniMax.</p><p>Nhà sản xuất cung cấp đồng bộ lời nói với văn bản: dấu thời gian theo câu, theo từ hoặc theo từ khi xuất dần. Kết quả này giúp kết hợp lời đọc với việc hiển thị văn bản. Khả năng bổ sung này cần hỗ trợ định dạng câu trả lời tương ứng.</p>",
  "aboutText": "### Lời nói nhanh cho câu trả lời tương tác\n\nSpeech 02 Turbo dành cho tổng hợp giọng nói tương tác. Nhà sản xuất mô tả sự kết hợp tốc độ với nhịp điệu ổn định và âm thanh tự nhiên; các kịch bản gồm câu trả lời bằng giọng nói, lời thoại trò chơi và nội dung tương tác. Mô hình nhận văn bản và tạo âm thanh lời nói.\n\n### Chọn đặc trưng âm thanh\n\nDòng Speech 02 cho phép kết hợp giọng, ngôn ngữ, giọng vùng miền và sắc thái cảm xúc. Transformer tự hồi quy cùng bộ mã hóa người nói được huấn luyện chung để liên kết âm sắc với nội dung. Có thể tổng hợp văn bản bằng giọng có sẵn; tạo giọng nhân bản mới thuộc bước chuẩn bị riêng.\n\nMô hình tự chọn ngữ điệu cảm xúc theo văn bản hoặc nhận trạng thái đã đặt: vui, buồn, giận dữ, sợ hãi, ghê tởm, ngạc nhiên hoặc bình tĩnh. Có thể điều khiển thêm tốc độ, cao độ và âm lượng để lượt lời phù hợp với nhịp tương tác mong muốn.\n\n### Ngôn ngữ và cách đọc từ\n\nMô hình hỗ trợ lời nói tiếng Nga và các ngôn ngữ khác, gồm tiếng Anh, Trung, Quảng Đông, Nhật, Hàn, Pháp, Đức, Tây Ban Nha, Bồ Đào Nha, Thổ Nhĩ Kỳ, Ả Rập và Ukraine. Với Speech 02, đặc tả hiện tại loại trừ riêng tiếng Ba Tư, Filipino và Tamil.\n\nCó thể làm rõ phát âm bằng từ điển thay thế, ký hiệu phiên âm quốc tế, bính âm tiếng Trung và các cách đọc tiếng Nhật. Khoảng dừng giữa các phần lời được đặt trong phạm vi **0,01–99,99 giây**. Thời lượng khoảng dừng có độ chính xác đến hai chữ số sau dấu phẩy; dấu được đặt giữa các đoạn lời và không đặt liên tiếp. Mô hình cung cấp tốc độ **0,5–2**, âm lượng lớn hơn 0 và tối đa **10**, thay đổi cao độ từ **−12 đến 12**.\n\n### Âm thanh để phát\n\nĐầu vào đồng bộ giới hạn văn bản ít hơn **10 000 ký tự**; với dung lượng dài hơn 3000 ký tự, nhà sản xuất khuyến nghị xuất dần. Khả năng của mô hình gồm MP3, WAV, FLAC và PCM; cài đặt chung còn mô tả Opus, G.711 μ-law, một hoặc hai kênh âm thanh.\n\nThẻ Ailoot này nhận văn bản và trả về lời nói. Tốc độ của Turbo thuộc mục đích biến thể mô hình; thời gian của từng câu trả lời và khả năng sử dụng định dạng mở rộng phụ thuộc vào cách truy cập đã chọn.\n\nCài đặt âm thanh bổ sung gồm các tần số lấy mẫu **8, 16, 22,05, 24, 32 và 44,1 kHz**. MP3 có các mức bitrate **32, 64, 128 hoặc 256 kbit/s**. Có thể thay đổi màu giọng và áp dụng một hiệu ứng: tiếng vang không gian rộng, tiếng vang hội trường, âm thanh điện thoại hoặc giọng robot. Hiệu ứng thay đổi giọng được hỗ trợ cho MP3, WAV và FLAC khi nhận toàn bộ âm thanh, còn với đầu ra truyền luồng chỉ hỗ trợ MP3. Các định dạng G.711 μ-law sử dụng tần số 8 kHz. Những khả năng này thuộc cài đặt tổng hợp của MiniMax.\n\nNhà sản xuất cung cấp đồng bộ lời nói với văn bản: dấu thời gian theo câu, theo từ hoặc theo từ khi xuất dần. Kết quả này giúp kết hợp lời đọc với việc hiển thị văn bản. Khả năng bổ sung này cần hỗ trợ định dạng câu trả lời tương ứng.",
  "editorialOverlay": {
    "copy_fields": null,
    "copy_sha256": null,
    "copy_source": null,
    "html_sha256": "6b0cd64456abeb26375581260a1ab787f2847011cc7e622028632c83507ea24a",
    "module_sha256": "ee9dc1c50b1e6a8fb7fa062030fcb4646b9aaaeb08be513b723a5a92a7290f06",
    "raw_model_unchanged": true,
    "schema": "ailoot-native-model-editorial-v1"
  },
  "locale": "vi",
  "methods": [
    {
      "html": "<div class=\"sheet-head\"><span class=\"mav\" aria-hidden=\"true\">MM</span><h2 id=\"sheet-title\">speech-02-turbo</h2><button class=\"icon-btn\" type=\"button\" data-close-sheet aria-label=\"Đóng\">×</button></div><div class=\"idline\"><span>MiniMax /</span><code>speech-02-turbo</code><button type=\"button\" id=\"copy-id\">Sao chép ID</button></div><nav class=\"card-jump-nav\" aria-label=\"Các phần của thẻ mô hình\"><button type=\"button\" data-card-jump=\"overview\">Bắt đầu</button><button type=\"button\" data-card-jump=\"methods\">Đầu vào &amp; phương thức</button><button type=\"button\" data-card-jump=\"pricing\">Bảng giá</button><button type=\"button\" data-card-jump=\"examples\">Ví dụ</button><button type=\"button\" data-card-jump=\"results\">Kết quả</button><button type=\"button\" data-card-jump=\"aliases\">Bí danh</button></nav><div class=\"card-method-tabs\" role=\"tablist\" aria-label=\"Phương thức API\"><button type=\"button\" role=\"tab\" tabindex=\"0\" aria-controls=\"card-method-content\" aria-selected=\"true\" id=\"card-method-tab-0\" data-card-method=\"Core|speech|/v1/audio/speech|speech-02-turbo\">Tổng hợp giọng nói</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\">Bắt đầu</h3><p class=\"mdesc-full\">Speech-02 Turbo dành cho tổng hợp giọng nói nhanh với nhịp điệu ổn định và giọng đọc đa ngôn ngữ.</p><dl class=\"card-io\" data-card-io><div><dt>Đầu vào được chấp nhận</dt><dd>Văn bản</dd></div><div><dt>Kết quả</dt><dd>speech</dd></div></dl><details class=\"card-about\"><summary>Về mô hình</summary><p class=\"note-s\" data-model-method-boundary>Mô tả này trình bày khả năng của mô hình. Đầu vào, đầu ra và tùy chọn có trên Ailoot được liệt kê bên dưới cho phương thức đã chọn.</p><div class=\"mabout\" id=\"m-about\"><h4>Lời nói nhanh cho câu trả lời tương tác</h4><p>Speech 02 Turbo dành cho tổng hợp giọng nói tương tác. Nhà sản xuất mô tả sự kết hợp tốc độ với nhịp điệu ổn định và âm thanh tự nhiên; các kịch bản gồm câu trả lời bằng giọng nói, lời thoại trò chơi và nội dung tương tác. Mô hình nhận văn bản và tạo âm thanh lời nói.</p><h4>Chọn đặc trưng âm thanh</h4><p>Dòng Speech 02 cho phép kết hợp giọng, ngôn ngữ, giọng vùng miền và sắc thái cảm xúc. Transformer tự hồi quy cùng bộ mã hóa người nói được huấn luyện chung để liên kết âm sắc với nội dung. Có thể tổng hợp văn bản bằng giọng có sẵn; tạo giọng nhân bản mới thuộc bước chuẩn bị riêng.</p><p>Mô hình tự chọn ngữ điệu cảm xúc theo văn bản hoặc nhận trạng thái đã đặt: vui, buồn, giận dữ, sợ hãi, ghê tởm, ngạc nhiên hoặc bình tĩnh. Có thể điều khiển thêm tốc độ, cao độ và âm lượng để lượt lời phù hợp với nhịp tương tác mong muốn.</p><h4>Ngôn ngữ và cách đọc từ</h4><p>Mô hình hỗ trợ lời nói tiếng Nga và các ngôn ngữ khác, gồm tiếng Anh, Trung, Quảng Đông, Nhật, Hàn, Pháp, Đức, Tây Ban Nha, Bồ Đào Nha, Thổ Nhĩ Kỳ, Ả Rập và Ukraine. Với Speech 02, đặc tả hiện tại loại trừ riêng tiếng Ba Tư, Filipino và Tamil.</p><p>Có thể làm rõ phát âm bằng từ điển thay thế, ký hiệu phiên âm quốc tế, bính âm tiếng Trung và các cách đọc tiếng Nhật. Khoảng dừng giữa các phần lời được đặt trong phạm vi <strong>0,01–99,99 giây</strong>. Thời lượng khoảng dừng có độ chính xác đến hai chữ số sau dấu phẩy; dấu được đặt giữa các đoạn lời và không đặt liên tiếp. Mô hình cung cấp tốc độ <strong>0,5–2</strong>, âm lượng lớn hơn 0 và tối đa <strong>10</strong>, thay đổi cao độ từ <strong>−12 đến 12</strong>.</p><h4>Âm thanh để phát</h4><p>Đầu vào đồng bộ giới hạn văn bản ít hơn <strong>10 000 ký tự</strong>; với dung lượng dài hơn 3000 ký tự, nhà sản xuất khuyến nghị xuất dần. Khả năng của mô hình gồm MP3, WAV, FLAC và PCM; cài đặt chung còn mô tả Opus, G.711 μ-law, một hoặc hai kênh âm thanh.</p><p>Thẻ Ailoot này nhận văn bản và trả về lời nói. Tốc độ của Turbo thuộc mục đích biến thể mô hình; thời gian của từng câu trả lời và khả năng sử dụng định dạng mở rộng phụ thuộc vào cách truy cập đã chọn.</p><p>Cài đặt âm thanh bổ sung gồm các tần số lấy mẫu <strong>8, 16, 22,05, 24, 32 và 44,1 kHz</strong>. MP3 có các mức bitrate <strong>32, 64, 128 hoặc 256 kbit/s</strong>. Có thể thay đổi màu giọng và áp dụng một hiệu ứng: tiếng vang không gian rộng, tiếng vang hội trường, âm thanh điện thoại hoặc giọng robot. Hiệu ứng thay đổi giọng được hỗ trợ cho MP3, WAV và FLAC khi nhận toàn bộ âm thanh, còn với đầu ra truyền luồng chỉ hỗ trợ MP3. Các định dạng G.711 μ-law sử dụng tần số 8 kHz. Những khả năng này thuộc cài đặt tổng hợp của MiniMax.</p><p>Nhà sản xuất cung cấp đồng bộ lời nói với văn bản: dấu thời gian theo câu, theo từ hoặc theo từ khi xuất dần. Kết quả này giúp kết hợp lời đọc với việc hiển thị văn bản. Khả năng bổ sung này cần hỗ trợ định dạng câu trả lời tương ứng.</p></div></details></section><section class=\"card-section\" data-card-section=\"methods\"><h3 tabindex=\"-1\">Có trên Ailoot · đầu vào &amp; phương thức</h3><details class=\"card-method\" open><summary><b>Ailoot · Tổng hợp giọng nói</b> <code>POST /v1/audio/speech</code></summary><dl class=\"method-capabilities\"><div><dt>Đầu vào</dt><dd><code>text</code></dd></div><div><dt>Đầu ra</dt><dd><code>speech</code></dd></div><div><dt>Định dạng đầu ra</dt><dd>mp3</dd></div></dl><div class=\"tw\" data-card-parameters data-typed-parameters><table><thead><tr><th>Trường</th><th>Loại</th><th>Yêu cầu</th><th>Giá trị &amp; giới hạn</th><th>Mặc định</th></tr></thead><tbody><tr data-parameter-availability=\"source_interface\"><th data-cell-label=\"Trường\" scope=\"row\"><span class=\"card-cell-label\">Trường</span><code class=\"card-field-name\">model</code></th><td data-cell-label=\"Loại\" data-field-type><span class=\"card-cell-label\">Loại</span><code>string</code></td><td data-cell-label=\"Yêu cầu\"><span class=\"card-cell-label\">Yêu cầu</span>Bắt buộc</td><td data-cell-label=\"Giá trị &amp; giới hạn\"><span class=\"card-cell-label\">Giá trị &amp; giới hạn</span><div>speech-02-turbo</div></td><td data-cell-label=\"Mặc định\" data-default=\"unspecified\"><span class=\"card-cell-label\">Mặc định</span>—</td></tr><tr data-parameter-availability=\"source_interface\"><th data-cell-label=\"Trường\" scope=\"row\"><span class=\"card-cell-label\">Trường</span><code class=\"card-field-name\">input</code></th><td data-cell-label=\"Loại\" data-field-type><span class=\"card-cell-label\">Loại</span><code>string</code></td><td data-cell-label=\"Yêu cầu\"><span class=\"card-cell-label\">Yêu cầu</span>Bắt buộc</td><td data-cell-label=\"Giá trị &amp; giới hạn\"><span class=\"card-cell-label\">Giá trị &amp; giới hạn</span><div>Độ dài tối thiểu: 1</div><div>Độ dài tối đa (không gồm ngưỡng): 10.000</div><div>Đơn vị: ký tự Unicode</div></td><td data-cell-label=\"Mặc định\" data-default=\"unspecified\"><span class=\"card-cell-label\">Mặc định</span>—</td></tr><tr data-parameter-availability=\"source_interface\"><th data-cell-label=\"Trường\" scope=\"row\"><span class=\"card-cell-label\">Trường</span><code class=\"card-field-name\">voice</code></th><td data-cell-label=\"Loại\" data-field-type><span class=\"card-cell-label\">Loại</span><code>string</code></td><td data-cell-label=\"Yêu cầu\"><span class=\"card-cell-label\">Yêu cầu</span>Bắt buộc</td><td data-cell-label=\"Giá trị &amp; giới hạn\"><span class=\"card-cell-label\">Giá trị &amp; giới hạn</span><div>Mẫu: ^[A-Za-z0-9_-]{1,128}$</div></td><td data-cell-label=\"Mặc định\" data-default=\"unspecified\"><span class=\"card-cell-label\">Mặc định</span>—</td></tr><tr data-parameter-availability=\"source_interface\"><th data-cell-label=\"Trường\" scope=\"row\"><span class=\"card-cell-label\">Trường</span><code class=\"card-field-name\">response_format</code></th><td data-cell-label=\"Loại\" data-field-type><span class=\"card-cell-label\">Loại</span><code>string</code></td><td data-cell-label=\"Yêu cầu\"><span class=\"card-cell-label\">Yêu cầu</span>Không bắt buộc</td><td data-cell-label=\"Giá trị &amp; giới hạn\"><span class=\"card-cell-label\">Giá trị &amp; giới hạn</span><div>mp3</div></td><td data-cell-label=\"Mặc định\" data-default=\"unspecified\"><span class=\"card-cell-label\">Mặc định</span>—</td></tr></tbody></table></div><details class=\"card-about\" data-material-combinations><summary>Tổ hợp tư liệu đầu vào</summary><p class=\"note-s\"><b>text_to_speech</b> · Bắt buộc: input</p></details><details class=\"note-s\" data-method-contract><summary>Tham số phương thức và vòng đời</summary><div class=\"tw\" data-card-table=\"contract\"><table><thead><tr><th>Tham số</th><th>Hợp đồng</th></tr></thead><tbody><tr><th data-cell-label=\"Tham số\" scope=\"row\"><span class=\"card-cell-label\">Tham số</span><code>material_types</code></th><td data-cell-label=\"Hợp đồng\"><span class=\"card-cell-label\">Hợp đồng</span>text</td></tr><tr><th data-cell-label=\"Tham số\" scope=\"row\"><span class=\"card-cell-label\">Tham số</span><code>required</code></th><td data-cell-label=\"Hợp đồng\"><span class=\"card-cell-label\">Hợp đồng</span>null</td></tr><tr><th data-cell-label=\"Tham số\" scope=\"row\"><span class=\"card-cell-label\">Tham số</span><code>optional_controls</code></th><td data-cell-label=\"Hợp đồng\"><span class=\"card-cell-label\">Hợp đồng</span>null</td></tr></tbody></table></div><p>Vòng đời: <code>synchronous_result_then_owned_library</code></p><p class=\"note-s\"><code>GET /v1/media/tasks/{task_id}</code> · Giá trị task_id thực tế đã trả về hoặc bản ghi trong thư viện nội dung đa phương tiện</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\">Cấu trúc phương thức và ID là chính xác; khả năng của nhà cung cấp tách biệt với việc cho phép tiếp nhận yêu cầu.</p></details></details></section><section class=\"card-section\" data-card-section=\"pricing\"><h3 tabindex=\"-1\">Bảng giá</h3><h4>Mức phí phương thức Ailoot</h4><section class=\"meth\" data-route=\"Core\"><header><b><span class=\"alias\">Ailoot</span> Tổng hợp giọng nói</b><code>POST /v1/audio/speech</code></header><dl><div><dt>Đầu vào</dt><dd>60,00 US$ <em>mỗi 1 triệu ký tự</em></dd></div></dl></section><p class=\"note-s\">Ailoot tạm giữ một khoản ước tính trước yêu cầu. Sau khi có kết quả, phí cuối cùng được quyết toán theo mức sử dụng đo được. Việc quyết toán khi truyền luồng dùng bản ghi mức sử dụng cuối cùng. <a href=\"/docs/vi/billing/reserve/\">Cách hoạt động của cơ chế tạm giữ và quyết toán →</a></p></section><section class=\"card-section\" data-card-section=\"examples\"><h3 tabindex=\"-1\">Ví dụ yêu cầu</h3><h4>Ailoot · Tổng hợp giọng nói</h4><div class=\"code-group\"><div class=\"cg-bar\"><div class=\"cg-tabs\" role=\"tablist\" aria-label=\"Các phiên bản mã\"><button class=\"cg-tab\" id=\"model-code-468-tab-0\" role=\"tab\" type=\"button\" aria-controls=\"model-code-468-panel-0\" aria-selected=\"true\" tabindex=\"0\">Ví dụ giọng nói</button></div><div class=\"cg-tools\"><button class=\"cg-btn cg-copy\" type=\"button\" aria-label=\"Sao chép mã\"><svg class=\"cp\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.4\"><rect x=\"5.25\" y=\"5.25\" width=\"8.5\" height=\"8.5\" rx=\"1.75\"/><path d=\"M10.75 5.25V3.5a1.25 1.25 0 0 0-1.25-1.25H3.5A1.25 1.25 0 0 0 2.25 3.5v6a1.25 1.25 0 0 0 1.25 1.25h1.75\"/></svg><svg class=\"ok\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.4\"><path d=\"m3 8.5 3.25 3.25L13 5\"/></svg></button></div></div><div class=\"cg-body\"><div class=\"cg-pane\" id=\"model-code-468-panel-0\" role=\"tabpanel\" aria-labelledby=\"model-code-468-tab-0\"><pre data-lang=\"bash\"><code>set -eu\n: &quot;${AILOOT_API_KEY:?Set your Ailoot API key}&quot;\n: &quot;${AILOOT_TEXT_FILE:?Set your actual UTF-8 narration script}&quot;\nexport AILOOT_TEXT_FILE\n: &quot;${AILOOT_VOICE_ID:?Set the actual accepted voice ID for this model}&quot;\nexport AILOOT_VOICE_ID\npython3 - &lt;&lt;&#39;PY_REQUEST&#39;\nimport json,os\nfrom pathlib import Path\np=json.loads(&#39;{&quot;model&quot;: &quot;speech-02-turbo&quot;, &quot;input&quot;: &quot;&quot;}&#39;)\nf=Path(os.environ[&quot;AILOOT_TEXT_FILE&quot;])\nif not f.is_file():raise SystemExit(&quot;Choose your actual UTF-8 source material&quot;)\ntext=f.read_text(encoding=&quot;utf-8&quot;)\nif not text.strip():raise SystemExit(&quot;Source material must contain text&quot;)\np[&quot;input&quot;]=text\nimport re\nvoice=os.environ[&quot;AILOOT_VOICE_ID&quot;]\nif not re.fullmatch(r&quot;[A-Za-z0-9_-]{1,128}&quot;,voice):raise SystemExit(&quot;Set an actual accepted voice ID&quot;)\np[&quot;voice&quot;]=voice\nPath(&quot;request.json&quot;).write_text(json.dumps(p,ensure_ascii=False))\nPY_REQUEST\ncurl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/audio/speech \\\n  -H &quot;Authorization: Bearer $AILOOT_API_KEY&quot; -H &#39;Content-Type: application/json&#39; \\\n  --data-binary @request.json -D response-headers.txt -o speech.mp3\n</code></pre></div></div></div></section><section class=\"card-section\" data-card-section=\"results\"><h3 tabindex=\"-1\">Nhận và lưu kết quả</h3><h4>Ailoot · Tổng hợp giọng nói</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>Lưu tất cả kết quả đã hoàn tất</h5><p class=\"note-s\">Lưu mọi phản hồi hoàn chỉnh, tệp và phần nội dung được trả về.</p><p class=\"note-s\">Giữ lại toàn bộ kết quả nhị phân và các header. Nếu phản hồi ở dạng JSON hoặc chứa nhiều đầu ra, giữ lại mọi phần tử dữ liệu và tải từng tài nguyên từ URL có chữ ký thực tế.</p></div><div class=\"card-result-process\" data-unknown-recovery><h5>Nếu cần kiểm tra phản hồi gốc</h5><p class=\"note-s\">Giữ lại operation_id/X-Client-Request-ID gốc để đối soát mà không gửi lại yêu cầu; không có tuyến truy vấn trạng thái riêng cho âm thanh.</p></div><details class=\"card-about\" data-output-fields><summary>Trường phản hồi</summary><div class=\"tw\" data-card-table=\"output\"><table><thead><tr><th>Trường</th><th>Loại</th></tr></thead><tbody><tr><th data-cell-label=\"Trường\" scope=\"row\"><span class=\"card-cell-label\">Trường</span><code class=\"card-field-name\">binary audio</code></th><td data-cell-label=\"Loại\" data-field-type><span class=\"card-cell-label\">Loại</span>bytes</td></tr><tr><th data-cell-label=\"Trường\" scope=\"row\"><span class=\"card-cell-label\">Trường</span><code class=\"card-field-name\">response headers</code></th><td data-cell-label=\"Loại\" data-field-type><span class=\"card-cell-label\">Loại</span>headers</td></tr></tbody></table></div></details><details class=\"card-about\" data-method-errors><summary>Lỗi và bước tiếp theo</summary><div class=\"tw\" data-card-table=\"errors\"><table><thead><tr><th>Phản hồi</th><th>Điều kiện</th><th>Bước tiếp theo</th></tr></thead><tbody><tr><th data-cell-label=\"Phản hồi\" scope=\"row\"><span class=\"card-cell-label\">Phản hồi</span>400 · <code>invalid_request_error</code></th><td data-cell-label=\"Điều kiện\"><span class=\"card-cell-label\">Điều kiện</span>Trường bắt buộc, cách biểu diễn tài liệu hoặc giá trị tham số không hợp lệ</td><td data-cell-label=\"Bước tiếp theo\"><span class=\"card-cell-label\">Bước tiếp theo</span>Sửa các trường được chỉ ra trước khi gửi yêu cầu tạo mới.</td></tr><tr><th data-cell-label=\"Phản hồi\" scope=\"row\"><span class=\"card-cell-label\">Phản hồi</span><code>server_error</code></th><td data-cell-label=\"Điều kiện\"><span class=\"card-cell-label\">Điều kiện</span>Phản hồi trả về cho biết thao tác hoặc kết quả cần được kiểm tra</td><td data-cell-label=\"Bước tiếp theo\"><span class=\"card-cell-label\">Bước tiếp theo</span>Giữ lại ID thao tác/tác vụ gốc đã trả về, các header của yêu cầu và toàn bộ phản hồi; tiếp tục truy xuất thao tác gốc đó bằng các phương thức được hỗ trợ. Không gửi lại yêu cầu tạo.</td></tr></tbody></table></div></details></section><section class=\"card-section\" data-card-section=\"aliases\"><h3 tabindex=\"-1\">Bí danh</h3><h4>Bí danh mô hình</h4><p class=\"note-s\"><span data-model-alias-route=\"Core\"><b>Ailoot</b> <a href=\"#m=speech-02-turbo&amp;route=Core&amp;caller=speech-02-turbo&amp;fmt=speech\"><code>speech-02-turbo</code></a></span></p><h4>Bí danh đường dẫn phương thức</h4><p class=\"note-s\">Dùng các đường dẫn phương thức hiển thị ở trên.</p><h4>ID gọi liên quan</h4><p class=\"note-s\"><a href=\"#m=speech-02-turbo&amp;route=Core&amp;caller=speech-02-turbo&amp;fmt=speech\"><code>speech-02-turbo</code></a></p></section></div>",
      "method_identity": {
        "effective_request_model_id": "speech-02-turbo",
        "fmt": "speech",
        "http": "POST",
        "path": "/v1/audio/speech",
        "request_model_id": "speech-02-turbo",
        "route_label": "Core"
      },
      "method_key": "Core|speech|/v1/audio/speech|speech-02-turbo",
      "ordinal": 0,
      "rawMethod": {
        "cache_read": null,
        "cache_write": null,
        "cache_write_1h": null,
        "cache_write_5m": null,
        "conditional_meter": null,
        "contract": {
          "data": {
            "all_results": "Keep the complete binary result and headers. If JSON/multiple outputs are returned, retain every data item and fetch each actual signed asset URL.",
            "errors": [
              {
                "code": null,
                "condition": "Trường bắt buộc, cách biểu diễn tài liệu hoặc giá trị tham số không hợp lệ",
                "http_status": 400,
                "recovery": "Sửa các trường được chỉ ra trước khi gửi yêu cầu tạo mới.",
                "type": "invalid_request_error"
              },
              {
                "code": null,
                "condition": "Phản hồi trả về cho biết thao tác hoặc kết quả cần được kiểm tra",
                "http_status": null,
                "recovery": "Giữ lại ID thao tác/tác vụ gốc đã trả về, các header của yêu cầu và toàn bộ phản hồi; tiếp tục truy xuất thao tác gốc đó bằng các phương thức được hỗ trợ. Không gửi lại yêu cầu tạo.",
                "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": "Giữ lại operation_id/X-Client-Request-ID gốc để đối soát mà không gửi lại yêu cầu; không có tuyến truy vấn trạng thái riêng cho âm thanh."
            },
            "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": "Giữ lại toàn bộ kết quả nhị phân và các header. Nếu phản hồi ở dạng JSON hoặc chứa nhiều đầu ra, giữ lại mọi phần tử dữ liệu và tải từng tài nguyên từ URL có chữ ký thực tế.",
              "family": "audio",
              "fields": [
                {
                  "description": null,
                  "name": "binary audio",
                  "type": "bytes"
                },
                {
                  "description": null,
                  "name": "response headers",
                  "type": "headers"
                }
              ],
              "format": "mp3"
            },
            "parameters": [
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": [
                  "speech-02-turbo"
                ],
                "enum_known": true,
                "name": "model",
                "required": true,
                "type": "string"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": null,
                "enum_known": false,
                "maximum_length_exclusive": 10000,
                "min_length": 1,
                "name": "input",
                "required": true,
                "type": "string",
                "unit": "ký tự 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": [
            "Cấu trúc phương thức và ID là chính xác; khả năng của nhà cung cấp tách biệt với việc cho phép tiếp nhận yêu cầu."
          ],
          "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": "Giá trị task_id thực tế đã trả về hoặc bản ghi trong thư viện nội dung đa phương tiện",
                "path": "/v1/media/tasks/{task_id}"
              }
            ],
            "unknown": "Retain original operation_id/X-Client-Request-ID for reconciliation without resubmission; no dedicated audio poll route."
          },
          "method": {
            "http": "POST",
            "path": "/v1/audio/speech"
          },
          "operation_modes": [
            "audio_speech"
          ],
          "output": {
            "family": [
              "speech"
            ],
            "format": null,
            "multioutputs": "retain every actual response output"
          }
        },
        "ctx": null,
        "examples": [
          {
            "code": "set -eu\n: \"${AILOOT_API_KEY:?Set your Ailoot API key}\"\n: \"${AILOOT_TEXT_FILE:?Set your actual UTF-8 narration script}\"\nexport AILOOT_TEXT_FILE\n: \"${AILOOT_VOICE_ID:?Set the actual accepted voice ID for this model}\"\nexport AILOOT_VOICE_ID\npython3 - <<'PY_REQUEST'\nimport json,os\nfrom pathlib import Path\np=json.loads('{\"model\": \"speech-02-turbo\", \"input\": \"\"}')\nf=Path(os.environ[\"AILOOT_TEXT_FILE\"])\nif not f.is_file():raise SystemExit(\"Choose your actual UTF-8 source material\")\ntext=f.read_text(encoding=\"utf-8\")\nif not text.strip():raise SystemExit(\"Source material must contain text\")\np[\"input\"]=text\nimport re\nvoice=os.environ[\"AILOOT_VOICE_ID\"]\nif not re.fullmatch(r\"[A-Za-z0-9_-]{1,128}\",voice):raise SystemExit(\"Set an actual accepted voice ID\")\np[\"voice\"]=voice\nPath(\"request.json\").write_text(json.dumps(p,ensure_ascii=False))\nPY_REQUEST\ncurl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/audio/speech \\\n  -H \"Authorization: Bearer $AILOOT_API_KEY\" -H 'Content-Type: application/json' \\\n  --data-binary @request.json -D response-headers.txt -o speech.mp3\n",
            "label": "Synthesize your actual script",
            "language": "bash"
          }
        ],
        "family": "openai",
        "fast_multiplier": null,
        "flex_multiplier": null,
        "fmt": "speech",
        "http": "POST",
        "img_in": null,
        "img_out": null,
        "in": null,
        "input": [
          "text"
        ],
        "label": "Tổng hợp giọng nói",
        "max_out": null,
        "max_tool_calls": null,
        "out": null,
        "output": [
          "speech"
        ],
        "path": "/v1/audio/speech",
        "pricing_profiles": [
          {
            "dimensions": {},
            "label": "Core",
            "units": [
              {
                "amount": 60,
                "amount_unit": "usd_per_display_unit",
                "key": "tts_million_chars",
                "label": "per 1 million characters",
                "side": "in"
              }
            ]
          }
        ],
        "request_model_id": "speech-02-turbo",
        "route_label": "Core",
        "status_reads": [],
        "tiers": [],
        "tool_prices": null,
        "unit": "tts_million_chars",
        "units": [
          {
            "key": "tts_million_chars",
            "label": "per 1 million characters",
            "side": "in",
            "usd": 60
          }
        ]
      }
    }
  ],
  "model_id": "speech-02-turbo",
  "nativeProvenance": {
    "input_facts_canonical_sha256": "dd729a04833e49d0ca9da5b5b115e2a6b82bdea41b61a7c6894e7a163eef3c98",
    "input_html_sha256": "4458800c5f5de8c9a567d21ca311c85491d1dfdb869c06d4e025fa8ab4184127",
    "private_audit_sha256": "365434631c0e10e3d9abddf03d185ed9b54dcbbcae7a1fcc77316e2fba4f7f07",
    "role": "historical-normalized-input-audit-hashes",
    "schema": "ailoot-native-model-provenance-v2"
  },
  "page": {
    "canonical": "https://ailoot.ai/models/vi/speech-02-turbo/",
    "description": "Speech-02 Turbo dành cho tổng hợp giọng nói nhanh với nhịp điệu ổn định và giọng đọc đa ngôn ngữ.",
    "locale": "vi",
    "md_url": "https://ailoot.ai/models/vi/speech-02-turbo/index.md",
    "title": "speech-02-turbo — Ailoot",
    "url": "https://ailoot.ai/models/vi/speech-02-turbo/"
  },
  "rawModel": {
    "about": "### Lời nói nhanh cho câu trả lời tương tác\n\nSpeech 02 Turbo dành cho tổng hợp giọng nói tương tác. Nhà sản xuất mô tả sự kết hợp tốc độ với nhịp điệu ổn định và âm thanh tự nhiên; các kịch bản gồm câu trả lời bằng giọng nói, lời thoại trò chơi và nội dung tương tác. Mô hình nhận văn bản và tạo âm thanh lời nói.\n\n### Chọn đặc trưng âm thanh\n\nDòng Speech 02 cho phép kết hợp giọng, ngôn ngữ, giọng vùng miền và sắc thái cảm xúc. Transformer tự hồi quy cùng bộ mã hóa người nói được huấn luyện chung để liên kết âm sắc với nội dung. Có thể tổng hợp văn bản bằng giọng có sẵn; tạo giọng nhân bản mới thuộc bước chuẩn bị riêng.\n\nMô hình tự chọn ngữ điệu cảm xúc theo văn bản hoặc nhận trạng thái đã đặt: vui, buồn, giận dữ, sợ hãi, ghê tởm, ngạc nhiên hoặc bình tĩnh. Có thể điều khiển thêm tốc độ, cao độ và âm lượng để lượt lời phù hợp với nhịp tương tác mong muốn.\n\n### Ngôn ngữ và cách đọc từ\n\nMô hình hỗ trợ lời nói tiếng Nga và các ngôn ngữ khác, gồm tiếng Anh, Trung, Quảng Đông, Nhật, Hàn, Pháp, Đức, Tây Ban Nha, Bồ Đào Nha, Thổ Nhĩ Kỳ, Ả Rập và Ukraine. Với Speech 02, đặc tả hiện tại loại trừ riêng tiếng Ba Tư, Filipino và Tamil.\n\nCó thể làm rõ phát âm bằng từ điển thay thế, ký hiệu phiên âm quốc tế, bính âm tiếng Trung và các cách đọc tiếng Nhật. Khoảng dừng giữa các phần lời được đặt trong phạm vi **0,01–99,99 giây**. Thời lượng khoảng dừng có độ chính xác đến hai chữ số sau dấu phẩy; dấu được đặt giữa các đoạn lời và không đặt liên tiếp. Mô hình cung cấp tốc độ **0,5–2**, âm lượng lớn hơn 0 và tối đa **10**, thay đổi cao độ từ **−12 đến 12**.\n\n### Âm thanh để phát\n\nĐầu vào đồng bộ giới hạn văn bản ít hơn **10 000 ký tự**; với dung lượng dài hơn 3000 ký tự, nhà sản xuất khuyến nghị xuất dần. Khả năng của mô hình gồm MP3, WAV, FLAC và PCM; cài đặt chung còn mô tả Opus, G.711 μ-law, một hoặc hai kênh âm thanh.\n\nThẻ Ailoot này nhận văn bản và trả về lời nói. Tốc độ của Turbo thuộc mục đích biến thể mô hình; thời gian của từng câu trả lời và khả năng sử dụng định dạng mở rộng phụ thuộc vào cách truy cập đã chọn.\n\nCài đặt âm thanh bổ sung gồm các tần số lấy mẫu **8, 16, 22,05, 24, 32 và 44,1 kHz**. MP3 có các mức bitrate **32, 64, 128 hoặc 256 kbit/s**. Có thể thay đổi màu giọng và áp dụng một hiệu ứng: tiếng vang không gian rộng, tiếng vang hội trường, âm thanh điện thoại hoặc giọng robot. Hiệu ứng thay đổi giọng được hỗ trợ cho MP3, WAV và FLAC khi nhận toàn bộ âm thanh, còn với đầu ra truyền luồng chỉ hỗ trợ MP3. Các định dạng G.711 μ-law sử dụng tần số 8 kHz. Những khả năng này thuộc cài đặt tổng hợp của MiniMax.\n\nNhà sản xuất cung cấp đồng bộ lời nói với văn bản: dấu thời gian theo câu, theo từ hoặc theo từ khi xuất dần. Kết quả này giúp kết hợp lời đọc với việc hiển thị văn bản. Khả năng bổ sung này cần hỗ trợ định dạng câu trả lời tương ứng.",
    "alias_of": null,
    "aliases": [],
    "author": "MiniMax",
    "ctx": null,
    "formats": [
      "speech"
    ],
    "id": "speech-02-turbo",
    "input": [
      "text"
    ],
    "kind": "speech",
    "max_out": null,
    "methods": [
      {
        "cache_read": null,
        "cache_write": null,
        "cache_write_1h": null,
        "cache_write_5m": null,
        "conditional_meter": null,
        "contract": {
          "data": {
            "all_results": "Keep the complete binary result and headers. If JSON/multiple outputs are returned, retain every data item and fetch each actual signed asset URL.",
            "errors": [
              {
                "code": null,
                "condition": "Trường bắt buộc, cách biểu diễn tài liệu hoặc giá trị tham số không hợp lệ",
                "http_status": 400,
                "recovery": "Sửa các trường được chỉ ra trước khi gửi yêu cầu tạo mới.",
                "type": "invalid_request_error"
              },
              {
                "code": null,
                "condition": "Phản hồi trả về cho biết thao tác hoặc kết quả cần được kiểm tra",
                "http_status": null,
                "recovery": "Giữ lại ID thao tác/tác vụ gốc đã trả về, các header của yêu cầu và toàn bộ phản hồi; tiếp tục truy xuất thao tác gốc đó bằng các phương thức được hỗ trợ. Không gửi lại yêu cầu tạo.",
                "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": "Giữ lại operation_id/X-Client-Request-ID gốc để đối soát mà không gửi lại yêu cầu; không có tuyến truy vấn trạng thái riêng cho âm thanh."
            },
            "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": "Giữ lại toàn bộ kết quả nhị phân và các header. Nếu phản hồi ở dạng JSON hoặc chứa nhiều đầu ra, giữ lại mọi phần tử dữ liệu và tải từng tài nguyên từ URL có chữ ký thực tế.",
              "family": "audio",
              "fields": [
                {
                  "description": null,
                  "name": "binary audio",
                  "type": "bytes"
                },
                {
                  "description": null,
                  "name": "response headers",
                  "type": "headers"
                }
              ],
              "format": "mp3"
            },
            "parameters": [
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": [
                  "speech-02-turbo"
                ],
                "enum_known": true,
                "name": "model",
                "required": true,
                "type": "string"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": null,
                "enum_known": false,
                "maximum_length_exclusive": 10000,
                "min_length": 1,
                "name": "input",
                "required": true,
                "type": "string",
                "unit": "ký tự 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": [
            "Cấu trúc phương thức và ID là chính xác; khả năng của nhà cung cấp tách biệt với việc cho phép tiếp nhận yêu cầu."
          ],
          "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": "Giá trị task_id thực tế đã trả về hoặc bản ghi trong thư viện nội dung đa phương tiện",
                "path": "/v1/media/tasks/{task_id}"
              }
            ],
            "unknown": "Retain original operation_id/X-Client-Request-ID for reconciliation without resubmission; no dedicated audio poll route."
          },
          "method": {
            "http": "POST",
            "path": "/v1/audio/speech"
          },
          "operation_modes": [
            "audio_speech"
          ],
          "output": {
            "family": [
              "speech"
            ],
            "format": null,
            "multioutputs": "retain every actual response output"
          }
        },
        "ctx": null,
        "examples": [
          {
            "code": "set -eu\n: \"${AILOOT_API_KEY:?Set your Ailoot API key}\"\n: \"${AILOOT_TEXT_FILE:?Set your actual UTF-8 narration script}\"\nexport AILOOT_TEXT_FILE\n: \"${AILOOT_VOICE_ID:?Set the actual accepted voice ID for this model}\"\nexport AILOOT_VOICE_ID\npython3 - <<'PY_REQUEST'\nimport json,os\nfrom pathlib import Path\np=json.loads('{\"model\": \"speech-02-turbo\", \"input\": \"\"}')\nf=Path(os.environ[\"AILOOT_TEXT_FILE\"])\nif not f.is_file():raise SystemExit(\"Choose your actual UTF-8 source material\")\ntext=f.read_text(encoding=\"utf-8\")\nif not text.strip():raise SystemExit(\"Source material must contain text\")\np[\"input\"]=text\nimport re\nvoice=os.environ[\"AILOOT_VOICE_ID\"]\nif not re.fullmatch(r\"[A-Za-z0-9_-]{1,128}\",voice):raise SystemExit(\"Set an actual accepted voice ID\")\np[\"voice\"]=voice\nPath(\"request.json\").write_text(json.dumps(p,ensure_ascii=False))\nPY_REQUEST\ncurl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/audio/speech \\\n  -H \"Authorization: Bearer $AILOOT_API_KEY\" -H 'Content-Type: application/json' \\\n  --data-binary @request.json -D response-headers.txt -o speech.mp3\n",
            "label": "Synthesize your actual script",
            "language": "bash"
          }
        ],
        "family": "openai",
        "fast_multiplier": null,
        "flex_multiplier": null,
        "fmt": "speech",
        "http": "POST",
        "img_in": null,
        "img_out": null,
        "in": null,
        "input": [
          "text"
        ],
        "label": "Tổng hợp giọng nói",
        "max_out": null,
        "max_tool_calls": null,
        "out": null,
        "output": [
          "speech"
        ],
        "path": "/v1/audio/speech",
        "pricing_profiles": [
          {
            "dimensions": {},
            "label": "Core",
            "units": [
              {
                "amount": 60,
                "amount_unit": "usd_per_display_unit",
                "key": "tts_million_chars",
                "label": "per 1 million characters",
                "side": "in"
              }
            ]
          }
        ],
        "request_model_id": "speech-02-turbo",
        "route_label": "Core",
        "status_reads": [],
        "tiers": [],
        "tool_prices": null,
        "unit": "tts_million_chars",
        "units": [
          {
            "key": "tts_million_chars",
            "label": "per 1 million characters",
            "side": "in",
            "usd": 60
          }
        ]
      }
    ],
    "model_aliases": [
      {
        "canonical_model_id": "speech-02-turbo",
        "request_model_id": "speech-02-turbo",
        "route_label": "Core"
      }
    ],
    "name": "speech-02-turbo",
    "price": {
      "in": 60,
      "in_label": "per 1 million characters",
      "out": null,
      "out_label": null,
      "sort_in": null,
      "sort_out": null,
      "varies": false
    },
    "short": "Speech-02 Turbo dành cho tổng hợp giọng nói nhanh với nhịp điệu ổn định và giọng đọc đa ngôn ngữ."
  },
  "renderer_schema": {
    "method_order": "Original DTO methods order; every exact route/format/path/caller survives.",
    "prices": "Original public DTO fields and original native display HTML; no flattened or normalized offers."
  },
  "representation": "exact-public-dto-and-native-renderer-html",
  "representationNotes": {
    "current_reference": {
      "about_json_pointer": "/aboutHtml",
      "methods": [
        {
          "contract_json_pointer": "/methods/0/rawMethod/contract",
          "html_json_pointer": "/methods/0/html",
          "method_ordinal": 0
        }
      ],
      "role": "current-semantic-reference"
    },
    "raw_input": {
      "examples_role": "historical-input-not-current-ready-examples",
      "json_pointers": [
        "/rawModel",
        "/methods/0/rawMethod"
      ],
      "role": "historical-owner-input"
    },
    "schema": "ailoot-native-model-representations-v1"
  },
  "schema": "ailoot-static-model-facts-v1",
  "schema_version": 1,
  "shortText": "Speech-02 Turbo dành cho tổng hợp giọng nói nhanh với nhịp điệu ổn định và giọng đọc đa ngôn ngữ.",
  "source": {
    "audit_sha256": "2e00086bcbfc28e64d0cebe97aa47c17d8d5618963027f8ffb9dc6123d7d25b1",
    "bridge_map_sha256": "1125275768b9636fc8461bc7da5061239a81ddfe508e2557843ca42c58ab0036",
    "raw_model_json_sha256": "b54225a17bc7ef11c571d3a7eff2b16ddf3f6f485a6cac120c9a109e42af9799",
    "renderer_sha256": "64a62299639eb843877e9ec5c95e32bf22bac3acfe230f6f502c5c3aa186f9c1"
  },
  "sourceRevision": "8177138afe1546a013ee9bcc89f73cfa416a514c92395330cc159c7d85109510"
}
