Merge branch 'multi_language' into for_webui

This commit is contained in:
misyaguziya
2024-09-09 17:46:06 +09:00
4 changed files with 157 additions and 210 deletions

View File

@@ -157,60 +157,6 @@ class Config:
if isinstance(value, bool):
self._ENABLE_FOREGROUND = value
@property
def SOURCE_COUNTRY(self):
return self._SOURCE_COUNTRY
@SOURCE_COUNTRY.setter
def SOURCE_COUNTRY(self, value):
if isinstance(value, str):
self._SOURCE_COUNTRY = value
@property
def SOURCE_LANGUAGE(self):
return self._SOURCE_LANGUAGE
@SOURCE_LANGUAGE.setter
def SOURCE_LANGUAGE(self, value):
if isinstance(value, str):
self._SOURCE_LANGUAGE = value
@property
def TARGET_COUNTRY(self):
return self._TARGET_COUNTRY
@TARGET_COUNTRY.setter
def TARGET_COUNTRY(self, value):
if isinstance(value, str):
self._TARGET_COUNTRY = value
@property
def TARGET_LANGUAGE(self):
return self._TARGET_LANGUAGE
@TARGET_LANGUAGE.setter
def TARGET_LANGUAGE(self, value):
if isinstance(value, str):
self._TARGET_LANGUAGE = value
@property
def CHOICE_INPUT_TRANSLATOR(self):
return self._CHOICE_INPUT_TRANSLATOR
@CHOICE_INPUT_TRANSLATOR.setter
def CHOICE_INPUT_TRANSLATOR(self, value):
if value in list(translation_lang.keys()):
self._CHOICE_INPUT_TRANSLATOR= value
@property
def CHOICE_OUTPUT_TRANSLATOR(self):
return self._CHOICE_OUTPUT_TRANSLATOR
@CHOICE_OUTPUT_TRANSLATOR.setter
def CHOICE_OUTPUT_TRANSLATOR(self, value):
if value in list(translation_lang.keys()):
self._CHOICE_OUTPUT_TRANSLATOR = value
# @property
# def SENT_MESSAGES_LOG(self):
# return self._SENT_MESSAGES_LOG
@@ -301,11 +247,12 @@ class Config:
try:
if isinstance(value, dict):
value_old = self.SELECTED_TAB_YOUR_LANGUAGES
for k, v in value.items():
language = v["language"]
country = v["country"]
for k0, v0 in value.items():
for k1, v1 in v0.items():
language = v1["language"]
country = v1["country"]
if language not in list(transcription_lang.keys()) or country not in list(transcription_lang[language].keys()):
value[k] = value_old[k]
value[k0][k1] = value_old[k0][k1]
self._SELECTED_TAB_YOUR_LANGUAGES = value
except Exception:
pass
@@ -321,11 +268,12 @@ class Config:
try:
if isinstance(value, dict):
value_old = self.SELECTED_TAB_TARGET_LANGUAGES
for k, v in value.items():
language = v["language"]
country = v["country"]
for k0, v0 in value.items():
for k1, v1 in v0.items():
language = v1["language"]
country = v1["country"]
if language not in list(transcription_lang.keys()) or country not in list(transcription_lang[language].keys()):
value[k] = value_old[k]
value[k0][k1] = value_old[k0][k1]
self._SELECTED_TAB_TARGET_LANGUAGES = value
except Exception:
pass
@@ -342,6 +290,17 @@ class Config:
self._SELECTED_TRANSCRIPTION_ENGINE = value
# saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value)
@property
@json_serializable('ENABLE_MULTI_TRANSLATION')
def ENABLE_MULTI_TRANSLATION(self):
return self._ENABLE_MULTI_TRANSLATION
@ENABLE_MULTI_TRANSLATION.setter
def ENABLE_MULTI_TRANSLATION(self, value):
if isinstance(value, bool):
self._ENABLE_MULTI_TRANSLATION = value
saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value)
@property
@json_serializable('IS_MAIN_WINDOW_SIDEBAR_COMPACT_MODE')
def IS_MAIN_WINDOW_SIDEBAR_COMPACT_MODE(self):
@@ -1000,12 +959,7 @@ class Config:
self._ENABLE_TRANSCRIPTION_SEND = False
self._ENABLE_TRANSCRIPTION_RECEIVE = False
self._ENABLE_FOREGROUND = False
self._CHOICE_INPUT_TRANSLATOR = "CTranslate2"
self._CHOICE_OUTPUT_TRANSLATOR = "CTranslate2"
self._SOURCE_LANGUAGE = "Japanese"
self._SOURCE_COUNTRY = "Japan"
self._TARGET_LANGUAGE = "English"
self._TARGET_COUNTRY = "United States"
# self._SENT_MESSAGES_LOG = []
# self._CURRENT_SENT_MESSAGES_LOG_INDEX = 0
self._IS_RESET_BUTTON_DISPLAYED_FOR_TRANSLATION = False
@@ -1027,33 +981,70 @@ class Config:
}
self._SELECTED_TAB_YOUR_LANGUAGES = {
"1":{
"primary":{
"language":"Japanese",
"country":"Japan"
},
},
"2":{
"primary":{
"language":"Japanese",
"country":"Japan"
},
},
"3":{
"primary":{
"language":"Japanese",
"country":"Japan"
},
},
}
self._SELECTED_TAB_TARGET_LANGUAGES = {
"1":{
"primary":{
"language":"English",
"country":"United States",
},
"secondary":{
"language":"English",
"country":"United States"
},
"tertiary":{
"language":"English",
"country":"United States"
},
},
"2":{
"primary":{
"language":"English",
"country":"United States",
},
"secondary":{
"language":"English",
"country":"United States"
},
"3":{
"tertiary":{
"language":"English",
"country":"United States"
},
},
"3":{
"primary":{
"language":"English",
"country":"United States",
},
"secondary":{
"language":"English",
"country":"United States"
},
"tertiary":{
"language":"English",
"country":"United States"
},
},
}
self._SELECTED_TRANSCRIPTION_ENGINE = "Google"
self._ENABLE_MULTI_TRANSLATION = False
self._IS_MAIN_WINDOW_SIDEBAR_COMPACT_MODE = False
## Config Window

View File

@@ -167,7 +167,12 @@ class Model:
compatible_engines = []
for engine in list(translation_lang.keys()):
languages = translation_lang.get(engine, {}).get("source", {})
if source_lang in languages and target_lang in languages:
source_langs = [e["language"] for e in list(source_lang.values())]
target_langs = [e["language"] for e in list(target_lang.values())]
language_list = list(languages.keys())
if all(e in language_list for e in source_langs) and all(e in language_list for e in target_langs):
compatible_engines.append(engine)
if "DeepL_API" in compatible_engines:
if config.AUTH_KEYS["DeepL_API"] is None:
@@ -202,11 +207,17 @@ class Model:
return translation, success_flag
def getInputTranslate(self, message):
translator_name=config.CHOICE_INPUT_TRANSLATOR
source_language=config.SOURCE_LANGUAGE
target_language=config.TARGET_LANGUAGE
target_country = config.TARGET_COUNTRY
translator_name=config.SELECTED_TAB_YOUR_TRANSLATOR_ENGINES[config.SELECTED_TAB_NO]
source_language=config.SELECTED_TAB_YOUR_LANGUAGES[config.SELECTED_TAB_NO]
target_languages=config.SELECTED_TAB_TARGET_LANGUAGES[config.SELECTED_TAB_NO]
translations = []
success_flags = []
for key in target_languages.keys():
if key == "primary" or config.ENABLE_MULTI_TRANSLATION is True:
target_language = target_languages[key]["language"]
target_country = target_languages[key]["country"]
if target_language is not None or target_country is not None:
translation, success_flag = self.getTranslate(
translator_name,
source_language,
@@ -214,13 +225,16 @@ class Model:
target_country,
message
)
return translation, success_flag
translations.append(translation)
success_flags.append(success_flag)
return translations, success_flags
def getOutputTranslate(self, message):
translator_name=config.CHOICE_OUTPUT_TRANSLATOR
source_language=config.TARGET_LANGUAGE
target_language=config.SOURCE_LANGUAGE
target_country=config.SOURCE_COUNTRY
translator_name=config.SELECTED_TAB_TARGET_TRANSLATOR_ENGINES[config.SELECTED_TAB_NO]
source_language=config.SELECTED_TAB_TARGET_LANGUAGES[config.SELECTED_TAB_NO]["primary"]["language"]
target_language=config.SELECTED_TAB_YOUR_LANGUAGES[config.SELECTED_TAB_NO]["primary"]["language"]
target_country=config.SELECTED_TAB_YOUR_LANGUAGES[config.SELECTED_TAB_NO]["primary"]["country"]
translation, success_flag = self.getTranslate(
translator_name,
@@ -430,8 +444,8 @@ class Model:
try:
res = self.mic_transcriber.transcribeAudioQueue(
self.mic_audio_queue,
config.SOURCE_LANGUAGE,
config.SOURCE_COUNTRY,
config.SELECTED_TAB_YOUR_LANGUAGES[config.SELECTED_TAB_NO]["primary"]["language"],
config.SELECTED_TAB_YOUR_LANGUAGES[config.SELECTED_TAB_NO]["primary"]["country"],
config.INPUT_MIC_AVG_LOGPROB,
config.INPUT_MIC_NO_SPEECH_PROB
)
@@ -590,8 +604,8 @@ class Model:
try:
res = self.speaker_transcriber.transcribeAudioQueue(
speaker_audio_queue,
config.TARGET_LANGUAGE,
config.TARGET_COUNTRY,
config.SELECTED_TAB_TARGET_LANGUAGES[config.SELECTED_TAB_NO]["primary"]["language"],
config.SELECTED_TAB_TARGET_LANGUAGES[config.SELECTED_TAB_NO]["primary"]["country"],
config.INPUT_SPEAKER_AVG_LOGPROB,
config.INPUT_SPEAKER_NO_SPEECH_PROB
)
@@ -673,8 +687,8 @@ class Model:
self.speaker_energy_recorder = None
def createOverlayImageShort(self, message, translation):
your_language = config.TARGET_LANGUAGE
target_language = config.SOURCE_LANGUAGE
your_language = config.SELECTED_TAB_TARGET_LANGUAGES[config.SELECTED_TAB_NO]["primary"]["language"]
target_language = config.SELECTED_TAB_YOUR_LANGUAGES[config.SELECTED_TAB_NO]["primary"]["language"]
ui_type = config.OVERLAY_UI_TYPE
self.pre_overlay_message = {
"message" : message,
@@ -685,11 +699,6 @@ class Model:
}
return self.overlay_image.createOverlayImageShort(message, your_language, translation, target_language, ui_type)
# def createOverlayImageLong(self, message_type, message, translation):
# your_language = config.TARGET_LANGUAGE if message_type == "receive" else config.SOURCE_LANGUAGE
# target_language = config.SOURCE_LANGUAGE if message_type == "receive" else config.TARGET_LANGUAGE
# return self.overlay_image.create_overlay_image_long(message_type, message, your_language, translation, target_language)
def clearOverlayImage(self):
self.overlay.clearImage()

View File

@@ -61,7 +61,7 @@ def callbackFilepathConfigFile(*args, **kwargs) -> dict:
# config.OVERLAY_UI_TYPE = "sakura"
# return {"status":200, "result":config.IS_EASTER_EGG_ENABLED}
def messageFormatter(format_type:str, translation, message):
def messageFormatter(format_type:str, translation:list, message:list):
if format_type == "RECEIVED":
FORMAT_WITH_T = config.RECEIVED_MESSAGE_FORMAT_WITH_T
FORMAT = config.RECEIVED_MESSAGE_FORMAT
@@ -72,16 +72,15 @@ def messageFormatter(format_type:str, translation, message):
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)
osc_message = FORMAT_WITH_T.replace("[message]", "/".join(message))
osc_message = osc_message.replace("[translation]", "/".join(translation))
else:
osc_message = FORMAT.replace("[message]", message)
osc_message = FORMAT.replace("[message]", "/".join(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"
config.SELECTED_TAB_YOUR_TRANSLATOR_ENGINES[config.SELECTED_TAB_NO] = "CTranslate2"
config.SELECTED_TAB_TARGET_TRANSLATOR_ENGINES[config.SELECTED_TAB_NO] = "CTranslate2"
updateTranslationEngineAndEngineList()
# func transcription send message
@@ -99,7 +98,7 @@ class MicMessage:
})
elif isinstance(message, str) and len(message) > 0:
# addSentMessageLog(message)
translation = ""
translation = []
if model.checkKeywords(message):
self.action("word_filter", {
"status":200,
@@ -127,11 +126,11 @@ class MicMessage:
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)
osc_message = messageFormatter("SEND", "", [message])
else:
osc_message = messageFormatter("SEND", "", translation)
else:
osc_message = messageFormatter("SEND", translation, message)
osc_message = messageFormatter("SEND", translation, [message])
model.oscSendMessage(osc_message)
self.action("mic", {
@@ -143,7 +142,7 @@ class MicMessage:
})
if config.ENABLE_LOGGER is True:
if len(translation) > 0:
translation = f" ({translation})"
translation = " (" + "/".join(translation) + ")"
model.logger.info(f"[SENT] {message}{translation}")
# if config.ENABLE_OVERLAY_SMALL_LOG is True:
@@ -229,7 +228,7 @@ class SpeakerMessage:
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)
osc_message = messageFormatter("RECEIVED", translation, [message])
model.oscSendMessage(osc_message)
# ------------Speaker2Chatbox------------
@@ -243,7 +242,7 @@ class SpeakerMessage:
})
if config.ENABLE_LOGGER is True:
if len(translation) > 0:
translation = f" ({translation})"
translation = " (" + "/".join(translation) + ")"
model.logger.info(f"[RECEIVED] {message}{translation}")
def startTranscriptionReceiveMessage(action:Callable[[dict], None]) -> None:
@@ -291,7 +290,7 @@ class ChatMessage:
message = data["message"]
if len(message) > 0:
# addSentMessageLog(message)
translation = ""
translation = []
if config.ENABLE_TRANSLATION is False:
pass
else:
@@ -309,11 +308,11 @@ class ChatMessage:
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)
osc_message = messageFormatter("SEND", "", [message])
else:
osc_message = messageFormatter("SEND", "", translation)
else:
osc_message = messageFormatter("SEND", translation, message)
osc_message = messageFormatter("SEND", translation, [message])
model.oscSendMessage(osc_message)
# if config.ENABLE_OVERLAY_SMALL_LOG is True:
@@ -325,7 +324,7 @@ class ChatMessage:
# update textbox message log (Sent)
if config.ENABLE_LOGGER is True:
if len(translation) > 0:
translation = f" ({translation})"
translation = " (" + "/".join(translation) + ")"
model.logger.info(f"[SENT] {message}{translation}")
return {"status":200,
@@ -375,72 +374,40 @@ def callbackMessageBoxTypingStop(*args, **kwargs) -> dict:
# updateMessageBox(1)
def updateTranslationEngineAndEngineList():
engine = config.CHOICE_INPUT_TRANSLATOR
engines = model.findTranslationEngines(config.SOURCE_LANGUAGE, config.TARGET_LANGUAGE)
engine = config.SELECTED_TAB_YOUR_TRANSLATOR_ENGINES[config.SELECTED_TAB_NO]
engines = model.findTranslationEngines(
config.SELECTED_TAB_YOUR_LANGUAGES[config.SELECTED_TAB_NO],
config.SELECTED_TAB_TARGET_LANGUAGES[config.SELECTED_TAB_NO])
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"]
config.SELECTED_TAB_YOUR_TRANSLATOR_ENGINES[config.SELECTED_TAB_NO] = engine
config.SELECTED_TAB_TARGET_TRANSLATOR_ENGINES[config.SELECTED_TAB_NO] = engine
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:
printLog("setYourLanguageAndCountry", select)
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":200,
"result":{
"your":{
"language":config.SOURCE_LANGUAGE,
"country":config.SOURCE_COUNTRY
}
}
}
return {"status":200}
def setTargetLanguageAndCountry(select:dict, *args, **kwargs) -> dict:
printLog("setTargetLanguageAndCountry", select)
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":200,
"result":{
"target":{
"language":config.TARGET_LANGUAGE,
"country":config.TARGET_COUNTRY
},
}
}
return {"status":200}
def swapYourLanguageAndTargetLanguage(*args, **kwargs) -> dict:
printLog("swapYourLanguageAndTargetLanguage")
@@ -448,41 +415,13 @@ def swapYourLanguageAndTargetLanguage(*args, **kwargs) -> dict:
target_language = config.SELECTED_TAB_TARGET_LANGUAGES[config.SELECTED_TAB_NO]
setYourLanguageAndCountry(target_language)
setTargetLanguageAndCountry(your_language)
return {"status":200,
"result":{
"your":{"language":config.SOURCE_LANGUAGE,
"country":config.SOURCE_COUNTRY,
},
"target":{
"language":config.TARGET_LANGUAGE,
"country":config.TARGET_COUNTRY,
},
},
}
return {"status":200}
def callbackSelectedLanguagePresetTab(selected_tab_no:str, *args, **kwargs) -> dict:
printLog("callbackSelectedLanguagePresetTab", selected_tab_no)
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":200, "result":config.SELECTED_TAB_NO}
return {"status":200}
def callbackSelectedTranslationEngine(selected_translation_engine:str, *args, **kwargs) -> dict:
printLog("callbackSelectedTranslationEngine", selected_translation_engine)
@@ -1270,10 +1209,6 @@ def getListOutputDevice(*args, **kwargs) -> dict:
def init(endpoints:dict, *args, **kwargs) -> None:
printLog("Start Initialization")
printLog("Start InitSetTranslateEngine")
initSetTranslateEngine()
printLog("Start Init LanguageAndCountry")
initSetLanguageAndCountry()
printLog("Start check DeepL API Key")
if config.AUTH_KEYS["DeepL_API"] is not None:

