import json from typing import Callable, Union from time import sleep from subprocess import Popen from threading import Thread from config import config from model import model # from view import view from utils import getKeyByValue, isUniqueStrings, strPctToInt import argparse # Common def callbackUpdateSoftware(func=None): print(json.dumps({"log": "callbackUpdateSoftware"}), flush=True) setMainWindowGeometry() model.updateSoftware(restart=True, func=func) def callbackRestartSoftware(): print(json.dumps({"log": "callbackRestartSoftware"}), flush=True) setMainWindowGeometry() model.reStartSoftware() def callbackFilepathLogs(): print(json.dumps({"log": "callbackFilepathLogs"}), flush=True) Popen(['explorer', config.PATH_LOGS.replace('/', '\\')], shell=True) return "Success", 200 def callbackFilepathConfigFile(): print(json.dumps({"log": "callbackFilepathConfigFile"}), flush=True) Popen(['explorer', config.PATH_LOCAL.replace('/', '\\')], shell=True) return "Success", 200 def callbackQuitVrct(): print(json.dumps({"log": "callbackQuitVrct"}), flush=True) setMainWindowGeometry() def callbackEnableEasterEgg(): print(json.dumps({"log": "callbackEnableEasterEgg"}), flush=True) config.IS_EASTER_EGG_ENABLED = True config.OVERLAY_UI_TYPE = "sakura" # view.printToTextbox_enableEasterEgg() def setMainWindowGeometry(): # PRE_SCALING_INT = strPctToInt(view.getPreUiScaling()) # NEW_SCALING_INT = strPctToInt(config.UI_SCALING) # MULTIPLY_FLOAT = (NEW_SCALING_INT / PRE_SCALING_INT) # main_window_geometry = view.getMainWindowGeometry(return_int=True) # main_window_geometry["width"] = str(int(main_window_geometry["width"] * MULTIPLY_FLOAT)) # main_window_geometry["height"] = str(int(main_window_geometry["height"] * MULTIPLY_FLOAT)) # main_window_geometry["x_pos"] = str(main_window_geometry["x_pos"]) # main_window_geometry["y_pos"] = str(main_window_geometry["y_pos"]) # config.MAIN_WINDOW_GEOMETRY = main_window_geometry pass def messageFormatter(format_type:str, translation, message): if format_type == "RECEIVED": FORMAT_WITH_T = config.RECEIVED_MESSAGE_FORMAT_WITH_T FORMAT = config.RECEIVED_MESSAGE_FORMAT elif format_type == "SEND": FORMAT_WITH_T = config.SEND_MESSAGE_FORMAT_WITH_T FORMAT = config.SEND_MESSAGE_FORMAT else: raise ValueError("format_type is not found", format_type) if len(translation) > 0: osc_message = FORMAT_WITH_T.replace("[message]", message) osc_message = osc_message.replace("[translation]", translation) else: osc_message = FORMAT.replace("[message]", message) return osc_message def changeToCTranslate2Process(): if config.CHOICE_INPUT_TRANSLATOR != "CTranslate2" or config.CHOICE_OUTPUT_TRANSLATOR != "CTranslate2": config.CHOICE_INPUT_TRANSLATOR = "CTranslate2" config.CHOICE_OUTPUT_TRANSLATOR = "CTranslate2" updateTranslationEngineAndEngineList() # view.printToTextbox_TranslationEngineLimitError() # func transcription send message class MicMessage: def __init__(self, action:Callable[[dict], None]) -> None: self.action = action def send(self, message: Union[str, bool]) -> None: if isinstance(message, bool) and message is False: self.action({"status":"error", "message":"No mic device detected."}) elif isinstance(message, str) and len(message) > 0: addSentMessageLog(message) translation = "" if model.checkKeywords(message): self.action("mic", {"status":"error", "message":f"Detected by word filter:{message}"}) return elif model.detectRepeatSendMessage(message): return elif config.ENABLE_TRANSLATION is False: pass else: translation, success = model.getInputTranslate(message) if success is False: changeToCTranslate2Process() if config.ENABLE_TRANSCRIPTION_SEND is True: if config.ENABLE_SEND_MESSAGE_TO_VRC is True: if config.ENABLE_SEND_ONLY_TRANSLATED_MESSAGES is True: if config.ENABLE_TRANSLATION is False: osc_message = messageFormatter("SEND", "", message) else: osc_message = messageFormatter("SEND", "", translation) else: osc_message = messageFormatter("SEND", translation, message) model.oscSendMessage(osc_message) self.action("mic", {"status":"success", "message":message, "translation":translation}) if config.ENABLE_LOGGER is True: if len(translation) > 0: translation = f" ({translation})" model.logger.info(f"[SENT] {message}{translation}") # if config.ENABLE_OVERLAY_SMALL_LOG is True: # overlay_image = model.createOverlayImageShort(message, translation) # model.updateOverlay(overlay_image) # overlay_image = model.createOverlayImageLong("send", message, translation) # model.updateOverlay(overlay_image) def startTranscriptionSendMessage(action:Callable[[dict], None]) -> None: mic_message = MicMessage(action) model.startMicTranscript(mic_message.send) def stopTranscriptionSendMessage(action:Callable[[dict], None]) -> None: model.stopMicTranscript() action("mic", {"status":"success", "message":"Stopped sending messages"}) def startThreadingTranscriptionSendMessage(action:Callable[[dict], None]) -> None: th_startTranscriptionSendMessage = Thread(target=startTranscriptionSendMessage, args=(action,)) th_startTranscriptionSendMessage.daemon = True th_startTranscriptionSendMessage.start() def stopThreadingTranscriptionSendMessage(action:Callable[[dict], None]) -> None: th_stopTranscriptionSendMessage = Thread(target=stopTranscriptionSendMessage, args=(action,)) th_stopTranscriptionSendMessage.daemon = True th_stopTranscriptionSendMessage.start() def startTranscriptionSendMessageOnCloseConfigWindow(action:Callable[[dict], None]) -> None: mic_message = MicMessage(action) model.startMicTranscript(mic_message.send) def stopTranscriptionSendMessageOnOpenConfigWindow(): model.stopMicTranscript() def startThreadingTranscriptionSendMessageOnCloseConfigWindow(action:Callable[[dict], None]) -> None: th_startTranscriptionSendMessage = Thread(target=startTranscriptionSendMessageOnCloseConfigWindow, args=(action,)) th_startTranscriptionSendMessage.daemon = True th_startTranscriptionSendMessage.start() def stopThreadingTranscriptionSendMessageOnOpenConfigWindow() -> None: th_stopTranscriptionSendMessage = Thread(target=stopTranscriptionSendMessageOnOpenConfigWindow) th_stopTranscriptionSendMessage.daemon = True th_stopTranscriptionSendMessage.start() # func transcription receive message class SpeakerMessage: def __init__(self, action:Callable[[dict], None]) -> None: self.action = action def receive(self, message): if isinstance(message, bool) and message is False: self.action("speaker", {"status":"error", "message":"No mic device detected."}) elif isinstance(message, str) and len(message) > 0: translation = "" if model.detectRepeatReceiveMessage(message): return elif config.ENABLE_TRANSLATION is False: pass else: translation, success = model.getOutputTranslate(message) if success is False: changeToCTranslate2Process() if config.ENABLE_TRANSCRIPTION_RECEIVE is True: if config.ENABLE_NOTICE_XSOVERLAY is True: xsoverlay_message = messageFormatter("RECEIVED", translation, message) model.notificationXSOverlay(xsoverlay_message) if config.ENABLE_OVERLAY_SMALL_LOG is True: if model.overlay.initialized is True: overlay_image = model.createOverlayImageShort(message, translation) model.updateOverlay(overlay_image) # overlay_image = model.createOverlayImageLong("receive", message, translation) # model.updateOverlay(overlay_image) # ------------Speaker2Chatbox------------ if config.ENABLE_SPEAKER2CHATBOX is True: # send OSC message if config.ENABLE_SEND_RECEIVED_MESSAGE_TO_VRC is True: osc_message = messageFormatter("RECEIVED", translation, message) model.oscSendMessage(osc_message) # ------------Speaker2Chatbox------------ # update textbox message log (Received) self.action("speaker",{"status":"success", "message":message, "translation":translation}) if config.ENABLE_LOGGER is True: if len(translation) > 0: translation = f" ({translation})" model.logger.info(f"[RECEIVED] {message}{translation}") def startTranscriptionReceiveMessage(action:Callable[[dict], None]) -> None: speaker_message = SpeakerMessage(action) model.startSpeakerTranscript(speaker_message.receive) def stopTranscriptionReceiveMessage(action:Callable[[dict], None]) -> None: model.stopSpeakerTranscript() action({"status":"success", "message":"Stopped receiving messages"}) def startThreadingTranscriptionReceiveMessage(action:Callable[[dict], None]) -> None: th_startTranscriptionReceiveMessage = Thread(target=startTranscriptionReceiveMessage, args=(action,)) th_startTranscriptionReceiveMessage.daemon = True th_startTranscriptionReceiveMessage.start() def stopThreadingTranscriptionReceiveMessage(action:Callable[[dict], None]) -> None: th_stopTranscriptionReceiveMessage = Thread(target=stopTranscriptionReceiveMessage, args=(action,)) th_stopTranscriptionReceiveMessage.daemon = True th_stopTranscriptionReceiveMessage.start() def startTranscriptionReceiveMessageOnCloseConfigWindow(action:Callable[[dict], None]) -> None: speaker_message = SpeakerMessage(action) model.startSpeakerTranscript(speaker_message.receive) def stopTranscriptionReceiveMessageOnOpenConfigWindow(): model.stopSpeakerTranscript() def startThreadingTranscriptionReceiveMessageOnCloseConfigWindow(action:Callable[[dict], None]) -> None: th_startTranscriptionReceiveMessage = Thread(target=startTranscriptionReceiveMessageOnCloseConfigWindow, args=(action,)) th_startTranscriptionReceiveMessage.daemon = True th_startTranscriptionReceiveMessage.start() def stopThreadingTranscriptionReceiveMessageOnOpenConfigWindow(): th_stopTranscriptionReceiveMessage = Thread(target=stopTranscriptionReceiveMessageOnOpenConfigWindow) th_stopTranscriptionReceiveMessage.daemon = True th_stopTranscriptionReceiveMessage.start() # func message box def sendChatMessage(message): if len(message) > 0: addSentMessageLog(message) translation = "" if config.ENABLE_TRANSLATION is False: pass else: translation, success = model.getInputTranslate(message) if success is False: changeToCTranslate2Process() # send OSC message if config.ENABLE_SEND_MESSAGE_TO_VRC is True: if config.ENABLE_SEND_ONLY_TRANSLATED_MESSAGES is True: if config.ENABLE_TRANSLATION is False: osc_message = messageFormatter("SEND", "", message) else: osc_message = messageFormatter("SEND", "", translation) else: osc_message = messageFormatter("SEND", translation, message) model.oscSendMessage(osc_message) # if config.ENABLE_OVERLAY_SMALL_LOG is True: # overlay_image = model.createOverlayImageShort(message, translation) # model.updateOverlay(overlay_image) # overlay_image = model.createOverlayImageLong("send", message, translation) # model.updateOverlay(overlay_image) # update textbox message log (Sent) # view.printToTextbox_SentMessage(message, translation) if config.ENABLE_LOGGER is True: if len(translation) > 0: translation = f" ({translation})" model.logger.info(f"[SENT] {message}{translation}") # delete message in entry message box if config.ENABLE_AUTO_CLEAR_MESSAGE_BOX is True: # view.clearMessageBox() pass def messageBoxPressKeyEnter(): # model.oscStopSendTyping() # message = view.getTextFromMessageBox() # sendChatMessage(message) pass def messageBoxPressKeyAny(e): if config.ENABLE_SEND_MESSAGE_TO_VRC is True: model.oscStartSendTyping() else: model.oscStopSendTyping() def messageBoxFocusIn(e): # view.foregroundOffIfForegroundEnabled() pass def messageBoxFocusOut(e): # view.foregroundOnIfForegroundEnabled() if config.ENABLE_SEND_MESSAGE_TO_VRC is True: model.oscStopSendTyping() def addSentMessageLog(sent_message): config.SENT_MESSAGES_LOG.append(sent_message) config.CURRENT_SENT_MESSAGES_LOG_INDEX = len(config.SENT_MESSAGES_LOG) def updateMessageBox(index_offset): if len(config.SENT_MESSAGES_LOG) == 0: return try: new_index = config.CURRENT_SENT_MESSAGES_LOG_INDEX + index_offset target_message_text = config.SENT_MESSAGES_LOG[new_index] # view.replaceMessageBox(target_message_text) config.CURRENT_SENT_MESSAGES_LOG_INDEX = new_index except IndexError: pass def messageBoxUpKeyPress(): if config.CURRENT_SENT_MESSAGES_LOG_INDEX > 0: updateMessageBox(-1) def messageBoxDownKeyPress(): if config.CURRENT_SENT_MESSAGES_LOG_INDEX < len(config.SENT_MESSAGES_LOG) - 1: updateMessageBox(1) def updateTranslationEngineAndEngineList(): engine = config.CHOICE_INPUT_TRANSLATOR engines = model.findTranslationEngines(config.SOURCE_LANGUAGE, config.TARGET_LANGUAGE) if engine not in engines: engine = engines[0] config.CHOICE_INPUT_TRANSLATOR = engine config.CHOICE_OUTPUT_TRANSLATOR = engine def initSetTranslateEngine(): engine = config.SELECTED_TAB_YOUR_TRANSLATOR_ENGINES[config.SELECTED_TAB_NO] config.CHOICE_INPUT_TRANSLATOR = engine engine = config.SELECTED_TAB_TARGET_TRANSLATOR_ENGINES[config.SELECTED_TAB_NO] config.CHOICE_OUTPUT_TRANSLATOR = engine def initSetLanguageAndCountry(): select = config.SELECTED_TAB_YOUR_LANGUAGES[config.SELECTED_TAB_NO] config.SOURCE_LANGUAGE = select["language"] config.SOURCE_COUNTRY = select["country"] select = config.SELECTED_TAB_TARGET_LANGUAGES[config.SELECTED_TAB_NO] config.TARGET_LANGUAGE = select["language"] config.TARGET_COUNTRY = select["country"] def setYourTranslateEngine(select): engines = config.SELECTED_TAB_YOUR_TRANSLATOR_ENGINES engines[config.SELECTED_TAB_NO] = select config.SELECTED_TAB_YOUR_TRANSLATOR_ENGINES = engines config.CHOICE_INPUT_TRANSLATOR = select def setTargetTranslateEngine(select): engines = config.SELECTED_TAB_TARGET_TRANSLATOR_ENGINES engines[config.SELECTED_TAB_NO] = select config.SELECTED_TAB_TARGET_TRANSLATOR_ENGINES = engines config.CHOICE_OUTPUT_TRANSLATOR = select def setYourLanguageAndCountry(select:dict, *args, **kwargs) -> dict: print(json.dumps({"log": "setYourLanguageAndCountry", "data":select}), flush=True) languages = config.SELECTED_TAB_YOUR_LANGUAGES languages[config.SELECTED_TAB_NO] = select config.SELECTED_TAB_YOUR_LANGUAGES = languages config.SOURCE_LANGUAGE = select["language"] config.SOURCE_COUNTRY = select["country"] updateTranslationEngineAndEngineList() return {"status":"success", "data":{ "your":{ "language":config.SOURCE_LANGUAGE, "country":config.SOURCE_COUNTRY } } } def setTargetLanguageAndCountry(select:dict, *args, **kwargs) -> dict: print(json.dumps({"log": "setTargetLanguageAndCountry", "data":select}), flush=True) languages = config.SELECTED_TAB_TARGET_LANGUAGES languages[config.SELECTED_TAB_NO] = select config.SELECTED_TAB_TARGET_LANGUAGES = languages config.TARGET_LANGUAGE = select["language"] config.TARGET_COUNTRY = select["country"] updateTranslationEngineAndEngineList() return {"status":"success", "data":{ "target":{ "language":config.TARGET_LANGUAGE, "country":config.TARGET_COUNTRY }, } } def swapYourLanguageAndTargetLanguage(*args, **kwargs) -> dict: print(json.dumps({"log": "swapYourLanguageAndTargetLanguage"}), flush=True) your_language = config.SELECTED_TAB_YOUR_LANGUAGES[config.SELECTED_TAB_NO] target_language = config.SELECTED_TAB_TARGET_LANGUAGES[config.SELECTED_TAB_NO] setYourLanguageAndCountry(target_language) setTargetLanguageAndCountry(your_language) return {"status":"success", "data":{ "your":{"language":config.SOURCE_LANGUAGE, "country":config.SOURCE_COUNTRY, }, "target":{ "language":config.TARGET_LANGUAGE, "country":config.TARGET_COUNTRY, }, }, } def callbackSelectedLanguagePresetTab(selected_tab_no:str, *args, **kwargs) -> dict: print(json.dumps({"log": "callbackSelectedLanguagePresetTab", "data":selected_tab_no}), flush=True) config.SELECTED_TAB_NO = selected_tab_no engines = config.SELECTED_TAB_YOUR_TRANSLATOR_ENGINES engine = engines[config.SELECTED_TAB_NO] config.CHOICE_INPUT_TRANSLATOR = engine engines = config.SELECTED_TAB_TARGET_TRANSLATOR_ENGINES engine = engines[config.SELECTED_TAB_NO] config.CHOICE_OUTPUT_TRANSLATOR = engine languages = config.SELECTED_TAB_YOUR_LANGUAGES select = languages[config.SELECTED_TAB_NO] config.SOURCE_LANGUAGE = select["language"] config.SOURCE_COUNTRY = select["country"] languages = config.SELECTED_TAB_TARGET_LANGUAGES select = languages[config.SELECTED_TAB_NO] config.TARGET_LANGUAGE = select["language"] config.TARGET_COUNTRY = select["country"] updateTranslationEngineAndEngineList() return {"status":"success", "data":config.SELECTED_TAB_NO} def callbackSelectedTranslationEngine(selected_translation_engine:str, *args, **kwargs) -> dict: print(json.dumps({"log": "callbackSelectedTranslationEngine", "data":selected_translation_engine}), flush=True) setYourTranslateEngine(selected_translation_engine) setTargetTranslateEngine(selected_translation_engine) return {"status":"success", "data":selected_translation_engine} # command func def callbackEnableTranslation(*args, **kwargs) -> dict: print(json.dumps({"log": "callbackEnableTranslation"}), flush=True) config.ENABLE_TRANSLATION = True if model.isLoadedCTranslate2Model() is False: model.changeTranslatorCTranslate2Model() return {"status":"success", "data":config.ENABLE_TRANSLATION} def callbackDisableTranslation(*args, **kwargs) -> dict: print(json.dumps({"log": "callbackDisableTranslation"}), flush=True) config.ENABLE_TRANSLATION = False return {"status":"success", "data":config.ENABLE_TRANSLATION} def callbackEnableTranscriptionSend(data, action, *args, **kwargs) -> dict: print(json.dumps({"log": "callbackEnableTranscriptionSend"}), flush=True) config.ENABLE_TRANSCRIPTION_SEND = True startThreadingTranscriptionSendMessage(action) return {"status":"success", "data":config.ENABLE_TRANSCRIPTION_SEND} def callbackDisableTranscriptionSend(data, action, *args, **kwargs) -> dict: print(json.dumps({"log": "callbackDisableTranscriptionSend"}), flush=True) config.ENABLE_TRANSCRIPTION_SEND = False stopThreadingTranscriptionSendMessage(action) return {"status":"success", "data":config.ENABLE_TRANSCRIPTION_SEND} def callbackEnableTranscriptionReceive(data, action, *args, **kwargs) -> dict: print(json.dumps({"log": "callbackEnableTranscriptionReceive"}), flush=True) config.ENABLE_TRANSCRIPTION_RECEIVE = True startThreadingTranscriptionReceiveMessage(action) if config.ENABLE_OVERLAY_SMALL_LOG is True: if model.overlay.initialized is False and model.overlay.checkSteamvrRunning() is True: model.startOverlay() return {"status":"success", "data":config.ENABLE_TRANSCRIPTION_RECEIVE} def callbackDisableTranscriptionReceive(data, action, *args, **kwargs) -> dict: print(json.dumps({"log": "callbackDisableTranscriptionReceive"}), flush=True) config.ENABLE_TRANSCRIPTION_RECEIVE = False stopThreadingTranscriptionReceiveMessage(action) return {"status":"success", "data":config.ENABLE_TRANSCRIPTION_RECEIVE} def callbackEnableForeground(*args, **kwargs) -> dict: print(json.dumps({"log": "callbackEnableForeground"}), flush=True) config.ENABLE_FOREGROUND = True return {"status":"success", "data":config.ENABLE_FOREGROUND} def callbackDisableForeground(*args, **kwargs) -> dict: print(json.dumps({"log": "callbackDisableForeground"}), flush=True) config.ENABLE_FOREGROUND = False return {"status":"success", "data":config.ENABLE_FOREGROUND} def callbackEnableMainWindowSidebarCompactMode(*args, **kwargs) -> dict: print(json.dumps({"log": "callbackEnableMainWindowSidebarCompactMode"}), flush=True) config.IS_MAIN_WINDOW_SIDEBAR_COMPACT_MODE = True return {"status":"success", "data":config.IS_MAIN_WINDOW_SIDEBAR_COMPACT_MODE} def callbackDisableMainWindowSidebarCompactMode(*args, **kwargs) -> dict: print(json.dumps({"log": "callbackDisableMainWindowSidebarCompactMode"}), flush=True) config.IS_MAIN_WINDOW_SIDEBAR_COMPACT_MODE = False return {"status":"success", "data":config.IS_MAIN_WINDOW_SIDEBAR_COMPACT_MODE} # Config Window def callbackOpenConfigWindow(*args, **kwargs) -> dict: print(json.dumps({"log": "callbackOpenConfigWindow"}), flush=True) if config.ENABLE_TRANSCRIPTION_SEND is True: stopThreadingTranscriptionSendMessageOnOpenConfigWindow() if config.ENABLE_TRANSCRIPTION_RECEIVE is True: stopThreadingTranscriptionReceiveMessageOnOpenConfigWindow() return {"status":"success"} def callbackCloseConfigWindow(data, action, *args, **kwargs) -> dict: print(json.dumps({"log": "callbackCloseConfigWindow"}), flush=True) model.stopCheckMicEnergy() model.stopCheckSpeakerEnergy() if config.ENABLE_TRANSCRIPTION_SEND is True: startThreadingTranscriptionSendMessageOnCloseConfigWindow(action) if config.ENABLE_TRANSCRIPTION_RECEIVE is True: sleep(2) if config.ENABLE_TRANSCRIPTION_RECEIVE is True: startThreadingTranscriptionReceiveMessageOnCloseConfigWindow(action) return {"status":"success"} # Compact Mode Switch def callbackEnableConfigWindowCompactMode(*args, **kwargs) -> dict: print(json.dumps({"log": "callbackEnableConfigWindowCompactMode"}), flush=True) config.IS_CONFIG_WINDOW_COMPACT_MODE = True model.stopCheckMicEnergy() model.stopCheckSpeakerEnergy() return {"status":"success", "data":config.IS_CONFIG_WINDOW_COMPACT_MODE} def callbackDisableConfigWindowCompactMode(*args, **kwargs) -> dict: print(json.dumps({"log": "callbackDisableConfigWindowCompactMode"}), flush=True) config.IS_CONFIG_WINDOW_COMPACT_MODE = False model.stopCheckMicEnergy() model.stopCheckSpeakerEnergy() return {"status":"success", "data":config.IS_CONFIG_WINDOW_COMPACT_MODE} # Appearance Tab def callbackSetTransparency(data, *args, **kwargs) -> dict: print(json.dumps({"log": "callbackSetTransparency", "data":data}), flush=True) config.TRANSPARENCY = int(data) return {"status":"success", "data":config.TRANSPARENCY} def callbackSetAppearance(data, *args, **kwargs) -> dict: print(json.dumps({"log": "callbackSetAppearance", "data":data}), flush=True) config.APPEARANCE_THEME = data return {"status":"success", "data":config.APPEARANCE_THEME} def callbackSetUiScaling(data, *args, **kwargs) -> dict: print(json.dumps({"log": "callbackSetUiScaling", "data":data}), flush=True) config.UI_SCALING = data return {"status":"success", "data":config.UI_SCALING} def callbackSetTextboxUiScaling(data, *args, **kwargs) -> dict: print(json.dumps({"log": "callbackSetTextboxUiScaling", "data":data}), flush=True) config.TEXTBOX_UI_SCALING = int(data) return {"status":"success", "data":config.TEXTBOX_UI_SCALING} def callbackSetMessageBoxRatio(data, *args, **kwargs) -> dict: print(json.dumps({"log": "callbackSetMessageBoxRatio", "data":data}), flush=True) config.MESSAGE_BOX_RATIO = int(data) return {"status":"success", "data":config.MESSAGE_BOX_RATIO} def callbackSetFontFamily(data, *args, **kwargs) -> dict: print(json.dumps({"log": "callbackSetFontFamily", "data":data}), flush=True) config.FONT_FAMILY = data return {"status":"success", "data":config.FONT_FAMILY} def callbackSetUiLanguage(data, *args, **kwargs) -> dict: print(json.dumps({"log": "callbackSetUiLanguage", "data":data}), flush=True) data = getKeyByValue(config.SELECTABLE_UI_LANGUAGES_DICT, data) config.UI_LANGUAGE = data return {"status":"success", "data":config.UI_LANGUAGE} def callbackSetEnableRestoreMainWindowGeometry(data, *args, **kwargs) -> dict: print(json.dumps({"log": "callbackSetEnableRestoreMainWindowGeometry", "data":data}), flush=True) config.ENABLE_RESTORE_MAIN_WINDOW_GEOMETRY = data return {"status":"success", "data":config.ENABLE_RESTORE_MAIN_WINDOW_GEOMETRY} # Translation Tab def callbackSetUseTranslationFeature(data, *args, **kwargs) -> dict: print(json.dumps({"log": "callbackSetUseTranslationFeature", "data":data}), flush=True) config.USE_TRANSLATION_FEATURE = data if config.USE_TRANSLATION_FEATURE is True: if model.checkCTranslatorCTranslate2ModelWeight(): config.IS_RESET_BUTTON_DISPLAYED_FOR_TRANSLATION = False def callback(): model.changeTranslatorCTranslate2Model() th_callback = Thread(target=callback) th_callback.daemon = True th_callback.start() else: config.IS_RESET_BUTTON_DISPLAYED_FOR_TRANSLATION = True else: config.IS_RESET_BUTTON_DISPLAYED_FOR_TRANSLATION = False return {"status":"success", "data":{ "feature":config.USE_TRANSLATION_FEATURE, "reset":config.IS_RESET_BUTTON_DISPLAYED_FOR_TRANSLATION, }, } def callbackSetCtranslate2WeightType(data, *args, **kwargs) -> dict: print(json.dumps({"log": "callbackSetCtranslate2WeightType", "data":data}), flush=True) config.CTRANSLATE2_WEIGHT_TYPE = str(data) if model.checkCTranslatorCTranslate2ModelWeight(): config.IS_RESET_BUTTON_DISPLAYED_FOR_TRANSLATION = False def callback(): model.changeTranslatorCTranslate2Model() th_callback = Thread(target=callback) th_callback.daemon = True th_callback.start() else: config.IS_RESET_BUTTON_DISPLAYED_FOR_TRANSLATION = True return {"status":"success", "data":{ "feature":config.CTRANSLATE2_WEIGHT_TYPE, "reset":config.IS_RESET_BUTTON_DISPLAYED_FOR_TRANSLATION, }, } def callbackSetDeeplAuthKey(data, *args, **kwargs) -> dict: print(json.dumps({"log": "callbackSetDeeplAuthKey", "data":data}), flush=True) status = "error" if len(data) == 36 or len(data) == 39: result = model.authenticationTranslatorDeepLAuthKey(auth_key=data) if result is True: key = data status = "success" else: key = None auth_keys = config.AUTH_KEYS auth_keys["DeepL_API"] = key config.AUTH_KEYS = auth_keys updateTranslationEngineAndEngineList() return {"status":status, "data":config.AUTH_KEYS["DeepL_API"]} def callbackClearDeeplAuthKey(*args, **kwargs) -> dict: print(json.dumps({"log": "callbackClearDeeplAuthKey"}), flush=True) auth_keys = config.AUTH_KEYS auth_keys["DeepL_API"] = None config.AUTH_KEYS = auth_keys updateTranslationEngineAndEngineList() return {"status":"success", "data":config.AUTH_KEYS["DeepL_API"]} # Transcription Tab # Transcription (Mic) def callbackSetMicHost(data, *args, **kwargs) -> dict: print(json.dumps({"log": "callbackSetMicHost", "data":data}), flush=True) config.CHOICE_MIC_HOST = data config.CHOICE_MIC_DEVICE = model.getInputDefaultDevice() model.stopCheckMicEnergy() return {"status":"success", "data":{ "host":config.CHOICE_MIC_HOST, "device":config.CHOICE_MIC_DEVICE, }, } def callbackSetMicDevice(data, *args, **kwargs) -> dict: print(json.dumps({"log": "callbackSetMicDevice", "data":data}), flush=True) config.CHOICE_MIC_DEVICE = data model.stopCheckMicEnergy() return {"status":"success", "data":{ "host":config.CHOICE_MIC_HOST, }, } def callbackSetMicEnergyThreshold(data, *args, **kwargs) -> dict: print(json.dumps({"log": "callbackSetMicEnergyThreshold", "data":data}), flush=True) status = "error" data = int(data) if 0 <= data <= config.MAX_MIC_ENERGY_THRESHOLD: config.INPUT_MIC_ENERGY_THRESHOLD = data status = "success" return {"status": status, "data": config.INPUT_MIC_ENERGY_THRESHOLD} def callbackSetMicDynamicEnergyThreshold(data, *args, **kwargs) -> dict: print(json.dumps({"log": "callbackSetMicDynamicEnergyThreshold", "data":data}), flush=True) config.INPUT_MIC_DYNAMIC_ENERGY_THRESHOLD = data return {"status":"success", "data":config.INPUT_MIC_DYNAMIC_ENERGY_THRESHOLD} class ProgressBarEnergy: def __init__(self, action): self.action = action def set(self, energy) -> None: self.action("energy", {"status":"success", "energy":energy}) def callbackEnableCheckMicThreshold(data, action, *args, **kwargs) -> dict: print(json.dumps({"log": "callbackEnableCheckMicThreshold"}), flush=True) progressbar_mic_energy = ProgressBarEnergy(action) model.startCheckMicEnergy(progressbar_mic_energy.set) return {"status":"success"} def callbackDisableCheckMicThreshold(*args, **kwargs) -> dict: print(json.dumps({"log": "callbackDisableCheckMicThreshold"}), flush=True) model.stopCheckMicEnergy() return {"status":"success"} def callbackSetMicRecordTimeout(data, *args, **kwargs) -> dict: print(json.dumps({"log": "callbackSetMicRecordTimeout", "data":data}), flush=True) try: data = int(data) if 0 <= data <= config.INPUT_MIC_PHRASE_TIMEOUT: config.INPUT_MIC_RECORD_TIMEOUT = data else: raise ValueError() except Exception: response = {"status":"error", "message":"Error Mic Record Timeout"} else: response = {"status":"success", "data":config.INPUT_MIC_RECORD_TIMEOUT} return response def callbackSetMicPhraseTimeout(data, *args, **kwargs) -> dict: print(json.dumps({"log": "callbackSetMicPhraseTimeout", "data":data}), flush=True) try: data = int(data) if data >= config.INPUT_MIC_RECORD_TIMEOUT: config.INPUT_MIC_PHRASE_TIMEOUT = data else: raise ValueError() except Exception: response = {"status":"error", "message":"Error Mic Phrase Timeout"} else: response = {"status":"success", "data":config.INPUT_MIC_PHRASE_TIMEOUT} return response def callbackSetMicMaxPhrases(data, *args, **kwargs) -> dict: print(json.dumps({"log": "callbackSetMicMaxPhrases", "data":data}), flush=True) try: data = int(data) if 0 <= data: config.INPUT_MIC_MAX_PHRASES = data else: raise ValueError() except Exception: response = {"status":"error", "message":"Error Mic Max Phrases"} else: response = {"status":"success", "data":config.INPUT_MIC_MAX_PHRASES} return response def callbackSetMicWordFilter(data, *args, **kwargs) -> dict: print(json.dumps({"log": "callbackSetMicWordFilter", "data":data}), flush=True) data = str(data) data = [w.strip() for w in data.split(",") if len(w.strip()) > 0] # Copy the list new_input_mic_word_filter_list = config.INPUT_MIC_WORD_FILTER new_added_value = [] for value in data: if value in new_input_mic_word_filter_list: # If the value is already in the list, do nothing. pass else: new_input_mic_word_filter_list.append(value) new_added_value.append(value) config.INPUT_MIC_WORD_FILTER = new_input_mic_word_filter_list model.resetKeywordProcessor() model.addKeywords() return {"status":"success", "data":config.INPUT_MIC_WORD_FILTER} def callbackDeleteMicWordFilter(data, *args, **kwargs) -> dict: print(json.dumps({"log": "callbackDeleteMicWordFilter", "data":data}), flush=True) try: new_input_mic_word_filter_list = config.INPUT_MIC_WORD_FILTER new_input_mic_word_filter_list.remove(str(data)) config.INPUT_MIC_WORD_FILTER = new_input_mic_word_filter_list model.resetKeywordProcessor() model.addKeywords() except Exception: print("There was no the target word in config.INPUT_MIC_WORD_FILTER") return {"status":"success", "data":config.INPUT_MIC_WORD_FILTER} # Transcription (Speaker) def callbackSetSpeakerDevice(data, *args, **kwargs) -> dict: print(json.dumps({"log": "callbackSetSpeakerDevice", "data":data}), flush=True) config.CHOICE_SPEAKER_DEVICE = data model.stopCheckSpeakerEnergy() return {"status":"success", "data":config.CHOICE_SPEAKER_DEVICE} def callbackSetSpeakerEnergyThreshold(data, *args, **kwargs) -> dict: print(json.dumps({"log": "callbackSetSpeakerEnergyThreshold", "data":data}), flush=True) try: data = int(data) if 0 <= data <= config.MAX_SPEAKER_ENERGY_THRESHOLD: # view.clearNotificationMessage() config.INPUT_SPEAKER_ENERGY_THRESHOLD = data # view.setGuiVariable_SpeakerEnergyThreshold(config.INPUT_SPEAKER_ENERGY_THRESHOLD) else: raise ValueError() except Exception: response = {"status":"error", "message":"Error Set Speaker Energy Threshold"} else: response = {"status":"success", "data":config.INPUT_SPEAKER_ENERGY_THRESHOLD} return response def callbackSetSpeakerDynamicEnergyThreshold(data, *args, **kwargs) -> dict: print(json.dumps({"log": "callbackSetSpeakerDynamicEnergyThreshold", "data":data}), flush=True) config.INPUT_SPEAKER_DYNAMIC_ENERGY_THRESHOLD = data return {"status":"success", "data":config.INPUT_SPEAKER_DYNAMIC_ENERGY_THRESHOLD} def callbackEnableCheckSpeakerThreshold(data, action, *args, **kwargs) -> dict: print(json.dumps({"log": "callbackEnableCheckSpeakerThreshold"}), flush=True) progressbar_speaker_energy = ProgressBarEnergy(action) model.startCheckSpeakerEnergy(progressbar_speaker_energy.set) return {"status":"success"} def callbackDisableCheckSpeakerThreshold(*args, **kwargs) -> dict: print(json.dumps({"log": "callbackDisableCheckSpeakerThreshold"}), flush=True) model.stopCheckSpeakerEnergy() return {"status":"success"} def callbackSetSpeakerRecordTimeout(data, *args, **kwargs) -> dict: print(json.dumps({"log": "callbackSetSpeakerRecordTimeout", "data":data}), flush=True) try: data = int(data) if 0 <= data <= config.INPUT_SPEAKER_PHRASE_TIMEOUT: config.INPUT_SPEAKER_RECORD_TIMEOUT = data else: raise ValueError() except Exception: response = {"status":"error", "message":"Error Speaker Record Timeout"} else: response = {"status":"success", "data":config.INPUT_SPEAKER_RECORD_TIMEOUT} return response def callbackSetSpeakerPhraseTimeout(data, *args, **kwargs) -> dict: print(json.dumps({"log": "callbackSetSpeakerPhraseTimeout", "data":data}), flush=True) try: data = int(data) if 0 <= data and data >= config.INPUT_SPEAKER_RECORD_TIMEOUT: config.INPUT_SPEAKER_PHRASE_TIMEOUT = data else: raise ValueError() except Exception: response = {"status":"error", "message":"Error Speaker Phrase Timeout"} else: response = {"status":"success", "data":config.INPUT_SPEAKER_PHRASE_TIMEOUT} return response def callbackSetSpeakerMaxPhrases(data, *args, **kwargs) -> dict: print(json.dumps({"log": "callbackSetSpeakerMaxPhrases", "data":data}), flush=True) try: data = int(data) if 0 <= data: config.INPUT_SPEAKER_MAX_PHRASES = data else: raise ValueError() except Exception: response = {"status":"error", "message":"Error Speaker Max Phrases"} else: response = {"status":"success", "data":config.INPUT_SPEAKER_MAX_PHRASES} return response # Transcription (Internal AI Model) def callbackSetUserWhisperFeature(data, *args, **kwargs) -> dict: print(json.dumps({"log": "callbackSetUserWhisperFeature", "data":data}), flush=True) config.USE_WHISPER_FEATURE = data if config.USE_WHISPER_FEATURE is True: if model.checkTranscriptionWhisperModelWeight() is True: config.IS_RESET_BUTTON_DISPLAYED_FOR_WHISPER = False config.SELECTED_TRANSCRIPTION_ENGINE = "Whisper" else: config.IS_RESET_BUTTON_DISPLAYED_FOR_WHISPER = True config.SELECTED_TRANSCRIPTION_ENGINE = "Google" else: config.IS_RESET_BUTTON_DISPLAYED_FOR_WHISPER = False config.SELECTED_TRANSCRIPTION_ENGINE = "Google" return {"status":"success", "data":{ "feature":config.USE_WHISPER_FEATURE, "transcription_engine":config.SELECTED_TRANSCRIPTION_ENGINE, "reset":config.IS_RESET_BUTTON_DISPLAYED_FOR_WHISPER, }, } def callbackSetWhisperWeightType(data, *args, **kwargs) -> dict: print(json.dumps({"log": "callbackSetWhisperWeightType", "data":data}), flush=True) config.WHISPER_WEIGHT_TYPE = str(data) if model.checkTranscriptionWhisperModelWeight() is True: config.IS_RESET_BUTTON_DISPLAYED_FOR_WHISPER = False config.SELECTED_TRANSCRIPTION_ENGINE = "Whisper" else: config.IS_RESET_BUTTON_DISPLAYED_FOR_WHISPER = True config.SELECTED_TRANSCRIPTION_ENGINE = "Google" return {"status":"success", "data":{ "weight_type":config.WHISPER_WEIGHT_TYPE, "transcription_engine":config.SELECTED_TRANSCRIPTION_ENGINE, "reset":config.IS_RESET_BUTTON_DISPLAYED_FOR_WHISPER, } } # VR Tab def callbackSetOverlaySettingsOpacity(data, *args, **kwargs) -> dict: print(json.dumps({"log": "callbackSetOverlaySettingsOpacity", "data":data}), flush=True) pre_settings = config.OVERLAY_SETTINGS pre_settings["opacity"] = data config.OVERLAY_SETTINGS = pre_settings model.updateOverlayImageOpacity() return {"status":"success", "data":config.OVERLAY_SETTINGS["opacity"]} def callbackSetOverlaySettingsUiScaling(data, *args, **kwargs) -> dict: print(json.dumps({"log": "callbackSetOverlaySettingsUiScaling", "data":data}), flush=True) pre_settings = config.OVERLAY_SETTINGS pre_settings["ui_scaling"] = data config.OVERLAY_SETTINGS = pre_settings model.updateOverlayImageUiScaling() return {"status":"success", "data":config.OVERLAY_SETTINGS["ui_scaling"]} def callbackEnableOverlaySmallLog(*args, **kwargs) -> dict: print(json.dumps({"log": "callbackEnableOverlaySmallLog"}), flush=True) config.ENABLE_OVERLAY_SMALL_LOG = True if config.ENABLE_OVERLAY_SMALL_LOG is True and config.ENABLE_TRANSCRIPTION_RECEIVE is True: if model.overlay.initialized is False and model.overlay.checkSteamvrRunning() is True: model.startOverlay() return {"status":"success", "data":config.ENABLE_OVERLAY_SMALL_LOG} def callbackDisableOverlaySmallLog(*args, **kwargs) -> dict: print(json.dumps({"log": "callbackDisableOverlaySmallLog"}), flush=True) config.ENABLE_OVERLAY_SMALL_LOG = False if config.ENABLE_OVERLAY_SMALL_LOG is False: model.clearOverlayImage() model.shutdownOverlay() return {"status":"success", "data":config.ENABLE_OVERLAY_SMALL_LOG} def callbackSetOverlaySmallLogSettingsXPos(data, *args, **kwargs) -> dict: print(json.dumps({"log": "callbackSetOverlaySmallLogSettingsXPos", "data":data}), flush=True) pre_settings = config.OVERLAY_SMALL_LOG_SETTINGS pre_settings["x_pos"] = data config.OVERLAY_SMALL_LOG_SETTINGS = pre_settings model.updateOverlayPosition() return {"status":"success", "data":config.OVERLAY_SMALL_LOG_SETTINGS["x_pos"]} def callbackSetOverlaySmallLogSettingsYPos(data, *args, **kwargs) -> dict: print(json.dumps({"log": "callbackSetOverlaySmallLogSettingsYPos", "data":data}), flush=True) pre_settings = config.OVERLAY_SMALL_LOG_SETTINGS pre_settings["y_pos"] = data config.OVERLAY_SMALL_LOG_SETTINGS = pre_settings model.updateOverlayPosition() return {"status":"success", "data":config.OVERLAY_SMALL_LOG_SETTINGS["y_pos"]} def callbackSetOverlaySmallLogSettingsZPos(data, *args, **kwargs) -> dict: print(json.dumps({"log": "callbackSetOverlaySmallLogSettingsZPos", "data":data}), flush=True) pre_settings = config.OVERLAY_SMALL_LOG_SETTINGS pre_settings["z_pos"] = data config.OVERLAY_SMALL_LOG_SETTINGS = pre_settings model.updateOverlayPosition() return {"status":"success", "data":config.OVERLAY_SMALL_LOG_SETTINGS["z_pos"]} def callbackSetOverlaySmallLogSettingsXRotation(data, *args, **kwargs) -> dict: print(json.dumps({"log": "callbackSetOverlaySmallLogSettingsXRotation", "data":data}), flush=True) pre_settings = config.OVERLAY_SMALL_LOG_SETTINGS pre_settings["x_rotation"] = data config.OVERLAY_SMALL_LOG_SETTINGS = pre_settings model.updateOverlayPosition() return {"status":"success", "data":config.OVERLAY_SMALL_LOG_SETTINGS["x_rotation"]} def callbackSetOverlaySmallLogSettingsYRotation(data, *args, **kwargs) -> dict: print(json.dumps({"log": "callbackSetOverlaySmallLogSettingsYRotation", "data":data}), flush=True) pre_settings = config.OVERLAY_SMALL_LOG_SETTINGS pre_settings["y_rotation"] = data config.OVERLAY_SMALL_LOG_SETTINGS = pre_settings model.updateOverlayPosition() return {"status":"success", "data":config.OVERLAY_SMALL_LOG_SETTINGS["y_rotation"]} def callbackSetOverlaySmallLogSettingsZRotation(data, *args, **kwargs) -> dict: print(json.dumps({"log": "callbackSetOverlaySmallLogSettingsZRotation", "data":data}), flush=True) pre_settings = config.OVERLAY_SMALL_LOG_SETTINGS pre_settings["z_rotation"] = data config.OVERLAY_SMALL_LOG_SETTINGS = pre_settings model.updateOverlayPosition() return {"status":"success", "data":config.OVERLAY_SMALL_LOG_SETTINGS["z_rotation"]} # Others Tab def callbackSetEnableAutoClearMessageBox(data, *args, **kwargs) -> dict: print(json.dumps({"log": "callbackSetEnableAutoClearMessageBox", "data":data}), flush=True) config.ENABLE_AUTO_CLEAR_MESSAGE_BOX = data return {"status":"success", "data":config.ENABLE_AUTO_CLEAR_MESSAGE_BOX} def callbackSetEnableSendOnlyTranslatedMessages(data, *args, **kwargs) -> dict: print(json.dumps({"log": "callbackSetEnableSendOnlyTranslatedMessages", "data":data}), flush=True) config.ENABLE_SEND_ONLY_TRANSLATED_MESSAGES = data return {"status":"success", "data":config.ENABLE_SEND_ONLY_TRANSLATED_MESSAGES} def callbackSetSendMessageButtonType(data, *args, **kwargs) -> dict: print(json.dumps({"log": "callbackSetSendMessageButtonType", "data":data}), flush=True) config.SEND_MESSAGE_BUTTON_TYPE = data return {"status":"success", "data":config.SEND_MESSAGE_BUTTON_TYPE} def callbackEnableNoticeXsoverlay(*args, **kwargs) -> dict: print(json.dumps({"log": "callbackEnableNoticeXsoverlay"}), flush=True) config.ENABLE_NOTICE_XSOVERLAY = True return {"status":"success", "data":config.ENABLE_NOTICE_XSOVERLAY} def callbackDisableNoticeXsoverlay(*args, **kwargs) -> dict: print(json.dumps({"log": "callbackDisableNoticeXsoverlay"}), flush=True) config.ENABLE_NOTICE_XSOVERLAY = False return {"status":"success", "data":config.ENABLE_NOTICE_XSOVERLAY} def callbackEnableAutoExportMessageLogs(*args, **kwargs) -> dict: print(json.dumps({"log": "callbackEnableAutoExportMessageLogs"}), flush=True) config.ENABLE_LOGGER = True model.startLogger() def callbackDisableAutoExportMessageLogs(*args, **kwargs) -> dict: print(json.dumps({"log": "callbackDisableAutoExportMessageLogs"}), flush=True) config.ENABLE_LOGGER = False model.stopLogger() def callbackEnableVrcMicMuteSync(*args, **kwargs) -> dict: print(json.dumps({"log": "callbackEnableVrcMicMuteSync"}), flush=True) config.ENABLE_VRC_MIC_MUTE_SYNC = True model.startCheckMuteSelfStatus() model.changeMicTranscriptStatus() def callbackDisableVrcMicMuteSync(*args, **kwargs) -> dict: print(json.dumps({"log": "callbackDisableVrcMicMuteSync"}), flush=True) config.ENABLE_VRC_MIC_MUTE_SYNC = False model.stopCheckMuteSelfStatus() model.changeMicTranscriptStatus() def callbackEnableSendMessageToVrc(*args, **kwargs) -> dict: print(json.dumps({"log": "callbackEnableSendMessageToVrc"}), flush=True) config.ENABLE_SEND_MESSAGE_TO_VRC = True return {"status":"success", "data":config.ENABLE_SEND_MESSAGE_TO_VRC} def callbackDisableSendMessageToVrc(*args, **kwargs) -> dict: print(json.dumps({"log": "callbackSetEnableSendMessageToVrc"}), flush=True) config.ENABLE_SEND_MESSAGE_TO_VRC = False return {"status":"success", "data":config.ENABLE_SEND_MESSAGE_TO_VRC} # Others (Message Formats(Send) def callbackSetSendMessageFormat(data, *args, **kwargs) -> dict: print(json.dumps({"log": "callbackSetSendMessageFormat", "data": str(data)}), flush=True) if isUniqueStrings(["[message]"], data) is True: config.SEND_MESSAGE_FORMAT = data return {"status":"success", "data":config.SEND_MESSAGE_FORMAT} def callbackSetSendMessageFormatWithT(data, *args, **kwargs) -> dict: print(json.dumps({"log": "callbackSetReceivedMessageFormat", "data": str(data)}), flush=True) if len(data) > 0: if isUniqueStrings(["[message]", "[translation]"], data) is True: config.SEND_MESSAGE_FORMAT_WITH_T = data return {"status":"success", "data":config.SEND_MESSAGE_FORMAT_WITH_T} # Others (Message Formats(Received) def callbackSetReceivedMessageFormat(data, *args, **kwargs) -> dict: print(json.dumps({"log": "callbackSetReceivedMessageFormat", "data": str(data)}), flush=True) if isUniqueStrings(["[message]"], data) is True: config.RECEIVED_MESSAGE_FORMAT = data return {"status":"success", "data":config.RECEIVED_MESSAGE_FORMAT} def callbackSetReceivedMessageFormatWithT(data, *args, **kwargs) -> dict: print(json.dumps({"log": "callbackSetReceivedMessageFormatWithT", "data": str(data)}), flush=True) if len(data) > 0: if isUniqueStrings(["[message]", "[translation]"], data) is True: config.RECEIVED_MESSAGE_FORMAT_WITH_T = data return {"status":"success", "data":config.RECEIVED_MESSAGE_FORMAT_WITH_T} # ---------------------Speaker2Chatbox--------------------- def callbackEnableSendReceivedMessageToVrc(*args, **kwargs) -> dict: print(json.dumps({"log": "callbackEnableSendReceivedMessageToVrc"}), flush=True) config.ENABLE_SEND_RECEIVED_MESSAGE_TO_VRC = True return {"status":"success", "data":config.ENABLE_SEND_RECEIVED_MESSAGE_TO_VRC} def callbackDisableSendReceivedMessageToVrc(*args, **kwargs) -> dict: print(json.dumps({"log": "callbackDisableSendReceivedMessageToVrc"}), flush=True) config.ENABLE_SEND_RECEIVED_MESSAGE_TO_VRC = False return {"status":"success", "data":config.ENABLE_SEND_RECEIVED_MESSAGE_TO_VRC} # ---------------------Speaker2Chatbox--------------------- # Advanced Settings Tab def callbackSetOscIpAddress(data, *args, **kwargs) -> dict: print(json.dumps({"log": "callbackSetOscIpAddress", "data": str(data)}), flush=True) config.OSC_IP_ADDRESS = str(data) return {"status":"success", "data":config.OSC_IP_ADDRESS} def callbackSetOscPort(data, *args, **kwargs) -> dict: print(json.dumps({"log": "callbackSetOscPort", "data": int(data)}), flush=True) config.OSC_PORT = int(data) return {"status":"success", "data":config.OSC_PORT} def getListLanguageAndCountry(): return model.getListLanguageAndCountry() def getListInputHost(): return model.getListInputHost() def getListInputDevice(): return model.getListInputDevice() def getListOutputDevice(): return model.getListOutputDevice() def init(): print(json.dumps({"log": "Start Initialization"}), flush=True) print(json.dumps({"log": "Start InitSetTranslateEngine"}), flush=True) initSetTranslateEngine() print(json.dumps({"log": "Start Init LanguageAndCountry"}), flush=True) initSetLanguageAndCountry() print(json.dumps({"log": "Start check DeepL API Key"}), flush=True) if config.AUTH_KEYS["DeepL_API"] is not None: if model.authenticationTranslatorDeepLAuthKey(auth_key=config.AUTH_KEYS["DeepL_API"]) is False: # error update Auth key auth_keys = config.AUTH_KEYS auth_keys["DeepL_API"] = None config.AUTH_KEYS = auth_keys # set Translation Engine print(json.dumps({"log": "Set Translation Engine"}), flush=True) updateTranslationEngineAndEngineList() # set Transcription Engine print(json.dumps({"log": "Set Transcription Engine"}), flush=True) if config.USE_WHISPER_FEATURE is True: config.SELECTED_TRANSCRIPTION_ENGINE = "Whisper" else: config.SELECTED_TRANSCRIPTION_ENGINE = "Google" # set word filter print(json.dumps({"log": "Set Word Filter"}), flush=True) model.addKeywords() # check Software Updated print(json.dumps({"log": "Check Software Updated"}), flush=True) if model.checkSoftwareUpdated() is True: pass # init logger print(json.dumps({"log": "Init Logger"}), flush=True) if config.ENABLE_LOGGER is True: model.startLogger() # init OSC receive print(json.dumps({"log": "Init OSC Receive"}), flush=True) model.startReceiveOSC() if config.ENABLE_VRC_MIC_MUTE_SYNC is True: model.startCheckMuteSelfStatus()