From 4c1407a61caeef3cecf17c5a7c82ef736fb15cfa Mon Sep 17 00:00:00 2001 From: "info@pi-farm.de" Date: Wed, 11 Mar 2026 16:44:44 +0000 Subject: [PATCH] app/src/main/java/com/example/jarvis_stts/MainActivity.kt aktualisiert --- .../com/example/jarvis_stts/MainActivity.kt | 53 ++++++++++++++----- 1 file changed, 39 insertions(+), 14 deletions(-) diff --git a/app/src/main/java/com/example/jarvis_stts/MainActivity.kt b/app/src/main/java/com/example/jarvis_stts/MainActivity.kt index 6c8a94a..7746f2f 100644 --- a/app/src/main/java/com/example/jarvis_stts/MainActivity.kt +++ b/app/src/main/java/com/example/jarvis_stts/MainActivity.kt @@ -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() // Launcher für Google Spracherkennung - 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) + 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) + // 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() {