{"openapi":"3.1.0","info":{"title":"Sori Studio API","description":"Private TTS API. Bearer API key required. Submit speech, then poll job status.","version":"1.0.0"},"paths":{"/v1/voices/import":{"post":{"summary":"Import Voice","operationId":"soriImportVoice","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecordingImport"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"SoriApiKey":[]}]}},"/v1/voices/{voice_id}/profile":{"put":{"summary":"Edit Profile","operationId":"soriEditProfile","security":[{"SoriApiKey":[]}],"parameters":[{"name":"voice_id","in":"path","required":true,"schema":{"type":"string","title":"Voice Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProfileEdit"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/catalog/typecast/{voice_id}/image":{"get":{"summary":"Catalog Image","operationId":"soriCatalogImage","security":[{"SoriApiKey":[]}],"parameters":[{"name":"voice_id","in":"path","required":true,"schema":{"type":"string","title":"Voice Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/voices/{voice_id}/memory":{"get":{"summary":"이 연결에서 생성한 목소리의 개선 기록","operationId":"soriVoiceMemory","security":[{"SoriApiKey":[]}],"parameters":[{"name":"voice_id","in":"path","required":true,"schema":{"type":"string","title":"Voice Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/jobs/{job_id}/feedback":{"post":{"summary":"생성 결과 평가와 Obsidian 기록 저장","operationId":"soriVoiceFeedback","security":[{"SoriApiKey":[]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VoiceFeedback"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/status":{"get":{"summary":"연결과 생성 엔진 상태 확인","operationId":"soriStatus","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"SoriApiKey":[]}]}},"/v1/languages":{"get":{"summary":"저장과 생성에 사용하는 언어 목록","operationId":"soriLanguages","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"SoriApiKey":[]}]}},"/v1/voices":{"get":{"summary":"저장 목소리와 기본 목소리 검색","operationId":"soriVoices","security":[{"SoriApiKey":[]}],"parameters":[{"name":"provider","in":"query","required":false,"schema":{"enum":["saved","qwen","typecast"],"type":"string","default":"saved","title":"Provider"}},{"name":"q","in":"query","required":false,"schema":{"type":"string","maxLength":100,"default":"","title":"Q"}},{"name":"language","in":"query","required":false,"schema":{"anyOf":[{"enum":["Korean","English","Japanese","Chinese","German","French","Russian","Portuguese","Spanish","Italian"],"type":"string"},{"type":"null"}],"title":"Language"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"default":20,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/voices/{voice_id}":{"get":{"summary":"목소리의 이름과 언어별 설정 조회","operationId":"soriVoice","security":[{"SoriApiKey":[]}],"parameters":[{"name":"voice_id","in":"path","required":true,"schema":{"type":"string","title":"Voice Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/voices/{voice_id}/presets/{language}":{"put":{"summary":"한 언어의 목소리 조절값 저장","operationId":"soriSavePreset","security":[{"SoriApiKey":[]}],"parameters":[{"name":"voice_id","in":"path","required":true,"schema":{"type":"string","title":"Voice Id"}},{"name":"language","in":"path","required":true,"schema":{"enum":["Korean","English","Japanese","Chinese","German","French","Russian","Portuguese","Spanish","Italian"],"type":"string","title":"Language"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CloneControls"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-openai-isConsequential":false}},"/v1/voices/{voice_id}/audio":{"get":{"summary":"저장한 참고 음성 WAV 받기","operationId":"soriReferenceAudio","security":[{"SoriApiKey":[]}],"parameters":[{"name":"voice_id","in":"path","required":true,"schema":{"type":"string","title":"Voice Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/speech":{"post":{"summary":"저장 설정으로 음성 생성 접수","operationId":"soriCreateSpeech","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SpeechRequest"}}},"required":true},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"SoriApiKey":[]}]}},"/v1/jobs/{job_id}":{"get":{"summary":"음성 생성 상태 확인","operationId":"soriJob","security":[{"SoriApiKey":[]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/jobs/{job_id}/audio":{"get":{"summary":"완성된 음성 WAV 다운로드","operationId":"soriAudio","security":[{"SoriApiKey":[]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"Character":{"properties":{"description":{"type":"string","maxLength":400,"title":"Description","default":""},"tags":{"items":{"type":"string"},"type":"array","maxItems":8,"title":"Tags"},"avatar":{"type":"string","maxLength":700000,"title":"Avatar","default":""}},"additionalProperties":false,"type":"object","title":"Character"},"CloneControls":{"properties":{"pitch_semitones":{"type":"number","maximum":6,"minimum":-6,"title":"Pitch Semitones","default":0},"speed":{"type":"number","maximum":2,"minimum":0.5,"title":"Speed","default":1},"gain_db":{"type":"number","maximum":6,"minimum":-12,"title":"Gain Db","default":0},"pause_ms":{"type":"integer","maximum":2000,"minimum":0,"title":"Pause Ms","default":220},"seed":{"type":"integer","maximum":2147483647,"minimum":0,"title":"Seed","default":42}},"additionalProperties":false,"type":"object","title":"CloneControls"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"ProfileEdit":{"properties":{"name":{"type":"string","maxLength":80,"minLength":1,"title":"Name"},"character":{"$ref":"#/components/schemas/Character"}},"additionalProperties":false,"type":"object","required":["name"],"title":"ProfileEdit"},"RecordingImport":{"properties":{"name":{"type":"string","maxLength":80,"minLength":1,"title":"Name"},"character":{"$ref":"#/components/schemas/Character"},"id":{"type":"string","pattern":"^[a-f0-9]{32}$","title":"Id"},"language":{"type":"string","maxLength":30,"title":"Language"},"ref_text":{"type":"string","maxLength":2000,"title":"Ref Text","default":""},"clone_method":{"type":"string","enum":["transcript","embedding"],"title":"Clone Method","default":"transcript"},"consent":{"type":"boolean","const":true,"title":"Consent"},"audio":{"type":"string","maxLength":11200000,"minLength":1,"title":"Audio"}},"additionalProperties":false,"type":"object","required":["name","id","language","consent","audio"],"title":"RecordingImport"},"SpeechRequest":{"properties":{"request_id":{"type":"string","maxLength":100,"minLength":8,"pattern":"^[A-Za-z0-9_-]+$","title":"Request Id"},"text":{"type":"string","maxLength":5000,"minLength":1,"title":"Text"},"title":{"type":"string","maxLength":80,"minLength":1,"title":"Title","default":"API 내레이션"},"engine":{"type":"string","enum":["qwen"],"title":"Engine","default":"qwen"},"voice":{"type":"string","maxLength":100,"title":"Voice","default":"Sohee"},"profile_id":{"type":"string","maxLength":32,"pattern":"^([a-f0-9]{32})?$","title":"Profile Id","default":""},"language":{"type":"string","enum":["Korean","English","Japanese","Chinese","German","French","Russian","Portuguese","Spanish","Italian"],"title":"Language","default":"Korean"},"clone_controls":{"anyOf":[{"$ref":"#/components/schemas/CloneControls"},{"type":"null"}]},"emotion":{"type":"string","enum":["neutral","warm","happy","excited","sad","serious","whisper"],"title":"Emotion","default":"neutral"},"ending":{"type":"string","enum":["natural","rising","falling"],"title":"Ending","default":"natural"},"pace":{"type":"string","enum":["normal","slow","brisk"],"title":"Pace","default":"normal"},"style":{"type":"string","maxLength":500,"title":"Style","default":""},"typecast_emotion":{"type":"string","maxLength":30,"title":"Typecast Emotion","default":"normal"},"max_new_characters":{"type":"integer","maximum":5000,"minimum":0,"title":"Max New Characters","default":0}},"additionalProperties":false,"type":"object","required":["request_id","text"],"title":"SpeechRequest"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"VoiceFeedback":{"properties":{"rating":{"type":"string","enum":["none","good","revise"],"title":"Rating"},"note":{"type":"string","maxLength":2000,"title":"Note","default":""},"export_obsidian":{"type":"boolean","title":"Export Obsidian","default":true}},"additionalProperties":false,"type":"object","required":["rating"],"title":"VoiceFeedback"}},"securitySchemes":{"SoriApiKey":{"type":"http","scheme":"bearer"}}},"servers":[{"url":"https://sori.menualtip.co.kr"}]}