From ad46c99993e90450351cdef06546bc2d9fd256b2 Mon Sep 17 00:00:00 2001 From: "info@pi-farm.de" Date: Thu, 12 Mar 2026 16:15:57 +0000 Subject: [PATCH] app/src/main/java/com/example/jarvis_stts/JarviceService.kt aktualisiert --- .../com/example/jarvis_stts/JarviceService.kt | 60 +++++++++++-------- 1 file changed, 35 insertions(+), 25 deletions(-) diff --git a/app/src/main/java/com/example/jarvis_stts/JarviceService.kt b/app/src/main/java/com/example/jarvis_stts/JarviceService.kt index d0f6cfb..ecfe900 100644 --- a/app/src/main/java/com/example/jarvis_stts/JarviceService.kt +++ b/app/src/main/java/com/example/jarvis_stts/JarviceService.kt @@ -122,49 +122,59 @@ class JarvisService : Service(), RecognitionListener { private fun resumeListening() { if (voskModel == null) return - Log.d("JARVIS", "Service: Starte Zuhören") voskService?.stop() - // Die Liste klein halten ist gut, aber wir brauchen den exakten Treffer - val rec = Recognizer(voskModel, 16000.0f, "[\"jarvis\", \"[unk]\"]") + // Wir fügen häufige deutsche Wörter und phonetische Ähnlichkeiten hinzu + // Diese dienen als "Blitzableiter" für Fehlalarm + val grammar = "[" + + "\"jarvis\", " + // Wake-Words + "\"ja\", \"nein\", \"und\", \"der\", \"die\", \"das\", " + // Füllwörter + "\"service\", \"imbiss\", \"harnisch\", \"garvis\", \"fertig\", " + // Phonetische Fallen + "\"[unk]\"" + + "]" + + val rec = Recognizer(voskModel, 16000.0f, grammar) + // Wir erlauben dem Recognizer, weniger "nervös" zu sein + // Ein höherer Wert für Small-Models kann helfen + rec.setThreshold(0.5) // Falls deine Vosk-Version das unterstützt voskService = SpeechService(rec, 16000.0f) voskService?.startListening(this) - + isInteracting = false updateNotification("Warte auf 'Jarvis'...") } - // --- Vosk Listener --- - override fun onPartialResult(hypothesis: String) { + // In onPartialResult machen wir jetzt GAR NICHTS mehr, um Fehlalarme zu vermeiden + override fun onPartialResult(hypothesis: String) {} + + // Wir nutzen nur noch onResult für den echten Check + override fun onResult(hypothesis: String) { if (isInteracting) return try { val json = JSONObject(hypothesis) - // Bei onPartialResult heißt das Feld "partial" - val partialText = json.optString("partial").lowercase().trim() + val recognizedText = json.optString("text").lowercase().trim() - // Wir reagieren NUR, wenn das Wort exakt "jarvis" ist - // Das verhindert, dass Wörter wie "Service" oder "Nachtisch" triggern - if (partialText == "jarvis" ) { - Log.d("JARVIS", "Service: WAKE WORD EXAKT ERKANNT: $partialText") - - isInteracting = true - // Ein kurzer haptischer Feedback-Vibe wäre hier cool (optional) - - pauseListening() - - val intent = Intent(this, MainActivity::class.java).apply { - addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_SINGLE_TOP) - putExtra("WAKE_WORD_TRIGGERED", true) - } - startActivity(intent) + // Nur wenn das erkannte Wort EXAKT Jarvis oder Computer ist + if (recognizedText == "jarvis") { + Log.d("JARVIS", "Sicheres Wake-Word erkannt: $recognizedText") + triggerJarvis() } } catch (e: Exception) { - Log.e("JARVIS", "Fehler beim Parsen des PartialResults: ${e.message}") + Log.e("JARVIS", "Fehler: ${e.message}") } } - override fun onResult(hypothesis: String) {} + private fun triggerJarvis() { + isInteracting = true + pauseListening() + val intent = Intent(this, MainActivity::class.java).apply { + addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_SINGLE_TOP) + putExtra("WAKE_WORD_TRIGGERED", true) + } + startActivity(intent) + } + override fun onFinalResult(hypothesis: String) {} override fun onError(e: Exception) { Log.e("JARVIS", "Service Error: ${e.message}") } override fun onTimeout() {}