> ## Documentation Index
> Fetch the complete documentation index at: https://typecast.ai/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# 보이스 상세 정보 조회 (v2)

> 향상된 메타데이터가 있는 특정 보이스에 대한 자세한 정보를 검색합니다(V2).

이 엔드포인트는 모델별로 그룹화된 감정 지원과 성별, 연령대, 사용 사례와 같은 메타데이터를 포함한 단일 보이스에 대한 전체 정보를 반환합니다. TTS 요청을 하기 전에 보이스 세부 정보를 확인하거나 사용 가능한 감정을 확인해야 할 때 사용합니다.

**응답 포함 사항:**
- **voice_id**: 고유한 보이스 식별자
- **voice_name**: 사람이 읽을 수 있는 보이스 이름
- **models**: 각각의 감정 세트가 있는 지원되는 TTS 모델 배열
- **gender**: 보이스 성별 분류(남성/여성)
- **age**: 연령대 분류(어린이/청소년/청년/중년/노년)
- **use_cases**: 이 보이스에 권장되는 콘텐츠 카테고리

**사용 사례:**
- TTS 요청 전 보이스 가용성 확인
- 특정 보이스 및 모델 조합에 대해 지원되는 감정 확인
- 보이스 선택 UI에 보이스 세부 정보 표시

## OpenAPI

