Heartbeat, Error Handling, SSE, Füllwörter-Verwaltung, Sprach-Coach

This commit is contained in:
TiffanyBrugger 2026-07-07 13:04:32 +00:00
parent 92a8363f5d
commit df0951916a
8 changed files with 38 additions and 26 deletions

Binary file not shown.

Binary file not shown.

Binary file not shown.

View file

@ -1,4 +1,4 @@
# config.py # config.py
# Zentrale Stelle für Netzwerkparameter # Zentrale Stelle für Netzwerkparameter
MISTY_IP = "192.168.68.65" MISTY_IP = "192.168.68.57"
RTSP_URL = f"rtsp://{MISTY_IP}:1936" RTSP_URL = "rtsp://{MISTY_IP}:1936"

View file

@ -6,7 +6,5 @@
"hm", "hm",
"also", "also",
"sozusagen", "sozusagen",
"irgendwie", "irgendwie"
"test",
"nochmal test"
] ]

View file

@ -3,25 +3,14 @@
"sessions": [ "sessions": [
{ {
"nummer": 1, "nummer": 1,
"zeit": "12:36", "zeit": "12:59",
"text": "Okay, das heißt, wenn ich jetzt hier rede und eine Präsentation halt, wieder nimmst du das Ganze auch. Okay. Aber dann merke ich gerade, dann ist es doch kein Livestream. Weil er nimmt jetzt wahrscheinlich auf, speichert das Ganze in eine wunderschöne Datei. Und diese Datei, die nennen wir Mississippi und gucken, ob er auch ganz viele verschiedene Worte und schwierige Worte wie Retoreg erkennt und dann wird das Ganze wahrscheinlich mit Whisper analysiert.", "text": "Blah, blah, blah, blah, blah, blah, blah, blah, blah.",
"fuellwoerter_anzahl": 1,
"gefundene_woerter": {
"halt": 1
},
"tempo": 146,
"feedback": "Du hattest ein Füllwort. Du hast das Füllwort halt einmal benutzt. Dein Sprechtempo war sehr angenehm.",
"gesicht": "e_Love.jpg"
},
{
"nummer": 2,
"zeit": "12:37",
"text": "Die mit manch schlecht.",
"fuellwoerter_anzahl": 0, "fuellwoerter_anzahl": 0,
"gefundene_woerter": {}, "gefundene_woerter": {},
"tempo": 266, "tempo": 102,
"feedback": "Keine Füllwörter gefunden. Hervorragend! Dein Sprechtempo war etwas zu schnell. Versuche dich etwas zu verlangsamen.", "feedback": "Keine Füllwörter gefunden. Hervorragend! Dein Sprechtempo war sehr angenehm.",
"gesicht": "e_Contempt.jpg" "gesicht": "e_Love.jpg"
} }
] ],
"fehler": "WebSocket Fehler: "
} }

View file

@ -44,6 +44,28 @@ def setze_fehler(nachricht):
with open(DATEN_DATEI, "w", encoding="utf-8") as f: with open(DATEN_DATEI, "w", encoding="utf-8") as f:
json.dump(daten, f, ensure_ascii=False, indent=2) json.dump(daten, f, ensure_ascii=False, indent=2)
def loesche_fehler():
if os.path.exists(DATEN_DATEI):
with open(DATEN_DATEI, "r", encoding="utf-8") as f:
daten = json.load(f)
if daten.get("fehler"):
daten["fehler"] = None
daten["status"] = "wartend"
with open(DATEN_DATEI, "w", encoding="utf-8") as f:
json.dump(daten, f, ensure_ascii=False, indent=2)
print("✅ Misty wieder erreichbar Fehler zurückgesetzt")
def heartbeat():
print("--- Heartbeat gestartet (alle 5 Sekunden) ---")
while True:
time.sleep(5)
if not laeuft_gerade:
if not pruefe_misty_verbindung():
print("❌ Heartbeat: Misty nicht erreichbar!")
setze_fehler(f"Verbindung zu Misty verloren. Bitte Misty einschalten und IP in config.py prüfen.")
else:
loesche_fehler()
def coaching_prozess(): def coaching_prozess():
global laeuft_gerade, aufnahme_laeuft, aufnahme_start global laeuft_gerade, aufnahme_laeuft, aufnahme_start
laeuft_gerade = True laeuft_gerade = True
@ -157,6 +179,9 @@ if not pruefe_misty_verbindung():
else: else:
print(f"✅ Misty erreichbar unter {MISTY_IP}") print(f"✅ Misty erreichbar unter {MISTY_IP}")
# Heartbeat-Thread starten
threading.Thread(target=heartbeat, daemon=True).start()
ws = websocket.WebSocketApp( ws = websocket.WebSocketApp(
f"ws://{MISTY_IP}/pubsub", f"ws://{MISTY_IP}/pubsub",
on_open=on_open, on_open=on_open,

View file

@ -3,7 +3,7 @@
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Misty Rhetorik-Coach</title> <title>Misty Sprach-Coach</title>
<link href="https://fonts.googleapis.com/css2?family=Nunito:wght@400;500;600;700;800;900&display=swap" rel="stylesheet"> <link href="https://fonts.googleapis.com/css2?family=Nunito:wght@400;500;600;700;800;900&display=swap" rel="stylesheet">
<style> <style>
* { margin: 0; padding: 0; box-sizing: border-box; } * { margin: 0; padding: 0; box-sizing: border-box; }
@ -251,7 +251,7 @@ header {
<div class="brand"> <div class="brand">
<div class="brand-avatar">🤖</div> <div class="brand-avatar">🤖</div>
<div> <div>
<div class="brand-name">Misty Rhetorik-Coach</div> <div class="brand-name">Misty Sprach-Coach</div>
<div class="brand-sub">PH Weingarten · Modul M2 · WS 2025/26</div> <div class="brand-sub">PH Weingarten · Modul M2 · WS 2025/26</div>
</div> </div>
</div> </div>
@ -405,7 +405,7 @@ header {
{% else %} {% else %}
<div class="card"> <div class="card">
<div class="empty-state"> <div class="empty-state">
🤖 Willkommen beim Misty Rhetorik-Coach!<br><br> 🤖 Willkommen beim Misty Sprach-Coach!<br><br>
Hier werden die Ergebnisse jeder Präsentation Füllwörter, Sprechtempo und Mistys Feedback gezeigt.<br><br> Hier werden die Ergebnisse jeder Präsentation Füllwörter, Sprechtempo und Mistys Feedback gezeigt.<br><br>
Sobald der erste Durchgang abgeschlossen ist, erscheinen die Ergebnisse automatisch.<br><br> Sobald der erste Durchgang abgeschlossen ist, erscheinen die Ergebnisse automatisch.<br><br>
Im Sessionverlauf ist zu sehen, wie sich die Leistung über mehrere Durchgänge hinweg verbessert.<br><br> Im Sessionverlauf ist zu sehen, wie sich die Leistung über mehrere Durchgänge hinweg verbessert.<br><br>