From 2c2853eb2100a9c1362023c076a93f8f655a4fb8 Mon Sep 17 00:00:00 2001 From: Till Immer Date: Tue, 7 Jul 2026 07:13:04 +0000 Subject: [PATCH] =?UTF-8?q?nora.py=20hinzugef=C3=BCgt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- nora.py | 102 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 102 insertions(+) create mode 100644 nora.py diff --git a/nora.py b/nora.py new file mode 100644 index 0000000..442e22c --- /dev/null +++ b/nora.py @@ -0,0 +1,102 @@ +import asyncio +import os +import re +import time +import traceback + +from dotenv import load_dotenv +from edge_tts import Communicate + +from agent import Agent +from util.logger import get_logger + +load_dotenv() + +logger = get_logger("NORA") + +TTS_VOICE = "de-DE-AmalaNeural" + + +class NoraChat: + + def __init__(self): + self.agent = Agent() + + async def run(self): + + print("\n" + "=" * 40) + print(" N.O.R.A START") + print("=" * 40 + "\n") + + logger.info("Verbinde MCP...") + await self.agent.mcp.connect() + + logger.info("Lade Tools...") + await self.agent.load_tools() + + print("N.O.R.A ist bereit. (exit zum Beenden)\n") + + try: + while True: + + user = input("Du: ").strip() + + if user.lower() in ["exit", "quit", "bye", "stop"]: + break + + if not user: + continue + + logger.info(f"USER: {user}") + + response = await self.agent.run(user) + + logger.info(f"NORA: {response}") + + print(f"\nN.O.R.A: {response}\n") + + await self.speak(response) + + except KeyboardInterrupt: + pass + + finally: + await self.agent.mcp.close() + logger.info("Shutdown abgeschlossen") + + async def speak(self, text: str): + + try: + + # Nur die ersten zwei Sätze sprechen + sentences = re.split(r'(?<=[.!?])\s+', text.strip()) + speech_text = " ".join(sentences[:2]) + + if not speech_text: + return + + filename = f"response_{int(time.time())}.mp3" + + tts = Communicate( + speech_text, + voice=TTS_VOICE + ) + + await tts.save(filename) + + os.system(f"mpg123 -q {filename}") + + os.remove(filename) + + except Exception: + logger.error("TTS Fehler") + logger.error(traceback.format_exc()) + + +async def main(): + chat = NoraChat() + await chat.run() + + +if __name__ == "__main__": + asyncio.run(main()) \ No newline at end of file