import copy import gc from subprocess import Popen from os import makedirs as os_makedirs from os import path as os_path from datetime import datetime from time import sleep from queue import Queue from threading import Thread from requests import get as requests_get from typing import Callable from packaging.version import parse from flashtext import KeywordProcessor from pykakasi import kakasi from device_manager import device_manager from config import config from models.translation.translation_translator import Translator from models.osc.osc import OSCHandler from models.transcription.transcription_recorder import SelectedMicEnergyAndAudioRecorder, SelectedSpeakerEnergyAndAudioRecorder from models.transcription.transcription_recorder import SelectedMicEnergyRecorder, SelectedSpeakerEnergyRecorder from models.transcription.transcription_transcriber import AudioTranscriber from models.translation.translation_languages import translation_lang from models.transcription.transcription_languages import transcription_lang from models.translation.translation_utils import checkCTranslate2Weight, downloadCTranslate2Weight, downloadCTranslate2Tokenizer from models.transcription.transcription_whisper import checkWhisperWeight, downloadWhisperWeight from models.overlay.overlay import Overlay from models.overlay.overlay_image import OverlayImage from models.watchdog.watchdog import Watchdog from models.websocket.websocket_server import WebSocketServer from utils import errorLogging, setupLogger class threadFnc(Thread): def __init__(self, fnc, end_fnc=None, daemon=True, *args, **kwargs): super(threadFnc, self).__init__(daemon=daemon, target=fnc, *args, **kwargs) self.fnc = fnc self.end_fnc = end_fnc self.loop = True self._pause = False def stop(self): self.loop = False def pause(self): self._pause = True def resume(self): self._pause = False def run(self): while self.loop: self.fnc(*self._args, **self._kwargs) while self._pause: sleep(0.1) if callable(self.end_fnc): self.end_fnc() return class Model: _instance = None def __new__(cls): if cls._instance is None: cls._instance = super(Model, cls).__new__(cls) cls._instance.init() return cls._instance def init(self): self.logger = None self.th_check_device = None self.mic_print_transcript = None self.mic_audio_recorder = None self.mic_transcriber = None self.mic_energy_recorder = None self.mic_energy_plot_progressbar = None self.speaker_print_transcript = None self.speaker_audio_recorder = None self.speaker_transcriber = None self.speaker_energy_recorder = None self.speaker_energy_plot_progressbar = None self.previous_send_message = "" self.previous_receive_message = "" self.translator = Translator() self.keyword_processor = KeywordProcessor() overlay_small_log_settings = copy.deepcopy(config.OVERLAY_SMALL_LOG_SETTINGS) overlay_large_log_settings = copy.deepcopy(config.OVERLAY_LARGE_LOG_SETTINGS) overlay_large_log_settings["ui_scaling"] = overlay_large_log_settings["ui_scaling"] * 0.25 overlay_settings = { "small": overlay_small_log_settings, "large": overlay_large_log_settings, } self.overlay = Overlay(overlay_settings) self.overlay_image = OverlayImage() self.mic_audio_queue = None self.mic_mute_status = None self.kks = kakasi() self.watchdog = Watchdog(config.WATCHDOG_TIMEOUT, config.WATCHDOG_INTERVAL) self.osc_handler = OSCHandler(config.OSC_IP_ADDRESS, config.OSC_PORT) self.websocket_server = WebSocketServer(host="0.0.0.0", port=8765)