import websocket import json import requests import time import whisper import threading # --- KONFIGURATION --- MISTY_IP = "192.168.68.58" DATEI_NAME = "bumper_aufnahme.wav" AUFNAHME_DAUER = 10 # Flag, um zu verhindern, dass die Analyse mehrfach gleichzeitig startet laeuft_gerade = False def coaching_prozess(): global laeuft_gerade laeuft_gerade = True # 1. Start-Signal print("--- Bumper gedrückt! Starte Coaching ---") requests.post(f"http://{MISTY_IP}/api/tts/speak", json={ "text": "Bumper erkannt. Ich höre dir jetzt für 10 Sekunden zu.", "speechLocale": "de-DE" }) time.sleep(4) # 2. Aufnahme print(f"--- Aufnahme läuft ({AUFNAHME_DAUER}s) ---") requests.post(f"http://{MISTY_IP}/api/audio/record/start", json={"FileName": DATEI_NAME}) time.sleep(AUFNAHME_DAUER) requests.post(f"http://{MISTY_IP}/api/audio/record/stop") time.sleep(2) # 3. Download print("--- Übertragung der Audio-Datei ---") r = requests.get(f"http://{MISTY_IP}/api/audio?FileName={DATEI_NAME}") if r.status_code == 200: with open(DATEI_NAME, 'wb') as f: f.write(r.content) else: print("Download-Fehler!"); laeuft_gerade = False; return # 4. KI-Analyse print("--- Whisper Analyse läuft ---") model = whisper.load_model("base") result = model.transcribe(DATEI_NAME, language="German", initial_prompt="Äh, ähm.") text = result["text"].lower() # Zählen anzahl_aehm = text.count("ähm") anzahl_aeh = text.replace("ähm", "TEMP").count("äh") gesamt = anzahl_aeh + anzahl_aehm # 5. Feedback if gesamt > 0: msg = f"Ich habe {gesamt} Füllwörter gehört. Versuche flüssiger zu sprechen." img = "e_DisorientedConfused.jpg" else: msg = "Hervorragend! Keine Füllwörter gefunden." img = "e_Joy.jpg" requests.post(f"http://{MISTY_IP}/api/images/display", json={"FileName": img}) requests.post(f"http://{MISTY_IP}/api/tts/speak", json={"text": msg, "speechLocale": "de-DE"}) print(f"Fertig! Text: {text}") laeuft_gerade = False def on_message(ws, message): global laeuft_gerade data = json.loads(message) # Wir prüfen, ob das Event vom Bumper kommt if "message" in data and "sensor" in data["message"]: sensor = data["message"]["sensor"] is_pressed = data["message"]["isPressed"] # "br" steht für Bumper Right (Rechter Bumper) if sensor == "br" and is_pressed and not laeuft_gerade: # Starte den Prozess in einem eigenen Thread, damit die Verbindung nicht blockiert threading.Thread(target=coaching_prozess).start() def on_open(ws): print("Verbindung zu Misty hergestellt. Drücke den RECHTEN BUMPER zum Starten.") # Wir abonnieren das Bumper-Event subscribe_msg = { "Operation": "subscribe", "Type": "BumpSensor", "DebounceMs": 50, "EventName": "BumperPress", "ReturnProperty": None } ws.send(json.dumps(subscribe_msg)) # WebSocket starten ws = websocket.WebSocketApp(f"ws://{MISTY_IP}/pubsub", on_open=on_open, on_message=on_message) ws.run_forever()