메인 콘텐츠로 건너뛰기
타입캐스트 API를 위한 공식 Kotlin 라이브러리입니다. AI 기반 음성을 사용하여 텍스트를 생동감 있는 음성으로 변환하세요. Kotlin 1.9+ 및 JDK 17 이상 버전과 호환됩니다. Gradle (Kotlin DSL 또는 Groovy) 및 Maven과 함께 작동합니다.

Maven Central

Typecast Kotlin SDK

소스 코드

Typecast Kotlin SDK 소스 코드

설치

build.gradle.kts에 다음 의존성을 추가하세요:
dependencies {
    implementation("com.neosapience:typecast-kotlin:1.0.1")
}
버전 1.0.1 이상이 설치되어 있는지 확인하세요. 이전 버전이 있다면 의존성 버전을 업데이트하세요.

빠른 시작

import com.neosapience.TypecastClient
import com.neosapience.models.*
import java.io.File

fun main() {
    // 클라이언트 초기화
    val client = TypecastClient.create("YOUR_API_KEY")

    // 텍스트를 음성으로 변환
    val request = TTSRequest.builder()
        .voiceId("tc_672c5f5ce59fac2a48faeaee")
        .text("안녕하세요! 저는 텍스트 음성 변환 에이전트입니다.")
        .model(TTSModel.SSFM_V30)
        .build()

    val response = client.textToSpeech(request)

    // 오디오 파일 저장
    File("output.${response.format}").writeBytes(response.audioData)

    println("Audio saved! Duration: ${response.duration}s, Format: ${response.format}")

    // 정리
    client.close()
}

기능

Typecast Kotlin SDK는 텍스트 음성 변환을 위한 강력한 기능을 제공합니다:
  • 다중 음성 모델: ssfm-v30(최신) 및 ssfm-v21 AI 음성 모델 지원
  • 다국어 지원: 영어, 한국어, 스페인어, 일본어, 중국어 등 37개 언어 지원
  • 감정 제어: 이모션 프리셋(normal, happy, sad, angry, whisper, toneup, tonedown) 또는 스마트 문맥 인식 추론
  • 오디오 사용자 정의: 라우드니스 LUFS(-70 to 0), 피치(-12 to +12 반음), 템포(0.5x to 2.0x), 형식(WAV/MP3) 제어
  • 음성 탐색: 모델, 성별, 나이, 사용 사례별 필터링이 가능한 V2 Voices API
  • 관용적 Kotlin: data class를 사용한 Kotlin 친화적 빌더 패턴 구문
  • 스트리밍: 저지연 재생을 위한 실시간 청크 오디오 전송
  • 포괄적인 오류 처리: 각 오류 유형에 대한 특정 예외 클래스

구성

환경 변수, .env 파일 또는 빌더를 통해 API 키를 설정하세요:
// 환경 변수 사용
// export TYPECAST_API_KEY="your-api-key-here"
val client = TypecastClient.create()

// 또는 직접 전달
val client = TypecastClient.create("your-api-key-here")

// 또는 사용자 정의 구성을 위해 빌더 사용
val client = TypecastClient.builder()
    .apiKey("your-api-key-here")
    .baseUrl("https://custom-api.example.com")
    .build()

환경 파일

프로젝트 루트에 .env 파일을 만드세요:
TYPECAST_API_KEY=your-api-key-here

고급 사용법

감정 제어 (ssfm-v30)

ssfm-v30은 두 가지 감정 제어 모드를 제공합니다: 프리셋스마트.
AI가 문맥에서 감정을 추론하도록 합니다:
val request = TTSRequest.builder()
    .voiceId("tc_672c5f5ce59fac2a48faeaee")
    .text("모든 것이 잘 될 거예요.")
    .model(TTSModel.SSFM_V30)
    .prompt(SmartPrompt.builder()
        .previousText("방금 최고의 소식을 들었어요!")  // 선택적 문맥
        .nextText("축하할 수 있어서 너무 기다려져요!")     // 선택적 문맥
        .build())
    .build()

val response = client.textToSpeech(request)

오디오 사용자 정의