View File

@@ -21,12 +21,6 @@ config_mapping = {
"/config/enable_transcription_send": "ENABLE_TRANSCRIPTION_SEND",
"/config/enable_transcription_receive": "ENABLE_TRANSCRIPTION_RECEIVE",
"/config/enable_foreground": "ENABLE_FOREGROUND",
"/config/source_country": "SOURCE_COUNTRY",
"/config/source_language": "SOURCE_LANGUAGE",
"/config/target_country": "TARGET_COUNTRY",
"/config/target_language": "TARGET_LANGUAGE",
"/config/choice_input_translator": "CHOICE_INPUT_TRANSLATOR",
"/config/choice_output_translator": "CHOICE_OUTPUT_TRANSLATOR",
"/config/is_reset_button_displayed_for_translation": "IS_RESET_BUTTON_DISPLAYED_FOR_TRANSLATION",
"/config/is_reset_button_displayed_for_whisper": "IS_RESET_BUTTON_DISPLAYED_FOR_WHISPER",
"/config/selected_tab_no": "SELECTED_TAB_NO",
@@ -334,9 +328,27 @@ if __name__ == "__main__":
case "/controller/callback_messagebox_send":
data = {"id":"123456", "message":"テスト"}
case "/controller/set_your_language_and_country":
data = {"language": "English", "country": "Hong Kong"}
data = {
"primary": {
"language": "English",
"country": "Hong Kong"
}
}
case "/controller/set_target_language_and_country":
data = {"language": "Japanese", "country": "Japan"}
data = {
"primary": {
"language": "Japanese",
"country": "Japan"
},
"secondary": {
"language": "English",
"country": "United States"
},
"tertiary": {
"language": "Chinese Simplified",
"country": "China"
}
}
case "/controller/callback_set_transparency":
data = 0.5
case "/controller/callback_set_appearance":