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 ecfe900..062871f 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,41 @@ class JarvisService : Service(), RecognitionListener { private fun resumeListening() { if (voskModel == null) return + Log.d("JARVIS", "Service: Starte Zuhören (Volles Wörterbuch)") voskService?.stop() - // 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 + // GANZ WICHTIG: Keine Grammar (Wortliste) mehr übergeben! + // Wir nutzen das volle deutsche Vokabular, um Fehlinterpretationen zu vermeiden. + val rec = Recognizer(voskModel, 16000.0f) + voskService = SpeechService(rec, 16000.0f) voskService?.startListening(this) - + isInteracting = false - updateNotification("Warte auf 'Jarvis'...") + updateNotification("Warte auf 'Jarvis'") } - // 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) { + override fun onPartialResult(hypothesis: String) { if (isInteracting) return try { val json = JSONObject(hypothesis) - val recognizedText = json.optString("text").lowercase().trim() + val partialText = json.optString("partial").lowercase().trim() - // Nur wenn das erkannte Wort EXAKT Jarvis oder Computer ist - if (recognizedText == "jarvis") { - Log.d("JARVIS", "Sicheres Wake-Word erkannt: $recognizedText") + // Regex \b bedeutet "Wortgrenze". Er sucht nach dem eigenständigen Wort. + // Verhindert Reaktionen auf Fantasiewörter, in denen die Silben vorkommen. + if (Regex("\\b(jarvis)\\b").containsMatchIn(partialText)) { + Log.d("JARVIS", "WAKE WORD IM TEXT ERKANNT: $partialText") triggerJarvis() } } catch (e: Exception) { - Log.e("JARVIS", "Fehler: ${e.message}") + Log.e("JARVIS", "Fehler beim Parsen: ${e.message}") } } + // onResult bleibt leer oder loggt nur zur Kontrolle + override fun onResult(hypothesis: String) {} + private fun triggerJarvis() { isInteracting = true pauseListening()