본문 바로가기
Android

Android TTS 사용법 (android.speech.tts.TextToSpeech)

by chan-na 2024. 10. 4.

Android TTS 사용법 (android.speech.tts.TextToSpeech)

  • Android에서 기본 제공하는 Text To Speech 기능인 android.speech.tts.TextToSpeech의 사용법을 알아본다
  • Android의 STT(Speech To Text) 기능에 대해서는 링크를 참고한다.

target SDK Android 11 (API level 30) 이상에서 <queries> 요소 설정

<queries>
    <intent>
        <action android:name="android.intent.action.TTS_SERVICE" />
    </intent>
</queries>
  • targetSdkVersion이 Android 11이상인 앱에서는 디바이스에 설치된 다른 앱 목록을 알 수 없다.
  • AndroidManifest 파일에 요소에 지정해놓은 앱들과만 상호작용 할 수 있다.
    • 특정 package를 지정할수도 있고, 위 코드처럼 intent signature로 설정할수도 있다.
    • 자세한 사항은 링크를 참고하자

TextToSpeech 인스턴스 생성

// default TTS engine 사용
TextToSpeech(Context context, TextToSpeech.OnInitListener listener)

// 특정 TTS engine 명시
TextToSpeech(Context context, TextToSpeech.OnInitListener listener, String engine)
  • 두가지 방식의 생성자를 제공한다.
  • default TTS engine을 사용하는 방식으로 생성해보자.
    private val textToSpeech: TextToSpeech by lazy {
        TextToSpeech(applicationContext, textToSpeechOnInitListener)
    }

    private val textToSpeechOnInitListener = TextToSpeech.OnInitListener { status ->
        if (status != TextToSpeech.ERROR) {
            textToSpeech.setLanguage(Locale.ENGLISH)
        }
    }
  • TextToSpeech의 초기화가 완료 되면 TextToSpeech.OnInitListener를 통해 알려준다.
    • 초기화 완료 이후부터 인스턴스를 사용할 수 있다.
  • TextToSpeech.setLanguage()를 통해 사용하고 싶은 언어를 설정할 수 있다.

음성 합성 실행

Button(onClick = {
    textToSpeech.speak(text, TextToSpeech.QUEUE_FLUSH, null, "utteranceId")
}) {
    Text("Speak out")
}
  • TextToSpeech.speak()를 통해 음성을 합성하여 스피커로 출력한다.
    • 비동기 함수이므로 함수가 종료되었다고 해도 음성 합성이 완료된것이 아니며, 음성합성이 시작도 하지 않고 queue에 들어가 있는 상태일수도 있다.
  • 발화의 진행 정도를 확인하고 싶다면 TextToSpeech.setOnUtteranceProgressListener()를 통해 리스너를 등록할 수 있다.
    • 이 때 발화를 식별하기 위해서 utteranceId가 사용된다.
    • 자세한 사항은 도큐먼트를 참고하자.
  • TextToSpeech.speak()에서 queueMode를 설정해줄수 있다.
    • TextToSpeech.QUEUE_ADD
      • playback queue의 끝에 새로운 entry를 추가한다.
    • TextToSpeech.QUEUE_FLUSH
      • playback queue의 모든 entry를 제거하고 새로운 entry를 추가한다.

리소스 정리

    override fun onDestroy() {
        super.onDestroy()

        textToSpeech.shutdown()
    }
  • TextToSpeech engine에서 사용하는 리소스를 해제한다.

전체 코드

Reference