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