import whisper import requests import re import json import os from datetime import datetime from config import MISTY_IP DATEN_DATEI = "session_daten.json" FUELLWOERTER_DATEI = "fuellwoerter.json" # Modell einmal beim Start laden print("--- Lade Whisper-Modell ---") _whisper_model = whisper.load_model("base") def lade_fuellwoerter(): if os.path.exists(FUELLWOERTER_DATEI): with open(FUELLWOERTER_DATEI, "r", encoding="utf-8") as f: woerter = json.load(f) return [rf'\b{w}\b' for w in woerter] return [ r'\bäh\b', r'\bähm\b', r'\behm\b', r'\bmhm\b', r'\bhm\b', r'\bhalt\b', r'\balso\b', r'\bsozusagen\b', r'\birgendwie\b', ] def setze_status(status): if os.path.exists(DATEN_DATEI): with open(DATEN_DATEI, "r", encoding="utf-8") as f: daten = json.load(f) else: daten = {"status": status, "sessions": []} daten["status"] = status with open(DATEN_DATEI, "w", encoding="utf-8") as f: json.dump(daten, f, ensure_ascii=False, indent=2) def speichere_session(text, anzahl, gefundene_woerter, tempo, feedback, gesicht): if os.path.exists(DATEN_DATEI): with open(DATEN_DATEI, "r", encoding="utf-8") as f: daten = json.load(f) else: daten = {"status": "wartend", "sessions": []} session = { "nummer": len(daten["sessions"]) + 1, "zeit": datetime.now().strftime("%H:%M"), "text": text, "fuellwoerter_anzahl": anzahl, "gefundene_woerter": gefundene_woerter, "tempo": tempo, "feedback": feedback, "gesicht": gesicht } daten["sessions"].append(session) daten["status"] = "wartend" with open(DATEN_DATEI, "w", encoding="utf-8") as f: json.dump(daten, f, ensure_ascii=False, indent=2) def analysiere(datei, echte_dauer=None): setze_status("analysierend") print("--- Whisper Analyse läuft ---") result = _whisper_model.transcribe( datei, language="German", initial_prompt="Dies ist eine Präsentation auf Deutsch. Äh, ähm, sozusagen, halt, also, irgendwie.", temperature=0, beam_size=5, best_of=5 ) text_original = result["text"].strip() text_lower = text_original.lower() print(f"Erkannter Text: {text_original}") # Füllwörter aus Datei laden (bei jeder Analyse aktuell) FUELLWOERTER = lade_fuellwoerter() anzahl = 0 gefundene_woerter = {} for muster in FUELLWOERTER: treffer = len(re.findall(muster, text_lower)) if treffer > 0: wort = muster.replace(r'\b', '') gefundene_woerter[wort] = treffer print(f" → {wort}: {treffer}x") anzahl += treffer print(f"Füllwörter gesamt: {anzahl}") anzahl_woerter = len(text_lower.split()) if echte_dauer and echte_dauer > 0: tempo = round((anzahl_woerter / echte_dauer) * 60) else: segmente = result["segments"] if segmente: dauer = segmente[-1]["end"] - segmente[0]["start"] tempo = round((anzahl_woerter / dauer) * 60) if dauer > 0 else 0 else: tempo = 0 print(f"Sprechtempo: {tempo} Wörter/Minute") return anzahl, text_original, gefundene_woerter, tempo def formatiere_woerter(gefundene_woerter): teile = [] for wort, anzahl in gefundene_woerter.items(): if anzahl == 1: teile.append(f"{wort} einmal") else: teile.append(f"{wort} {anzahl}mal") if len(teile) == 1: return teile[0] return ", ".join(teile[:-1]) + " und " + teile[-1] def gib_feedback(anzahl, gefundene_woerter, tempo, text=""): fuellwoerter_schlecht = anzahl >= 3 tempo_ok = 90 <= tempo <= 150 if not fuellwoerter_schlecht and tempo_ok: img = "e_Love.jpg" elif fuellwoerter_schlecht and not tempo_ok: img = "e_Sadness.jpg" else: img = "e_Contempt.jpg" if anzahl == 0: fuellwort_msg = "Keine Füllwörter gefunden. Hervorragend!" elif anzahl == 1: woerter_text = formatiere_woerter(gefundene_woerter) fuellwort_msg = f"Du hattest ein Füllwort. Du hast das Füllwort {woerter_text} benutzt." elif anzahl <= 3: woerter_text = formatiere_woerter(gefundene_woerter) fuellwort_msg = f"Du hattest {anzahl} Füllwörter. Du hast benutzt: {woerter_text}." else: woerter_text = formatiere_woerter(gefundene_woerter) fuellwort_msg = f"Du hattest {anzahl} Füllwörter. Du hast benutzt: {woerter_text}. Bitte übe noch etwas." if tempo == 0: tempo_msg = "" elif tempo < 90: tempo_msg = "Dein Sprechtempo war etwas zu langsam. Versuche etwas flüssiger zu sprechen." elif tempo <= 150: tempo_msg = "Dein Sprechtempo war sehr angenehm." else: tempo_msg = "Dein Sprechtempo war etwas zu schnell. Versuche dich etwas zu verlangsamen." msg = fuellwort_msg if tempo_msg: msg += " " + tempo_msg speichere_session(text, anzahl, gefundene_woerter, tempo, msg, img) requests.post(f"http://{MISTY_IP}/api/images/display", json={"FileName": img}) requests.post(f"http://{MISTY_IP}/api/tts/speak", json={ "text": msg, "voice": "de-de-x-deb-local" }) print(f"Gesicht: {img}") print(f"Misty sagt: {msg}")