From ab2dc073b9b04c9feb5bcee9b0761cd1f2e53de3 Mon Sep 17 00:00:00 2001 From: misyaguziya Date: Wed, 11 Sep 2024 11:08:51 +0900 Subject: [PATCH 1/2] =?UTF-8?q?=F0=9F=9A=A7=20[WIP/TEST]=20Model=20:=20?= =?UTF-8?q?=E6=97=A5=E6=9C=AC=E8=AA=9E=E3=81=B2=E3=82=89=E3=81=8C=E3=81=AA?= =?UTF-8?q?/=E3=83=AD=E3=83=BC=E3=83=9E=E5=AD=97=20=E5=A4=89=E6=8F=9B?= =?UTF-8?q?=E3=81=AE=E5=AE=9F=E8=A3=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- requirements.txt | 1 + src-python/config.py | 24 ++++++++++++++++++++++++ src-python/model.py | 14 +++++++++++++- src-python/webui_controller.py | 5 +++++ 4 files changed, 43 insertions(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index bf32dda5..2b4bc322 100644 --- a/requirements.txt +++ b/requirements.txt @@ -13,6 +13,7 @@ faster-whisper==1.0.3 openvr==1.26.701 pydub==0.25.1 psutil==5.9.8 +pykakasi==2.3.0 translators @ git+https://github.com/misyaguziya/translators@5.9.2 SpeechRecognition @ git+https://github.com/misyaguziya/custom_speech_recognition@3.10.4 tinyoscquery @ git+https://github.com/cyberkitsune/tinyoscquery@0.1.2 \ No newline at end of file diff --git a/src-python/config.py b/src-python/config.py index 899172b8..5ccfbc6f 100644 --- a/src-python/config.py +++ b/src-python/config.py @@ -301,6 +301,28 @@ class Config: self._ENABLE_MULTI_LANGUAGE_TRANSLATION = value saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) + @property + @json_serializable('ENABLE_CONVERT_MESSAGE_TO_ROMAJI') + def ENABLE_CONVERT_MESSAGE_TO_ROMAJI(self): + return self._ENABLE_CONVERT_MESSAGE_TO_ROMAJI + + @ENABLE_CONVERT_MESSAGE_TO_ROMAJI.setter + def ENABLE_CONVERT_MESSAGE_TO_ROMAJI(self, value): + if isinstance(value, bool): + self._ENABLE_CONVERT_MESSAGE_TO_ROMAJI = value + saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) + + @property + @json_serializable('ENABLE_CONVERT_MESSAGE_TO_HIRAGANA') + def ENABLE_CONVERT_MESSAGE_TO_HIRAGANA(self): + return self._ENABLE_CONVERT_MESSAGE_TO_HIRAGANA + + @ENABLE_CONVERT_MESSAGE_TO_HIRAGANA.setter + def ENABLE_CONVERT_MESSAGE_TO_HIRAGANA(self, value): + if isinstance(value, bool): + self._ENABLE_CONVERT_MESSAGE_TO_HIRAGANA = 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): @@ -1045,6 +1067,8 @@ class Config: } self._SELECTED_TRANSCRIPTION_ENGINE = "Google" self._ENABLE_MULTI_LANGUAGE_TRANSLATION = False + self._ENABLE_CONVERT_MESSAGE_TO_ROMAJI = False + self._ENABLE_CONVERT_MESSAGE_TO_HIRAGANA = False self._IS_MAIN_WINDOW_SIDEBAR_COMPACT_MODE = False ## Config Window diff --git a/src-python/model.py b/src-python/model.py index bbe8235d..b6a97f3a 100644 --- a/src-python/model.py +++ b/src-python/model.py @@ -15,13 +15,13 @@ import webbrowser from typing import Callable from flashtext import KeywordProcessor +from pykakasi import kakasi from models.translation.translation_translator import Translator from models.transcription.transcription_utils import getInputDevices, getOutputDevices from models.osc.osc_tools import sendTyping, sendMessage, receiveOscParameters, getOSCParameterValue from models.transcription.transcription_recorder import SelectedMicEnergyAndAudioRecorder, SelectedSpeakerEnergyAndAudioRecorder from models.transcription.transcription_recorder import SelectedMicEnergyRecorder, SelectedSpeakerEnergyRecorder from models.transcription.transcription_transcriber import AudioTranscriber -from models.xsoverlay.notification import xsoverlayForVRCT from models.translation.translation_languages import translation_lang from models.transcription.transcription_languages import transcription_lang from models.translation.translation_utils import checkCTranslate2Weight, downloadCTranslate2Weight @@ -99,6 +99,7 @@ class Model: self.mic_audio_queue = None self.mic_mute_status = None self.mic_mute_status_check = None + self.kks = kakasi() def checkCTranslatorCTranslate2ModelWeight(self): return checkCTranslate2Weight(config.PATH_LOCAL, config.CTRANSLATE2_WEIGHT_TYPE) @@ -270,6 +271,17 @@ class Model: self.previous_receive_message = message return repeat_flag + def convertMessageToRomajiAndHiragana(self, message: str, hiragana:bool, romaji:bool) -> str: + data_list = self.kks.convert(message) + if + keys_to_keep = {"orig", "hira", "hepburn"} + filtered_list = [] + + for item in data_list: + filtered_item = {key: value for key, value in item.items() if key in keys_to_keep} + filtered_list.append(filtered_item) + return filtered_list + @staticmethod def oscStartSendTyping(): sendTyping(True, config.OSC_IP_ADDRESS, config.OSC_PORT) diff --git a/src-python/webui_controller.py b/src-python/webui_controller.py index d431bef4..9aaf4e89 100644 --- a/src-python/webui_controller.py +++ b/src-python/webui_controller.py @@ -303,6 +303,10 @@ class ChatMessage: } }) + message_romaji = [] + if config.ENABLE_CONVERT_MESSAGE_TO_ROMAJI is True or config.ENABLE_CONVERT_MESSAGE_TO_HIRAGANA is True: + message_romaji = model.convertMessageToRomajiAndHiragana(message) + # send OSC message if config.ENABLE_SEND_MESSAGE_TO_VRC is True: if config.ENABLE_SEND_ONLY_TRANSLATED_MESSAGES is True: @@ -331,6 +335,7 @@ class ChatMessage: "id":id, "message":message, "translation":translation, + "romaji":message_romaji, }, } From ce28366278b3fc9c0f99cef2d070421a3d266c51 Mon Sep 17 00:00:00 2001 From: misyaguziya Date: Thu, 12 Sep 2024 00:42:49 +0900 Subject: [PATCH 2/2] =?UTF-8?q?=F0=9F=91=8D=EF=B8=8F=20[Update]=20Model=20?= =?UTF-8?q?:=20=E6=97=A5=E6=9C=AC=E8=AA=9E=E3=81=B2=E3=82=89=E3=81=8C?= =?UTF-8?q?=E3=81=AA/=E3=83=AD=E3=83=BC=E3=83=9E=E5=AD=97=20=E5=A4=89?= =?UTF-8?q?=E6=8F=9B=E3=81=AE=E5=AE=9F=E8=A3=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ローマ字/ひらがな有効でかつ以下の場合に動作 - 送信の翻訳時にtargetのプライマリが日本語の場合 - 受診時にtargetのプライマリが日本語の場合 --- src-python/model.py | 4 +-- src-python/webui_controller.py | 45 +++++++++++++++++++++++++++++----- src-python/webui_mainloop.py | 7 ++++++ 3 files changed, 47 insertions(+), 9 deletions(-) diff --git a/src-python/model.py b/src-python/model.py index b6a97f3a..04bd85bc 100644 --- a/src-python/model.py +++ b/src-python/model.py @@ -271,12 +271,10 @@ class Model: self.previous_receive_message = message return repeat_flag - def convertMessageToRomajiAndHiragana(self, message: str, hiragana:bool, romaji:bool) -> str: + def convertMessageToTransliteration(self, message: str) -> str: data_list = self.kks.convert(message) - if keys_to_keep = {"orig", "hira", "hepburn"} filtered_list = [] - for item in data_list: filtered_item = {key: value for key, value in item.items() if key in keys_to_keep} filtered_list.append(filtered_item) diff --git a/src-python/webui_controller.py b/src-python/webui_controller.py index 9aaf4e89..41411cb0 100644 --- a/src-python/webui_controller.py +++ b/src-python/webui_controller.py @@ -98,6 +98,7 @@ class MicMessage: elif isinstance(message, str) and len(message) > 0: # addSentMessageLog(message) translation = [] + transliteration = [] if model.checkKeywords(message): self.action("word_filter", { "status":200, @@ -121,6 +122,10 @@ class MicMessage: } }) + if config.ENABLE_CONVERT_MESSAGE_TO_ROMAJI is True or config.ENABLE_CONVERT_MESSAGE_TO_HIRAGANA is True: + if config.SELECTED_TAB_TARGET_LANGUAGES[config.SELECTED_TAB_NO]["primary"]["language"] == "Japanese": + transliteration = model.convertMessageToTransliteration(translation[0]) + 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: @@ -136,7 +141,8 @@ class MicMessage: "status":200, "result": { "message":message, - "translation":translation + "translation":translation, + "transliteration":transliteration } }) if config.ENABLE_LOGGER is True: @@ -200,6 +206,7 @@ class SpeakerMessage: }) elif isinstance(message, str) and len(message) > 0: translation = [] + transliteration = [] if model.detectRepeatReceiveMessage(message): return elif config.ENABLE_TRANSLATION is False: @@ -215,6 +222,10 @@ class SpeakerMessage: } }) + if config.ENABLE_CONVERT_MESSAGE_TO_ROMAJI is True or config.ENABLE_CONVERT_MESSAGE_TO_HIRAGANA is True: + if config.SELECTED_TAB_TARGET_LANGUAGES[config.SELECTED_TAB_NO]["primary"]["language"] == "Japanese": + transliteration = model.convertMessageToTransliteration(message) + if config.ENABLE_TRANSCRIPTION_RECEIVE is True: if config.ENABLE_OVERLAY_SMALL_LOG is True: if model.overlay.initialized is True: @@ -236,7 +247,8 @@ class SpeakerMessage: "status":200, "result": { "message":message, - "translation":translation + "translation":translation, + "transliteration":transliteration, } }) if config.ENABLE_LOGGER is True: @@ -290,6 +302,7 @@ class ChatMessage: if len(message) > 0: # addSentMessageLog(message) translation = [] + transliteration = [] if config.ENABLE_TRANSLATION is False: pass else: @@ -303,9 +316,9 @@ class ChatMessage: } }) - message_romaji = [] - if config.ENABLE_CONVERT_MESSAGE_TO_ROMAJI is True or config.ENABLE_CONVERT_MESSAGE_TO_HIRAGANA is True: - message_romaji = model.convertMessageToRomajiAndHiragana(message) + if config.ENABLE_CONVERT_MESSAGE_TO_ROMAJI is True or config.ENABLE_CONVERT_MESSAGE_TO_HIRAGANA is True: + if config.SELECTED_TAB_TARGET_LANGUAGES[config.SELECTED_TAB_NO]["primary"]["language"] == "Japanese": + transliteration = model.convertMessageToTransliteration(translation[0]) # send OSC message if config.ENABLE_SEND_MESSAGE_TO_VRC is True: @@ -335,7 +348,7 @@ class ChatMessage: "id":id, "message":message, "translation":translation, - "romaji":message_romaji, + "transliteration":transliteration, }, } @@ -505,6 +518,26 @@ def callbackDisableMultiLanguageTranslation(*args, **kwargs) -> dict: config.ENABLE_MULTI_LANGUAGE_TRANSLATION = False return {"status":200, "result":config.ENABLE_MULTI_LANGUAGE_TRANSLATION} +def callbackEnableConvertMessageToRomaji(*args, **kwargs) -> dict: + printLog("Enable Convert Message To Romaji") + config.ENABLE_CONVERT_MESSAGE_TO_ROMAJI = True + return {"status":200, "result":config.ENABLE_CONVERT_MESSAGE_TO_ROMAJI} + +def callbackDisableConvertMessageToRomaji(*args, **kwargs) -> dict: + printLog("Disable Convert Message To Romaji") + config.ENABLE_CONVERT_MESSAGE_TO_ROMAJI = False + return {"status":200, "result":config.ENABLE_CONVERT_MESSAGE_TO_ROMAJI} + +def callbackEnableConvertMessageToHiragana(*args, **kwargs) -> dict: + printLog("Enable Convert Message To Hiragana") + config.ENABLE_CONVERT_MESSAGE_TO_HIRAGANA = True + return {"status":200, "result":config.ENABLE_CONVERT_MESSAGE_TO_HIRAGANA} + +def callbackDisableConvertMessageToHiragana(*args, **kwargs) -> dict: + printLog("Disable Convert Message To Hiragana") + config.ENABLE_CONVERT_MESSAGE_TO_HIRAGANA = False + return {"status":200, "result":config.ENABLE_CONVERT_MESSAGE_TO_HIRAGANA} + def callbackEnableMainWindowSidebarCompactMode(*args, **kwargs) -> dict: printLog("Enable MainWindow Sidebar Compact Mode") config.IS_MAIN_WINDOW_SIDEBAR_COMPACT_MODE = True diff --git a/src-python/webui_mainloop.py b/src-python/webui_mainloop.py index 7425b956..deb3d63b 100644 --- a/src-python/webui_mainloop.py +++ b/src-python/webui_mainloop.py @@ -30,6 +30,8 @@ config_mapping = { "/config/selected_tab_target_languages": "SELECTED_TAB_TARGET_LANGUAGES", "/config/selected_transcription_engine": "SELECTED_TRANSCRIPTION_ENGINE", "/config/enable_multi_translation": "ENABLE_MULTI_LANGUAGE_TRANSLATION", + "/config/enable_convert_message_to_romaji": "ENABLE_CONVERT_MESSAGE_TO_ROMAJI", + "/config/enable_convert_message_to_hiragana": "ENABLE_CONVERT_MESSAGE_TO_HIRAGANA", "/config/is_main_window_sidebar_compact_mode": "IS_MAIN_WINDOW_SIDEBAR_COMPACT_MODE", "/config/transparency": "TRANSPARENCY", "/config/appearance_theme": "APPEARANCE_THEME", @@ -98,6 +100,10 @@ controller_mapping = { "/controller/callback_close_config_window": controller.callbackCloseConfigWindow, "/controller/callback_enable_multi_language_translation": controller.callbackEnableMultiLanguageTranslation, "/controller/callback_disable_multi_language_translation": controller.callbackDisableMultiLanguageTranslation, + "/controller/callback_enable_convert_message_to_romaji": controller.callbackEnableConvertMessageToRomaji, + "/controller/callback_disable_convert_message_to_romaji": controller.callbackDisableConvertMessageToRomaji, + "/controller/callback_enable_convert_message_to_hiragana": controller.callbackEnableConvertMessageToHiragana, + "/controller/callback_disable_convert_message_to_hiragana": controller.callbackDisableConvertMessageToHiragana, "/controller/callback_enable_main_window_sidebar_compact_mode": controller.callbackEnableMainWindowSidebarCompactMode, "/controller/callback_disable_main_window_sidebar_compact_mode": controller.callbackDisableMainWindowSidebarCompactMode, "/controller/callback_enable_translation": controller.callbackEnableTranslation, @@ -331,6 +337,7 @@ if __name__ == "__main__": match endpoint: case "/controller/callback_messagebox_send": # handleControllerRequest("/controller/callback_enable_translation") + # handleControllerRequest("/controller/callback_enable_convert_message_to_romaji") data = {"id":"123456", "message":"テスト"} case "/controller/callback_selected_translation_engine": data = "DeepL"