제머리로는 도저히 풀리지 않아 도움을 요청합니다.
현재 단어장 어플을 만들고 있는데 제가 원하는 기능은 단어의 스펠링과 뜻을 자동으로 읽어주는 기능입니다.
문제는 TTS를 제대로 컨트롤하질 못하겠습니다..
스펠링을 읽어주고 끝나면 뜻을 읽어줘야 하기 때문에 TTS종료 시점을 알아야 하더군요.
그냥 연속으로 하면 스펠링 읽어주는 시간을 기다리지 않고 바로 뒤에 있는 뜻을 읽어서요..
이를 처음에 BR을 통해 action값 TextToSpeech.ACTION_TTS_QUEUE_PROCESSING_COMPLETED 로 받아왔습니다.
그런데.. 제가 재생할때 쓰레드를 사용하고 있고, 정지나 재생 같은 기능도 있기 때문에 동기화 문제가 생겨서 그런지..
BR를 통해서 해결하려하면 여러가지 계속 오작동이 나서요 ㅠ
그래서 대략
listenSpel(); //스펠링 읽기
while(tts.isSpeaking())
listenMean(); //뜻 읽기
이런식으로 해결하려 했습니다.. 스펠링을 읽는동안 TTS의 isSpeaking()를 통해 실행중인지 보고 실행중이면 무한루프에 빠지게요..
그런데 이게.. TTS를 실행시켰다고 무조건 바로 실행되는게 보장되는게 아닌지.. 가끔 isSpeaking() 에 걸리지 않고 단어를 뛰어넘어 버리더군요..
이런식으로 해도 문제가 계속 생기는데..
아 이거 어떤 식으로 해야 할가요 ㅠ
-----
참고로 단어를 그냥 순서대로 끝까지 읽어주는게 아니라..
음악 플레이어처럼 재생, 정지, 앞으로, 뒤로 기능을 넣으려고 합니다.
그래서 Service에서 돌아가게 되고 재생에 쓰레드를 넣게 됬구요..
ICS이상이면 setOnUtteranceProgressListener 그 이하이면 setOnUtteranceCompletedListener 라는 리스너가 있습니다.
TTS객체에 리스너 달면 되구요.. speak요청한 문장이나 단어가 speak 완료되면 리스너가 받습니다.
onDone / onUtteranceCompleted메소드 인데요.. 인자로 utteranceId를 받게 되어 있는데 이 id가 speak 요청한 id입니다.
m_tts.speak("request_speak", TextToSpeech.QUEUE_FLUSH, params);
위 코드로 tts를 요청했다면 setOnUtteranceProgressListener 의 onDone메소드에서는 utteranceId의 값이 request_speak
으로 오겠지요?