From 776ff62ce3faa02347d3d63f40c4061a597660c2 Mon Sep 17 00:00:00 2001 From: Till Immer Date: Mon, 6 Jul 2026 22:01:22 +0000 Subject: [PATCH] =?UTF-8?q?nora=5Fchat.py=20hinzugef=C3=BCgt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- nora_chat.py | 136 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 136 insertions(+) create mode 100644 nora_chat.py diff --git a/nora_chat.py b/nora_chat.py new file mode 100644 index 0000000..3456ebc --- /dev/null +++ b/nora_chat.py @@ -0,0 +1,136 @@ +import asyncio +import os +import time +import traceback + +from edge_tts import Communicate + +from agent import Agent +from util.logger import get_logger + + +logger = get_logger("NORA CHAT") + + +# ========================= +# CONFIG +# ========================= + +TTS_VOICE = "de-DE-AmalaNeural" + + +# ========================= +# CHAT ASSISTANT +# ========================= + +class NoraChat: + + def __init__(self): + logger.info("Initialisiere N.O.R.A Chat...") + + self.agent = Agent() + self.running = True + + logger.info("N.O.R.A Chat bereit ✔") + + + # ========================= + # MAIN LOOP + # ========================= + + async def run(self): + + logger.info("Starte Chat-Modus") + + while self.running: + + try: + user_input = input("\nDu: ") + + if user_input.lower() in [ + "exit", + "quit", + "stop", + "beenden" + ]: + logger.info("Beende NORA") + break + + + if not user_input.strip(): + continue + + + logger.info(f"USER: {user_input}") + + + # Agent Anfrage + response = await self.agent.run(user_input) + + + logger.info(f"NORA: {response}") + + print(f"\nNORA: {response}") + + + # Sprach-Ausgabe + await self.speak(response) + + + except KeyboardInterrupt: + break + + except Exception: + logger.error(traceback.format_exc()) + + + # ========================= + # TTS + # ========================= + + async def speak(self, text): + + try: + + filename = f"response_{int(time.time())}.mp3" + + + tts = Communicate( + text, + voice=TTS_VOICE + ) + + + await tts.save(filename) + + + # Ausgabe über Standard-Audio + os.system( + f"mpg123 -q {filename}" + ) + + + os.remove(filename) + + + except Exception: + + logger.error("TTS Fehler") + logger.error(traceback.format_exc()) + + + +# ========================= +# MAIN +# ========================= + +async def main(): + + nora = NoraChat() + + await nora.run() + + + +if __name__ == "__main__": + asyncio.run(main()) \ No newline at end of file