diff --git a/app/src/main/java/com/bartlomiejpluta/ttsserver/core/lua/lib/TTSLibrary.kt b/app/src/main/java/com/bartlomiejpluta/ttsserver/core/lua/lib/TTSLibrary.kt index 1bf64ce..b8f8e3c 100644 --- a/app/src/main/java/com/bartlomiejpluta/ttsserver/core/lua/lib/TTSLibrary.kt +++ b/app/src/main/java/com/bartlomiejpluta/ttsserver/core/lua/lib/TTSLibrary.kt @@ -3,11 +3,10 @@ package com.bartlomiejpluta.ttsserver.core.lua.lib import cafe.adriel.androidaudioconverter.model.AudioFormat import com.bartlomiejpluta.ttsserver.core.tts.engine.TTSEngine import org.luaj.vm2.LuaNil -import org.luaj.vm2.LuaString import org.luaj.vm2.LuaValue import org.luaj.vm2.lib.ThreeArgFunction import org.luaj.vm2.lib.TwoArgFunction -import java.lang.IllegalArgumentException +import org.luaj.vm2.lib.jse.CoerceJavaToLua import java.util.* class TTSLibrary(private val ttsEngine: TTSEngine) : TwoArgFunction() { @@ -42,7 +41,7 @@ class TTSLibrary(private val ttsEngine: TTSEngine) : TwoArgFunction() { val file = ttsEngine.createTTSFile(text.checkjstring(), lang, audioFormat) - return LuaValue.valueOf(file.absolutePath) + return CoerceJavaToLua.coerce(file) } } } \ No newline at end of file diff --git a/app/src/main/java/com/bartlomiejpluta/ttsserver/core/tts/engine/TTSEngine.kt b/app/src/main/java/com/bartlomiejpluta/ttsserver/core/tts/engine/TTSEngine.kt index 4fb5d96..d7c3634 100644 --- a/app/src/main/java/com/bartlomiejpluta/ttsserver/core/tts/engine/TTSEngine.kt +++ b/app/src/main/java/com/bartlomiejpluta/ttsserver/core/tts/engine/TTSEngine.kt @@ -10,14 +10,11 @@ import cafe.adriel.androidaudioconverter.model.AudioFormat import com.bartlomiejpluta.ttsserver.core.tts.exception.TTSException import com.bartlomiejpluta.ttsserver.core.tts.listener.GongListener import com.bartlomiejpluta.ttsserver.core.tts.listener.TTSProcessListener -import com.bartlomiejpluta.ttsserver.core.tts.model.TTSStream import com.bartlomiejpluta.ttsserver.core.tts.status.TTSStatus import com.bartlomiejpluta.ttsserver.core.tts.status.TTSStatusHolder import com.bartlomiejpluta.ttsserver.core.util.AudioConverter import com.bartlomiejpluta.ttsserver.ui.preference.key.PreferenceKey -import java.io.BufferedInputStream import java.io.File -import java.io.FileInputStream import java.security.MessageDigest import java.util.* @@ -33,7 +30,11 @@ class TTSEngine( val status: TTSStatus get() = ttsStatusHolder.status - fun createTTSFile(text: String, language: Locale, audioFormat: AudioFormat = AudioFormat.WAV): File { + fun createTTSFile( + text: String, + language: Locale, + audioFormat: AudioFormat = AudioFormat.WAV + ): File { val digest = hash(text, language) val targetFilename = "tts_$digest.${audioFormat.format}" val wavFilename = "tts_$digest.wav" @@ -68,26 +69,6 @@ class TTSEngine( return digest.fold("", { str, it -> str + "%02x".format(it) }) } - fun fetchTTSStream(text: String, language: Locale, audioFormat: AudioFormat = AudioFormat.WAV): TTSStream { - val file = createTempFile("tmp_tts_server", ".wav") - - val uuid = UUID.randomUUID().toString() - val listener = TTSProcessListener(uuid) - tts.setOnUtteranceProgressListener(listener) - - tts.language = language - tts.synthesizeToFile(text, null, file, uuid) - listener.await() - - val converted = convertFile(file, audioFormat) - val stream = BufferedInputStream(FileInputStream(converted)) - val length = converted.length() - - file.delete() - - return TTSStream(stream, length) - } - fun performTTS(text: String, language: Locale) { val uuid = UUID.randomUUID().toString() val listener = TTSProcessListener(uuid) diff --git a/app/src/main/java/com/bartlomiejpluta/ttsserver/core/web/endpoint/DefaultEndpoint.kt b/app/src/main/java/com/bartlomiejpluta/ttsserver/core/web/endpoint/DefaultEndpoint.kt index e5f9b64..5ba508d 100644 --- a/app/src/main/java/com/bartlomiejpluta/ttsserver/core/web/endpoint/DefaultEndpoint.kt +++ b/app/src/main/java/com/bartlomiejpluta/ttsserver/core/web/endpoint/DefaultEndpoint.kt @@ -4,6 +4,7 @@ import com.bartlomiejpluta.ttsserver.core.web.dto.Request import com.bartlomiejpluta.ttsserver.core.web.uri.UriTemplate import fi.iki.elonen.NanoHTTPD.* import org.luaj.vm2.* +import org.luaj.vm2.lib.jse.CoerceLuaToJava import java.io.BufferedInputStream import java.io.File import java.io.FileInputStream @@ -24,10 +25,10 @@ class DefaultEndpoint( .let { provideResponse(it) } - private fun provideResponse(response: LuaTable) = when { - response.get("data") !is LuaNil -> getTextResponse(response) - response.get("file") !is LuaNil -> getFileResponse(response) - else -> throw IllegalArgumentException("Provide 'data' or 'file' in response table") + private fun provideResponse(response: LuaTable) = when (response.get("data")) { + is LuaString -> getTextResponse(response) + is LuaUserdata -> getFileResponse(response) + else -> throw IllegalArgumentException("Supported only string and file data types") } private fun getTextResponse(response: LuaTable) = newFixedLengthResponse( @@ -37,9 +38,14 @@ class DefaultEndpoint( ) private fun getFileResponse(response: LuaTable): Response? { - val file = File(response.get("file").checkjstring()) + val file = CoerceLuaToJava.coerce(response.get("data"), File::class.java) as File val stream = BufferedInputStream(FileInputStream(file)) val length = file.length() + + if(!getCached(response)) { + file.delete() + } + return newFixedLengthResponse( getStatus(response), getMimeType(response), @@ -60,5 +66,7 @@ class DefaultEndpoint( private fun getData(response: LuaTable) = response.get("data").checkjstring() + private fun getCached(response: LuaTable) = response.get("cached").optboolean(false) + override fun toString() = "D[${uri.template}]" } \ No newline at end of file