From df864727039c6ee80ad2d4807ee75bb9097f6566 Mon Sep 17 00:00:00 2001 From: "info@pi-farm.de" Date: Wed, 11 Mar 2026 10:13:20 +0000 Subject: [PATCH] app/src/main/java/com/example/jarvis_stts/MainActivity.kt aktualisiert --- .../com/example/jarvis_stts/MainActivity.kt | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) 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 e28ce80..de0e63d 100644 --- a/app/src/main/java/com/example/jarvis_stts/MainActivity.kt +++ b/app/src/main/java/com/example/jarvis_stts/MainActivity.kt @@ -16,6 +16,9 @@ import androidx.core.app.ActivityCompat import androidx.core.content.ContextCompat import okhttp3.* import java.util.Locale +import ai.picovoice.porcupine.PorcupineManager +import ai.picovoice.porcupine.PorcupineManagerCallback +import ai.picovoice.porcupine.Porcupine class MainActivity : AppCompatActivity(), TextToSpeech.OnInitListener { @@ -23,6 +26,7 @@ class MainActivity : AppCompatActivity(), TextToSpeech.OnInitListener { private lateinit var tvStatus: TextView private lateinit var etUrl: EditText private lateinit var spinnerVoices: Spinner + private var porcupineManager: PorcupineManager? = null private val client = OkHttpClient() private var webSocket: WebSocket? = null @@ -82,6 +86,8 @@ class MainActivity : AppCompatActivity(), TextToSpeech.OnInitListener { if (ContextCompat.checkSelfPermission(this, Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.RECORD_AUDIO), 1) } + // Wake-Word Engine starten, sobald die App offen ist + initWakeWord() } private fun connectToServer(url: String) { @@ -152,7 +158,42 @@ class MainActivity : AppCompatActivity(), TextToSpeech.OnInitListener { tts.speak(text, TextToSpeech.QUEUE_FLUSH, null, "") } + private fun initWakeWord() { + try { + // HIER DEINEN PICOVOICE ACCESS KEY EINTRAGEN: + val accessKey = "DEIN_KOPIERTER_PICOVOICE_KEY" + + porcupineManager = PorcupineManager.Builder() + .setAccessKey(accessKey) + // Du kannst hier auch .COMPUTER, .BUMBLEBEE oder .PORCUPINE wählen + .setKeyword(Porcupine.BuiltInKeyword.JARVIS) + .build(applicationContext, PorcupineManagerCallback { keywordIndex -> + if (keywordIndex == 0) { + // Wake-Word wurde erkannt! + runOnUiThread { + tvStatus.text = "Wake-Word erkannt! Höre zu..." + // Startet sofort die Google-Spracherkennung für deinen Befehl + startVoiceInput() + } + } + }) + + // Startet das Dauerlauschen im Hintergrund + porcupineManager?.start() + Log.d("WakeWord", "Porcupine lauscht auf 'Jarvis'...") + + } catch (e: Exception) { + Log.e("WakeWord", "Fehler beim Starten von Porcupine: ${e.message}") + runOnUiThread { + Toast.makeText(this, "Wake-Word Fehler: ${e.message}", Toast.LENGTH_LONG).show() + } + } + } + override fun onDestroy() { + // Wichtig: Beim Schließen der App aufräumen! + porcupineManager?.stop() + porcupineManager?.delete() webSocket?.close(1000, "App Ende") tts.stop() tts.shutdown()