Improve TTS engine listener

This commit is contained in:
2020-05-16 16:18:50 +02:00
parent 4c549dd0d5
commit 6a208428c9
3 changed files with 28 additions and 68 deletions

View File

@@ -2,8 +2,6 @@ package io.bartek.ttsserver.core.tts.engine
import android.content.Context import android.content.Context
import android.speech.tts.TextToSpeech import android.speech.tts.TextToSpeech
import io.bartek.ttsserver.core.tts.exception.TTSException
import io.bartek.ttsserver.core.tts.listener.Lock
import io.bartek.ttsserver.core.tts.listener.TTSProcessListener import io.bartek.ttsserver.core.tts.listener.TTSProcessListener
import io.bartek.ttsserver.core.tts.model.TTSStream import io.bartek.ttsserver.core.tts.model.TTSStream
import io.bartek.ttsserver.core.tts.status.TTSStatus import io.bartek.ttsserver.core.tts.status.TTSStatus
@@ -29,26 +27,15 @@ class TTSEngine(
val filename = "tts_$digest.wav" val filename = "tts_$digest.wav"
val file = File(context.cacheDir, filename) val file = File(context.cacheDir, filename)
file.takeIf { it.exists() } ?.let { return it } file.takeIf { it.exists() }?.let { return it }
val uuid = UUID.randomUUID().toString() val uuid = UUID.randomUUID().toString()
val lock = Lock() val listener = TTSProcessListener(uuid)
tts.setOnUtteranceProgressListener( tts.setOnUtteranceProgressListener(listener)
TTSProcessListener(
uuid,
lock
)
)
synchronized(lock) { tts.language = language
tts.language = language tts.synthesizeToFile(text, null, file, uuid)
tts.synthesizeToFile(text, null, file, uuid) listener.await()
lock.wait()
}
if (!lock.success) {
throw TTSException()
}
return file return file
} }
@@ -63,23 +50,12 @@ class TTSEngine(
val file = createTempFile("tmp_tts_server", ".wav") val file = createTempFile("tmp_tts_server", ".wav")
val uuid = UUID.randomUUID().toString() val uuid = UUID.randomUUID().toString()
val lock = Lock() val listener = TTSProcessListener(uuid)
tts.setOnUtteranceProgressListener( tts.setOnUtteranceProgressListener(listener)
TTSProcessListener(
uuid,
lock
)
)
synchronized(lock) { tts.language = language
tts.language = language tts.synthesizeToFile(text, null, file, uuid)
tts.synthesizeToFile(text, null, file, uuid) listener.await()
lock.wait()
}
if (!lock.success) {
throw TTSException()
}
val stream = BufferedInputStream(FileInputStream(file)) val stream = BufferedInputStream(FileInputStream(file))
val length = file.length() val length = file.length()
@@ -91,23 +67,12 @@ class TTSEngine(
fun performTTS(text: String, language: Locale) { fun performTTS(text: String, language: Locale) {
val uuid = UUID.randomUUID().toString() val uuid = UUID.randomUUID().toString()
val lock = Lock() val listener = TTSProcessListener(uuid)
tts.setOnUtteranceProgressListener( tts.setOnUtteranceProgressListener(listener)
TTSProcessListener(
uuid,
lock
)
)
synchronized(lock) { tts.language = language
tts.language = language tts.speak(text, TextToSpeech.QUEUE_ADD, null, uuid)
tts.speak(text, TextToSpeech.QUEUE_ADD, null, uuid) listener.await()
lock.wait()
}
if (!lock.success) {
throw TTSException()
}
} }
} }

View File

@@ -1,5 +0,0 @@
package io.bartek.ttsserver.core.tts.listener
@Suppress("PLATFORM_CLASS_MAPPED_TO_KOTLIN")
// TODO: Investigate the Kotlin way to achieve the same
data class Lock(var success: Boolean = false) : Object()

View File

@@ -1,29 +1,29 @@
package io.bartek.ttsserver.core.tts.listener package io.bartek.ttsserver.core.tts.listener
import android.speech.tts.UtteranceProgressListener import android.speech.tts.UtteranceProgressListener
import io.bartek.ttsserver.core.tts.exception.TTSException
import java.util.concurrent.LinkedBlockingQueue
class TTSProcessListener( class TTSProcessListener(private val uuid: String) : UtteranceProgressListener() {
private val uuid: String, private val queue = LinkedBlockingQueue<Boolean>()
private val lock: Lock
) : UtteranceProgressListener() {
override fun onDone(utteranceId: String?) { override fun onDone(utteranceId: String?) {
if (utteranceId == uuid) { if (utteranceId == uuid) {
synchronized(lock) { queue.add(true)
lock.success = true
lock.notifyAll()
}
} }
} }
override fun onError(utteranceId: String?) { override fun onError(utteranceId: String?) {
if (utteranceId == uuid) { if (utteranceId == uuid) {
synchronized(lock) { queue.add(false)
lock.success = false
lock.notifyAll()
}
} }
} }
override fun onStart(utteranceId: String?) {} override fun onStart(utteranceId: String?) {}
fun await() {
if(!queue.take()) {
throw TTSException()
}
}
} }