Improve TTS engine listener
This commit is contained in:
@@ -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()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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()
|
|
||||||
@@ -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()
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user