```json
{
  "openapi": "3.1.0",
  "info": {
    "title": "Typecast API",
    "x-logo": {
      "url": "https://typecast.ai/_ipx/_/image/logo/tc_logo.webp"
    },
    "version": "0.1.2"
  },
  "servers": [
    {
      "url": "https://api.typecast.ai",
      "description": "프로덕션 서버"
    }
  ],
  "security": [
    {
      "ApiKeyAuth": []
    }
  ],
  "paths": {
    "/v2/voices/{voice_id}": {
      "get": {
        "tags": [
          "Deprecated"
        ],
        "x-mint": {
          "href": "/ko/api-reference/deprecated/get-voice-details-v2"
        },
        "summary": "보이스 상세 정보 조회 (v2)",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VoiceV2"
                },
                "example": {
                  "age": "young_adult",
                  "gender": "female",
                  "models": [
                    {
                      "version": "ssfm-v30",
                      "emotions": [
                        "normal",
                        "happy",
                        "sad",
                        "angry",
                        "whisper",
                        "toneup",
                        "tonedown"
                      ]
                    },
                    {
                      "version": "ssfm-v21",
                      "emotions": [
                        "normal",
                        "happy",
                        "sad",
                        "angry"
                      ]
                    }
                  ],
                  "voice_id": "tc_60e5426de8b95f1d3000d7b5",
                  "use_cases": [
                    "Audiobook",
                    "E-learning",
                    "Ads"
                  ],
                  "voice_name": "Olivia",
                  "voice_type": "original"
                }
              }
            },
            "description": "Success - Returns detailed information for the requested voice"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "example": {
                  "detail": "Invalid API key"
                }
              }
            },
            "description": "Unauthorized - Invalid or missing API key"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "example": {
                  "detail": "Voice not found"
                }
              }
            },
            "description": "Not Found - Requested voice does not exist"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "example": {
                  "detail": "Invalid request format"
                }
              }
            },
            "description": "Validation Error - Invalid voice_id format"
          }
        },
        "deprecated": true,
        "parameters": [
          {
            "in": "path",
            "name": "voice_id",
            "schema": {
              "type": "string",
              "title": "Voice Id"
            },
            "required": true
          }
        ],
        "description": "향상된 메타데이터가 있는 특정 보이스에 대한 자세한 정보를 검색합니다(V2).\n\n이 엔드포인트는 모델별로 그룹화된 감정 지원과 성별, 연령대, 사용 사례와 같은 메타데이터를 포함한 단일 보이스에 대한 전체 정보를 반환합니다. TTS 요청을 하기 전에 보이스 세부 정보를 확인하거나 사용 가능한 감정을 확인해야 할 때 사용합니다.\n\n**응답 포함 사항:**\n- **voice_id**: 고유한 보이스 식별자\n- **voice_name**: 사람이 읽을 수 있는 보이스 이름\n- **models**: 각각의 감정 세트가 있는 지원되는 TTS 모델 배열\n- **gender**: 보이스 성별 분류(남성/여성)\n- **age**: 연령대 분류(어린이/청소년/청년/중년/노년)\n- **use_cases**: 이 보이스에 권장되는 콘텐츠 카테고리\n\n**사용 사례:**\n- TTS 요청 전 보이스 가용성 확인\n- 특정 보이스 및 모델 조합에 대해 지원되는 감정 확인\n- 보이스 선택 UI에 보이스 세부 정보 표시",
        "operationId": "get_voice_v2_v2_voices__voice_id__get",
        "x-codeSamples": [
          {
            "lang": "cURL",
            "label": "cURL",
            "source": "curl --request GET \\\n  --url 'https://api.typecast.ai/v2/voices/tc_60e5426de8b95f1d3000d7b5' \\\n  --header 'X-API-KEY: <api-key>'\n"
          },
          {
            "lang": "C#",
            "label": "C# (HttpClient)",
            "source": "using System;\nusing System.Net.Http;\nusing System.Threading.Tasks;\n\nvar client = new HttpClient();\nclient.DefaultRequestHeaders.Add(\"X-API-KEY\", \"<api-key>\");\n\nvar voiceId = \"tc_60e5426de8b95f1d3000d7b5\";\nvar response = await client.GetAsync($\"https://api.typecast.ai/v2/voices/{voiceId}\");\n\nif (response.IsSuccessStatusCode)\n{\n    var content = await response.Content.ReadAsStringAsync();\n    Console.WriteLine(content);\n}\n"
          },
          {
            "lang": "Kotlin",
            "label": "Kotlin (OkHttp)",
            "source": "import okhttp3.OkHttpClient\nimport okhttp3.Request\n\nval client = OkHttpClient()\nval voiceId = \"tc_60e5426de8b95f1d3000d7b5\"\n\nval request = Request.Builder()\n    .url(\"https://api.typecast.ai/v2/voices/$voiceId\")\n    .addHeader(\"X-API-KEY\", \"<api-key>\")\n    .get()\n    .build()\n\nclient.newCall(request).execute().use { response ->\n    if (response.isSuccessful) {\n        println(response.body?.string())\n    }\n}\n"
          },
          {
            "lang": "C++",
            "label": "C++ (libcurl)",
            "source": "#include <curl/curl.h>\n#include <string>\n#include <iostream>\n\nsize_t WriteCallback(void* contents, size_t size, size_t nmemb, void* userp) {\n    ((std::string*)userp)->append((char*)contents, size * nmemb);\n    return size * nmemb;\n}\n\nint main() {\n    CURL* curl = curl_easy_init();\n    if(curl) {\n        std::string readBuffer;\n        struct curl_slist* headers = NULL;\n\n        headers = curl_slist_append(headers, \"X-API-KEY: <api-key>\");\n\n        std::string url = \"https://api.typecast.ai/v2/voices/tc_60e5426de8b95f1d3000d7b5\";\n\n        curl_easy_setopt(curl, CURLOPT_URL, url.c_str());\n        curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);\n        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);\n        curl_easy_setopt(curl, CURLOPT_WRITEDATA, &readBuffer);\n\n        CURLcode res = curl_easy_perform(curl);\n        if(res == CURLE_OK) {\n            std::cout << readBuffer << std::endl;\n        }\n\n        curl_slist_free_all(headers);\n        curl_easy_cleanup(curl);\n    }\n    return 0;\n}\n"
          },
          {
            "lang": "C",
            "label": "C (libcurl)",
            "source": "#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <curl/curl.h>\n\ntypedef struct {\n    char* data;\n    size_t size;\n} MemoryStruct;\n\nsize_t WriteMemoryCallback(void* contents, size_t size, size_t nmemb, void* userp) {\n    size_t realsize = size * nmemb;\n    MemoryStruct* mem = (MemoryStruct*)userp;\n\n    char* ptr = realloc(mem->data, mem->size + realsize + 1);\n    if(!ptr) return 0;\n\n    mem->data = ptr;\n    memcpy(&(mem->data[mem->size]), contents, realsize);\n    mem->size += realsize;\n    mem->data[mem->size] = 0;\n\n    return realsize;\n}\n\nint main(void) {\n    CURL* curl;\n    CURLcode res;\n    MemoryStruct chunk = {NULL, 0};\n\n    curl_global_init(CURL_GLOBAL_ALL);\n    curl = curl_easy_init();\n\n    if(curl) {\n        struct curl_slist* headers = NULL;\n        headers = curl_slist_append(headers, \"X-API-KEY: <api-key>\");\n\n        const char* url = \"https://api.typecast.ai/v2/voices/tc_60e5426de8b95f1d3000d7b5\";\n\n        curl_easy_setopt(curl, CURLOPT_URL, url);\n        curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);\n        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteMemoryCallback);\n        curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void*)&chunk);\n\n        res = curl_easy_perform(curl);\n\n        if(res == CURLE_OK) {\n            printf(\"%s\\n\", chunk.data);\n        }\n\n        curl_slist_free_all(headers);\n        curl_easy_cleanup(curl);\n        free(chunk.data);\n    }\n\n    curl_global_cleanup();\n    return 0;\n}\n"
          },
          {
            "lang": "Swift",
            "label": "Swift (URLSession)",
            "source": "import Foundation\n\nlet voiceId = \"tc_60e5426de8b95f1d3000d7b5\"\nlet url = URL(string: \"https://api.typecast.ai/v2/voices/\\(voiceId)\")!\nvar request = URLRequest(url: url)\nrequest.httpMethod = \"GET\"\nrequest.setValue(\"<api-key>\", forHTTPHeaderField: \"X-API-KEY\")\n\nlet task = URLSession.shared.dataTask(with: request) { data, response, error in\n    if let data = data, let jsonString = String(data: data, encoding: .utf8) {\n        print(jsonString)\n    }\n}\ntask.resume()\n"
          },
          {
            "lang": "Rust",
            "label": "Rust (reqwest)",
            "source": "use reqwest;\n\n#[tokio::main]\nasync fn main() -> Result<(), Box<dyn std::error::Error>> {\n    let client = reqwest::Client::new();\n    let voice_id = \"tc_60e5426de8b95f1d3000d7b5\";\n\n    let url = format!(\"https://api.typecast.ai/v2/voices/{}\", voice_id);\n\n    let response = client\n        .get(&url)\n        .header(\"X-API-KEY\", \"<api-key>\")\n        .send()\n        .await?;\n\n    if response.status().is_success() {\n        let body = response.text().await?;\n        println!(\"{}\", body);\n    }\n\n    Ok(())\n}\n"
          }
        ]
      }
    }
  },
  "components": {
    "schemas": {
      "Limits": {
        "type": "object",
        "title": "Limits",
        "required": [
          "concurrency_limit"
        ],
        "properties": {
          "concurrency_limit": {
            "type": "integer",
            "title": "Concurrency Limit",
            "description": "허용되는 최대 동시 요청 수"
          },
          "custom_voice_slot": {
            "type": "integer",
            "title": "Custom Voice Slot",
            "default": 0,
            "minimum": 0,
            "description": "전체 커스텀 보이스 슬롯 한도 (professional 포함)"
          },
          "professional_voice_slot": {
            "type": "integer",
            "title": "Professional Voice Slot",
            "default": 0,
            "minimum": 0,
            "description": "프리미엄 클로닝 보이스 슬롯 한도"
          }
        },
        "description": "사용 제한 정보"
      },
      "Prompt": {
        "title": "프롬프트 (ssfm-v21)",
        "properties": {
          "emotion_preset": {
            "example": "normal",
            "description": "적용할 감정 프리셋.\r\n\r\nssfm-v21 지원 감정: normal, happy, sad, angry\r\n\r\n`GET /v3/voices` API 응답의 `models` 필드에서 각 보이스에 사용 가능한 감정을 확인하세요.\r\n"
          },
          "emotion_intensity": {
            "example": 1,
            "description": "감정 표현 강도 제어(0.0~2.0).\r\n\r\n- 0.0: 완전히 중립적\r\n- 1.0: 표준 표현(기본값)\r\n- 2.0: 최대 강도\r\n"
          }
        },
        "description": "생성된 음성의 감정 및 스타일 설정."
      },
      "AgeEnum": {
        "enum": [
          "child",
          "teenager",
          "young_adult",
          "middle_age",
          "elder"
        ],
        "type": "string",
        "title": "AgeEnum",
        "description": "연령대 분류 열거형 - 데이터베이스 값(한국어)을 API 값(영어)으로 변환합니다.\n\n사용 가능한 값:\n- **child**: 어린이 보이스(12세 미만)\n- **teenager**: 청소년 보이스(13-19세)\n- **young_adult**: 청년 보이스(20-35세)\n- **middle_age**: 중년 보이스(36-60세)\n- **elder**: 노년 보이스(60세 이상)\n"
      },
      "Credits": {
        "type": "object",
        "title": "Credits",
        "required": [
          "plan_credits",
          "used_credits"
        ],
        "properties": {
          "plan_credits": {
            "type": "integer",
            "title": "Plan Credits",
            "description": "플랜에서 기본으로 제공하는 총 크레딧"
          },
          "used_credits": {
            "type": "integer",
            "title": "Used Credits",
            "description": "사용된 크레딧 수"
          }
        },
        "description": "크레딧 사용 정보"
      },
      "VoiceV2": {
        "type": "object",
        "title": "VoiceV2",
        "required": [
          "voice_id",
          "voice_name",
          "models",
          "voice_type"
        ],
        "properties": {
          "age": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/AgeEnum"
              },
              {
                "type": "null"
              }
            ],
            "description": "보이스 연령대 분류(어린이/청소년/청년/중년/노년)"
          },
          "gender": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/GenderEnum"
              },
              {
                "type": "null"
              }
            ],
            "description": "보이스 성별 분류(남성/여성)"
          },
          "models": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ModelInfo"
            },
            "title": "Models",
            "description": "사용 가능한 감정이 있는 지원되는 TTS 모델 목록(예: [{'version': 'ssfm-v21', 'emotions': ['happy', 'sad']}])"
          },
          "voice_id": {
            "type": "string",
            "title": "Voice Id",
            "description": "고유한 보이스 식별자. 기본 제공 보이스는 `tc_` prefix (예: `tc_60e5426de8b95f1d3000d7b5`), `POST /v1/voices/clone` 으로 만든 커스텀 보이스는 `uc_` prefix 를 사용합니다. `/v3/voices`로 계정에서 사용할 수 있는 기본 제공 보이스와 생성이 완료된 커스텀 보이스를 조회하세요."
          },
          "use_cases": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "title": "Use Cases",
            "description": "이 보이스가 적합한 사용 사례 카테고리 목록\n\n## 보이스 이름 참고\n\n`voice_name` 필드는 영문으로만 반환됩니다. 아래 목록에서 한국어 표기를 확인하실 수 있습니다.\n\n<details>\n<summary><strong>보이스 이름 목록 펼치기 (542개)</strong></summary>\n\n| 영어 | 한국어 | 영어 | 한국어 | 영어 | 한국어 |\n| --- | --- | --- | --- | --- | --- |\n| Aaron | 에런 | Inhye | 인혜 | Piljae | 필재 |\n| Abigail | 아비게일 | Inseong | 인성 | Pyeonghwa | 평화 |\n| Ae-ran | 애란 | Instructor Han | 한유격 교관 | Rachel | 레이첼 |\n| Ael | 아엘 | Insun | 인선 | Ravi | 라비 |\n| Agatha | 아가사 | Jabbaba | 자바바 | Rayeon | 라연 |\n| Aiden | 에이든 | Jack | 잭 | Rebecca | 레베카 |\n| Alena | 알레나 | Jack-o’-Lantern | 잭오랜턴 | Reporter Bona | 다보나 기자 |\n| Alex | 알렉스 | Jackson | 잭슨 | Reporter Catalina | 카탈리나 기자 |\n| Amber | 엠버 | Jaeho | 재호 | Reporter Jinsub | 송진섭 기자 |\n| Anchor Hwa | 김경화 앵커 | Jaehun | 재훈 | Reporter Kang | 강수정 기자 |\n| Angela | 안젤라 | Jaejun | 재준 | Reporter Lee | 이승주 기자 |\n| Anja | 안냐 | Jaekyung | 재경 | Reporter Parkchan | 박찬 기자 |\n| Annabelle the Ghost | 귀신 애나벨 | Jaesun | 재선 | Rex | 렉스 |\n| Annie | 애니 | JaeYi | 재이 | Riley | 라일리 |\n| April | 에이프릴 | Jaeyoung | 재영 | Risan Ji | 지리산 |\n| Arang | 아랑 | Jain | 자인 | Rita | 리타 |\n| Ari | 아리 | Jake | 제이크 | River | 리버 |\n| Arin | 아린 | Janet | 재닛 | Robert | 로버트 |\n| Athena | 아테나 | Jangho | 장호 | Robo | 로보 |\n| Audrey | 오드리 | Jangwoon | 장운 | Romi | 로미 |\n| Avery | 에이버리 | Jechan | 제찬 | Ron | 론 |\n| Avong | 아봉 | Jeff | 제프 | Roro | 로로 |\n| Azzi | 아찌 | Jenna | 제나 | Rowoon | 로운 |\n| Babilon | 바빌론 | Jennifer | 제니퍼 | Royce | 로이스 |\n| Bell | 벨 | Jeong Choi | 최정 | Rudolph | 루돌프 |\n| Ben | 벤 | Jeongah | 정아 | Ruri | 루리 |\n| Benny | 베니 | JeongJin | 정진 | Rusty | 러스티 |\n| Beri | 베리 | Jeongseob | 정섭 | Ryan | 라이언 |\n| Billie | 빌리 | Jerome | 제롬 | Ryueun | 류은 |\n| Bomi | 이보미 | Jewby | 쥬비 | Sabrina the Witch | 마녀 사브리나 |\n| Bonggyu | 봉규 | Jian | 지안 | Saeron | 새론 |\n| Bongman Kim | 김봉만 | Jicheol | 지철 | Salty Chan-gu | 삐뚤어진 찬구 |\n| Bono | 보노 | Jihee | 지희 | Samantha | 사만다 |\n| Bora | 보라 | Jihoon | 지훈 | Sammy | 새미 |\n| Brad | 브래드 | Jihyun | 지현 | Sangdo | 상도 |\n| Bruce | 브루스 | Jimmy | 지미 | Sanghoon | 상훈 |\n| Buddy | 버디 | Jin | 진 | Sangwoo | 상우 |\n| Bumsoo | 범수 | Jinhan | 진한 | Santa | 산타 |\n| Buttaguy | 빠다가이 | Jinhang Kim | 김진행 | Santa Claus | 산타클로스 |\n| Caitlyn | 케이틀린 | Jinhee | 진희 | Santa Reporter | VJ 싼타 |\n| Callan | 칼란 | Jinhyuk | 진혁 | Sara | 세라 |\n| Camila | 카밀라 | Jinseo | 진서 | Sean | 션 |\n| Captain Bill | 캡틴 빌 | Jinung | 진웅 | SeHee | 세희 |\n| Carl | 칼 | Jinwoo | 진우 | Seheon | 세헌 |\n| Carlos | 카를로스 | Jiwoo | 지우 | Sejin | 세진 |\n| Carol | 캐롤 | Jiyoon | 지윤 | Sena | 세나 |\n| Catherine | 캐서린 | Jiyoung | 지영 | Seohee | 서희 |\n| Chad | 채드 | Jodie | 조디 | Seojin | 서진 |\n| Chaeah | 채아 | Jolly | 졸리 | Seojoon | 서준 |\n| Chan-gu | 찬구 | Jongdae | 종대 | Seok Choi | 최석 |\n| Changbae | 창배 | Jooeun | 주은 | SeokPil | 한석필 |\n| Changhee | 창희 | Joonghyun | 중현 | Seokpyo | 석표 |\n| Changmin | 창민 | Joongsik | 중식 | Seolhwa | 설화 |\n| Changsu | 박창수 | Joonkyu | 준규 | Seonha | 선하 |\n| Chanhyuk | 찬혁 | Joshua | 조슈아 | Seoyeon | 서연 |\n| Charlotte | 샬롯 | Juha | 주하 | Seoyoon | 서윤 |\n| Chase | 체이스 | Juho | 주호 | Seungah | 승아 |\n| Cheolhoon | 철훈 | Jungbong | 정봉 | Seungheon | 승헌 |\n| Cheolyong | 리철용 | Junghee | 정희 | Seungho | 승호 |\n| Cherry | 체리 | Jungjae | 정재 | Seunghwa | 승화 |\n| Chester | 체스터 | Jungmin | 정민 | Seungjae | 승재 |\n| Chiho | 치호 | Jungseok | 정석 | Seungmoon | 승문 |\n| Chloe | 클로이 | Jungsoon | 정순 | Seungwon | 승원 |\n| Choyeon | 강초연 교관 | Jungwon | 정원 | Seungyeon | 승연 |\n| Chungah | 청아 | Junhee | 준희 | Sewoo | 세우 |\n| Chunsik Kang | 강춘식 기자 | Junho | 준호 | Shana | 샤나 |\n| Claire | 클레어 | JunKi | 준기 | Sheriff Kim | 김반장 |\n| Classic Narrator | 미스타 변사 | Junsang | 준상 | Shinhe | 신혜 |\n| Cole | 콜 | Junseong | 준성 | Shinwook | 신욱 |\n| Cox | 콕스 | Justice Roh | 정의로 | Shotgun | 샷건 |\n| Cyrus | 사이러스 | Justin | 저스틴 | Simon | 사이먼 |\n| Dabin | 다빈 | Juwon | 주원 | Sindarin | 신다린 |\n| Daegil | 대길 | Juyoung | 주영 | Sio | 시오 |\n| Dahee | 다희 | K-Santa | 산타 할아버지 | Siwon | 시원 |\n| Dahyeon | 다현 | Kangil | 강일 | Siwoo | 시우 |\n| Damian | 데이미언 | Kanno | 칸노 | Siyeon | 시연 |\n| Dan | 댄 | Katie | 케이티 | Skylar | 스카일러 |\n| Dana | 다나 | Kelly | 켈리 | Slushy | 슬러시 |\n| Dasom | 다솜 | Kelsey | 켈시 | Smoke | 스모크 |\n| David | 데이비드 | Kevin | 케빈 | Sohye | 소혜 |\n| Dean | 딘 | Keybo | 키보 | Sojin | 소진 |\n| Deokhwan | 덕환 | Kijang Kim | 김기장 | Soobin | 수빈 |\n| Dohan | 도한 | Killian the Vampire | 뱀파이어 킬리언 | Sookhee | 숙희 |\n| Dohee | 도희 | Kiseob | 기섭 | Sooni | 순이 |\n| Dohyun | 도현 | Klip Kim | 클립 킴 | Sophia | 소피아 |\n| Dollar Jr. | 달러 주니어 | Koombo | 쿰보 | Sora | 소라 |\n| Doug | 더그 | Kristen | 크리스틴 | Soye | 소예 |\n| Doughnut | 도넛 | Kukhee | 국희 | Soyi | 소이 |\n| DU5T | 더스트 | Kwonil | 권일 | Soyoung | 소영 |\n| Duckchun | 덕춘 | Kyumin | 규민 | Soyul | 소율 |\n| Duke | 듀크 | Kyungho | 경호 | Spice | 스파이스 |\n| Dukgu | 덕구 | Kyungsoo | 경수 | Sportscaster Kang | 강수정 캐스터 |\n| Duman | 두만 | Kyungsook | 경숙 | Sportscaster Tony | 이영광 캐스터 |\n| Dupil | 곽두필 | Lady Cho | 단희빈 | Starling | 스탈링 |\n| DVZY | 데이지 | Lala | 라라 | Stephanie | 스테파니 |\n| Dylan | 딜런 | Lamie | 라미 | Storyteller Jinsub | 송진섭 스토리텔러 |\n| E-seller Sherri | 쇼린이 | Landon | 랜던 | Sua | 수아 |\n| Echo | 에코 | Larry | 래리 | Suho | 수호 |\n| Edward | 에드워드 | Leo | 레오 | Suji | 수지 |\n| Elias | 엘리아스 | Liam | 리암 | Sujin | 수진 |\n| Elise | 엘리스 | Lindsay | 린지 | Sullock Hong | 홍설록 |\n| Ella | 엘라 | Liz | 리즈 | Sumin | 수민 |\n| Eman | 이만 | Lloyd | 로이드 | Sungbae | 성배 |\n| Emma | 엠마 | Logan | 로건 | Sunggyu | 성규 |\n| Eunbin | 은빈 | Lucille | 루실 | Sungho | 성호 |\n| Eunchae | 은채 | Luna | 루나 | Sunghoon | 성훈 |\n| Eunha | 은하 | Lydia | 리디아 | Sunghyun | 성현 |\n| Eunsol | 은솔 | Maddie | 매디 | Sungjun | 홈쇼핑 성준 |\n| Frankenstein | 프랑켄슈타인 | Maisie | 메이시 | Sungkwon | 성권 |\n| Furnando | 터르난도 | Margaret | 마가렛 | Sungtae | 성태 |\n| Gaeul | 가을 | Margot | 마고 | Sungwook | 성욱 |\n| Gahee | 가희 | Matthew | 매튜 | Sunyoung | 선영 |\n| George | 조지 | MBTI EF (F) | MBTI EF 여 | Suyoon | 수윤 |\n| GeumHee | 금희 | MBTI EF (M) | MBTI EF 남 | Sylvia | 실비아 |\n| Geunhyeok | 근혁 | MBTI ET (F) | MBTI ET 여 | Taebaek | 장태백 |\n| Geunseok | 근석 | MBTI ET (M) | MBTI ET 남 | Taeji | 태지 |\n| Geunwoo | 근우 | MBTI IF (F) | MBTI IF 여 | Taejoong | 태중 |\n| Geunyeong | 근영 | MBTI IF (M) | MBTI IF 남 | Taemin | 태민 |\n| Ggami | 까미 | MBTI IT (F) | MBTI IT 여 | Taesub | 태섭 |\n| Ggomi | 꼬미 | MBTI IT (M) | MBTI IT 남 | Taewoo | 태우 |\n| Glenda | 글렌다 | MC Kong | MC콩 | Teal | 틸 |\n| Goat Kim | 김고트 | MC TypeCast | MC 타캐 | Tessa | 테사 |\n| Gongchul | 공철 | Mia | 미아 | Tian | 티안 |\n| Gowoon | 고운 | Michael | 마이클 | Tim | 팀 |\n| Grace | 그레이스 | Mija | 오미자 | Tina | 티나 |\n| Graham | 그레이엄 | Mijin | 미진 | Toby | 토비 |\n| Gunseok | 건석 | Mikyung | 미경 | Tommy | 토미 |\n| Gunwoo | 건우 | Millie | 밀리 | Tyson | 타이슨 |\n| Guri | 구리 | Minchae | 민채 | UiChan | 의찬이 |\n| Gus | 거스 | Minji | 민지 | Uncle Hank | 행크 |\n| Ha Eun | 하은 | Minjoon | 민준 | Valerie | 밸러리 |\n| Haejun | 해준 | Minju | 민주 | Valkyrie | 발키리 |\n| Haerang | 해랑 | Minjung | 민정 | Vanessa | 바네사 |\n| Hailey | 헤일리 | Minsang | 민상 | Verna | 베르나 |\n| Hajun | 하준 | Minsu | 민수 | Victoria | 빅토리아 |\n| Hakchul | 학철 | Mio | 미오 | Viktor | 빅토르 |\n| Hamchu | 햄쮸 | Miran Choi | 최미란 | Vincent | 빈센트 |\n| Han Taesung Caster | 한태성 캐스터 | Mirine | 미리내 | Vivien | 비비안 |\n| Hana | 하나 | Miseon | 미선 | Wade | 웨이드 |\n| Hangyeol | 한결 | Miso | 미소 | Walter | 월터 |\n| Hanjun | 한준 | Mister Gop | 미스터 갑 | Wangkwon | 왕권 |\n| Hanna | 한나 | Monggun | 몽군 | Weather Reporter Sky | 하늘 캐스터 |\n| Hans | 한스 | Moonjung | 문정 | West | 웨스트 |\n| Hansol | 한솔 | Mooyeol | 무열 | Wonho | 원호 |\n| Hanyoung | 한영 | Morgan | 모건 | Wonkyung | 원경 |\n| Harin | 하린 | Moru | 머루 | Wonwoo | 원우 |\n| Harper | 하퍼 | Mrs. Claus | 미세스 클로스 | Wooju | 우주 |\n| Hayul | 하율 | Munseok | 문석 | Woosung | 우성 |\n| Heejoon | 희준 | Munsu | 문수 | Xavier | 자비에르 |\n| Helena | 헬레나 | Myeonghee | 명희 | Yeeun | 예은 |\n| Henry | 헨리 | Myungil | 명일 | Yejin | 예진 |\n| Homun Sim | 심호문 | Myungjoo | 명주 | Yejoon | 예준 |\n| Hoon | 훈 | Naeun | 나은 | YeLin | 예린 |\n| Hosik | 호식 | Najin | 나진 | Yena | 예나 |\n| Hosun | 호선 | Namjoon | 남준 | Yeonah | 연아 |\n| Hoyoung | 호영 | Nana | 나나 | Yeonggeol | 영걸 |\n| Hugh | 휴 | Nari | 개나리 | Yeonhwa | 연화 |\n| Hwimin | 휘민 | Nathan | 네이선 | Yeonja | 연자 |\n| Hyejung | 혜정 | Neel | 닐 | Yeonsuh | 연서 |\n| Hyelee | 혜리 | Neoguard | 네오가드 | Yeonwoo | 연우 |\n| Hyemin | 혜민 | News anchor Jinsub | 송진섭 앵커 | Yeseul | 예슬 |\n| Hyena | 혜나 | Newscaster John | 존 앵커 | Yongsik | 용식이 |\n| Hyeongjin | 형진 | Nia | 니아 | Yoonseo | 윤서 |\n| Hyera | 혜라 | Noa | 노아 | Yoonsung | 윤성 |\n| Hyesu | 홈쇼핑 혜수 | Noel | 노엘 | Younggil | 영길 |\n| Hyewon | 혜원 | Noeul | 노을 | Younghee | 영희 |\n| Hyun | 현 | Norah | 노라 | Younghwan | 영환 |\n| Hyunji | 현지 | Nova | 노바 | Youngji | 영지 |\n| Hyunjin | 현진 | Old radio | 레디오 | Youngkyu | 영규 |\n| Hyunju | 현주 | Oliver | 올리버 | Youngmok | 영목 |\n| Hyunkyung | 현경 | Olivia | 올리비아 | Yubin | 유빈 |\n| Hyunmin | 현민 | Oscar | 오스카 | Yujin | 유진 |\n| Hyunseung | 현승 | Owen | 오언 | Yumi | 유미 |\n| HyunWoo | 현우 | P-0150N | 포이즌 | Yumin | 유민 |\n| Ian | 이안 | Pacang | 파캉 | Yunbin | 윤빈 |\n| Icarus | 이카루스 | Paige | 페이지 | Yunjeong | 윤정 |\n| Igyeom | 이겸 | Pangpang | 팡팡 | Yura | 유라 |\n| Ijun | 이준 | Patricia | 패트리샤 | Yuri | 유리 |\n| Ilho | 일호 | Patrick | 패트릭 | Yuseong | 유성 |\n| Ina | 이나 | Peter | 피터 | Zoey | 조이 |\n| Inhwa | 인화 | Philip | 필립 |  |  |\n\n</details>\n"
          },
          "voice_name": {
            "type": "string",
            "title": "Voice Name",
            "description": "사람이 읽을 수 있는 보이스 이름"
          },
          "voice_type": {
            "$ref": "#/components/schemas/VoiceType",
            "description": "보이스 타입 — `original` 은 타입캐스트가 기본 제공하는 스톡 보이스, `custom` 은 사용자가 업로드/클론한 보이스입니다."
          }
        },
        "description": "모델별로 그룹화된 감정과 향상된 메타데이터가 있는 V2 보이스 응답 모델"
      },
      "VoiceV3": {
        "type": "object",
        "title": "VoiceV3",
        "required": [
          "voice_id",
          "voice_name",
          "voice_type",
          "models"
        ],
        "properties": {
          "age": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/AgeEnum"
              },
              {
                "type": "null"
              }
            ],
            "description": "보이스 연령대입니다."
          },
          "gender": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/GenderEnum"
              },
              {
                "type": "null"
              }
            ],
            "description": "보이스 성별(`male` 또는 `female`)입니다."
          },
          "models": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ModelInfo"
            },
            "title": "Models",
            "description": "지원하는 TTS 모델과 감정 목록입니다."
          },
          "voice_id": {
            "type": "string",
            "title": "Voice Id",
            "description": "고유 보이스 식별자입니다. 기본 보이스는 `tc_`, 커스텀 보이스는 `uc_`로 시작합니다."
          },
          "use_cases": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "title": "Use Cases",
            "description": "추천 사용 사례 목록입니다."
          },
          "voice_name": {
            "$ref": "#/components/schemas/VoiceName",
            "description": "`{\"eng\": \"Daejin\", \"kor\": \"대진\"}` 같은 다국어 보이스 이름입니다."
          },
          "voice_type": {
            "$ref": "#/components/schemas/VoiceType",
            "description": "보이스 타입(`original` 또는 `custom`)입니다."
          },
          "preview_url": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Preview Url",
            "description": "제공되는 경우 사용할 수 있는 미리듣기 오디오 URL입니다."
          }
        },
        "description": "다국어 이름과 미리듣기 URL을 포함한 보이스 정보입니다."
      },
      "PlanTier": {
        "enum": [
          "free",
          "lite",
          "plus",
          "custom"
        ],
        "type": "string",
        "title": "PlanTier",
        "description": "API 플랜.\n\n사용 가능한 값:\n- **free**: 제한된 크레딧의 무료 등급\n- **lite**: 중간 수준 크레딧의 라이트 플랜\n- **plus**: 높은 크레딧의 플러스 플랜\n- **custom**: 커스텀 엔터프라이즈 플랜"
      },
      "TTSModel": {
        "enum": [
          "ssfm-v30",
          "ssfm-v21"
        ],
        "type": "string",
        "title": "TTSModel",
        "description": "음성 합성에 사용할 TTS 모델 버전. 다양한 모델은 다양한 기능과 품질 수준을 제공합니다.\n\n사용 가능한 모델:\n- **ssfm-v30**: 향상된 플로우와 추가 감정 프리셋이 있는 최신 모델(권장)\n- **ssfm-v21**: 검증된 신뢰성과 일관된 품질을 갖춘 안정적인 모델\n"
      },
      "ModelInfo": {
        "type": "object",
        "title": "ModelInfo",
        "required": [
          "version",
          "emotions"
        ],
        "properties": {
          "version": {
            "$ref": "#/components/schemas/TTSModel",
            "description": "TTS 모델 버전(예: ssfm-v21, ssfm-v30)"
          },
          "emotions": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "title": "Emotions",
            "description": "이 모델에서 지원되는 감정 목록"
          }
        },
        "description": "버전 및 지원되는 감정을 포함한 모델 정보"
      },
      "VoiceName": {
        "type": "object",
        "title": "VoiceName",
        "required": [
          "eng",
          "kor"
        ],
        "properties": {
          "eng": {
            "type": "string",
            "title": "Eng",
            "description": "영어 보이스 이름입니다."
          },
          "kor": {
            "type": "string",
            "title": "Kor",
            "description": "한국어 보이스 이름입니다."
          }
        },
        "description": "ISO 639-3 언어 코드를 키로 사용하는 다국어 보이스 이름입니다."
      },
      "VoiceType": {
        "enum": [
          "original",
          "custom"
        ],
        "type": "string",
        "title": "VoiceType",
        "description": "보이스 타입 분류.\n\n- `original` — 타입캐스트가 기본 제공하는 스톡 보이스로, 모든 계정에서 사용 가능합니다.\n- `custom` — 사용자가 본인의 샘플을 업로드하거나 클로닝해서 만든 보이스입니다."
      },
      "GenderEnum": {
        "enum": [
          "male",
          "female"
        ],
        "type": "string",
        "title": "GenderEnum",
        "description": "성별 분류 열거형 - 데이터베이스 값(한국어)을 API 값(영어)으로 변환합니다.\n\n사용 가능한 값:\n- **male**: 남성 보이스\n- **female**: 여성 보이스\n"
      },
      "EmotionEnum": {
        "enum": [
          "normal",
          "sad",
          "happy",
          "angry",
          "whisper",
          "toneup",
          "tonedown"
        ],
        "type": "string",
        "title": "EmotionEnum",
        "description": "음성 합성에 사용 가능한 감정 프리셋. 각 감정은 생성된 음성의 톤, 속도, 표현력에 영향을 줍니다.\n\n**ssfm-v21 지원 감정 (4종류):**\n- normal: 중립적이고 균형 잡힌 톤\n- happy: 밝고 명랑한 표현\n- sad: 우울하고 차분한 톤\n- angry: 강하고 강렬한 전달\n\n**ssfm-v30 지원 감정 (7종류):**\n- normal: 중립적이고 균형 잡힌 톤\n- happy: 밝고 명랑한 표현\n- sad: 우울하고 차분한 톤\n- angry: 강하고 강렬한 전달\n- whisper: 부드럽고 조용한 말\n- toneup: 더 높은 톤 강조\n- tonedown: 더 낮은 톤 강조\n\n`GET /v3/voices` API 응답의 `models` 필드에서 각 보이스에 사용 가능한 감정을 확인하세요.\n"
      },
      "SmartPrompt": {
        "type": "object",
        "title": "스마트 프롬프트 (ssfm-v30)",
        "example": {
          "next_text": "I am literally bursting with happiness and I never want this feeling to end!",
          "emotion_type": "smart",
          "previous_text": "I feel like I'm walking on air and I just want to scream with joy!"
        },
        "properties": {
          "next_text": {
            "type": "string",
            "title": "Next Text",
            "default": "",
            "example": "I am literally bursting with happiness and I never want this feeling to end!",
            "description": "TTSRequest의 `text` 필드 이후에 오는 텍스트. 감정 추론을 위한 전방 컨텍스트를 제공합니다.\r\n\r\n모델은 흐름을 분석합니다: `previous_text` → `text`(합성됨) → `next_text`\r\n\r\n- 최대 2000자\r\n- 모델이 감정 전환을 예측하는 데 도움\r\n- 다음 컨텍스트가 없으면 비워 둡니다\r\n"
          },
          "emotion_type": {
            "type": "string",
            "const": "smart",
            "title": "Emotion Type",
            "default": "smart",
            "description": "프롬프트 유형을 식별하는 판별자 필드. 컨텍스트 인식 감정 추론을 위해 \"smart\"로 설정해야 합니다.\r\n"
          },
          "previous_text": {
            "type": "string",
            "title": "Previous Text",
            "default": "",
            "example": "I feel like I'm walking on air and I just want to scream with joy!",
            "description": "TTSRequest의 `text` 필드 이전에 오는 텍스트. 감정 추론을 위한 후방 컨텍스트를 제공합니다.\r\n\r\n모델은 흐름을 분석합니다: `previous_text` → `text`(합성됨) → `next_text`\r\n\r\n- 최대 2000자\r\n- 모델이 감정 빌드업과 컨텍스트를 이해하는 데 도움\r\n- 이전 컨텍스트가 없으면 비워 둡니다\r\n"
          }
        },
        "description": "생성된 음성의 감정 및 스타일 설정.",
        "additionalProperties": false
      },
      "PresetPrompt": {
        "type": "object",
        "title": "프리셋 프롬프트 (ssfm-v30)",
        "properties": {
          "emotion_type": {
            "type": "string",
            "const": "preset",
            "title": "Emotion Type",
            "default": "preset",
            "description": "프롬프트 유형을 식별하는 판별자 필드. 프리셋 기반 감정 제어를 위해 \"preset\"으로 설정해야 합니다.\r\n"
          },
          "emotion_preset": {
            "$ref": "#/components/schemas/EmotionEnum",
            "default": "normal",
            "example": "normal",
            "description": "생성된 음성에 적용할 감정 프리셋.\r\n\r\n지원되는 감정: normal, happy, sad, angry, whisper, toneup, tonedown\r\n\r\n`GET /v3/voices` API 응답의 `models` 필드에서 각 보이스에 사용 가능한 감정을 확인하세요.\r\n"
          },
          "emotion_intensity": {
            "type": "number",
            "title": "Emotion Intensity",
            "default": 1,
            "example": 1,
            "maximum": 2,
            "minimum": 0,
            "description": "생성된 음성의 감정 표현 강도를 제어합니다.\r\n\r\n- 0.0: 완전히 중립적, 감정 색채 없음\r\n- 0.5: 미묘한 감정 힌트\r\n- 1.0: 표준 감정 표현(기본값)\r\n- 1.5: 강한 감정 강조\r\n- 2.0: 최대 강도, 매우 표현력 있음\r\n"
          }
        },
        "description": "생성된 음성의 감정 및 스타일 설정.",
        "additionalProperties": false
      },
      "UseCasesEnum": {
        "enum": [
          "Announcer",
          "Anime",
          "Audiobook",
          "Conversational",
          "Documentary",
          "E-learning",
          "Rapper",
          "Game",
          "Tiktok/Reels",
          "News",
          "Podcast",
          "Voicemail",
          "Ads"
        ],
        "type": "string",
        "description": "콘텐츠 유형 필터링을 위한 보이스 사용 사례 카테고리. 각 보이스는 특정 콘텐츠 유형에 대한 적합성을 나타내는 하나 이상의 사용 사례로 태그됩니다.\n\n**사용 가능한 사용 사례:**\n- **Announcer**: 공공 발표 및 프레젠테이션\n- **Anime**: 애니메이션 보이스\n- **Audiobook**: 장문 내레이션 및 스토리텔링\n- **Conversational**: 챗봇 및 대화형 AI\n- **Documentary**: 다큐멘터리 내레이션 및 해설\n- **E-learning**: 교육 콘텐츠 및 튜토리얼\n- **Rapper**: 랩 및 음악 퍼포먼스\n- **Game**: 비디오 게임 보이스 및 내레이션\n- **Tiktok/Reels**: SNS 숏츠\n- **News**: 뉴스 방송\n- **Podcast**: 방송 및 팟캐스트 제작\n- **Voicemail**: IVR 시스템 및 음성 비서\n- **Ads**: 광고 및 홍보 콘텐츠\n"
      },
      "ErrorResponse": {
        "type": "object",
        "example": {
          "message": "The input text contains characters or symbols that cannot be synthesized into speech. Please check your input text.",
          "error_code": "TEXT_NOT_SYNTHESIZABLE"
        },
        "properties": {
          "detail": {
            "type": "string",
            "description": "문제를 설명하는 오류 메시지"
          },
          "message": {
            "type": "string",
            "description": "구조화된 오류에 대한 설명"
          },
          "error_code": {
            "type": "string",
            "description": "구조화된 오류를 식별하는 코드"
          }
        },
        "description": "기존 오류와 유효성 검사 오류는 `detail`을 사용하며, 구조화된 오류는 `error_code`와 `message`를 사용합니다."
      },
      "CustomVoiceItem": {
        "type": "object",
        "title": "CustomVoiceItem",
        "required": [
          "voice_id",
          "name",
          "model",
          "source",
          "status",
          "created_at"
        ],
        "properties": {
          "name": {
            "type": "string",
            "title": "Name",
            "description": "보이스 이름입니다."
          },
          "error": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Error",
            "description": "`status`가 `failed`일 때의 실패 사유입니다."
          },
          "model": {
            "type": "string",
            "title": "Model",
            "description": "TTS 모델 버전입니다."
          },
          "source": {
            "type": "string",
            "title": "Source",
            "description": "생성 방식(`instant` 또는 `professional`)입니다."
          },
          "status": {
            "$ref": "#/components/schemas/CustomVoiceStatus",
            "description": "현재 생성 또는 학습 상태입니다."
          },
          "voice_id": {
            "type": "string",
            "title": "Voice Id",
            "description": "`uc_`로 시작하는 커스텀 보이스 고유 식별자입니다."
          },
          "created_at": {
            "type": "string",
            "title": "Created At",
            "format": "date-time",
            "description": "UTC 기준 생성 시각입니다."
          }
        },
        "description": "인증된 계정이 소유한 커스텀 보이스입니다."
      },
      "ValidationError": {
        "type": "object",
        "title": "ValidationError",
        "required": [
          "loc",
          "msg",
          "type"
        ],
        "properties": {
          "ctx": {
            "type": "object",
            "title": "Context"
          },
          "loc": {
            "type": "array",
            "items": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "integer"
                }
              ]
            },
            "title": "Location"
          },
          "msg": {
            "type": "string",
            "title": "Message"
          },
          "type": {
            "type": "string",
            "title": "Error Type"
          },
          "input": {
            "title": "Input"
          }
        }
      },
      "RecommendedVoice": {
        "type": "object",
        "title": "RecommendedVoice",
        "required": [
          "voice_id",
          "voice_name",
          "score"
        ],
        "properties": {
          "score": {
            "type": "number",
            "title": "Score",
            "example": 0.92,
            "description": "추천 관련도 점수. 값이 높을수록 검색어와 더 잘 맞는 후보입니다."
          },
          "voice_id": {
            "type": "string",
            "title": "Voice Id",
            "example": "tc_60e5426de8b95f1d3000d7b5",
            "description": "`tc_` prefix 가 붙은 타입캐스트 보이스 식별자. 텍스트 음성 변환 요청의 `voice_id` 로 사용할 수 있습니다."
          },
          "voice_name": {
            "type": "string",
            "title": "Voice Name",
            "example": "Olivia",
            "description": "사람이 읽을 수 있는 보이스 이름."
          }
        },
        "description": "`GET /v1/voices/recommendations` 응답의 보이스 추천 후보. 관련도 순서로 정렬됩니다."
      },
      "CustomVoiceStatus": {
        "enum": [
          "pending",
          "training",
          "completed",
          "failed"
        ],
        "type": "string",
        "title": "CustomVoiceStatus",
        "description": "커스텀 보이스의 현재 생성 또는 학습 상태입니다."
      },
      "CustomVoiceResponse": {
        "type": "object",
        "title": "CustomVoiceResponse",
        "required": [
          "voice_id",
          "name",
          "model",
          "status"
        ],
        "properties": {
          "name": {
            "type": "string",
            "title": "Name",
            "description": "보이스 이름 (1~30자)."
          },
          "model": {
            "type": "string",
            "allOf": [
              {
                "$ref": "#/components/schemas/TTSModel"
              }
            ],
            "title": "Model",
            "description": "보이스가 클로닝된 엔진 모델 (`ssfm-v21` 또는 `ssfm-v30`)."
          },
          "status": {
            "$ref": "#/components/schemas/CustomVoiceStatus",
            "description": "생성/학습 상태"
          },
          "voice_id": {
            "type": "string",
            "title": "Voice Id",
            "example": "uc_64a1b2c3d4e5f6a7b8c9d0e1",
            "description": "`uc_` prefix 가 붙은 커스텀 보이스 식별자. `POST /v1/text-to-speech` 등 `voice_id` 를 받는 엔드포인트에 그대로 사용할 수 있습니다."
          }
        },
        "description": "`POST /v1/voices/clone` 응답 — 퀵 클로닝으로 생성된 커스텀 보이스 메타데이터."
      },
      "HTTPValidationError": {
        "type": "object",
        "title": "HTTPValidationError",
        "properties": {
          "detail": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ValidationError"
            },
            "title": "Detail"
          }
        }
      },
      "PauseComposeSegment": {
        "type": "object",
        "title": "PauseComposeSegment",
        "examples": [
          {
            "type": "pause",
            "duration_seconds": 1.5
          }
        ],
        "required": [
          "type",
          "duration_seconds"
        ],
        "properties": {
          "type": {
            "type": "string",
            "const": "pause",
            "title": "Type",
            "default": "pause",
            "description": "세그먼트 구분값입니다. 항상 `pause`입니다."
          },
          "duration_seconds": {
            "type": "number",
            "title": "Duration Seconds",
            "example": 1.5,
            "maximum": 10,
            "description": "초 단위 쉼 길이입니다. 개별 쉼은 최대 10초, 모든 쉼의 합은 최대 60초입니다.",
            "exclusiveMinimum": 0
          }
        },
        "description": "크레딧 차감 없이 삽입되는 무음 구간입니다.",
        "additionalProperties": false
      },
      "AlignmentSegmentWord": {
        "type": "object",
        "title": "AlignmentSegmentWord",
        "required": [
          "text",
          "start",
          "end"
        ],
        "properties": {
          "end": {
            "type": "number",
            "title": "End",
            "description": "이 구간의 종료 시각(오디오 시작 기준 초)."
          },
          "text": {
            "type": "string",
            "title": "Text",
            "description": "원본 transcript 의 텍스트 조각 (문장부호 포함)."
          },
          "start": {
            "type": "number",
            "title": "Start",
            "description": "이 구간의 시작 시각(오디오 시작 기준 초)."
          }
        },
        "description": "원본 transcript 와 생성된 오디오 사이의 단어 단위 정렬 구간."
      },
      "SubscriptionResponse": {
        "type": "object",
        "title": "SubscriptionResponse",
        "required": [
          "plan",
          "credits",
          "limits",
          "professional_clone_generations"
        ],
        "properties": {
          "plan": {
            "$ref": "#/components/schemas/PlanTier",
            "description": "현재 구독 플랜명"
          },
          "limits": {
            "$ref": "#/components/schemas/Limits",
            "description": "사용 제한 정보"
          },
          "credits": {
            "$ref": "#/components/schemas/Credits",
            "description": "크레딧 사용 정보"
          },
          "professional_clone_generations": {
            "$ref": "#/components/schemas/ProfessionalCloneGenerations"
          }
        },
        "description": "구독 정보 응답 모델"
      },
      "AlignmentSegmentCharacter": {
        "type": "object",
        "title": "AlignmentSegmentCharacter",
        "required": [
          "text",
          "start",
          "end"
        ],
        "properties": {
          "end": {
            "type": "number",
            "title": "End",
            "description": "이 구간의 종료 시각(오디오 시작 기준 초)."
          },
          "text": {
            "type": "string",
            "title": "Text",
            "description": "원본 transcript 의 텍스트 조각 (문장부호/공백 포함)."
          },
          "start": {
            "type": "number",
            "title": "Start",
            "description": "이 구간의 시작 시각(오디오 시작 기준 초)."
          }
        },
        "description": "원본 transcript 와 생성된 오디오 사이의 문자 단위 정렬 구간."
      },
      "CustomVoiceCreateResponse": {
        "type": "object",
        "title": "CustomVoiceCreateResponse",
        "required": [
          "voice_id",
          "name",
          "model",
          "status"
        ],
        "properties": {
          "name": {
            "type": "string",
            "title": "Name",
            "description": "보이스 이름입니다."
          },
          "model": {
            "type": "string",
            "title": "Model",
            "description": "TTS 모델 버전입니다."
          },
          "status": {
            "$ref": "#/components/schemas/CustomVoiceStatus",
            "description": "현재 생성 또는 학습 상태입니다."
          },
          "voice_id": {
            "type": "string",
            "title": "Voice Id",
            "description": "`uc_`로 시작하는 커스텀 보이스 고유 식별자입니다."
          }
        },
        "description": "퀵 클로닝 또는 프리미엄 클로닝 생성 요청 결과입니다."
      },
      "TTSWithTimestampsResponse": {
        "type": "object",
        "title": "TTSWithTimestampsResponse",
        "required": [
          "audio",
          "audio_format",
          "audio_duration",
          "words",
          "characters"
        ],
        "properties": {
          "audio": {
            "type": "string",
            "title": "Audio",
            "description": "base64 로 인코딩된 오디오 바이트. `audio_format` 확장자로 디코딩해 파일로 저장할 수 있습니다."
          },
          "words": {
            "anyOf": [
              {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/AlignmentSegmentWord"
                }
              },
              {
                "type": "null"
              }
            ],
            "title": "Words",
            "description": "단어 단위 타임스탬프(문장부호 포함). 요청이 `granularity=char` 일 때는 `null`."
          },
          "characters": {
            "anyOf": [
              {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/AlignmentSegmentCharacter"
                }
              },
              {
                "type": "null"
              }
            ],
            "title": "Characters",
            "description": "문자 단위 타임스탬프(문장부호와 공백 포함). 요청이 `granularity=word` 일 때는 `null`."
          },
          "audio_format": {
            "enum": [
              "wav",
              "mp3"
            ],
            "type": "string",
            "title": "Audio Format",
            "description": "`audio` 필드의 오디오 인코딩 포맷 — `wav` 또는 `mp3` (요청의 `output.audio_format` 에 따라 결정)."
          },
          "audio_duration": {
            "type": "number",
            "title": "Audio Duration",
            "description": "생성된 오디오의 길이(초)."
          }
        },
        "description": "TTS 생성 + 타임스탬프 정렬 통합 응답."
      },
      "ProfessionalCloneGenerations": {
        "type": "object",
        "title": "ProfessionalCloneGenerations",
        "properties": {
          "plan_generations": {
            "type": "integer",
            "title": "Plan Generations",
            "default": 0,
            "minimum": 0,
            "description": "플랜 제공 학습 횟수"
          },
          "used_generations": {
            "type": "integer",
            "title": "Used Generations",
            "default": 0,
            "minimum": 0,
            "description": "사용된 학습 횟수"
          }
        },
        "description": "프리미엄 클로닝 학습 횟수 정보"
      },
      "Body_create_voice_clone_v1_voices_clone_post": {
        "type": "object",
        "title": "Body_create_voice_clone_v1_voices_clone_post",
        "required": [
          "file",
          "name",
          "model"
        ],
        "properties": {
          "file": {
            "type": "string",
            "title": "File",
            "format": "binary",
            "description": "오디오 샘플. WAV 또는 MP3, 최대 25MB, 5초 이상 150초 이하.",
            "contentMediaType": "application/octet-stream"
          },
          "name": {
            "type": "string",
            "title": "Name",
            "maxLength": 30,
            "minLength": 1,
            "description": "보이스 이름 (1~30자)."
          },
          "model": {
            "$ref": "#/components/schemas/TTSModel",
            "allOf": [
              {
                "$ref": "#/components/schemas/TTSModel"
              }
            ],
            "description": "클로닝할 엔진 모델 (`ssfm-v21` 또는 `ssfm-v30`)."
          }
        },
        "description": "퀵 클로닝 요청을 위한 multipart 본문."
      },
      "Body_create_instant_clone_v1_custom_voices_instant_clone_post": {
        "type": "object",
        "title": "Body_create_instant_clone_v1_custom_voices_instant_clone_post",
        "required": [
          "file",
          "name",
          "model"
        ],
        "properties": {
          "file": {
            "type": "string",
            "title": "파일",
            "format": "binary",
            "description": "25 MiB 이하이면서 길이가 5초 이상 150초 이하인 WAV 또는 MP3 음성 파일 1개입니다.",
            "contentMediaType": "application/octet-stream"
          },
          "name": {
            "type": "string",
            "title": "Name",
            "example": "상품 내레이터",
            "maxLength": 30,
            "minLength": 1,
            "description": "최대 30자의 보이스 이름입니다."
          },
          "model": {
            "$ref": "#/components/schemas/TTSModel",
            "example": "ssfm-v30",
            "description": "TTS 모델 버전입니다."
          }
        },
        "description": "퀵 클로닝용 multipart 요청 본문입니다."
      },
      "Body_create_professional_clone_v1_custom_voices_professional_clone_post": {
        "type": "object",
        "title": "Body_create_professional_clone_v1_custom_voices_professional_clone_post",
        "required": [
          "name",
          "files",
          "model",
          "language"
        ],
        "properties": {
          "name": {
            "type": "string",
            "title": "Name",
            "example": "커스텀 보이스 이름",
            "maxLength": 30,
            "minLength": 1,
            "description": "최대 30자의 보이스 이름입니다."
          },
          "files": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "binary",
              "contentMediaType": "application/octet-stream"
            },
            "title": "파일",
            "description": "학습에 사용할 WAV 또는 MP3 음성 파일입니다. 하나의 파일을 업로드할 수 있습니다.\r\n\r\n**업로드 제한**\r\n\r\n* WAV 또는 MP3 파일 1개\r\n* 파일 크기: 1 GiB 이하\r\n* 길이: 5분 이상 3시간 이하\r\n* 샘플레이트: 16 kHz 이상\r\n\r\n최상의 결과를 위해 다음 조건을 충족하는 오디오를 권장합니다.\r\n\r\n* 생성된 보이스가 재현하기를 원하는 말투와 최대한 가깝게 녹음해 주세요.\r\n* 배경 소음이 없는 조용한 환경에서 녹음해 주세요.\r\n* 한 명의 화자 목소리만 포함해 주세요.\r\n* `language` 필드에 지정한 언어로 녹음해 주세요.\r\n* 오디오 길이가 길수록 생성되는 보이스의 품질이 향상됩니다."
          },
          "model": {
            "$ref": "#/components/schemas/TTSModel",
            "example": "ssfm-v30",
            "description": "TTS 모델 버전입니다."
          },
          "language": {
            "type": "string",
            "title": "Language",
            "example": "kor",
            "description": "`kor`, `eng` 같은 ISO 639-3 언어 코드입니다."
          }
        },
        "description": "프리미엄 클로닝용 multipart 요청 본문입니다."
      }
    },
    "securitySchemes": {
      "ApiKeyAuth": {
        "in": "header",
        "name": "X-API-KEY",
        "type": "apiKey",
        "description": "인증을 위한 API 키. 타입캐스트 API 콘솔에서 API 키를 생성할 수 있습니다."
      },
      "BearerAuth": {
        "type": "http",
        "scheme": "bearer",
        "bearerFormat": "JWT"
      }
    }
  }
}
```
