Add /say endpoint
This commit is contained in:
@@ -15,7 +15,7 @@ data class SpeechData(val stream: InputStream, val size: Long)
|
|||||||
class TTS(context: Context, initListener: TextToSpeech.OnInitListener) {
|
class TTS(context: Context, initListener: TextToSpeech.OnInitListener) {
|
||||||
private val tts = TextToSpeech(context, initListener)
|
private val tts = TextToSpeech(context, initListener)
|
||||||
|
|
||||||
fun performTTS(text: String, language: Locale): SpeechData {
|
fun fetchTTSStream(text: String, language: Locale): SpeechData {
|
||||||
val file = createTempFile("tmp_tts_server", ".wav")
|
val file = createTempFile("tmp_tts_server", ".wav")
|
||||||
|
|
||||||
val uuid = UUID.randomUUID().toString()
|
val uuid = UUID.randomUUID().toString()
|
||||||
@@ -39,6 +39,22 @@ class TTS(context: Context, initListener: TextToSpeech.OnInitListener) {
|
|||||||
|
|
||||||
return SpeechData(stream, length)
|
return SpeechData(stream, length)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun performTTS(text: String, language: Locale) {
|
||||||
|
val uuid = UUID.randomUUID().toString()
|
||||||
|
val lock = Lock()
|
||||||
|
tts.setOnUtteranceProgressListener(TTSProcessListener(uuid, lock))
|
||||||
|
|
||||||
|
synchronized(lock) {
|
||||||
|
tts.language = language
|
||||||
|
tts.speak(text, TextToSpeech.QUEUE_ADD, null, uuid)
|
||||||
|
lock.wait()
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!lock.success) {
|
||||||
|
throw TTSException()
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private data class Lock(var success: Boolean = false) : Object()
|
private data class Lock(var success: Boolean = false) : Object()
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ class TTSServer(port: Int, private val context: Context) : NanoHTTPD(port),
|
|||||||
session?.let {
|
session?.let {
|
||||||
return when(it.uri) {
|
return when(it.uri) {
|
||||||
"/wave" -> wave(it)
|
"/wave" -> wave(it)
|
||||||
|
"/say" -> say(it)
|
||||||
else -> throw ResponseException(NOT_FOUND, "")
|
else -> throw ResponseException(NOT_FOUND, "")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -51,10 +52,28 @@ class TTSServer(port: Int, private val context: Context) : NanoHTTPD(port),
|
|||||||
}
|
}
|
||||||
|
|
||||||
val (text, language) = getRequestData(session)
|
val (text, language) = getRequestData(session)
|
||||||
val (stream, size) = tts.performTTS(text, language)
|
val (stream, size) = tts.fetchTTSStream(text, language)
|
||||||
return newFixedLengthResponse(OK, "audio/x-wav", stream, size)
|
return newFixedLengthResponse(OK, "audio/x-wav", stream, size)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun say(session: IHTTPSession): Response {
|
||||||
|
if(!preferences.getBoolean("preference_enable_say_endpoint", true)) {
|
||||||
|
throw ResponseException(NOT_FOUND, "")
|
||||||
|
}
|
||||||
|
|
||||||
|
if (session.method != Method.POST) {
|
||||||
|
throw ResponseException(METHOD_NOT_ALLOWED, "")
|
||||||
|
}
|
||||||
|
|
||||||
|
if (session.headers["content-type"]?.let { it != "application/json" } != false) {
|
||||||
|
throw ResponseException(BAD_REQUEST, "")
|
||||||
|
}
|
||||||
|
|
||||||
|
val (text, language) = getRequestData(session)
|
||||||
|
tts.performTTS(text, language)
|
||||||
|
return newFixedLengthResponse(OK, MIME_PLAINTEXT, "")
|
||||||
|
}
|
||||||
|
|
||||||
private fun getRequestData(session: IHTTPSession): TTSRequestData {
|
private fun getRequestData(session: IHTTPSession): TTSRequestData {
|
||||||
val map = mutableMapOf<String, String>()
|
val map = mutableMapOf<String, String>()
|
||||||
session.parseBody(map)
|
session.parseBody(map)
|
||||||
|
|||||||
Reference in New Issue
Block a user