Kotlin으로 Android 앱에 자연스러운 음성 합성을
Android에는 음성 합성이 들어 있습니다. TextToSpeech 클래스는 휴대폰에 설치된 엔진으로 어떤 글이든 오프라인에서 무료로 읽어 줍니다. 하지만 사용자가 듣는 목소리는 기기, 엔진, 내려받은 목소리에 따라 달라서 같은 앱도 휴대폰마다 다르게 들립니다.
무료 SuperClonica 엔진은 Android 앱에 어디서나 같은 자연스러운 목소리를 줍니다. 방법은 두 가지로, 리소스로 넣는 미리 만든 오디오 파일이나 앱이 호출하는 음성 서버입니다. 이 가이드에서는 두 방법을 Kotlin 코드와 함께 보여 주고, 시스템 엔진이 여전히 맞는 경우도 알려 드립니다.
Android 앱을 말하게 하는 세 가지 방법
많은 앱이 섞어 씁니다. 인터페이스에는 리소스, 사용자 텍스트에는 서버, 예비로 시스템 엔진.
- TextToSpeech: 휴대폰에 설치된 엔진. 오프라인이고 무료지만 기기마다 목소리가 다릅니다.
- raw 리소스: 고정된 대사를 SuperClonica로 한 번 만들어 앱에 넣습니다.
- 음성 서버: 앱이 SuperClonica 서버로 텍스트를 보내고 돌아온 WAV를 재생합니다.
- SuperClonica는 31개 언어를 말하며, 중국어는 아직 지원하지 않습니다.
목소리를 무료로 골라 보기
아무 목소리 페이지에서 앱의 대사를 30~100자로 입력하고 언어를 고른 뒤 생성 버튼을 누르세요. 몇 초 만에 맞는지 들을 수 있습니다. 계정 없이 휴대폰에서 바로 됩니다.
미리 만든 대사를 리소스로 넣기
리소스는 오프라인이고 지연이 없지만, 바꾸려면 새 앱 버전이 필요합니다.
- 컴퓨터에서 엔진으로 대사마다 음성을 만드세요: python -m pip install superclonica-cpu 후 superclonica --text "다시 오신 걸 환영해요!" --voice F1 --lang ko --output welcome.mp3.
- 파일은 res/raw에 넣으세요. 리소스 이름에는 소문자, 숫자, 밑줄만 쓸 수 있습니다.
- 대사 재생: MediaPlayer.create(context, R.raw.welcome).start()
- 재생이 끝나면 setOnCompletionListener 등에서 플레이어를 해제하세요.
내 음성 서버 호출하기
직접 관리하는 컴퓨터에서 서버를 돌리세요: docker run -d -p 8000:8000 -v superclonica-models:/models superclonica/superclonica:cpu. Android는 기본적으로 암호화되지 않은 HTTP를 막으니 HTTPS 뒤에 두고, SUPERCLONICA_API_KEY를 설정해 내 앱만 쓰게 하세요. OkHttp로 대사 하나가 요청 하나이며, 메인 스레드 밖, 예를 들어 Dispatchers.IO 코루틴에서 실행합니다: val body = """{"text": "주문하신 상품이 발송되었습니다.", "voice": "F1", "lang": "ko"}""".toRequestBody("application/json".toMediaType()); val bytes = client.newCall(Request.Builder().url("https://tts.example.com/synthesize").post(body).build()).execute().body!!.bytes(); val file = File(cacheDir, "line.wav").apply { writeBytes(bytes) }; MediaPlayer().apply { setDataSource(file.path); prepare(); start() } 키를 Authorization 헤더로 붙이고, 반복되는 대사 파일은 캐시하세요.
시스템 TextToSpeech로 충분할 때
알림 읽기, 접근성 도우미, 프로토타입, 네트워크 없이 말해야 하는 앱처럼 목소리가 알아듣기만 하면 될 때는 시스템 엔진으로 충분합니다. 언어 튜터, 게임 캐릭터, 명상 가이드, 모든 휴대폰에서 같은 소리여야 하는 브랜드처럼 목소리가 제품의 일부라면 SuperClonica를 고르세요.