Neuro/main.py

90 lines
2.6 KiB
Python
Raw Normal View History

2024-01-05 21:56:50 -05:00
# Python Module Imports
import signal
import sys
import time
2024-01-05 21:56:50 -05:00
import threading
import asyncio
# Class Imports
from signals import Signals
from prompter import Prompter
from llmWrapper import LLMWrapper
from stt import STT
from tts import TTS
from modules.twitchClient import TwitchClient
from socketioServer import SocketIOServer
async def main():
2024-01-05 21:56:50 -05:00
print("Starting Project...")
# Register signal handler so that all threads can be exited.
def signal_handler(sig, frame):
print('Received CTRL + C, attempting to gracefully exit. Close all dashboard windows to speed up shutdown.')
signals.terminate = True
stt.API.shutdown()
2024-01-05 21:56:50 -05:00
signal.signal(signal.SIGINT, signal_handler)
signal.signal(signal.SIGTERM, signal_handler)
2024-01-05 21:56:50 -05:00
# CORE FILES
2024-01-05 21:56:50 -05:00
# Singleton object that every module will be able to read/write to
signals = Signals()
2024-01-05 21:56:50 -05:00
# Create STT
stt = STT(signals)
2024-01-05 21:56:50 -05:00
# Create TTS
tts = TTS(signals)
2024-01-05 21:56:50 -05:00
# Create LLMController
llm_wrapper = LLMWrapper(signals, tts)
2024-01-05 21:56:50 -05:00
# Create Prompter
prompter = Prompter(signals, llm_wrapper)
# MODULES
modules = {}
module_threads = {}
2024-01-05 21:56:50 -05:00
# Create Discord bot
# modules['discord'] = DiscordClient(signals, stt, enabled=False)
# Create Twitch bot
modules['twitch'] = TwitchClient(signals, enabled=False)
2024-01-05 21:56:50 -05:00
# Create Socket.io server
sio = SocketIOServer(signals, stt, tts, llm_wrapper, prompter, modules=modules)
# Create threads (As daemons, so they exit when the main thread exits)
prompter_thread = threading.Thread(target=prompter.prompt_loop, daemon=True)
stt_thread = threading.Thread(target=stt.listen_loop, daemon=True)
sio_thread = threading.Thread(target=sio.start_server, daemon=True)
2024-01-05 21:56:50 -05:00
# Start Threads
sio_thread.start()
prompter_thread.start()
stt_thread.start()
# Create and start threads for modules
for name, module in modules.items():
module_thread = threading.Thread(target=module.init_event_loop, daemon=True)
module_threads[name] = module_thread
module_thread.start()
while not signals.terminate:
time.sleep(0.1)
print("TERMINATING ======================")
# Wait for child threads to exit before exiting main thread
sio_thread.join()
print("SIO EXITED ======================")
prompter_thread.join()
print("PROMPTER EXITED ======================")
# stt_thread.join()
# print("STT EXITED ======================")
# Wait for all modules to finish
for module_thread in module_threads.values():
module_thread.join()
sys.exit(0)
if __name__ == '__main__':
asyncio.run(main())