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

This commit is contained in:
2026-03-11 14:54:16 +00:00
parent 54aa9686a5
commit 221e926ca2

View File

@@ -45,7 +45,6 @@ class MainActivity : AppCompatActivity(), RecognitionListener, TextToSpeech.OnIn
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// 1. UI initialisieren
tvStatus = findViewById(R.id.tvStatus)
etUrl = findViewById(R.id.etUrl)
spinnerVoices = findViewById(R.id.spinnerVoices)
@@ -54,7 +53,6 @@ class MainActivity : AppCompatActivity(), RecognitionListener, TextToSpeech.OnIn
tts = TextToSpeech(this, this)
// 2. SharedPreferences
val prefs = getSharedPreferences("JarvisPrefs", MODE_PRIVATE)
etUrl.setText(prefs.getString("server_url", ""))
@@ -66,9 +64,11 @@ class MainActivity : AppCompatActivity(), RecognitionListener, TextToSpeech.OnIn
}
}
btnSpeak.setOnClickListener { startVoiceInput() }
btnSpeak.setOnClickListener {
voskService?.stop() // Vosk stoppen, wenn man manuell klickt
startVoiceInput()
}
// 3. Vosk Modell laden & Berechtigungen
if (ContextCompat.checkSelfPermission(this, Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.RECORD_AUDIO), 1)
} else {
@@ -76,6 +76,14 @@ class MainActivity : AppCompatActivity(), RecognitionListener, TextToSpeech.OnIn
}
}
// KORREKTUR: Damit Jarvis sofort nach der Erlaubnis startet
override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
if (requestCode == 1 && grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
initVoskModel()
}
}
private fun initVoskModel() {
StorageService.unpack(this, "model-de", "model",
{ model: Model ->
@@ -91,12 +99,14 @@ class MainActivity : AppCompatActivity(), RecognitionListener, TextToSpeech.OnIn
private fun startVosk() {
try {
if (voskModel == null) return
// Wir horchen auf "jarvis". [unk] lässt unbekannte Wörter zu.
val rec = Recognizer(voskModel, 16000.0f, "[\"computer\", \"[unk]\"]")
//val rec = Recognizer(voskModel, 16000.0f, "[\"jarvis\", \"[unk]\"]")
// Falls noch ein alter Service läuft, sicherheitshalber stoppen
voskService?.stop()
voskService?.shutdown()
val rec = Recognizer(voskModel, 16000.0f, "[\"computer\", \"jarvis\", \"[unk]\"]")
voskService = SpeechService(rec, 16000.0f)
voskService?.startListening(this)
runOnUiThread { tvStatus.text = "Bereit (Warte auf 'Jarvis')" }
runOnUiThread { tvStatus.text = "Bereit (Warte auf 'Computer')" }
} catch (e: Exception) {
Log.e("JARVIS", "Vosk Start Fehler: ${e.message}")
}
@@ -111,8 +121,9 @@ class MainActivity : AppCompatActivity(), RecognitionListener, TextToSpeech.OnIn
val recognizedText = extractText(hypothesis)
Log.d("JARVIS", "Vosk hört: $recognizedText")
if (recognizedText.contains("computer") || recognizedText.contains("jarvis")) {
voskService?.stop() // Pause statt Stop ist oft schneller
// KORREKTUR: ignoreCase hinzugefügt für mehr Sicherheit
if (recognizedText.contains("computer", true) || recognizedText.contains("jarvis", true)) {
voskService?.stop()
startVoiceInput()
}
}
@@ -126,8 +137,9 @@ class MainActivity : AppCompatActivity(), RecognitionListener, TextToSpeech.OnIn
tvStatus.text = "Ich: $spokenText"
webSocket?.send(spokenText)
}
// WICHTIG: Warte kurz oder prüfe, ob TTS spricht, bevor du das hier machst:
voskService?.startVosk()
// KORREKTUR: Einfach die Funktion aufrufen, nicht über voskService
startVosk()
}
override fun onResult(hypothesis: String) {}