Merge branch 'init_optimize' into for_webui

This commit is contained in:
Sakamoto Shiina
2024-10-29 14:54:30 +09:00
8 changed files with 160 additions and 273 deletions

View File

@@ -3,10 +3,10 @@ import inspect
from os import path as os_path, makedirs as os_makedirs
from json import load as json_load
from json import dump as json_dump
import threading
from device_manager import device_manager
from models.transcription.transcription_languages import transcription_lang
from utils import generatePercentageStringsList, isUniqueStrings
from utils import isUniqueStrings
json_serializable_vars = {}
def json_serializable(var_name):
@@ -15,15 +15,11 @@ def json_serializable(var_name):
return func
return decorator
def saveJson(path, key, value):
with open(path, "r", encoding="utf-8") as fp:
json_data = json_load(fp)
json_data[key] = value
with open(path, "w", encoding="utf-8") as fp:
json_dump(json_data, fp, indent=4, ensure_ascii=False)
class Config:
_instance = None
_config_data = {}
_timer = None
_debounce_time = 2
def __new__(cls):
if cls._instance is None:
@@ -32,6 +28,19 @@ class Config:
cls._instance.load_config()
return cls._instance
def saveConfigToFile(self):
with open(self.PATH_CONFIG, "w", encoding="utf-8") as fp:
json_dump(self._config_data, fp, indent=4, ensure_ascii=False)
def saveConfig(self, key, value):
self._config_data[key] = value
if isinstance(self._timer, threading.Timer) and self._timer.is_alive():
self._timer.cancel()
self._timer = threading.Timer(self._debounce_time, self.saveConfigToFile)
self._timer.daemon = True
self._timer.start()
# Read Only
@property
def VERSION(self):
@@ -78,8 +87,8 @@ class Config:
return self._APPEARANCE_THEME_LIST
@property
def UI_SCALING_LIST(self):
return self._UI_SCALING_LIST
def UI_SCALING_RANGE(self):
return self._UI_SCALING_RANGE
@property
def TEXTBOX_UI_SCALING_RANGE(self):
@@ -90,12 +99,12 @@ class Config:
return self._MESSAGE_BOX_RATIO_RANGE
@property
def SELECTABLE_CTRANSLATE2_WEIGHT_TYPE_DICT(self):
return self._SELECTABLE_CTRANSLATE2_WEIGHT_TYPE_DICT
def SELECTABLE_CTRANSLATE2_WEIGHT_TYPE_LIST(self):
return self._SELECTABLE_CTRANSLATE2_WEIGHT_TYPE_LIST
@property
def SELECTABLE_WHISPER_WEIGHT_TYPE_DICT(self):
return self._SELECTABLE_WHISPER_WEIGHT_TYPE_DICT
def SELECTABLE_WHISPER_WEIGHT_TYPE_LIST(self):
return self._SELECTABLE_WHISPER_WEIGHT_TYPE_LIST
@property
def MAX_MIC_THRESHOLD(self):
@@ -224,7 +233,7 @@ class Config:
def SELECTED_TAB_NO(self, value):
if isinstance(value, str):
self._SELECTED_TAB_NO = value
saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value)
self.saveConfig(inspect.currentframe().f_code.co_name, value)
@property
@json_serializable('SELECTED_TRANSLATION_ENGINES')
@@ -235,7 +244,7 @@ class Config:
def SELECTED_TRANSLATION_ENGINES(self, value):
if isinstance(value, dict):
self._SELECTED_TRANSLATION_ENGINES = value
saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value)
self.saveConfig(inspect.currentframe().f_code.co_name, value)
@property
@json_serializable('SELECTED_YOUR_LANGUAGES')
@@ -256,7 +265,7 @@ class Config:
self._SELECTED_YOUR_LANGUAGES = value
except Exception:
pass
saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value)
self.saveConfig(inspect.currentframe().f_code.co_name, value)
@property
@json_serializable('SELECTED_TARGET_LANGUAGES')
@@ -277,7 +286,7 @@ class Config:
self._SELECTED_TARGET_LANGUAGES = value
except Exception:
pass
saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value)
self.saveConfig(inspect.currentframe().f_code.co_name, value)
@property
@json_serializable('SELECTED_TRANSCRIPTION_ENGINE')
@@ -288,7 +297,7 @@ class Config:
def SELECTED_TRANSCRIPTION_ENGINE(self, value):
if isinstance(value, str):
self._SELECTED_TRANSCRIPTION_ENGINE = value
# saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value)
# self.saveConfig(inspect.currentframe().f_code.co_name, value)
@property
@json_serializable('MULTI_LANGUAGE_TRANSLATION')
@@ -299,7 +308,7 @@ class Config:
def MULTI_LANGUAGE_TRANSLATION(self, value):
if isinstance(value, bool):
self._MULTI_LANGUAGE_TRANSLATION = value
saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value)
self.saveConfig(inspect.currentframe().f_code.co_name, value)
@property
@json_serializable('CONVERT_MESSAGE_TO_ROMAJI')
@@ -310,7 +319,7 @@ class Config:
def CONVERT_MESSAGE_TO_ROMAJI(self, value):
if isinstance(value, bool):
self._CONVERT_MESSAGE_TO_ROMAJI = value
saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value)
self.saveConfig(inspect.currentframe().f_code.co_name, value)
@property
@json_serializable('CONVERT_MESSAGE_TO_HIRAGANA')
@@ -321,7 +330,7 @@ class Config:
def CONVERT_MESSAGE_TO_HIRAGANA(self, value):
if isinstance(value, bool):
self._CONVERT_MESSAGE_TO_HIRAGANA = value
saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value)
self.saveConfig(inspect.currentframe().f_code.co_name, value)
@property
@json_serializable('MAIN_WINDOW_SIDEBAR_COMPACT_MODE')
@@ -332,7 +341,7 @@ class Config:
def MAIN_WINDOW_SIDEBAR_COMPACT_MODE(self, value):
if isinstance(value, bool):
self._MAIN_WINDOW_SIDEBAR_COMPACT_MODE = value
saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value)
self.saveConfig(inspect.currentframe().f_code.co_name, value)
## Config Window
@property
@@ -344,7 +353,7 @@ class Config:
def TRANSPARENCY(self, value):
if isinstance(value, int):
self._TRANSPARENCY = value
saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value)
self.saveConfig(inspect.currentframe().f_code.co_name, value)
@property
@json_serializable('APPEARANCE_THEME')
@@ -355,7 +364,7 @@ class Config:
def APPEARANCE_THEME(self, value):
if value in self.APPEARANCE_THEME_LIST:
self._APPEARANCE_THEME = value
saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value)
self.saveConfig(inspect.currentframe().f_code.co_name, value)
@property
@json_serializable('UI_SCALING')
@@ -366,7 +375,7 @@ class Config:
def UI_SCALING(self, value):
if isinstance(value, int):
self._UI_SCALING = value
saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value)
self.saveConfig(inspect.currentframe().f_code.co_name, value)
@property
@json_serializable('TEXTBOX_UI_SCALING')
@@ -377,7 +386,7 @@ class Config:
def TEXTBOX_UI_SCALING(self, value):
if isinstance(value, int):
self._TEXTBOX_UI_SCALING = value
saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value)
self.saveConfig(inspect.currentframe().f_code.co_name, value)
@property
@json_serializable('MESSAGE_BOX_RATIO')
@@ -388,7 +397,7 @@ class Config:
def MESSAGE_BOX_RATIO(self, value):
if isinstance(value, (int, float)):
self._MESSAGE_BOX_RATIO = value
saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value)
self.saveConfig(inspect.currentframe().f_code.co_name, value)
@property
@json_serializable('FONT_FAMILY')
@@ -399,7 +408,7 @@ class Config:
def FONT_FAMILY(self, value):
if isinstance(value, str):
self._FONT_FAMILY = value
saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value)
self.saveConfig(inspect.currentframe().f_code.co_name, value)
@property
@json_serializable('UI_LANGUAGE')
@@ -410,7 +419,7 @@ class Config:
def UI_LANGUAGE(self, value):
if isinstance(value, str):
self._UI_LANGUAGE = value
saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value)
self.saveConfig(inspect.currentframe().f_code.co_name, value)
@property
@json_serializable('RESTORE_MAIN_WINDOW_GEOMETRY')
@@ -421,7 +430,7 @@ class Config:
def RESTORE_MAIN_WINDOW_GEOMETRY(self, value):
if isinstance(value, bool):
self._RESTORE_MAIN_WINDOW_GEOMETRY = value
saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value)
self.saveConfig(inspect.currentframe().f_code.co_name, value)
@property
@json_serializable('MAIN_WINDOW_GEOMETRY')
@@ -434,7 +443,7 @@ class Config:
for key, value in value.items():
if isinstance(value, int):
self._MAIN_WINDOW_GEOMETRY[key] = value
saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, self.MAIN_WINDOW_GEOMETRY)
self.saveConfig(inspect.currentframe().f_code.co_name, self.MAIN_WINDOW_GEOMETRY)
@property
@json_serializable('AUTO_MIC_SELECT')
@@ -445,7 +454,7 @@ class Config:
def AUTO_MIC_SELECT(self, value):
if isinstance(value, bool):
self._AUTO_MIC_SELECT = value
saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value)
self.saveConfig(inspect.currentframe().f_code.co_name, value)
@property
@json_serializable('SELECTED_MIC_HOST')
@@ -456,7 +465,7 @@ class Config:
def SELECTED_MIC_HOST(self, value):
if value in [host for host in device_manager.getMicDevices().keys()]:
self._SELECTED_MIC_HOST = value
saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value)
self.saveConfig(inspect.currentframe().f_code.co_name, value)
@property
@json_serializable('SELECTED_MIC_DEVICE')
@@ -467,7 +476,7 @@ class Config:
def SELECTED_MIC_DEVICE(self, value):
if value in [device["name"] for device in device_manager.getMicDevices()[self.SELECTED_MIC_HOST]]:
self._SELECTED_MIC_DEVICE = value
saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value)
self.saveConfig(inspect.currentframe().f_code.co_name, value)
@property
@json_serializable('MIC_THRESHOLD')
@@ -478,7 +487,7 @@ class Config:
def MIC_THRESHOLD(self, value):
if isinstance(value, int):
self._MIC_THRESHOLD = value
saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value)
self.saveConfig(inspect.currentframe().f_code.co_name, value)
@property
@json_serializable('MIC_AUTOMATIC_THRESHOLD')
@@ -489,7 +498,7 @@ class Config:
def MIC_AUTOMATIC_THRESHOLD(self, value):
if isinstance(value, bool):
self._MIC_AUTOMATIC_THRESHOLD = value
saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value)
self.saveConfig(inspect.currentframe().f_code.co_name, value)
@property
@json_serializable('MIC_RECORD_TIMEOUT')
@@ -500,7 +509,7 @@ class Config:
def MIC_RECORD_TIMEOUT(self, value):
if isinstance(value, int):
self._MIC_RECORD_TIMEOUT = value
saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value)
self.saveConfig(inspect.currentframe().f_code.co_name, value)
@property
@json_serializable('MIC_PHRASE_TIMEOUT')
@@ -511,7 +520,7 @@ class Config:
def MIC_PHRASE_TIMEOUT(self, value):
if isinstance(value, int):
self._MIC_PHRASE_TIMEOUT = value
saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value)
self.saveConfig(inspect.currentframe().f_code.co_name, value)
@property
@json_serializable('MIC_MAX_PHRASES')
@@ -522,7 +531,7 @@ class Config:
def MIC_MAX_PHRASES(self, value):
if isinstance(value, int):
self._MIC_MAX_PHRASES = value
saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value)
self.saveConfig(inspect.currentframe().f_code.co_name, value)
@property
@json_serializable('MIC_WORD_FILTER')
@@ -533,7 +542,7 @@ class Config:
def MIC_WORD_FILTER(self, value):
if isinstance(value, list):
self._MIC_WORD_FILTER = sorted(set(value), key=value.index)
saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value)
self.saveConfig(inspect.currentframe().f_code.co_name, value)
@property
@json_serializable('MIC_AVG_LOGPROB')
@@ -544,7 +553,7 @@ class Config:
def MIC_AVG_LOGPROB(self, value):
if isinstance(value, (int, float)):
self._MIC_AVG_LOGPROB = value
saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value)
self.saveConfig(inspect.currentframe().f_code.co_name, value)
@property
@json_serializable('MIC_NO_SPEECH_PROB')
@@ -555,7 +564,7 @@ class Config:
def MIC_NO_SPEECH_PROB(self, value):
if isinstance(value, (int, float)):
self._MIC_NO_SPEECH_PROB = value
saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value)
self.saveConfig(inspect.currentframe().f_code.co_name, value)
@property
@json_serializable('AUTO_SPEAKER_SELECT')
@@ -566,7 +575,7 @@ class Config:
def AUTO_SPEAKER_SELECT(self, value):
if isinstance(value, bool):
self._AUTO_SPEAKER_SELECT = value
saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value)
self.saveConfig(inspect.currentframe().f_code.co_name, value)
@property
@json_serializable('SELECTED_SPEAKER_DEVICE')
@@ -577,7 +586,7 @@ class Config:
def SELECTED_SPEAKER_DEVICE(self, value):
if value in [device["name"] for device in device_manager.getSpeakerDevices()]:
self._SELECTED_SPEAKER_DEVICE = value
saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value)
self.saveConfig(inspect.currentframe().f_code.co_name, value)
@property
@json_serializable('SPEAKER_THRESHOLD')
@@ -588,7 +597,7 @@ class Config:
def SPEAKER_THRESHOLD(self, value):
if isinstance(value, int):
self._SPEAKER_THRESHOLD = value
saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value)
self.saveConfig(inspect.currentframe().f_code.co_name, value)
@property
@json_serializable('SPEAKER_AUTOMATIC_THRESHOLD')
@@ -599,7 +608,7 @@ class Config:
def SPEAKER_AUTOMATIC_THRESHOLD(self, value):
if isinstance(value, bool):
self._SPEAKER_AUTOMATIC_THRESHOLD = value
saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value)
self.saveConfig(inspect.currentframe().f_code.co_name, value)
@property
@json_serializable('SPEAKER_RECORD_TIMEOUT')
@@ -610,7 +619,7 @@ class Config:
def SPEAKER_RECORD_TIMEOUT(self, value):
if isinstance(value, int):
self._SPEAKER_RECORD_TIMEOUT = value
saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value)
self.saveConfig(inspect.currentframe().f_code.co_name, value)
@property
@json_serializable('SPEAKER_PHRASE_TIMEOUT')
@@ -621,7 +630,7 @@ class Config:
def SPEAKER_PHRASE_TIMEOUT(self, value):
if isinstance(value, int):
self._SPEAKER_PHRASE_TIMEOUT = value
saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value)
self.saveConfig(inspect.currentframe().f_code.co_name, value)
@property
@json_serializable('SPEAKER_MAX_PHRASES')
@@ -632,7 +641,7 @@ class Config:
def SPEAKER_MAX_PHRASES(self, value):
if isinstance(value, int):
self._SPEAKER_MAX_PHRASES = value
saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value)
self.saveConfig(inspect.currentframe().f_code.co_name, value)
@property
@json_serializable('SPEAKER_AVG_LOGPROB')
@@ -643,7 +652,7 @@ class Config:
def SPEAKER_AVG_LOGPROB(self, value):
if isinstance(value, (int, float)):
self._SPEAKER_AVG_LOGPROB = value
saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value)
self.saveConfig(inspect.currentframe().f_code.co_name, value)
@property
@json_serializable('SPEAKER_NO_SPEECH_PROB')
@@ -654,7 +663,7 @@ class Config:
def SPEAKER_NO_SPEECH_PROB(self, value):
if isinstance(value, (int, float)):
self._SPEAKER_NO_SPEECH_PROB = value
saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value)
self.saveConfig(inspect.currentframe().f_code.co_name, value)
@property
@json_serializable('OSC_IP_ADDRESS')
@@ -665,7 +674,7 @@ class Config:
def OSC_IP_ADDRESS(self, value):
if isinstance(value, str):
self._OSC_IP_ADDRESS = value
saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value)
self.saveConfig(inspect.currentframe().f_code.co_name, value)
@property
@json_serializable('OSC_PORT')
@@ -676,7 +685,7 @@ class Config:
def OSC_PORT(self, value):
if isinstance(value, int):
self._OSC_PORT = value
saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value)
self.saveConfig(inspect.currentframe().f_code.co_name, value)
@property
@json_serializable('AUTH_KEYS')
@@ -689,7 +698,7 @@ class Config:
for key, value in value.items():
if isinstance(value, str):
self._AUTH_KEYS[key] = value
saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, self.AUTH_KEYS)
self.saveConfig(inspect.currentframe().f_code.co_name, self.AUTH_KEYS)
@property
@json_serializable('USE_EXCLUDE_WORDS')
@@ -700,7 +709,7 @@ class Config:
def USE_EXCLUDE_WORDS(self, value):
if isinstance(value, bool):
self._USE_EXCLUDE_WORDS = value
saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value)
self.saveConfig(inspect.currentframe().f_code.co_name, value)
@property
@json_serializable('USE_TRANSLATION_FEATURE')
@@ -711,7 +720,7 @@ class Config:
def USE_TRANSLATION_FEATURE(self, value):
if isinstance(value, bool):
self._USE_TRANSLATION_FEATURE = value
saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value)
self.saveConfig(inspect.currentframe().f_code.co_name, value)
@property
@json_serializable('USE_WHISPER_FEATURE')
@@ -722,7 +731,7 @@ class Config:
def USE_WHISPER_FEATURE(self, value):
if isinstance(value, bool):
self._USE_WHISPER_FEATURE = value
saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value)
self.saveConfig(inspect.currentframe().f_code.co_name, value)
@property
@json_serializable('SELECTED_TRANSLATION_COMPUTE_DEVICE')
@@ -733,7 +742,7 @@ class Config:
def SELECTED_TRANSLATION_COMPUTE_DEVICE(self, value):
if isinstance(value, dict):
self._SELECTED_TRANSLATION_COMPUTE_DEVICE = value
saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value)
self.saveConfig(inspect.currentframe().f_code.co_name, value)
@property
@json_serializable('SELECTED_TRANSCRIPTION_COMPUTE_DEVICE')
@@ -744,7 +753,7 @@ class Config:
def SELECTED_TRANSCRIPTION_COMPUTE_DEVICE(self, value):
if isinstance(value, dict):
self._SELECTED_TRANSCRIPTION_COMPUTE_DEVICE = value
saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value)
self.saveConfig(inspect.currentframe().f_code.co_name, value)
@property
@json_serializable('CTRANSLATE2_WEIGHT_TYPE')
@@ -753,10 +762,10 @@ class Config:
@CTRANSLATE2_WEIGHT_TYPE.setter
def CTRANSLATE2_WEIGHT_TYPE(self, value):
# if isinstance(value, str) and value in self.SELECTABLE_CTRANSLATE2_WEIGHT_TYPE_DICT:
# if isinstance(value, str) and value in self.SELECTABLE_CTRANSLATE2_WEIGHT_TYPE_LIST:
if isinstance(value, str):
self._CTRANSLATE2_WEIGHT_TYPE = value
saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value)
self.saveConfig(inspect.currentframe().f_code.co_name, value)
@property
@json_serializable('WHISPER_WEIGHT_TYPE')
@@ -767,7 +776,7 @@ class Config:
def WHISPER_WEIGHT_TYPE(self, value):
if isinstance(value, str):
self._WHISPER_WEIGHT_TYPE = value
saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value)
self.saveConfig(inspect.currentframe().f_code.co_name, value)
@property
@json_serializable('AUTO_CLEAR_MESSAGE_BOX')
@@ -778,7 +787,7 @@ class Config:
def AUTO_CLEAR_MESSAGE_BOX(self, value):
if isinstance(value, bool):
self._AUTO_CLEAR_MESSAGE_BOX = value
saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value)
self.saveConfig(inspect.currentframe().f_code.co_name, value)
@property
@json_serializable('SEND_ONLY_TRANSLATED_MESSAGES')
@@ -789,7 +798,7 @@ class Config:
def SEND_ONLY_TRANSLATED_MESSAGES(self, value):
if isinstance(value, bool):
self._SEND_ONLY_TRANSLATED_MESSAGES = value
saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value)
self.saveConfig(inspect.currentframe().f_code.co_name, value)
@property
@json_serializable('SEND_MESSAGE_BUTTON_TYPE')
@@ -800,7 +809,7 @@ class Config:
def SEND_MESSAGE_BUTTON_TYPE(self, value):
if isinstance(value, str):
self._SEND_MESSAGE_BUTTON_TYPE = value
saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value)
self.saveConfig(inspect.currentframe().f_code.co_name, value)
@property
@json_serializable('OVERLAY_SETTINGS')
@@ -813,7 +822,7 @@ class Config:
for key, value in value.items():
if isinstance(value, (int, float)):
self._OVERLAY_SETTINGS[key] = float(value)
saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, self.OVERLAY_SETTINGS)
self.saveConfig(inspect.currentframe().f_code.co_name, self.OVERLAY_SETTINGS)
@property
@json_serializable('OVERLAY_SMALL_LOG')
@@ -824,7 +833,7 @@ class Config:
def OVERLAY_SMALL_LOG(self, value):
if isinstance(value, bool):
self._OVERLAY_SMALL_LOG = value
saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value)
self.saveConfig(inspect.currentframe().f_code.co_name, value)
@property
@json_serializable('OVERLAY_SMALL_LOG_SETTINGS')
@@ -842,7 +851,7 @@ class Config:
case "display_duration" | "fadeout_duration":
if isinstance(value, int):
self._OVERLAY_SMALL_LOG_SETTINGS[key] = value
saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, self.OVERLAY_SMALL_LOG_SETTINGS)
self.saveConfig(inspect.currentframe().f_code.co_name, self.OVERLAY_SMALL_LOG_SETTINGS)
@property
@json_serializable('OVERLAY_UI_TYPE')
@@ -853,7 +862,7 @@ class Config:
def OVERLAY_UI_TYPE(self, value):
if isinstance(value, str):
self._OVERLAY_UI_TYPE = value
# saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value)
# self.saveConfig(inspect.currentframe().f_code.co_name, value)
@property
@json_serializable('SEND_MESSAGE_TO_VRC')
@@ -864,7 +873,7 @@ class Config:
def SEND_MESSAGE_TO_VRC(self, value):
if isinstance(value, bool):
self._SEND_MESSAGE_TO_VRC = value
saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value)
self.saveConfig(inspect.currentframe().f_code.co_name, value)
@property
@json_serializable('SEND_MESSAGE_FORMAT')
@@ -877,7 +886,7 @@ class Config:
if isUniqueStrings(["[message]"], value) is False:
value = "[message]"
self._SEND_MESSAGE_FORMAT = value
saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value)
self.saveConfig(inspect.currentframe().f_code.co_name, value)
@property
@json_serializable('SEND_MESSAGE_FORMAT_WITH_T')
@@ -890,7 +899,7 @@ class Config:
if isUniqueStrings(["[message]", "[translation]"], value) is False:
value = "[message]([translation])"
self._SEND_MESSAGE_FORMAT_WITH_T = value
saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value)
self.saveConfig(inspect.currentframe().f_code.co_name, value)
@property
@json_serializable('RECEIVED_MESSAGE_FORMAT')
@@ -903,7 +912,7 @@ class Config:
if isUniqueStrings(["[message]"], value) is False:
value = "[message]"
self._RECEIVED_MESSAGE_FORMAT = value
saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value)
self.saveConfig(inspect.currentframe().f_code.co_name, value)
@property
@json_serializable('RECEIVED_MESSAGE_FORMAT_WITH_T')
@@ -916,7 +925,7 @@ class Config:
if isUniqueStrings(["[message]", "[translation]"], value) is False:
value = "[message]([translation])"
self._RECEIVED_MESSAGE_FORMAT_WITH_T = value
saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value)
self.saveConfig(inspect.currentframe().f_code.co_name, value)
@property
@json_serializable('SEND_RECEIVED_MESSAGE_TO_VRC')
@@ -927,7 +936,7 @@ class Config:
def SEND_RECEIVED_MESSAGE_TO_VRC(self, value):
if isinstance(value, bool):
self._SEND_RECEIVED_MESSAGE_TO_VRC = value
saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value)
self.saveConfig(inspect.currentframe().f_code.co_name, value)
@property
@json_serializable('LOGGER_FEATURE')
@@ -938,7 +947,7 @@ class Config:
def LOGGER_FEATURE(self, value):
if isinstance(value, bool):
self._LOGGER_FEATURE = value
saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value)
self.saveConfig(inspect.currentframe().f_code.co_name, value)
@property
@json_serializable('VRC_MIC_MUTE_SYNC')
@@ -949,7 +958,7 @@ class Config:
def VRC_MIC_MUTE_SYNC(self, value):
if isinstance(value, bool):
self._VRC_MIC_MUTE_SYNC = value
saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value)
self.saveConfig(inspect.currentframe().f_code.co_name, value)
def init_config(self):
# Read Only
@@ -966,27 +975,25 @@ class Config:
self._BOOTH_URL = "https://misyaguziya.booth.pm/"
self._DOCUMENTS_URL = "https://mzsoftware.notion.site/VRCT-Documents-be79b7a165f64442ad8f326d86c22246"
self._DEEPL_AUTH_KEY_PAGE_URL = "https://www.deepl.com/ja/account/summary"
self._TRANSPARENCY_RANGE = (50, 100)
self._TRANSPARENCY_RANGE = (40, 100)
self._APPEARANCE_THEME_LIST = ["Light", "Dark", "System"]
self._UI_SCALING_LIST = generatePercentageStringsList(start=40, end=200, step=10)
self._TEXTBOX_UI_SCALING_RANGE = (50, 200)
self._UI_SCALING_RANGE = (40, 200)
self._TEXTBOX_UI_SCALING_RANGE = (40, 200)
self._MESSAGE_BOX_RATIO_RANGE = (1, 99)
self._SELECTABLE_CTRANSLATE2_WEIGHT_TYPE_DICT = {
# {Save json str}: {i18n_placeholder} pairs
"Small": "Small",
"Large": "Large",
}
self._SELECTABLE_CTRANSLATE2_WEIGHT_TYPE_LIST = [
"Small",
"Large",
]
self._SELECTABLE_WHISPER_WEIGHT_TYPE_DICT = {
# {Save json str}: {i18n_placeholder} pairs
"tiny": "tiny",
"base": "base",
"small": "small",
"medium": "medium",
"large-v1": "large-v1",
"large-v2": "large-v2",
"large-v3": "large-v3",
}
self._SELECTABLE_WHISPER_WEIGHT_TYPE_LIST = [
"tiny",
"base",
"small",
"medium",
"large-v1",
"large-v2",
"large-v3",
]
self._MAX_MIC_THRESHOLD = 2000
self._MAX_SPEAKER_THRESHOLD = 4000
@@ -1163,21 +1170,16 @@ class Config:
def load_config(self):
if os_path.isfile(self.PATH_CONFIG) is not False:
with open(self.PATH_CONFIG, 'r', encoding="utf-8") as fp:
config = json_load(fp)
if fp.readable() and fp.seek(0, 2) > 0:
fp.seek(0)
self._config_data = json_load(fp)
old_message_format = None
for key in config.keys():
if key == "MESSAGE_FORMAT":
old_message_format = config[key]
setattr(self, key, config[key])
if old_message_format is not None:
setattr(self, "SEND_MESSAGE_FORMAT_WITH_T", old_message_format)
for key, value in self._config_data.items():
setattr(self, key, value)
with open(self.PATH_CONFIG, 'w', encoding="utf-8") as fp:
config = {}
for var_name, var_func in json_serializable_vars.items():
config[var_name] = var_func(self)
json_dump(config, fp, indent=4, ensure_ascii=False)
self._config_data[var_name] = var_func(self)
json_dump(self._config_data, fp, indent=4, ensure_ascii=False)
config = Config()

