app/src/main/java/com/example/jarvis_stts/MainActivity.kt aktualisiert

This commit is contained in:
2026-03-11 16:44:44 +00:00
parent 9bbd0e9f84
commit 4c1407a61c

View File

@@ -22,6 +22,7 @@ import org.vosk.android.SpeechService
import org.vosk.android.StorageService
import java.io.IOException
import java.util.Locale
import android.speech.tts.UtteranceProgressListener
class MainActivity : AppCompatActivity(), RecognitionListener, TextToSpeech.OnInitListener {
@@ -43,18 +44,21 @@ class MainActivity : AppCompatActivity(), RecognitionListener, TextToSpeech.OnIn
private var voiceNames = mutableListOf<String>()
// Launcher für Google Spracherkennung
private val speechRecognizerLauncher = registerForActivityResult(
ActivityResultContracts.StartActivityForResult()
) { result ->
isInteracting = false // WICHTIG: Sperre wieder aufheben!
private val speechRecognizerLauncher = registerForActivityResult(
ActivityResultContracts.StartActivityForResult()
) { result ->
isInteracting = false // WICHTIG: Sperre wieder aufheben!
if (result.resultCode == RESULT_OK && result.data != null) {
val spokenText = result.data!!.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS)?.get(0) ?: ""
tvStatus.text = "Ich: $spokenText"
webSocket?.send(spokenText)
if (result.resultCode == RESULT_OK && result.data != null) {
val spokenText = result.data!!.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS)?.get(0) ?: ""
tvStatus.text = "Ich: $spokenText"
webSocket?.send(spokenText)
// HIER STARTEN WIR VOSK NOCH NICHT! Wir warten auf die Antwort des Servers.
} else {
// Nur wenn wir nichts gesagt oder abgebrochen haben, geht Vosk direkt wieder an
startVosk()
}
}
startVosk()
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
@@ -203,6 +207,28 @@ class MainActivity : AppCompatActivity(), RecognitionListener, TextToSpeech.OnIn
if (status == TextToSpeech.SUCCESS) {
tts.language = Locale.GERMAN
setupVoiceSpinner()
// NEU: Wir horchen darauf, wann Jarvis aufhört zu sprechen
tts.setOnUtteranceProgressListener(object : UtteranceProgressListener() {
override fun onStart(utteranceId: String?) {
// Jarvis fängt an zu sprechen
}
override fun onDone(utteranceId: String?) {
// Jarvis ist fertig! Wake-Word wieder aktivieren.
if (utteranceId == "TTS_DONE") {
// onDone läuft im Hintergrund, UI/Vosk Updates müssen in den Main Thread
runOnUiThread {
startVosk()
}
}
}
@Deprecated("Deprecated in Java")
override fun onError(utteranceId: String?) {
runOnUiThread { startVosk() } // Bei einem Fehler auch wieder zuhören
}
})
}
}
@@ -229,10 +255,9 @@ class MainActivity : AppCompatActivity(), RecognitionListener, TextToSpeech.OnIn
private fun speakOut(text: String) {
// Wir können hier Vosk stoppen, damit Jarvis sich nicht selbst hört
voskService?.stop()
tts.speak(text, TextToSpeech.QUEUE_FLUSH, null, "TTS_DONE")
// Nach dem Sprechen müssen wir Vosk wieder starten.
// Das machen wir am besten über einen Listener (siehe unten).
// Die ID "TTS_DONE" triggert unseren Listener, wenn der Text fertig gesprochen wurde
tts.speak(text, TextToSpeech.QUEUE_FLUSH, null, "TTS_DONE")
}
override fun onDestroy() {