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

This commit is contained in:
2026-03-11 11:05:21 +00:00
parent e65ad4fbaa
commit 41335a9cfb

View File

@@ -45,6 +45,23 @@ class MainActivity : AppCompatActivity(), TextToSpeech.OnInitListener {
} }
} }
private val speechRecognizerLauncher = registerForActivityResult(
ActivityResultContracts.StartActivityForResult()
) { result ->
// Wenn Google fertig ist, starten wir das Wake-word wieder
try {
porcupineManager?.start()
} catch (e: Exception) {
Log.e("JARVIS", "Neustart nach Spracheingabe fehlgeschlagen")
}
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)
}
}
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main) setContentView(R.layout.activity_main)
@@ -88,7 +105,7 @@ class MainActivity : AppCompatActivity(), TextToSpeech.OnInitListener {
ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.RECORD_AUDIO), 1) ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.RECORD_AUDIO), 1)
} else { } else {
// App hat die Erlaubnis schon (z.B. beim zweiten App-Start) -> Direkt starten! // App hat die Erlaubnis schon (z.B. beim zweiten App-Start) -> Direkt starten!
initWakeWord()
} }
} }
@@ -105,6 +122,22 @@ class MainActivity : AppCompatActivity(), TextToSpeech.OnInitListener {
} }
} }
override fun onResume() {
super.onResume()
// Nur starten, wenn wir die Erlaubnis haben
if (ContextCompat.checkSelfPermission(this, Manifest.permission.RECORD_AUDIO) == PackageManager.PERMISSION_GRANTED) {
// Falls der Manager schon läuft, stoppen wir ihn kurz, um ihn sauber neu zu starten
porcupineManager?.stop()
initWakeWord()
}
}
override fun onPause() {
super.onPause()
// Mikrofon pausieren, wenn die App nicht im Fokus ist, um den Fehler zu vermeiden
porcupineManager?.stop()
}
private fun connectToServer(url: String) { private fun connectToServer(url: String) {
webSocket?.close(1000, "Neuverbindung") webSocket?.close(1000, "Neuverbindung")
val request = Request.Builder().url(url).build() val request = Request.Builder().url(url).build()
@@ -175,32 +208,35 @@ class MainActivity : AppCompatActivity(), TextToSpeech.OnInitListener {
private fun initWakeWord() { private fun initWakeWord() {
try { try {
// HIER DEINEN PICOVOICE ACCESS KEY EINTRAGEN: val accessKey = "DEIN_KEY_HIER" // Bitte nochmal prüfen!
val accessKey = "DEIN_KOPIERTER_PICOVOICE_KEY"
porcupineManager = PorcupineManager.Builder() porcupineManager = PorcupineManager.Builder()
.setAccessKey(accessKey) .setAccessKey(accessKey)
// Du kannst hier auch .COMPUTER, .BUMBLEBEE oder .PORCUPINE wählen
.setKeyword(Porcupine.BuiltInKeyword.JARVIS) .setKeyword(Porcupine.BuiltInKeyword.JARVIS)
.build(applicationContext, PorcupineManagerCallback { keywordIndex -> .build(applicationContext, PorcupineManagerCallback { keywordIndex ->
if (keywordIndex == 0) {
// Wake-Word wurde erkannt!
runOnUiThread { runOnUiThread {
tvStatus.text = "Wake-Word erkannt! Höre zu..." // 1. Wake-word stoppen, damit Google das Mikrofon kriegt
// Startet sofort die Google-Spracherkennung für deinen Befehl porcupineManager?.stop()
// 2. Google-Eingabe starten
startVoiceInput() startVoiceInput()
} }
}
}) })
// Startet das Dauerlauschen im Hintergrund
porcupineManager?.start() porcupineManager?.start()
Log.d("WakeWord", "Porcupine lauscht auf 'Jarvis'...") Log.d("JARVIS", "Porcupine erfolgreich gestartet")
} catch (e: Exception) { } catch (e: Exception) {
Log.e("WakeWord", "Fehler beim Starten von Porcupine: ${e.message}") // DAS HIER IST WICHTIG: Was genau ist der Fehler?
val errorMessage = when (e) {
is ai.picovoice.porcupine.PorcupineActivationException -> "Key ungültig oder Limit erreicht"
is ai.picovoice.porcupine.PorcupineActivationNetworkException -> "Keine Internetverbindung zur Key-Prüfung"
is ai.picovoice.porcupine.PorcupineInvalidArgumentException -> "Falsches Keyword oder Argument"
else -> e.message ?: "Unbekannter Fehler"
}
Log.e("JARVIS", "Detail-Fehler: $errorMessage")
runOnUiThread { runOnUiThread {
Toast.makeText(this, "Wake-Word Fehler: ${e.message}", Toast.LENGTH_LONG).show() tvStatus.text = "Fehler: $errorMessage"
} }
} }
} }