View File

@@ -1,7 +1,6 @@
from os import path as os_path, makedirs as os_makedirs
from requests import get as requests_get
from typing import Callable
import torch
import huggingface_hub
from faster_whisper import WhisperModel
import logging

View File

@@ -22,12 +22,6 @@ def makeEven(number, minus:bool=False):
return number if isEven(number) else number - 1
return number if isEven(number) else number + 1
def generatePercentageStringsList(start:int, end:int, step:int):
strings = []
for percent in range(start, end + 1, step):
strings.append(f"{percent}%")
return strings
def intToPctStr(value:int):
return f"{value}%"

View File

@@ -11,10 +11,14 @@ import torch
class Controller:
def __init__(self) -> None:
self.init_mapping = {}
self.run_mapping = {}
self.run = None
self.device_access_status = True
def setInitMapping(self, init_mapping:dict) -> None:
self.init_mapping = init_mapping
def setRunMapping(self, run_mapping:dict) -> None:
self.run_mapping = run_mapping
@@ -43,6 +47,18 @@ class Controller:
model.getListSpeakerDevice(),
)
def updateConfigSettings(self) -> None:
settings = {}
for endpoint, dict_data in self.init_mapping.items():
response = dict_data["variable"](None)
result = response.get("result", None)
settings[endpoint] = result
self.run(
200,
self.run_mapping["initialization_complete"],
settings,
)
def restartAccessDevices(self) -> None:
if config.ENABLE_TRANSCRIPTION_SEND is True:
self.startThreadingTranscriptionSendMessage()
@@ -353,8 +369,8 @@ class Controller:
return {"status":200, "result":config.APPEARANCE_THEME_LIST}
@staticmethod
def getUiScalingList(*args, **kwargs) -> dict:
return {"status":200, "result":config.UI_SCALING_LIST}
def getUiScalingRange(*args, **kwargs) -> dict:
return {"status":200, "result":config.UI_SCALING_RANGE}
@staticmethod
def getTextboxUiScalingRange(*args, **kwargs) -> dict:
@@ -381,8 +397,8 @@ class Controller:
return {"status":200,"result":config.SELECTED_TRANSLATION_COMPUTE_DEVICE}
@staticmethod
def getSelectableCtranslate2WeightTypeDict(*args, **kwargs) -> dict:
return {"status":200, "result":config.SELECTABLE_CTRANSLATE2_WEIGHT_TYPE_DICT}
def getSelectableCtranslate2WeightTypeList(*args, **kwargs) -> dict:
return {"status":200, "result":config.SELECTABLE_CTRANSLATE2_WEIGHT_TYPE_LIST}
@staticmethod
def getSelectedTranscriptionComputeDevice(*args, **kwargs) -> dict:
@@ -395,8 +411,8 @@ class Controller:
return {"status":200,"result":config.SELECTED_TRANSCRIPTION_COMPUTE_DEVICE}
@staticmethod
def getSelectableWhisperModelTypeDict(*args, **kwargs) -> dict:
return {"status":200, "result":config.SELECTABLE_WHISPER_WEIGHT_TYPE_DICT}
def getSelectableWhisperWeightTypeList(*args, **kwargs) -> dict:
return {"status":200, "result":config.SELECTABLE_WHISPER_WEIGHT_TYPE_LIST}
@staticmethod
def getMaxMicThreshold(*args, **kwargs) -> dict:
@@ -1704,6 +1720,8 @@ class Controller:
if config.AUTO_SPEAKER_SELECT is True:
self.setEnableAutoSpeakerSelect()
self.updateConfigSettings()
printLog("End Initialization")
self.startWatchdog()

