2024-01-05 21:56:50 -05:00
|
|
|
# Python Module Imports
|
|
|
|
import signal
|
|
|
|
import sys
|
2024-03-09 22:25:07 -05:00
|
|
|
import time
|
2024-01-05 21:56:50 -05:00
|
|
|
import threading
|
|
|
|
import asyncio
|
2024-05-20 23:35:35 -07:00
|
|
|
|
2024-01-05 21:56:50 -05:00
|
|
|
# Class Imports
|
|
|
|
from signals import Signals
|
|
|
|
from prompter import Prompter
|
2024-06-11 23:16:21 -07:00
|
|
|
from llmWrappers.llmState import LLMState
|
|
|
|
from llmWrappers.textLLMWrapper import TextLLMWrapper
|
|
|
|
from llmWrappers.imageLLMWrapper import ImageLLMWrapper
|
2024-01-05 21:56:50 -05:00
|
|
|
from stt import STT
|
|
|
|
from tts import TTS
|
2024-04-09 11:15:03 -04:00
|
|
|
from modules.twitchClient import TwitchClient
|
2024-05-04 20:35:28 -04:00
|
|
|
from modules.audioPlayer import AudioPlayer
|
2024-05-08 20:26:17 -04:00
|
|
|
from modules.vtubeStudio import VtubeStudio
|
2024-06-11 23:16:21 -07:00
|
|
|
from modules.multimodal import MultiModal
|
2024-05-20 23:35:35 -07:00
|
|
|
from modules.customPrompt import CustomPrompt
|
|
|
|
from modules.memory import Memory
|
2024-03-09 22:25:07 -05:00
|
|
|
from socketioServer import SocketIOServer
|
2024-01-01 17:42:23 -05:00
|
|
|
|
2024-03-10 01:09:26 -05:00
|
|
|
|
|
|
|
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):
|
2024-03-17 19:18:30 -04:00
|
|
|
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)
|
2024-03-17 19:18:30 -04:00
|
|
|
signal.signal(signal.SIGTERM, signal_handler)
|
2024-01-05 21:56:50 -05:00
|
|
|
|
2024-04-09 11:15:03 -04:00
|
|
|
# CORE FILES
|
|
|
|
|
2024-01-05 21:56:50 -05:00
|
|
|
# Singleton object that every module will be able to read/write to
|
2024-03-10 01:09:26 -05:00
|
|
|
signals = Signals()
|
2024-01-05 21:56:50 -05:00
|
|
|
|
2024-05-13 16:20:00 -04:00
|
|
|
# MODULES
|
|
|
|
# Modules that start disabled CANNOT be enabled while the program is running.
|
|
|
|
modules = {}
|
|
|
|
module_threads = {}
|
|
|
|
|
2024-01-05 21:56:50 -05:00
|
|
|
# Create STT
|
2024-03-10 01:09:26 -05:00
|
|
|
stt = STT(signals)
|
2024-01-05 21:56:50 -05:00
|
|
|
# Create TTS
|
2024-03-10 01:09:26 -05:00
|
|
|
tts = TTS(signals)
|
2024-06-11 23:16:21 -07:00
|
|
|
# Create LLMWrappers
|
|
|
|
llmState = LLMState()
|
|
|
|
llms = {
|
|
|
|
"text": TextLLMWrapper(signals, tts, llmState, modules),
|
|
|
|
"image": ImageLLMWrapper(signals, tts, llmState, modules)
|
|
|
|
}
|
2024-01-05 21:56:50 -05:00
|
|
|
# Create Prompter
|
2024-06-11 23:16:21 -07:00
|
|
|
prompter = Prompter(signals, llms, modules)
|
2024-04-09 11:15:03 -04:00
|
|
|
|
2024-01-05 21:56:50 -05:00
|
|
|
# Create Discord bot
|
2024-04-09 11:15:03 -04:00
|
|
|
# modules['discord'] = DiscordClient(signals, stt, enabled=False)
|
2024-01-06 01:12:29 -05:00
|
|
|
# Create Twitch bot
|
2024-06-11 23:16:21 -07:00
|
|
|
modules['twitch'] = TwitchClient(signals, enabled=False)
|
2024-04-13 20:16:54 -04:00
|
|
|
# Create audio player
|
2024-05-04 21:45:03 -04:00
|
|
|
modules['audio_player'] = AudioPlayer(signals, enabled=True)
|
2024-05-08 20:26:17 -04:00
|
|
|
# Create Vtube Studio plugin
|
2024-05-22 23:00:36 -07:00
|
|
|
modules['vtube_studio'] = VtubeStudio(signals, enabled=True)
|
2024-06-11 23:16:21 -07:00
|
|
|
# Create Multimodal module
|
|
|
|
modules['multimodal'] = MultiModal(signals, enabled=False)
|
2024-05-20 23:35:35 -07:00
|
|
|
# Create Custom Prompt module
|
|
|
|
modules['custom_prompt'] = CustomPrompt(signals, enabled=True)
|
|
|
|
# Create Memory module
|
|
|
|
modules['memory'] = Memory(signals, enabled=True)
|
2024-01-05 21:56:50 -05:00
|
|
|
|
2024-03-09 22:25:07 -05:00
|
|
|
# Create Socket.io server
|
2024-06-11 23:16:21 -07:00
|
|
|
# The specific llmWrapper it gets doesn't matter since state is shared between all llmWrappers
|
|
|
|
sio = SocketIOServer(signals, stt, tts, llms["text"], prompter, modules=modules)
|
2024-03-09 22:25:07 -05:00
|
|
|
|
|
|
|
# Create threads (As daemons, so they exit when the main thread exits)
|
2024-03-10 01:09:26 -05:00
|
|
|
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
|
2024-03-10 01:09:26 -05:00
|
|
|
sio_thread.start()
|
|
|
|
prompter_thread.start()
|
|
|
|
stt_thread.start()
|
2024-04-09 11:15:03 -04:00
|
|
|
|
|
|
|
# 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()
|
2024-03-09 22:25:07 -05:00
|
|
|
|
2024-03-17 19:18:30 -04:00
|
|
|
while not signals.terminate:
|
|
|
|
time.sleep(0.1)
|
|
|
|
print("TERMINATING ======================")
|
|
|
|
|
|
|
|
# Wait for child threads to exit before exiting main thread
|
2024-05-08 20:26:17 -04:00
|
|
|
|
|
|
|
# Wait for all modules to finish
|
|
|
|
for module_thread in module_threads.values():
|
|
|
|
module_thread.join()
|
|
|
|
|
2024-03-17 19:18:30 -04:00
|
|
|
sio_thread.join()
|
|
|
|
print("SIO EXITED ======================")
|
|
|
|
prompter_thread.join()
|
|
|
|
print("PROMPTER EXITED ======================")
|
2024-04-09 11:15:03 -04:00
|
|
|
# stt_thread.join()
|
|
|
|
# print("STT EXITED ======================")
|
|
|
|
|
2024-05-08 20:26:17 -04:00
|
|
|
print("All threads exited, shutdown complete")
|
2024-03-17 19:18:30 -04:00
|
|
|
sys.exit(0)
|
2024-03-10 01:09:26 -05:00
|
|
|
|
|
|
|
if __name__ == '__main__':
|
|
|
|
asyncio.run(main())
|