라우드니스, 피치, 템포 및 출력 형식을 제어합니다:
val request = TTSRequest.builder()
    .voiceId("tc_672c5f5ce59fac2a48faeaee")
    .text("사용자 정의 오디오 출력!")
    .model(TTSModel.SSFM_V30)
    .output(Output.builder()
        .targetLufs(-14.0)                 // 범위: -70 ~ 0 (LUFS)
        .audioPitch(2)                  // 범위: -12 to +12 반음
        .audioTempo(1.2)                // 범위: 0.5x to 2.0x
        .audioFormat(AudioFormat.MP3)   // 옵션: WAV, MP3
        .build())
    .seed(42)  // 부호 없는 정수 시드 (재현 가능한 결과)
    .build()

val response = client.textToSpeech(request)

File("output.${response.format}").writeBytes(response.audioData)
println("Duration: ${response.duration}s, Format: ${response.format}")

음성 탐색 (V2 API)

향상된 메타데이터로 사용 가능한 음성을 나열하고 필터링합니다:
// 모든 음성 가져오기
val voices = client.getVoicesV2()

// 기준으로 필터링
val filter = VoicesV2Filter.builder()
    .model(TTSModel.SSFM_V30)
    .gender(GenderEnum.FEMALE)
    .age(AgeEnum.YOUNG_ADULT)
    .build()

val filtered = client.getVoicesV2(filter)

// 음성 정보 표시
voices.forEach { voice ->
    println("ID: ${voice.voiceId}, Name: ${voice.voiceName}")
    println("Gender: ${voice.gender}, Age: ${voice.age}")

    voice.models.forEach { model ->
        println("Model: ${model.version}, Emotions: ${model.emotions}")
    }

    voice.useCases?.let { useCases ->
        println("Use cases: ${useCases.joinToString(", ")}")
    }
}

다국어 콘텐츠

SDK는 자동 언어 감지와 함께 37개 언어를 지원합니다:
// 자동 언어 감지 (권장)
val request = TTSRequest.builder()
    .voiceId("tc_672c5f5ce59fac2a48faeaee")
    .text("こんにちは。お元気ですか。")
    .model(TTSModel.SSFM_V30)
    .build()

val response = client.textToSpeech(request)

// 또는 언어를 명시적으로 지정
val koreanRequest = TTSRequest.builder()
    .voiceId("tc_672c5f5ce59fac2a48faeaee")
    .text("안녕하세요. 반갑습니다.")
    .model(TTSModel.SSFM_V30)
    .language(LanguageCode.KOR)  // ISO 639-3 언어 코드
    .build()

val koreanResponse = client.textToSpeech(koreanRequest)

File("output.${response.format}").writeBytes(response.audioData)

스트리밍

저지연 재생을 위한 실시간 오디오 청크 스트리밍:
import javax.sound.sampled.*

// 오디오 재생 설정: 32000 Hz, 16비트, 모노, 리틀엔디안
val format = AudioFormat(32000f, 16, 1, true, false)
val line = AudioSystem.getSourceDataLine(format).apply {
    open(format, 8192)
    start()
}

val stream = client.textToSpeechStream(request)
val buf = ByteArray(4096)
var first = true

while (true) {
    val bytesRead = stream.read(buf)
    if (bytesRead == -1) break
    var offset = 0
    var len = bytesRead
    if (first) {
        offset = 44           // 44바이트 WAV 헤더 건너뛰기
        len -= 44
        first = false
    }
    line.write(buf, offset, len)
}
line.drain()
line.close()
stream.close()
client.close()
WAV 스트리밍 형식: 32000 Hz, 16비트, 모노 PCM. 첫 번째 청크에 44바이트 WAV 헤더(size = 0xFFFFFFFF)가 포함되며, 이후 청크는 원시 PCM 데이터만 포함합니다. MP3 형식: 320 kbps, 44100 Hz, 각 청크는 독립적으로 디코딩 가능합니다. 스트리밍 엔드포인트는 volumetargetLufs를 지원하지 않습니다.

지원 언어

SDK는 자동 언어 감지와 함께 37개 언어를 지원합니다:
코드언어코드언어코드언어
ENG영어JPN일본어UKR우크라이나어
KOR한국어ELL그리스어IND인도네시아어
SPA스페인어TAM타밀어DAN덴마크어
DEU독일어TGL타갈로그어SWE스웨덴어
FRA프랑스어FIN핀란드어MSA말레이어
ITA이탈리아어ZHO중국어CES체코어
POL폴란드어SLK슬로바키아어POR포르투갈어
NLD네덜란드어ARA아랍어BUL불가리아어
RUS러시아어HRV크로아티아어RON루마니아어
BEN벵골어HIN힌디어HUN헝가리어
NAN민난어NOR노르웨이어PAN펀자브어
THA태국어TUR터키어VIE베트남어
YUE광둥어
지정하지 않으면 입력 텍스트에서 언어가 자동으로 감지됩니다.