View File

@@ -34,6 +34,8 @@ run_mapping = {
"speaker_device_list":"/run/speaker_device_list",
"update_software_flag":"/run/update_software_flag",
"initialization_complete":"/run/initialization_complete",
}
controller.setRunMapping(run_mapping)
@@ -94,11 +96,11 @@ mapping = {
"/get/data/transparency": {"status": True, "variable":controller.getTransparency},
"/set/data/transparency": {"status": True, "variable":controller.setTransparency},
"/get/data/appearance_theme_list": {"status": True, "variable":controller.getAppearanceThemesList},
"/get/data/appearance_theme": {"status": True, "variable":controller.getAppearanceTheme},
"/set/data/appearance_theme": {"status": True, "variable":controller.setAppearanceTheme},
# "/get/data/appearance_theme_list": {"status": True, "variable":controller.getAppearanceThemesList},
# "/get/data/appearance_theme": {"status": True, "variable":controller.getAppearanceTheme},
# "/set/data/appearance_theme": {"status": True, "variable":controller.setAppearanceTheme},
"/get/data/ui_scaling_list": {"status": True, "variable":controller.getUiScalingList},
"/get/data/ui_scaling_range": {"status": True, "variable":controller.getUiScalingRange},
"/get/data/ui_scaling": {"status": True, "variable":controller.getUiScaling},
"/set/data/ui_scaling": {"status": True, "variable":controller.setUiScaling},
@@ -128,11 +130,11 @@ mapping = {
"/set/enable/use_translation_feature": {"status": True, "variable":controller.setEnableUseTranslationFeature},
"/set/disable/use_translation_feature": {"status": True, "variable":controller.setDisableUseTranslationFeature},
"/get/data/translation_compute_device_dict": {"status": True, "variable":controller.getComputeDeviceList},
"/get/data/translation_compute_device_list": {"status": True, "variable":controller.getComputeDeviceList},
"/get/data/selected_translation_compute_device": {"status": True, "variable":controller.getSelectedTranslationComputeDevice},
"/set/data/selected_translation_compute_device": {"status": True, "variable":controller.setSelectedTranslationComputeDevice},
"/get/data/selectable_ctranslate2_weight_type_dict": {"status": True, "variable":controller.getSelectableCtranslate2WeightTypeDict},
"/get/data/selectable_ctranslate2_weight_type_list": {"status": True, "variable":controller.getSelectableCtranslate2WeightTypeList},
"/get/data/ctranslate2_weight_type": {"status": True, "variable":controller.getCtranslate2WeightType},
"/set/data/ctranslate2_weight_type": {"status": True, "variable":controller.setCtranslate2WeightType},
@@ -233,11 +235,11 @@ mapping = {
"/set/enable/check_speaker_threshold": {"status": True, "variable":controller.setEnableCheckSpeakerThreshold},
"/set/disable/check_speaker_threshold": {"status": True, "variable":controller.setDisableCheckSpeakerThreshold},
"/get/data/transcription_compute_device_dict": {"status": True, "variable":controller.getComputeDeviceList},
"/get/data/transcription_compute_device_list": {"status": True, "variable":controller.getComputeDeviceList},
"/get/data/selected_transcription_compute_device": {"status": True, "variable":controller.getSelectedTranscriptionComputeDevice},
"/set/data/selected_transcription_compute_device": {"status": True, "variable":controller.setSelectedTranscriptionComputeDevice},
"/get/data/selectable_whisper_weight_type_dict": {"status": True, "variable":controller.getSelectableWhisperModelTypeDict},
"/get/data/selectable_whisper_weight_type_list": {"status": True, "variable":controller.getSelectableWhisperWeightTypeList},
"/get/data/whisper_weight_type": {"status": True, "variable":controller.getWhisperWeightType},
"/set/data/whisper_weight_type": {"status": True, "variable":controller.setWhisperWeightType},
@@ -315,6 +317,9 @@ mapping = {
# "/run/stop_watchdog": {"status": True, "variable":controller.stopWatchdog},
}
init_mapping = {key:value for key, value in mapping.items() if key.startswith("/get/data/")}
controller.setInitMapping(init_mapping)
class Main:
def __init__(self) -> None:
self.queue = Queue()

View File

@@ -33,45 +33,14 @@ import {
} from "@logics_common";
import {
useSoftwareVersion,
useEnableAutoMicSelect,
useEnableAutoSpeakerSelect,
useSelectedMicHost,
useSelectedMicDevice,
useSelectedSpeakerDevice,
useMicThreshold,
useSpeakerThreshold,
useEnableAutoClearMessageInputBox,
useEnableSendOnlyTranslatedMessages,
useEnableAutoExportMessageLogs,
useEnableVrcMicMuteSync,
useEnableSendMessageToVrc,
useSendMessageButtonType,
useUiLanguage,
useUiScaling,
useMessageLogUiScaling,
useSelectedFontFamily,
useTransparency,
useMicHostList,
useMicDeviceList,
useSpeakerDeviceList,
useMicRecordTimeout,
useMicPhraseTimeout,
useMicMaxWords,
useMicWordFilterList,
useSpeakerRecordTimeout,
useSpeakerPhraseTimeout,
useSpeakerMaxWords,
useOscIpAddress,
useOscPort,
} from "@logics_configs";
import {
useMainFunction,
useIsMainPageCompactMode,
useLanguageSettings,
useSelectableLanguageList,
useMessageInputBoxRatio,
} from "@logics_main";
const StartPythonFacadeComponent = () => {
@@ -79,119 +48,11 @@ const StartPythonFacadeComponent = () => {
const hasRunRef = useRef(false);
const { asyncFetchFonts } = useAsyncFetchFonts();
const { fetchAndUpdateWindowGeometry } = useWindow();
const { getMicHostList } = useMicHostList();
const { getMicDeviceList } = useMicDeviceList();
const { getSpeakerDeviceList } = useSpeakerDeviceList();
const { getIsMainPageCompactMode } = useIsMainPageCompactMode();
const { getSoftwareVersion } = useSoftwareVersion();
const { getEnableAutoMicSelect } = useEnableAutoMicSelect();
const { getEnableAutoSpeakerSelect } = useEnableAutoSpeakerSelect();
const { getSelectedMicHost } = useSelectedMicHost();
const { getSelectedMicDevice } = useSelectedMicDevice();
const { getSelectedSpeakerDevice } = useSelectedSpeakerDevice();
const { getMicThreshold, getEnableAutomaticMicThreshold } = useMicThreshold();
const { getSpeakerThreshold, getEnableAutomaticSpeakerThreshold } = useSpeakerThreshold();
const { getEnableAutoClearMessageInputBox } = useEnableAutoClearMessageInputBox();
const { getEnableSendOnlyTranslatedMessages } = useEnableSendOnlyTranslatedMessages();
const { getEnableAutoExportMessageLogs } = useEnableAutoExportMessageLogs();
const { getEnableVrcMicMuteSync } = useEnableVrcMicMuteSync();
const { getEnableSendMessageToVrc } = useEnableSendMessageToVrc();
const { getSendMessageButtonType } = useSendMessageButtonType();
const { getUiLanguage } = useUiLanguage();
const { getUiScaling } = useUiScaling();
const { getMessageLogUiScaling } = useMessageLogUiScaling();
const { getSelectedFontFamily } = useSelectedFontFamily();
const { getTransparency } = useTransparency();
const {
getSelectedPresetTabNumber,
getEnableMultiTranslation,
getSelectedYourLanguages,
getSelectedTargetLanguages,
getTranslationEngines,
getSelectedTranslationEngines,
} = useLanguageSettings();
const { getSelectableLanguageList } = useSelectableLanguageList();
const { getMessageInputBoxRatio } = useMessageInputBoxRatio();
const { getMicRecordTimeout } = useMicRecordTimeout();
const { getMicPhraseTimeout } = useMicPhraseTimeout();
const { getMicMaxWords } = useMicMaxWords();
const { getMicWordFilterList } = useMicWordFilterList();
const { getSpeakerRecordTimeout } = useSpeakerRecordTimeout();
const { getSpeakerPhraseTimeout } = useSpeakerPhraseTimeout();
const { getSpeakerMaxWords } = useSpeakerMaxWords();
const { getOscIpAddress } = useOscIpAddress();
const { getOscPort } = useOscPort();
useEffect(() => {
if (!hasRunRef.current) {
asyncStartPython().then(() => {
startFeedingToWatchDog();
fetchAndUpdateWindowGeometry();
getUiLanguage();
getUiScaling();
getMessageLogUiScaling();
getIsMainPageCompactMode();
getMessageInputBoxRatio();
getTransparency();
asyncFetchFonts();
getSelectedFontFamily();
getSoftwareVersion();
getSelectedPresetTabNumber();
getEnableMultiTranslation();
getSelectedYourLanguages();
getSelectedTargetLanguages();
getSelectableLanguageList();
getTranslationEngines();
getSelectedTranslationEngines();
getMicHostList();
getMicDeviceList();
getSpeakerDeviceList();
getEnableAutoMicSelect();
getEnableAutoSpeakerSelect();
getSelectedMicHost();
getSelectedMicDevice();
getSelectedSpeakerDevice();
getMicThreshold();
getSpeakerThreshold();
getEnableAutomaticMicThreshold();
getEnableAutomaticSpeakerThreshold();
getMicRecordTimeout();
getMicPhraseTimeout();
getMicMaxWords();
getMicWordFilterList();
getSpeakerRecordTimeout();
getSpeakerPhraseTimeout();
getSpeakerMaxWords();
getEnableAutoClearMessageInputBox();
getSendMessageButtonType();
getEnableSendOnlyTranslatedMessages();
getEnableAutoExportMessageLogs();
getEnableVrcMicMuteSync();
getEnableSendMessageToVrc();
getOscIpAddress();
getOscPort();
}).catch((err) => {
console.error(err);
});

View File

@@ -51,9 +51,6 @@ export const useWindow = () => {
}
};
const fetchAndUpdateWindowGeometry = () => {
asyncStdoutToPython("/get/data/main_window_geometry");
};
const WindowGeometryController = () => {
useEffect(() => {
@@ -86,7 +83,6 @@ export const useWindow = () => {
return {
WindowGeometryController,
asyncSaveWindowGeometry,
fetchAndUpdateWindowGeometry,
restoreWindowGeometry,
};
};

View File

@@ -362,9 +362,21 @@ export const useReceiveRoutes = () => {
"/set/data/speaker_max_phrases": updateSpeakerMaxWords,
};
const receiveRoutes = (parsed_data) => {
const initDataSyncProcess = (payload) => {
for (const [endpoint, value] of Object.entries(payload)) {
const route = routes[endpoint];
(route) ? route(value) : console.error(`Invalid endpoint: ${endpoint}\vvalue: ${JSON.stringify(value)}`);
}
};
switch (parsed_data.status) {
case 200:
if (parsed_data.endpoint === "/run/initialization_complete") {
initDataSyncProcess(parsed_data.result);
break;
};
const route = routes[parsed_data.endpoint];
(route) ? route(parsed_data.result) : console.error(`Invalid endpoint: ${parsed_data.endpoint}\nresult: ${JSON.stringify(parsed_data.result)}`);
break;