Misty-Sprach-Coach/start_coaching.py
2026-05-06 12:46:05 +00:00

116 lines
3.5 KiB
Python

import websocket
import json
import requests
import time
import threading
import os
from config import MISTY_IP
from analyse import analysiere, gib_feedback, setze_status
DATEI_NAME = "aufnahme.wav"
DATEN_DATEI = "session_daten.json"
laeuft_gerade = False
aufnahme_laeuft = False
aufnahme_start = 0
def setze_neutral():
requests.post(f"http://{MISTY_IP}/api/images/display", json={"FileName": "e_DefaultContent.jpg"})
def reset_session_daten():
with open(DATEN_DATEI, "w", encoding="utf-8") as f:
json.dump({"status": "wartend", "sessions": []}, f, ensure_ascii=False, indent=2)
print("--- Session-Daten zurückgesetzt ---")
def coaching_prozess():
global laeuft_gerade, aufnahme_laeuft, aufnahme_start
laeuft_gerade = True
aufnahme_laeuft = True
setze_neutral()
setze_status("aufnehmend")
print("--- Fuß gedrückt! Starte Coaching ---")
requests.post(f"http://{MISTY_IP}/api/tts/speak", json={
"text": "Ich höre dir zu. Drücke meinen Fuß nochmal wenn du fertig bist.",
"voice": "de-de-x-deb-local"
})
time.sleep(4)
print("--- Aufnahme läuft ---")
requests.post(f"http://{MISTY_IP}/api/audio/record/start", json={"FileName": DATEI_NAME})
aufnahme_start = time.time()
while aufnahme_laeuft:
time.sleep(0.1)
echte_dauer = time.time() - aufnahme_start
print(f"--- Aufnahme gestoppt ({round(echte_dauer)} Sekunden) ---")
requests.post(f"http://{MISTY_IP}/api/audio/record/stop")
time.sleep(2)
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!")
setze_status("wartend")
laeuft_gerade = False
return
anzahl, text, gefundene_woerter, tempo = analysiere(DATEI_NAME, echte_dauer)
gib_feedback(anzahl, gefundene_woerter, tempo, text)
setze_status("wartend")
laeuft_gerade = False
def on_message(ws, message):
global laeuft_gerade, aufnahme_laeuft
data = json.loads(message)
if "message" in data and "sensorId" in data["message"]:
sensor = data["message"]["sensorId"]
is_pressed = data["message"]["isContacted"]
if sensor in ["bfr", "bfl"] and is_pressed:
if not laeuft_gerade:
threading.Thread(target=coaching_prozess).start()
elif aufnahme_laeuft:
print("--- Fuß gedrückt! Aufnahme wird beendet ---")
aufnahme_laeuft = False
def on_open(ws):
print("Verbindung zu Misty hergestellt. Drücke einen FUSS zum Starten.")
reset_session_daten()
setze_neutral()
setze_status("wartend")
subscribe_msg = {
"Operation": "subscribe",
"Type": "BumpSensor",
"DebounceMs": 50,
"EventName": "BumperPress",
"ReturnProperty": None
}
ws.send(json.dumps(subscribe_msg))
def on_error(ws, error):
print(f"❌ WebSocket Fehler: {error}")
def on_close(ws, close_status_code, close_msg):
print(f"❌ Verbindung getrennt: {close_status_code} - {close_msg}")
setze_neutral()
setze_status("wartend")
ws = websocket.WebSocketApp(
f"ws://{MISTY_IP}/pubsub",
on_open=on_open,
on_message=on_message,
on_error=on_error,
on_close=on_close
)
try:
ws.run_forever()
except KeyboardInterrupt:
print("\n--- Programm beendet ---")
setze_neutral()
setze_status("wartend")