오류 처리

SDK는 API 오류 처리를 위한 특정 예외 클래스를 제공합니다:
import com.neosapience.TypecastClient
import com.neosapience.exceptions.*

try {
    val response = client.textToSpeech(request)
} catch (e: UnauthorizedException) {
    // 401: 잘못된 API 키
    println("Invalid API key: ${e.message}")
} catch (e: PaymentRequiredException) {
    // 402: 크레딧 부족
    println("Insufficient credits: ${e.message}")
} catch (e: ForbiddenException) {
    // 403: 접근 거부
    println("Access denied: ${e.message}")
} catch (e: NotFoundException) {
    // 404: 리소스를 찾을 수 없음
    println("Voice not found: ${e.message}")
} catch (e: UnprocessableEntityException) {
    // 422: 유효성 검사 오류
    println("Validation error: ${e.message}")
} catch (e: RateLimitException) {
    // 429: 요청 한도 초과
    println("Rate limit exceeded - please try again later")
} catch (e: InternalServerException) {
    // 500: 서버 오류
    println("Server error: ${e.message}")
} catch (e: TypecastException) {
    // 일반 오류
    println("API error (${e.statusCode}): ${e.message}")
}

예외 계층 구조

예외상태 코드설명
BadRequestException400잘못된 요청 매개변수
UnauthorizedException401잘못되거나 누락된 API 키
PaymentRequiredException402크레딧 부족
ForbiddenException403접근 거부
NotFoundException404리소스를 찾을 수 없음
UnprocessableEntityException422유효성 검사 오류
RateLimitException429요청 한도 초과
InternalServerException500서버 오류
TypecastException*기본 예외 클래스

IntelliJ IDEA 설정

1

새 프로젝트 생성

  1. IntelliJ IDEA 열기
  2. FileNewProject... 이동
  3. “Kotlin” 및 “Gradle (Kotlin)” 선택
  4. JDK를 17 이상으로 설정
2

의존성 추가

build.gradle.kts에 추가:
dependencies {
    implementation("com.neosapience:typecast-kotlin:1.0.1")
}
3

프로젝트 동기화

Gradle 동기화 버튼 클릭 또는 build.gradle.kts 우클릭 → Reload Gradle Project

Android 설정

1

의존성 추가

앱의 build.gradle.kts에 추가:
dependencies {
    implementation("com.neosapience:typecast-kotlin:1.0.1")
}
2

인터넷 권한 추가

AndroidManifest.xml에 추가:
<uses-permission android:name="android.permission.INTERNET" />
3

백그라운드 스레드에서 사용

코루틴 또는 백그라운드 스레드에서 API 호출:
lifecycleScope.launch(Dispatchers.IO) {
    val client = TypecastClient.create("YOUR_API_KEY")
    val response = client.textToSpeech(request)
    // 응답 처리
}

API 레퍼런스

TypecastClient 메서드

메서드설명
textToSpeech(TTSRequest)텍스트를 음성 오디오로 변환
getVoicesV2()모든 사용 가능한 음성 가져오기
getVoicesV2(VoicesV2Filter)필터링된 음성 가져오기
getVoiceV2(voiceId: String)ID로 특정 음성 가져오기
close()리소스 해제

TTSRequest 필드

필드타입필수설명
voiceIdString음성 ID (형식: tc_* 또는 uc_*)
textString합성할 텍스트 (최대 2000자)
modelTTSModelTTS 모델 (SSFM_V21 또는 SSFM_V30)
languageLanguageCodeISO 639-3 코드 (생략 시 자동 감지)
promptPrompt / PresetPrompt / SmartPrompt감정 설정
outputOutput오디오 출력 설정
seedUInt32재현성을 위한 부호 없는 정수 시드 (≥ 0)

TTSResponse 필드

필드타입설명
audioDataByteArray생성된 오디오 데이터
durationDouble오디오 길이(초)
formatString오디오 형식 (wav 또는 mp3)