From 42cddcfe8091f7a6789e8a750666bd6d47025ce3 Mon Sep 17 00:00:00 2001 From: misygauziya Date: Mon, 24 Jul 2023 00:18:21 +0900 Subject: [PATCH 01/18] [Add] notification.py --- notification.py | 73 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 notification.py diff --git a/notification.py b/notification.py new file mode 100644 index 00000000..5d3d0898 --- /dev/null +++ b/notification.py @@ -0,0 +1,73 @@ +# ########################################################################################################################### +# DOCUMENT:https://xiexe.github.io/XSOverlayDocumentation/#/NotificationsAPI +# SOURCE:https://zenn.dev/eeharumt/scraps/95f49a62dd809a +# messageType: int = 0 # 1: ポップアップ通知, 2: メディアプレーヤー情報 +# index: int = 0 # メディアプレーヤーでのみ使用され、手首のアイコンを変更する +# timeout: float = 0.5 # 通知インジケータが表示され続ける時間[秒] +# height: float = 175 # 通知インジケータの高さ +# opacity: float = 1 # 通知インジケータの透明度。0.0-1.0の範囲で低いほど透明に +# volume: float = 0.7 # 通知音の大きさ +# audioPath: str = "" # 通知音ファイルのパス。規定音として"default", "error", "warning"を指定可能。空文字列で通知音なしにできる。 +# title: str = "" # 通知タイトル、リッチテキストフォーマットをサポート。 +# content: str = "" # 通知内容、リッチテキストフォーマットをサポート。省略することで小サイズ通知となる。 +# useBase64Icon: bool = False # TrueにすることでBase64の画像を表示する +# icon: str = "" # Base64画像イメージまたは画像ファイルパス。規定アイコンとして"default", "error", or "warning"を指定可能 +# sourceApp: str = "" # 通知したアプリ名(デバック用) +# ########################################################################################################################## + +import socket +import json +import base64 + +def notification_xsoverlay( + endpoint:tuple=("127.0.0.1", 42069), messageType:int=0, index:int=0, timeout:float=1, + height:float=120.0, opacity:float=1.0, volume:float=0.5, audioPath:str="default", + title:str="", content:str="", useBase64Icon:bool=False, icon:str="default", sourceApp:str="" +) -> int: + + if icon in ["default", "error", "warning"]: + icon_data = icon + elif useBase64Icon: + try: + with open(icon, "rb") as f: + icon_data_bytes = f.read() + icon_data = base64.b64encode(icon_data_bytes).decode("utf-8") + except: + icon_data = "default" + else: + icon_data = icon + + sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) + + data_msg = { + "messageType": messageType, + "index": index, + "timeout":timeout, + "height": height, + "opacity": opacity, + "volume": volume, + "audioPath": audioPath, + "title": title, + "content": content, + "useBase64Icon": useBase64Icon, + "icon": icon_data, + "sourceApp": sourceApp, + } + msg_str = json.dumps(data_msg) + msg_byte = msg_str.encode("utf-8") + response = sock.sendto(msg_byte, endpoint) + sock.close() + return response + +def notification_xsoverlay_for_vrct(content:str="") -> int: + response = notification_xsoverlay( + title="VRCT", + content=content, + useBase64Icon=True, + icon="./img/app.ico", + sourceApp="VRCT" + ) + return response + +if __name__ == "__main__": + notification_xsoverlay_for_vrct(content="notification test") \ No newline at end of file From 53ddab3fc0b52cfd14012d276ef15877e0cb44be Mon Sep 17 00:00:00 2001 From: misygauziya Date: Mon, 24 Jul 2023 00:43:39 +0900 Subject: [PATCH 02/18] =?UTF-8?q?[update]=20Speaker=E3=81=8B=E3=82=89?= =?UTF-8?q?=E3=81=AE=E6=96=87=E5=AD=97=E8=B5=B7=E3=81=93=E3=81=97=E7=B5=90?= =?UTF-8?q?=E6=9E=9C=E3=82=92XSOverlay=E3=81=AE=E9=80=9A=E7=9F=A5=E6=A9=9F?= =?UTF-8?q?=E8=83=BD=E3=81=A7=E8=A1=A8=E7=A4=BA=E3=81=99=E3=82=8B=E6=A9=9F?= =?UTF-8?q?=E8=83=BD=E3=82=92=E8=BF=BD=E5=8A=A0(VR=E9=99=90=E5=AE=9A)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- VRCT.py | 11 ++++++++++- locales.yml | 2 ++ utils.py | 6 +++--- window_config.py | 29 ++++++++++++++++++++++++++++- 4 files changed, 43 insertions(+), 5 deletions(-) diff --git a/VRCT.py b/VRCT.py index 84c72f23..8b0a9f13 100644 --- a/VRCT.py +++ b/VRCT.py @@ -18,6 +18,7 @@ from audio_utils import get_input_device_list, get_output_device_list, get_defau from audio_recorder import SelectedMicRecorder, SelectedSpeakerRecorder from audio_transcriber import AudioTranscriber from translation import Translator +from notification import notification_xsoverlay_for_vrct class App(CTk): def __init__(self, *args, **kwargs): @@ -65,6 +66,7 @@ class App(CTk): self.INPUT_SPEAKER_RECORD_TIMEOUT = 3 self.INPUT_SPEAKER_PHRASE_TIMEOUT = 3 self.INPUT_SPEAKER_MAX_PHRASES = 10 + ## Parameter self.OSC_IP_ADDRESS = "127.0.0.1" self.OSC_PORT = 9000 @@ -77,6 +79,7 @@ class App(CTk): self.MESSAGE_FORMAT = "[message]([translation])" # Others self.ENABLE_AUTO_CLEAR_CHATBOX = False + self.ENABLE_NOTICE_XSOVERLAY =False # load config if os_path.isfile(self.PATH_CONFIG) is not False: @@ -209,6 +212,9 @@ class App(CTk): if "ENABLE_AUTO_CLEAR_CHATBOX" in config.keys(): if type(config["ENABLE_AUTO_CLEAR_CHATBOX"]) is bool: self.ENABLE_AUTO_CLEAR_CHATBOX = config["ENABLE_AUTO_CLEAR_CHATBOX"] + if "ENABLE_NOTICE_XSOVERLAY" in config.keys(): + if type(config["ENABLE_NOTICE_XSOVERLAY"]) is bool: + self.ENABLE_NOTICE_XSOVERLAY = config["ENABLE_NOTICE_XSOVERLAY"] with open(self.PATH_CONFIG, 'w') as fp: config = { @@ -247,6 +253,7 @@ class App(CTk): "AUTH_KEYS": self.AUTH_KEYS, "MESSAGE_FORMAT": self.MESSAGE_FORMAT, "ENABLE_AUTO_CLEAR_CHATBOX": self.ENABLE_AUTO_CLEAR_CHATBOX, + "ENABLE_NOTICE_XSOVERLAY": self.ENABLE_NOTICE_XSOVERLAY, } json_dump(config, fp, indent=4) @@ -567,6 +574,8 @@ class App(CTk): # update textbox message receive log print_textbox(self.textbox_message_log, f"{voice_message}", "RECEIVE") print_textbox(self.textbox_message_receive_log, f"{voice_message}", "RECEIVE") + if self.ENABLE_NOTICE_XSOVERLAY is True: + notification_xsoverlay_for_vrct(content=f"{voice_message}") self.spk_print_transcript = thread_fnc(spk_transcript_to_textbox) self.spk_print_transcript.daemon = True @@ -654,7 +663,7 @@ class App(CTk): print_textbox(self.textbox_message_send_log, f"{chat_message}", "SEND") # delete message in entry message box - if self.ENABLE_AUTO_CLEAR_CHATBOX == True: + if self.ENABLE_AUTO_CLEAR_CHATBOX is True: self.entry_message_box.delete(0, customtkinter.END) BREAK_KEYSYM_LIST = [ diff --git a/locales.yml b/locales.yml index 79b5fd86..f4b80300 100644 --- a/locales.yml +++ b/locales.yml @@ -60,6 +60,7 @@ en: # tab Others label_checkbox_auto_clear_chatbox: "Auto clear chat box" + label_checkbox_notice_xsoverlay: "Notification XSOverlay" ja: @@ -125,6 +126,7 @@ ja: # tab Others label_checkbox_auto_clear_chatbox: "送信後はチャットボックスを空にする" + label_checkbox_notice_xsoverlay: "XSOverlayの通知機能を有効" ko: diff --git a/utils.py b/utils.py index 0e63f179..ac2eb35d 100644 --- a/utils.py +++ b/utils.py @@ -100,15 +100,15 @@ def widget_config_window_label_setter(self, language_yaml_data): "label_input_speaker_phrase_timeout", "label_input_speaker_max_phrases", - # tab Parameter "label_ip_address", "label_port", "label_authkey", "label_message_format", - + # tab Others - "label_checkbox_auto_clear_chatbox" + "label_checkbox_auto_clear_chatbox", + "label_checkbox_notice_xsoverlay", ] for name in widget_names: widget = getattr(self, name) diff --git a/window_config.py b/window_config.py index 89adde9a..7c8b2173 100644 --- a/window_config.py +++ b/window_config.py @@ -492,6 +492,11 @@ class ToplevelWindowConfig(CTkToplevel): self.parent.ENABLE_AUTO_CLEAR_CHATBOX = value save_json(self.parent.PATH_CONFIG, "ENABLE_AUTO_CLEAR_CHATBOX", self.parent.ENABLE_AUTO_CLEAR_CHATBOX) + def checkbox_notice_xsoverlay_callback(self): + value = self.checkbox_notice_xsoverlay.get() + self.parent.ENABLE_NOTICE_XSOVERLAY = value + save_json(self.parent.PATH_CONFIG, "ENABLE_NOTICE_XSOVERLAY", self.parent.ENABLE_NOTICE_XSOVERLAY) + def delete_window(self): self.checkbox_input_mic_threshold_check.deselect() self.checkbox_input_speaker_threshold_check.deselect() @@ -1381,7 +1386,7 @@ class ToplevelWindowConfig(CTkToplevel): # tab Others ## checkbox auto clear chat box - row += 1 + row = 0 self.label_checkbox_auto_clear_chatbox = CTkLabel( self.tabview_config.tab(config_tab_title_others), text=init_lang_text, @@ -1403,4 +1408,26 @@ class ToplevelWindowConfig(CTkToplevel): else: self.checkbox_auto_clear_chatbox.deselect() + # checkbox notice xsoverlay + row += 1 + self.label_checkbox_notice_xsoverlay = CTkLabel( + self.tabview_config.tab(config_tab_title_others), + text=init_lang_text, + fg_color="transparent", + font=CTkFont(family=self.parent.FONT_FAMILY) + ) + self.label_checkbox_notice_xsoverlay.grid(row=row, column=0, columnspan=1, padx=padx, pady=pady, sticky="nsw") + self.checkbox_notice_xsoverlay = CTkCheckBox( + self.tabview_config.tab(config_tab_title_others), + text="", + onvalue=True, + offvalue=False, + command=self.checkbox_notice_xsoverlay_callback, + font=CTkFont(family=self.parent.FONT_FAMILY) + ) + self.checkbox_notice_xsoverlay.grid(row=row, column=1, columnspan=1, padx=padx, pady=pady, sticky="nsew") + if self.parent.ENABLE_NOTICE_XSOVERLAY is True: + self.checkbox_notice_xsoverlay.select() + else: + self.checkbox_notice_xsoverlay.deselect() widget_config_window_label_setter(self, language_yaml_data) \ No newline at end of file From 36374d69790735638a108739ed410837dd4408b1 Mon Sep 17 00:00:00 2001 From: misygauziya Date: Mon, 24 Jul 2023 23:50:35 +0900 Subject: [PATCH 03/18] =?UTF-8?q?[Add]=20init=E6=99=82=E3=81=ABOSC?= =?UTF-8?q?=E3=81=AE=E8=B5=B7=E5=8B=95=E7=A2=BA=E8=AA=8D=E3=82=92=E8=A1=8C?= =?UTF-8?q?=E3=81=86=E5=87=A6=E7=90=86=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 裏でOSC receive処理は回りっぱなし --- VRCT.py | 30 ++++++++++++++++++++++++++---- osc_tools.py | 18 +++++++++++++++++- 2 files changed, 43 insertions(+), 5 deletions(-) diff --git a/VRCT.py b/VRCT.py index 84c72f23..64cc44b6 100644 --- a/VRCT.py +++ b/VRCT.py @@ -10,7 +10,7 @@ from flashtext import KeywordProcessor from threading import Thread from utils import save_json, print_textbox, thread_fnc, get_localized_text, widget_main_window_label_setter -from osc_tools import send_typing, send_message +from osc_tools import send_typing, send_message, send_test_action, receive_osc_parameters from window_config import ToplevelWindowConfig from window_information import ToplevelWindowInformation from languages import transcription_lang, translators, translation_lang, selectable_languages @@ -77,6 +77,7 @@ class App(CTk): self.MESSAGE_FORMAT = "[message]([translation])" # Others self.ENABLE_AUTO_CLEAR_CHATBOX = False + self.ENABLE_OSC = False # load config if os_path.isfile(self.PATH_CONFIG) is not False: @@ -403,6 +404,14 @@ class App(CTk): self.config_window = ToplevelWindowConfig(self) + # start receive osc + th_receive_osc_parameters = Thread(target=receive_osc_parameters, args=(self.check_osc_receive,)) + th_receive_osc_parameters.daemon = True + th_receive_osc_parameters.start() + + # check osc started + send_test_action() + def button_config_callback(self): self.checkbox_translation.configure(state="disabled") self.checkbox_transcription_send.configure(state="disabled") @@ -477,8 +486,12 @@ class App(CTk): voice_message = self.MESSAGE_FORMAT.replace("[message]", message).replace("[translation]", result) if self.checkbox_transcription_send.get() is True: - # send OSC message - send_message(voice_message, self.OSC_IP_ADDRESS, self.OSC_PORT) + if self.ENABLE_OSC is True: + # send OSC message + send_message(voice_message, self.OSC_IP_ADDRESS, self.OSC_PORT) + else: + print_textbox(self.textbox_message_log, "OSC is not enabled, please enable OSC and rejoin.", "ERROR") + print_textbox(self.textbox_message_system_log, "OSC is not enabled, please enable OSC and rejoin.", "ERROR") # update textbox message log print_textbox(self.textbox_message_log, f"{voice_message}", "SEND") print_textbox(self.textbox_message_send_log, f"{voice_message}", "SEND") @@ -647,7 +660,11 @@ class App(CTk): chat_message = self.MESSAGE_FORMAT.replace("[message]", message).replace("[translation]", result) # send OSC message - send_message(chat_message, self.OSC_IP_ADDRESS, self.OSC_PORT) + if self.ENABLE_OSC is True: + send_message(chat_message, self.OSC_IP_ADDRESS, self.OSC_PORT) + else: + print_textbox(self.textbox_message_log, "OSC is not enabled, please enable OSC and rejoin.", "ERROR") + print_textbox(self.textbox_message_system_log, "OSC is not enabled, please enable OSC and rejoin.", "ERROR") # update textbox message log print_textbox(self.textbox_message_log, f"{chat_message}", "SEND") @@ -747,6 +764,11 @@ class App(CTk): widget_main_window_label_setter(self, language_yaml_data) + def check_osc_receive(self, address, osc_arguments): + if self.ENABLE_OSC is False: + self.ENABLE_OSC = True + # print(address, osc_arguments) + if __name__ == "__main__": try: app = App() diff --git a/osc_tools.py b/osc_tools.py index dacda522..7c7d9504 100644 --- a/osc_tools.py +++ b/osc_tools.py @@ -1,5 +1,9 @@ +from time import sleep +from typing import List from pythonosc import osc_message_builder from pythonosc import udp_client +from pythonosc import dispatcher +from pythonosc import osc_server # send OSC message typing def send_typing(flag=False, ip_address="127.0.0.1", port=9000): @@ -18,4 +22,16 @@ def send_message(message=None, ip_address="127.0.0.1", port=9000): msg.add_arg(True) b_msg = msg.build() client = udp_client.SimpleUDPClient(ip_address, port) - client.send(b_msg) \ No newline at end of file + client.send(b_msg) + +def send_test_action(ip_address="127.0.0.1", port=9000): + client = udp_client.SimpleUDPClient(ip_address, port) + client.send_message("/input/Vertical", 1) + sleep(0.01) + client.send_message("/input/Vertical", False) + +def receive_osc_parameters(target, filter="/*", ip_address="127.0.0.1", port=9001): + _dispatcher = dispatcher.Dispatcher() + _dispatcher.map(filter, target) + server = osc_server.ThreadingOSCUDPServer((ip_address, port), _dispatcher) + server.serve_forever() \ No newline at end of file From 972353fec23847d1a97c942776fce4db2e2d3718 Mon Sep 17 00:00:00 2001 From: misygauziya Date: Tue, 25 Jul 2023 11:25:56 +0900 Subject: [PATCH 04/18] [Add] img/xsoverlay.png MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 大きい画像だと送信できなかったため、32x32で作成 --- img/xsoverlay.png | Bin 0 -> 1209 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 img/xsoverlay.png diff --git a/img/xsoverlay.png b/img/xsoverlay.png new file mode 100644 index 0000000000000000000000000000000000000000..35c793eaed87c7b132f6b5400b732341c3e74660 GIT binary patch literal 1209 zcmV;q1V;ObP)EX>4Tx04UFukvmAkP!xv$rWPMm9PFUt5TQERMMWG-6pLV?v=v%)FuCaqnlvOS zE{=k0!NJF3)xpJCR|i)?5PX2Rx;QDiNQvhrg%+WL7Y_I1zxV$+_gp}zmzidDMFCB> z&16gxGuc(K`xOBUQ;nflW|k38EvC_Neci*y_qzzs!v9vknzI<-6N#hDFm2)u;@M5x z;Ji;9VntacJ|~_usX^jLt}7nDaW1$l@XU~zPRr|tNVF__0AVNVEC6r+!Lc30ig(RIz9sDD%KS3^qTqQ7a zET94nvg-%`gWt2Y^3zjZQcwZ{FOKsu4s`DVjhf?pA3ILt1n@rtS9;4|sRMJLq}N(n z_y`!-1}?5!nz9F6?f^qihHT2NMD1tTjqx>_{=000?uMObu0Z*6U5Zgc=ca%Ew3 zWn>_CX>@2HM@dakSAh-}0007zNklKpZw0w%6M~B1PFzS{!IeUb z+V%4@9U}oh&A@9A_IkbZXf*oE zXf%?!H7SZ>jK||Ayq2Zq9vzd-W>@@Wt!%?er9#_8FHRR= z$IMom%_jM><^!qSZcmu4bUK|eV&al7*X#9jW?#JxGnov_PznZ#^mKA(#|pO4dg z96Op!Ci?lyO90lFVo8$3YPHHW8Vzo-Sja4_3%*pV)kd_oSfT|B>!KKWbPQdKg;i~o zz&3Sw7cA?Lz}^#}g7OMHbGclTSS)r&jcy>P( Date: Tue, 25 Jul 2023 11:26:54 +0900 Subject: [PATCH 05/18] =?UTF-8?q?[Update]=20XSOverlay=E3=81=AE=E8=A1=A8?= =?UTF-8?q?=E7=A4=BA=E3=81=AEparameter=E3=82=92=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- notification.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/notification.py b/notification.py index 5d3d0898..61e18725 100644 --- a/notification.py +++ b/notification.py @@ -20,8 +20,8 @@ import json import base64 def notification_xsoverlay( - endpoint:tuple=("127.0.0.1", 42069), messageType:int=0, index:int=0, timeout:float=1, - height:float=120.0, opacity:float=1.0, volume:float=0.5, audioPath:str="default", + endpoint:tuple=("127.0.0.1", 42069), messageType:int=1, index:int=0, timeout:float=2, + height:float=120.0, opacity:float=1.0, volume:float=0.0, audioPath:str="", title:str="", content:str="", useBase64Icon:bool=False, icon:str="default", sourceApp:str="" ) -> int: @@ -54,8 +54,7 @@ def notification_xsoverlay( "sourceApp": sourceApp, } msg_str = json.dumps(data_msg) - msg_byte = msg_str.encode("utf-8") - response = sock.sendto(msg_byte, endpoint) + response = sock.sendto(msg_str.encode("utf-8"), endpoint) sock.close() return response @@ -64,7 +63,7 @@ def notification_xsoverlay_for_vrct(content:str="") -> int: title="VRCT", content=content, useBase64Icon=True, - icon="./img/app.ico", + icon="./img/xsoverlay.png", sourceApp="VRCT" ) return response From e0d0c4f048deb4e365e09dab8cc6b41236002ee6 Mon Sep 17 00:00:00 2001 From: misygauziya Date: Wed, 26 Jul 2023 03:11:05 +0900 Subject: [PATCH 06/18] =?UTF-8?q?[bugfix]=20=E6=96=87=E5=AD=97=E8=B5=B7?= =?UTF-8?q?=E3=81=93=E3=81=97=E3=81=AE=E8=A8=80=E8=AA=9E=E8=AA=AC=E6=98=8E?= =?UTF-8?q?=E3=82=92google=E3=82=92=E5=8F=82=E8=80=83=E3=81=AB=E4=BF=AE?= =?UTF-8?q?=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit https://cloud.google.com/speech-to-text/docs/speech-to-text-supported-languages --- languages.py | 176 +++++++++++++++++++++++++-------------------------- 1 file changed, 88 insertions(+), 88 deletions(-) diff --git a/languages.py b/languages.py index 2c5c1615..9f00f8b6 100644 --- a/languages.py +++ b/languages.py @@ -1,93 +1,93 @@ transcription_lang = { "Japanese Japan":"ja-JP", - "English United States":"en-US", - "English United Kingdom":"en-GB", - "Afrikaans South Africa":"af-ZA", - "Arabic Algeria":"ar-DZ", - "Arabic Bahrain":"ar-BH", - "Arabic Egypt":"ar-EG", - "Arabic Israel":"ar-IL", - "Arabic Iraq":"ar-IQ", - "Arabic Jordan":"ar-JO", - "Arabic Kuwait":"ar-KW", - "Arabic Lebanon":"ar-LB", - "Arabic Morocco":"ar-MA", - "Arabic Oman":"ar-OM", - "Arabic Palestinian Territory":"ar-PS", - "Arabic Qatar":"ar-QA", - "Arabic Saudi Arabia":"ar-SA", - "Arabic Tunisia":"ar-TN", - "Arabic UAE":"ar-AE", - "Euskara Spain":"eu-ES", - "Bulgarian Bulgaria":"bg-BG", - "Catalan Spain":"ca-ES", - "Mongolian China (Simp.)":"cmn-Hans-CN", - "Mongolian Hong Kong SAR (Trad.)":"cmn-Hans-HK", - "Mongolian Taiwan (Trad.)":"cmn-Hant-TW", - "Cantonese Hong Kong":"yue-Hant-HK", - "Hrvatska Croatia":"hr_HR", - "Czech Republic":"cs-CZ", - "Danish Denmark":"da-DK", - "English Australia":"en-AU", - "English Canada":"en-CA", - "English India":"en-IN", - "English Ireland":"en-IE", - "English New Zealand":"en-NZ", - "English Philippines":"en-PH", - "English South Africa":"en-ZA", - "Persian Iran":"fa-IR", - "French France":"fr-FR", - "Filipino Philippines":"fil-PH", - "Galician Spain":"gl-ES", - "German Germany":"de-DE", - "Greek Greece":"el-GR", - "Finnish Finland":"fi-FI", - "Hebrew Israel":"he-IL", - "Hindi India":"hi-IN", - "Hungarian Hungary":"hu-HU", - "Indonesian Indonesia":"id-ID", - "Icelandic Iceland":"is-IS", - "Italian Italy":"it-IT", - "Italian Switzerland":"it-CH", - "Korean Korea":"ko-KR", - "Lithuanian Lithuania":"lt-LT", - "Malay Malaysia":"ms-MY", - "Nederlands Netherlands":"nl-NL", - "Bokmål Norway":"nb-NO", - "Polski Poland":"pl-PL", - "Português Brazil":"pt-BR", - "Português Portugal":"pt-PT", - "limba română Romania":"ro-RO", - "Russian Russia":"ru-RU", - "Serbian Serbia":"sr-RS", - "Slovak Slovakia":"sk-SK", - "Slovenian Slovenia":"sl-SI", - "Spanish Argentina":"es-AR", - "Spanish Bolivia":"es-BO", - "Spanish Chile":"es-CL", - "Spanish Colombia":"es-CO", - "Spanish Costa Rica":"es-CR", - "Spanish Dominican Republic":"es-DO", - "Spanish Ecuador":"es-EC", - "Spanish El Salvador":"es-SV", - "Spanish Guatemala":"es-GT", - "Spanish Honduras":"es-HN", - "Spanish México":"es-MX", - "Spanish Nicaragua":"es-NI", - "Spanish Panamá":"es-PA", - "Spanish Paraguay":"es-PY", - "Spanish Perú":"es-PE", - "Spanish Puerto Rico":"es-PR", - "Spanish Spain":"es-ES", - "Spanish Uruguay":"es-UY", - "Spanish United States":"es-US", - "Spanish Venezuela":"es-VE", - "Swedish Sweden":"sv-SE", - "Thai Thailand":"th-TH", - "Turkish Turkey":"tr-TR", - "Ukrainian Ukraine":"uk-UA", - "Vietnamese Viet Nam":"vi-VN", - "Zulu South Africa":"zu-ZA" + "English (United States)":"en-US", + "English (United Kingdom)":"en-GB", + "Afrikaans (South Africa)":"af-ZA", + "Arabic (Algeria)":"ar-DZ", + "Arabic (Bahrain)":"ar-BH", + "Arabic (Egypt)":"ar-EG", + "Arabic (Israel)":"ar-IL", + "Arabic (Iraq)":"ar-IQ", + "Arabic (Jordan)":"ar-JO", + "Arabic (Kuwait)":"ar-KW", + "Arabic (Lebanon)":"ar-LB", + "Arabic (Morocco)":"ar-MA", + "Arabic (Oman)":"ar-OM", + "Arabic (State of Palestine)":"ar-PS", + "Arabic (Qatar)":"ar-QA", + "Arabic (Saudi Arabia)":"ar-SA", + "Arabic (Tunisia)":"ar-TN", + "Arabic (United Arab Emirates)":"ar-AE", + "Basque (Spain)":"eu-ES", + "Bulgarian (Bulgaria)":"bg-BG", + "Catalan (Spain)":"ca-ES", + "Chinese, Mandarin (Simplified, China)":"cmn-Hans-CN", + "Chinese, Mandarin (Simplified, Hong Kong)":"cmn-Hans-HK", + "Chinese, Mandarin (Traditional, Taiwan)":"cmn-Hant-TW", + "Chinese, Cantonese (Traditional Hong Kong)":"yue-Hant-HK", + "Croatian (Croatia)":"hr_HR", + "Czech (Czech Republic)":"cs-CZ", + "Danish (Denmark)":"da-DK", + "English (Australia)":"en-AU", + "English (Canada)":"en-CA", + "English (India)":"en-IN", + "English (Ireland)":"en-IE", + "English (New Zealand)":"en-NZ", + "English (Philippines)":"en-PH", + "English (South Africa)":"en-ZA", + "Persian (Iran)":"fa-IR", + "French (France)":"fr-FR", + "Filipino (Philippines)":"fil-PH", + "Galician (Spain)":"gl-ES", + "German (Germany)":"de-DE", + "Greek (Greece)":"el-GR", + "Finnish (Finland)":"fi-FI", + "Hebrew (Israel)":"he-IL", + "Hindi (India)":"hi-IN", + "Hungarian (Hungary)":"hu-HU", + "Indonesian (Indonesia)":"id-ID", + "Icelandic (Iceland)":"is-IS", + "Italian (Italy)":"it-IT", + "Italian (Switzerland)":"it-CH", + "Korean (South Korea)":"ko-KR", + "Lithuanian (Lithuania)":"lt-LT", + "Malay (Malaysia)":"ms-MY", + "Dutch (Netherlands)":"nl-NL", + "Norwegian Bokmål (Norway)":"nb-NO", + "Polish (Poland)":"pl-PL", + "Portuguese (Brazil)":"pt-BR", + "Portuguese (Portugal)":"pt-PT", + "Romanian (Romania)":"ro-RO", + "Russian (Russia)":"ru-RU", + "Serbian (Serbia)":"sr-RS", + "Slovak (Slovakia)":"sk-SK", + "Slovenian (Slovenia)":"sl-SI", + "Spanish (Argentina)":"es-AR", + "Spanish (Bolivia)":"es-BO", + "Spanish (Chile)":"es-CL", + "Spanish (Colombia)":"es-CO", + "Spanish (Costa Rica)":"es-CR", + "Spanish (Dominican Republic)":"es-DO", + "Spanish (Ecuador)":"es-EC", + "Spanish (El Salvador)":"es-SV", + "Spanish (Guatemala)":"es-GT", + "Spanish (Honduras)":"es-HN", + "Spanish (Mexico)":"es-MX", + "Spanish (Nicaragua)":"es-NI", + "Spanish (Panama)":"es-PA", + "Spanish (Paraguay)":"es-PY", + "Spanish (Peru)":"es-PE", + "Spanish (Puerto Rico)":"es-PR", + "Spanish (Spain)":"es-ES", + "Spanish (Uruguay)":"es-UY", + "Spanish (United States)":"es-US", + "Spanish (Venezuela)":"es-VE", + "Swedish (Sweden)":"sv-SE", + "Thai (Thailand)":"th-TH", + "Turkish (Turkey)":"tr-TR", + "Ukrainian (Ukraine)":"uk-UA", + "Vietnamese (Vietnam)":"vi-VN", + "Zulu (South Africa)":"zu-ZA" } translators = ["DeepL(web)", "DeepL(auth)", "Google(web)", "Bing(web)"] From 01c8dc95ae6d22cb7100b3153a769747162e82bb Mon Sep 17 00:00:00 2001 From: misygauziya Date: Wed, 26 Jul 2023 03:19:36 +0900 Subject: [PATCH 07/18] [bugfix] typo hr_HR -> hr-HR --- languages.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/languages.py b/languages.py index 9f00f8b6..ab9428f1 100644 --- a/languages.py +++ b/languages.py @@ -25,7 +25,7 @@ transcription_lang = { "Chinese, Mandarin (Simplified, Hong Kong)":"cmn-Hans-HK", "Chinese, Mandarin (Traditional, Taiwan)":"cmn-Hant-TW", "Chinese, Cantonese (Traditional Hong Kong)":"yue-Hant-HK", - "Croatian (Croatia)":"hr_HR", + "Croatian (Croatia)":"hr-HR", "Czech (Czech Republic)":"cs-CZ", "Danish (Denmark)":"da-DK", "English (Australia)":"en-AU", From 6bf2b4d975749193699ee2c98d32aac05a595d81 Mon Sep 17 00:00:00 2001 From: misygauziya Date: Wed, 26 Jul 2023 03:56:42 +0900 Subject: [PATCH 08/18] [Update] Add translate languages [Korean, Indonesian, Ukrainian, Turkish, Norwegian] for DeepL(web) --- languages.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/languages.py b/languages.py index ab9428f1..0daa3d3a 100644 --- a/languages.py +++ b/languages.py @@ -95,6 +95,7 @@ translation_lang = {} translation_lang["DeepL(web)"] = { "Japanese":"JA", "English":"EN", + "Korean":"KO", "Bulgarian":"BG", "Chinese":"ZH", "Czech":"CS", @@ -116,7 +117,11 @@ translation_lang["DeepL(web)"] = { "Slovak":"SK", "Slovenian":"SL", "Spanish":"ES", - "Swedish":"SV" + "Swedish":"SV", + "Indonesian":"ID", + "Ukrainian":"UK", + "Turkish":"TR", + "Norwegian":"NB", } translation_lang["DeepL(auth)"] = { "Japanese":"ja", From 6627b5e7e6b3800cbacf92de09928d9467b78ee3 Mon Sep 17 00:00:00 2001 From: misygauziya Date: Wed, 26 Jul 2023 06:48:56 +0900 Subject: [PATCH 09/18] =?UTF-8?q?[Update]=20config=20window=E3=82=92?= =?UTF-8?q?=E3=82=B0=E3=83=A9=E3=83=83=E3=83=97=E3=81=99=E3=82=8B=E3=82=88?= =?UTF-8?q?=E3=81=86=E3=81=AB=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- VRCT.py | 9 +++++++++ window_config.py | 11 ++++++++++- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/VRCT.py b/VRCT.py index 1ed48de2..bcd8fcf1 100644 --- a/VRCT.py +++ b/VRCT.py @@ -423,11 +423,20 @@ class App(CTk): self.checkbox_translation.configure(state="disabled") self.checkbox_transcription_send.configure(state="disabled") self.checkbox_transcription_receive.configure(state="disabled") + self.checkbox_foreground.configure(state="disabled") + self.tabview_logs.configure(state="disabled") + self.textbox_message_log.configure(state="disabled") + self.textbox_message_send_log.configure(state="disabled") + self.textbox_message_receive_log.configure(state="disabled") + self.textbox_message_system_log.configure(state="disabled") + self.entry_message_box.configure(state="disabled") self.button_config.configure(state="disabled", fg_color=["gray92", "gray14"]) + self.button_information.configure(state="disabled", fg_color=["gray92", "gray14"]) self.config_window.deiconify() self.config_window.focus_set() self.config_window.focus() + self.config_window.grab_set() def button_information_callback(self): if self.information_window is None or not self.information_window.winfo_exists(): diff --git a/window_config.py b/window_config.py index 7c8b2173..c5f0da9a 100644 --- a/window_config.py +++ b/window_config.py @@ -506,8 +506,17 @@ class ToplevelWindowConfig(CTkToplevel): self.parent.checkbox_translation.configure(state="normal") self.parent.checkbox_transcription_send.configure(state="normal") self.parent.checkbox_transcription_receive.configure(state="normal") + self.parent.checkbox_foreground.configure(state="normal") + self.parent.tabview_logs.configure(state="normal") + self.parent.textbox_message_log.configure(state="normal") + self.parent.textbox_message_send_log.configure(state="normal") + self.parent.textbox_message_receive_log.configure(state="normal") + self.parent.textbox_message_system_log.configure(state="normal") + self.parent.entry_message_box.configure(state="normal") self.parent.button_config.configure(state="normal", fg_color=["#3B8ED0", "#1F6AA5"]) - self.parent.config_window.withdraw() + self.parent.button_information.configure(state="normal", fg_color=["#3B8ED0", "#1F6AA5"]) + self.withdraw() + self.grab_release() def entry_message_format_callback(self, event): value = self.entry_message_format.get() From 9be6e3de41a112bda6760157d85631e4bf1b388d Mon Sep 17 00:00:00 2001 From: misygauziya Date: Wed, 26 Jul 2023 11:23:44 +0900 Subject: [PATCH 10/18] =?UTF-8?q?[Update]=20main=20window=20=E3=81=AEcheck?= =?UTF-8?q?box=E3=82=92ON=E3=81=AE=E7=8A=B6=E6=85=8B=E3=81=A7=E3=82=82conf?= =?UTF-8?q?ig=E3=82=92=E9=96=8B=E3=81=91=E3=82=8B=E3=82=88=E3=81=86?= =?UTF-8?q?=E3=81=AB=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- VRCT.py | 91 +++++++++++++++++++++++++++++++++--------------- window_config.py | 3 +- 2 files changed, 65 insertions(+), 29 deletions(-) diff --git a/VRCT.py b/VRCT.py index bcd8fcf1..bb1fd21e 100644 --- a/VRCT.py +++ b/VRCT.py @@ -1,3 +1,4 @@ +from time import sleep from os import path as os_path from json import load as json_load from json import dump as json_dump @@ -33,8 +34,8 @@ class App(CTk): ## main window self.ENABLE_TRANSLATION = False - self.ENABLE_TRANSCRIPTION_SEND = False - self.ENABLE_TRANSCRIPTION_RECEIVE = False + # self.ENABLE_TRANSCRIPTION_SEND = False + # self.ENABLE_TRANSCRIPTION_RECEIVE = False self.ENABLE_FOREGROUND = False ## UI self.TRANSPARENCY = 100 @@ -420,6 +421,8 @@ class App(CTk): send_test_action() def button_config_callback(self): + self.foreground_stop() + self.transcription_stop() self.checkbox_translation.configure(state="disabled") self.checkbox_transcription_send.configure(state="disabled") self.checkbox_transcription_receive.configure(state="disabled") @@ -432,7 +435,6 @@ class App(CTk): self.entry_message_box.configure(state="disabled") self.button_config.configure(state="disabled", fg_color=["gray92", "gray14"]) self.button_information.configure(state="disabled", fg_color=["gray92", "gray14"]) - self.config_window.deiconify() self.config_window.focus_set() self.config_window.focus() @@ -445,18 +447,13 @@ class App(CTk): def checkbox_translation_callback(self): self.ENABLE_TRANSLATION = self.checkbox_translation.get() - if self.ENABLE_TRANSLATION: - self.button_config.configure(state="disabled", fg_color=["gray92", "gray14"]) + if self.ENABLE_TRANSLATION is True: print_textbox(self.textbox_message_log, "Start translation", "INFO") print_textbox(self.textbox_message_system_log, "Start translation", "INFO") else: - if ((self.checkbox_translation.get() is False) and - (self.checkbox_transcription_send.get() is False) and - (self.checkbox_transcription_receive.get() is False)): - self.button_config.configure(state="normal", fg_color=["#3B8ED0", "#1F6AA5"]) print_textbox(self.textbox_message_log, "Stop translation", "INFO") print_textbox(self.textbox_message_system_log, "Stop translation", "INFO") - save_json(self.PATH_CONFIG, "ENABLE_TRANSLATION", self.ENABLE_TRANSLATION) + def transcription_send_start(self): self.mic_audio_queue = Queue() @@ -529,20 +526,24 @@ class App(CTk): print_textbox(self.textbox_message_log, "Stop voice2chatbox", "INFO") print_textbox(self.textbox_message_system_log, "Stop voice2chatbox", "INFO") - if ((self.checkbox_translation.get() is False) and - (self.checkbox_transcription_send.get() is False) and - (self.checkbox_transcription_receive.get() is False)): - self.button_config.configure(state="normal", fg_color=["#3B8ED0", "#1F6AA5"]) self.checkbox_transcription_send.configure(state="normal") self.checkbox_transcription_receive.configure(state="normal") + def transcription_send_stop_for_config(self): + if isinstance(self.mic_print_transcript, thread_fnc): + self.mic_print_transcript.stop() + if self.mic_audio_recorder.stop != None: + self.mic_audio_recorder.stop() + self.mic_audio_recorder.stop = None + + print_textbox(self.textbox_message_log, "Stop voice2chatbox", "INFO") + print_textbox(self.textbox_message_system_log, "Stop voice2chatbox", "INFO") + def checkbox_transcription_send_callback(self): self.checkbox_transcription_send.configure(state="disabled") self.checkbox_transcription_receive.configure(state="disabled") - self.button_config.configure(state="disabled", fg_color=["gray92", "gray14"]) self.update() - self.ENABLE_TRANSCRIPTION_SEND = self.checkbox_transcription_send.get() - if self.ENABLE_TRANSCRIPTION_SEND is True: + if self.checkbox_transcription_send.get() is True: th_transcription_send_start = Thread(target=self.transcription_send_start) th_transcription_send_start.daemon = True th_transcription_send_start.start() @@ -550,7 +551,6 @@ class App(CTk): th_transcription_send_stop = Thread(target=self.transcription_send_stop) th_transcription_send_stop.daemon = True th_transcription_send_stop.start() - save_json(self.PATH_CONFIG, "ENABLE_TRANSCRIPTION_SEND", self.ENABLE_TRANSCRIPTION_SEND) def transcription_receive_start(self): self.spk_audio_queue = Queue() @@ -578,7 +578,7 @@ class App(CTk): if self.checkbox_translation.get() is False: voice_message = f"{message}" elif self.translator.translator_status[self.CHOICE_TRANSLATOR] is False: - print_textbox(self.textbox_message_log, "Auth Key or language setting is incorrect", "ERROR") + print_textbox(self.textbox_message_log, "Auth Key or language setting is incorrect", "ERROR") print_textbox(self.textbox_message_system_log, "Auth Key or language setting is incorrect", "ERROR") voice_message = f"{message}" else: @@ -616,20 +616,24 @@ class App(CTk): print_textbox(self.textbox_message_log, "Stop speaker2log", "INFO") print_textbox(self.textbox_message_system_log, "Stop speaker2log", "INFO") - if ((self.checkbox_translation.get() is False) and - (self.checkbox_transcription_send.get() is False) and - (self.checkbox_transcription_receive.get() is False)): - self.button_config.configure(state="normal", fg_color=["#3B8ED0", "#1F6AA5"]) self.checkbox_transcription_send.configure(state="normal") self.checkbox_transcription_receive.configure(state="normal") + def transcription_receive_stop_for_config(self): + if isinstance(self.spk_print_transcript, thread_fnc): + self.spk_print_transcript.stop() + if self.spk_audio_recorder.stop != None: + self.spk_audio_recorder.stop() + self.spk_audio_recorder.stop = None + + print_textbox(self.textbox_message_log, "Stop speaker2log", "INFO") + print_textbox(self.textbox_message_system_log, "Stop speaker2log", "INFO") + def checkbox_transcription_receive_callback(self): self.checkbox_transcription_send.configure(state="disabled") self.checkbox_transcription_receive.configure(state="disabled") - self.button_config.configure(state="disabled", fg_color=["gray92", "gray14"]) self.update() - self.ENABLE_TRANSCRIPTION_RECEIVE = self.checkbox_transcription_receive.get() - if self.ENABLE_TRANSCRIPTION_RECEIVE is True: + if self.checkbox_transcription_receive.get() is True: th_transcription_receive_start = Thread(target=self.transcription_receive_start) th_transcription_receive_start.daemon = True th_transcription_receive_start.start() @@ -638,7 +642,26 @@ class App(CTk): th_transcription_receive_stop.daemon = True th_transcription_receive_stop.start() - save_json(self.PATH_CONFIG, "ENABLE_TRANSCRIPTION_RECEIVE", self.ENABLE_TRANSCRIPTION_RECEIVE) + def transcription_start(self): + if self.checkbox_transcription_send.get() is True: + th_transcription_send_start = Thread(target=self.transcription_send_start) + th_transcription_send_start.daemon = True + th_transcription_send_start.start() + sleep(2) + if self.checkbox_transcription_receive.get() is True: + th_transcription_receive_start = Thread(target=self.transcription_receive_start) + th_transcription_receive_start.daemon = True + th_transcription_receive_start.start() + + def transcription_stop(self): + if self.checkbox_transcription_send.get() is True: + th_transcription_send_stop = Thread(target=self.transcription_send_stop_for_config) + th_transcription_send_stop.daemon = True + th_transcription_send_stop.start() + if self.checkbox_transcription_receive.get() is True: + th_transcription_receive_stop = Thread(target=self.transcription_receive_stop_for_config) + th_transcription_receive_stop.daemon = True + th_transcription_receive_stop.start() def checkbox_foreground_callback(self): self.ENABLE_FOREGROUND = self.checkbox_foreground.get() @@ -650,7 +673,19 @@ class App(CTk): self.attributes("-topmost", False) print_textbox(self.textbox_message_log, "Stop foreground", "INFO") print_textbox(self.textbox_message_system_log, "Stop foreground", "INFO") - save_json(self.PATH_CONFIG, "ENABLE_FOREGROUND", self.ENABLE_FOREGROUND) + + def foreground_start(self): + self.ENABLE_FOREGROUND = self.checkbox_foreground.get() + if self.ENABLE_FOREGROUND: + self.attributes("-topmost", True) + print_textbox(self.textbox_message_log, "Start foreground", "INFO") + print_textbox(self.textbox_message_system_log, "Start foreground", "INFO") + + def foreground_stop(self): + self.ENABLE_FOREGROUND = False + self.attributes("-topmost", False) + print_textbox(self.textbox_message_log, "Stop foreground", "INFO") + print_textbox(self.textbox_message_system_log, "Stop foreground", "INFO") def entry_message_box_press_key_enter(self, event): # send OSC typing diff --git a/window_config.py b/window_config.py index c5f0da9a..cf92a143 100644 --- a/window_config.py +++ b/window_config.py @@ -502,7 +502,8 @@ class ToplevelWindowConfig(CTkToplevel): self.checkbox_input_speaker_threshold_check.deselect() self.checkbox_input_mic_threshold_check_callback() self.checkbox_input_speaker_threshold_check_callback() - + self.parent.transcription_start() + self.parent.foreground_start() self.parent.checkbox_translation.configure(state="normal") self.parent.checkbox_transcription_send.configure(state="normal") self.parent.checkbox_transcription_receive.configure(state="normal") From 470e1cbabe4b65eaba9d1ac975e1cd37f36930b5 Mon Sep 17 00:00:00 2001 From: misygauziya Date: Wed, 26 Jul 2023 12:54:45 +0900 Subject: [PATCH 11/18] =?UTF-8?q?[Update]=20information=20window=E3=82=92?= =?UTF-8?q?=E8=A1=A8=E7=A4=BA=E3=81=97=E3=81=9F=E6=99=82=E3=81=AB=E6=9C=80?= =?UTF-8?q?=E5=89=8D=E9=9D=A2=E3=81=AB=E3=81=AA=E3=82=8B=E3=82=88=E3=81=86?= =?UTF-8?q?=E3=81=AB=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- VRCT.py | 15 ++++++++------- window_information.py | 7 ++++++- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/VRCT.py b/VRCT.py index bb1fd21e..d027e81b 100644 --- a/VRCT.py +++ b/VRCT.py @@ -411,6 +411,7 @@ class App(CTk): self.protocol("WM_DELETE_WINDOW", self.delete_window) self.config_window = ToplevelWindowConfig(self) + self.information_window = ToplevelWindowInformation(self) # start receive osc th_receive_osc_parameters = Thread(target=receive_osc_parameters, args=(self.check_osc_receive,)) @@ -441,8 +442,8 @@ class App(CTk): self.config_window.grab_set() def button_information_callback(self): - if self.information_window is None or not self.information_window.winfo_exists(): - self.information_window = ToplevelWindowInformation(self) + self.information_window.deiconify() + self.information_window.focus_set() self.information_window.focus() def checkbox_translation_callback(self): @@ -454,7 +455,6 @@ class App(CTk): print_textbox(self.textbox_message_log, "Stop translation", "INFO") print_textbox(self.textbox_message_system_log, "Stop translation", "INFO") - def transcription_send_start(self): self.mic_audio_queue = Queue() mic_device = [device for device in get_input_device_list()[self.CHOICE_MIC_HOST] if device["name"] == self.CHOICE_MIC_DEVICE][0] @@ -682,10 +682,11 @@ class App(CTk): print_textbox(self.textbox_message_system_log, "Start foreground", "INFO") def foreground_stop(self): - self.ENABLE_FOREGROUND = False - self.attributes("-topmost", False) - print_textbox(self.textbox_message_log, "Stop foreground", "INFO") - print_textbox(self.textbox_message_system_log, "Stop foreground", "INFO") + if self.ENABLE_FOREGROUND: + self.attributes("-topmost", False) + print_textbox(self.textbox_message_log, "Stop foreground", "INFO") + print_textbox(self.textbox_message_system_log, "Stop foreground", "INFO") + self.ENABLE_FOREGROUND = False def entry_message_box_press_key_enter(self, event): # send OSC typing diff --git a/window_information.py b/window_information.py index aa5d05a6..cc0d3b7f 100644 --- a/window_information.py +++ b/window_information.py @@ -4,6 +4,7 @@ from customtkinter import CTkToplevel, CTkTextbox, CTkFont class ToplevelWindowInformation(CTkToplevel): def __init__(self, parent, *args, **kwargs): super().__init__(parent, *args, **kwargs) + self.withdraw() self.parent = parent self.grid_columnconfigure(0, weight=1) self.grid_rowconfigure(0, weight=1) @@ -146,4 +147,8 @@ https://twitter.com/misya_ai """ self.textbox_information.insert("end", textbox_information_message) - self.textbox_information.configure(state='disabled') \ No newline at end of file + self.textbox_information.configure(state='disabled') + self.protocol("WM_DELETE_WINDOW", self.delete_window) + + def delete_window(self): + self.withdraw() \ No newline at end of file From f83cfa79c8790c3ade20b3aa66b87bc9e228027c Mon Sep 17 00:00:00 2001 From: misygauziya Date: Thu, 27 Jul 2023 03:57:35 +0900 Subject: [PATCH 12/18] =?UTF-8?q?[bugfix]=20Deepl(auth)=E3=81=A7EN?= =?UTF-8?q?=E2=86=92JP=E3=81=AE=E7=BF=BB=E8=A8=B3=E3=81=8C=E3=81=86?= =?UTF-8?q?=E3=81=BE=E3=81=8F=E3=81=84=E3=81=8B=E3=81=AA=E3=81=84=E5=95=8F?= =?UTF-8?q?=E9=A1=8C=E3=82=92=E4=BF=AE=E6=AD=A3(#29)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- VRCT.py | 16 ++++++------- languages.py | 61 +++++++++++++++++++++++++++++++++++++++++++----- translation.py | 4 ++-- window_config.py | 48 ++++++++++++++++++------------------- 4 files changed, 89 insertions(+), 40 deletions(-) diff --git a/VRCT.py b/VRCT.py index 1ed48de2..d4352373 100644 --- a/VRCT.py +++ b/VRCT.py @@ -44,10 +44,10 @@ class App(CTk): self.UI_LANGUAGE = "en" ## Translation self.CHOICE_TRANSLATOR = translators[0] - self.INPUT_SOURCE_LANG = list(translation_lang[self.CHOICE_TRANSLATOR].keys())[0] - self.INPUT_TARGET_LANG = list(translation_lang[self.CHOICE_TRANSLATOR].keys())[1] - self.OUTPUT_SOURCE_LANG = list(translation_lang[self.CHOICE_TRANSLATOR].keys())[1] - self.OUTPUT_TARGET_LANG = list(translation_lang[self.CHOICE_TRANSLATOR].keys())[0] + self.INPUT_SOURCE_LANG = list(translation_lang[self.CHOICE_TRANSLATOR]["source"].keys())[0] + self.INPUT_TARGET_LANG = list(translation_lang[self.CHOICE_TRANSLATOR]["target"].keys())[1] + self.OUTPUT_SOURCE_LANG = list(translation_lang[self.CHOICE_TRANSLATOR]["source"].keys())[1] + self.OUTPUT_TARGET_LANG = list(translation_lang[self.CHOICE_TRANSLATOR]["target"].keys())[0] ## Transcription Send self.CHOICE_MIC_HOST = get_default_input_device()["host"]["name"] self.CHOICE_MIC_DEVICE = get_default_input_device()["device"]["name"] @@ -127,16 +127,16 @@ class App(CTk): if config["CHOICE_TRANSLATOR"] in list(self.translator.translator_status.keys()): self.CHOICE_TRANSLATOR = config["CHOICE_TRANSLATOR"] if "INPUT_SOURCE_LANG" in config.keys(): - if config["INPUT_SOURCE_LANG"] in list(translation_lang[self.CHOICE_TRANSLATOR].keys()): + if config["INPUT_SOURCE_LANG"] in list(translation_lang[self.CHOICE_TRANSLATOR]["source"].keys()): self.INPUT_SOURCE_LANG = config["INPUT_SOURCE_LANG"] if "INPUT_TARGET_LANG" in config.keys(): - if config["INPUT_SOURCE_LANG"] in list(translation_lang[self.CHOICE_TRANSLATOR].keys()): + if config["INPUT_TARGET_LANG"] in list(translation_lang[self.CHOICE_TRANSLATOR]["target"].keys()): self.INPUT_TARGET_LANG = config["INPUT_TARGET_LANG"] if "OUTPUT_SOURCE_LANG" in config.keys(): - if config["INPUT_SOURCE_LANG"] in list(translation_lang[self.CHOICE_TRANSLATOR].keys()): + if config["OUTPUT_SOURCE_LANG"] in list(translation_lang[self.CHOICE_TRANSLATOR]["source"].keys()): self.OUTPUT_SOURCE_LANG = config["OUTPUT_SOURCE_LANG"] if "OUTPUT_TARGET_LANG" in config.keys(): - if config["INPUT_SOURCE_LANG"] in list(translation_lang[self.CHOICE_TRANSLATOR].keys()): + if config["OUTPUT_TARGET_LANG"] in list(translation_lang[self.CHOICE_TRANSLATOR]["target"].keys()): self.OUTPUT_TARGET_LANG = config["OUTPUT_TARGET_LANG"] # Transcription diff --git a/languages.py b/languages.py index 0daa3d3a..3862f4ff 100644 --- a/languages.py +++ b/languages.py @@ -1,5 +1,5 @@ transcription_lang = { - "Japanese Japan":"ja-JP", + "Japanese (Japan)":"ja-JP", "English (United States)":"en-US", "English (United Kingdom)":"en-GB", "Afrikaans (South Africa)":"af-ZA", @@ -92,7 +92,7 @@ transcription_lang = { translators = ["DeepL(web)", "DeepL(auth)", "Google(web)", "Bing(web)"] translation_lang = {} -translation_lang["DeepL(web)"] = { +dict_deepl_web_languages = { "Japanese":"JA", "English":"EN", "Korean":"KO", @@ -123,7 +123,43 @@ translation_lang["DeepL(web)"] = { "Turkish":"TR", "Norwegian":"NB", } -translation_lang["DeepL(auth)"] = { +translation_lang["DeepL(web)"] = { + "source":dict_deepl_web_languages, + "target":dict_deepl_web_languages, +} + +dict_deepl_auth_source_languages = { + "Japanese":"ja", + "English":"en", + "Bulgarian":"bg", + "Czech":"cs", + "Danish":"da", + "German":"de", + "Greek":"el", + "Spanish":"es", + "Estonian":"et", + "Finnish":"fi", + "French":"fr", + "Hungarian":"hu", + "Indonesian":"id", + "Italian":"it", + "Korean":"ko", + "Lithuanian":"lt", + "Latvian":"lv", + "Norwegian":"nb", + "Dutch":"nl", + "Polish":"pl", + "Portuguese":"pt", + "Romanian":"ro", + "Russian":"ru", + "Slovak":"sk", + "Slovenian":"sl", + "Swedish":"sv", + "Turkish":"tr", + "Ukrainian":"uk", + "Chinese":"zh" +} +dict_deepl_auth_target_languages = { "Japanese":"ja", "English American":"en-US", "English British":"en-GB", @@ -146,7 +182,6 @@ translation_lang["DeepL(auth)"] = { "Norwegian":"nb", "Dutch":"nl", "Polish":"pl", - "Portuguese":"pt", "Portuguese Brazilian":"pt-BR", "Portuguese European":"pt-PT", "Romanian":"ro", @@ -158,7 +193,12 @@ translation_lang["DeepL(auth)"] = { "Ukrainian":"uk", "Chinese":"zh" } -translation_lang["Google(web)"] = { +translation_lang["DeepL(auth)"] = { + "source": dict_deepl_auth_source_languages, + "target": dict_deepl_auth_target_languages, +} + +dict_google_web_languages = { "Japanese":"ja", "English":"en", "Chinese":"zh", @@ -222,7 +262,12 @@ translation_lang["Google(web)"] = { "Basque":"eu", "Irish":"ga" } -translation_lang["Bing(web)"] = { +translation_lang["Google(web)"] = { + "source":dict_google_web_languages, + "target":dict_google_web_languages, +} + +dict_bing_web_languages = { "Japanese":"ja", "English":"en", "Chinese":"zh", @@ -284,6 +329,10 @@ translation_lang["Bing(web)"] = { "Punjabi":"pa", "Irish":"ga" } +translation_lang["Bing(web)"] = { + "source":dict_bing_web_languages, + "target":dict_bing_web_languages, +} selectable_languages = { "en": "English", diff --git a/translation.py b/translation.py index 8eacf8a6..e251c8a9 100644 --- a/translation.py +++ b/translation.py @@ -35,8 +35,8 @@ class Translator(): def translate(self, translator_name, source_language, target_language, message): result = "" try: - source_language=translation_lang[translator_name][source_language] - target_language=translation_lang[translator_name][target_language] + source_language=translation_lang[translator_name]["source"][source_language] + target_language=translation_lang[translator_name]["target"][target_language] if translator_name == "DeepL(web)": result = deepl_web_Translator( source_language=source_language, diff --git a/window_config.py b/window_config.py index 7c8b2173..8e3a117e 100644 --- a/window_config.py +++ b/window_config.py @@ -212,33 +212,33 @@ class ToplevelWindowConfig(CTkToplevel): print_textbox(self.parent.textbox_message_system_log, "Auth Key or language setting is incorrect", "ERROR") else: self.optionmenu_translation_input_source_language.configure( - values=list(translation_lang[choice].keys()), - variable=StringVar(value=list(translation_lang[choice].keys())[0])) + values=list(translation_lang[choice]["source"].keys()), + variable=StringVar(value=list(translation_lang[choice]["source"].keys())[0])) self.optionmenu_translation_input_target_language.configure( - values=list(translation_lang[choice].keys()), - variable=StringVar(value=list(translation_lang[choice].keys())[1])) + values=list(translation_lang[choice]["target"].keys()), + variable=StringVar(value=list(translation_lang[choice]["target"].keys())[1])) self.optionmenu_translation_output_source_language.configure( - values=list(translation_lang[choice].keys()), - variable=StringVar(value=list(translation_lang[choice].keys())[1])) + values=list(translation_lang[choice]["source"].keys()), + variable=StringVar(value=list(translation_lang[choice]["source"].keys())[1])) self.optionmenu_translation_output_target_language.configure( - values=list(translation_lang[choice].keys()), - variable=StringVar(value=list(translation_lang[choice].keys())[0])) + values=list(translation_lang[choice]["target"].keys()), + variable=StringVar(value=list(translation_lang[choice]["target"].keys())[0])) if SCROLLABLE_DROPDOWN: self.scrollableDropdown_translation_input_source_language.configure( - values=list(translation_lang[choice].keys())) + values=list(translation_lang[choice]["source"].keys())) self.scrollableDropdown_translation_input_target_language.configure( - values=list(translation_lang[choice].keys())) + values=list(translation_lang[choice]["target"].keys())) self.scrollableDropdown_translation_output_source_language.configure( - values=list(translation_lang[choice].keys())) + values=list(translation_lang[choice]["source"].keys())) self.scrollableDropdown_translation_output_target_language.configure( - values=list(translation_lang[choice].keys())) + values=list(translation_lang[choice]["target"].keys())) self.parent.CHOICE_TRANSLATOR = choice - self.parent.INPUT_SOURCE_LANG = list(translation_lang[choice].keys())[0] - self.parent.INPUT_TARGET_LANG = list(translation_lang[choice].keys())[1] - self.parent.OUTPUT_SOURCE_LANG = list(translation_lang[choice].keys())[1] - self.parent.OUTPUT_TARGET_LANG = list(translation_lang[choice].keys())[0] + self.parent.INPUT_SOURCE_LANG = list(translation_lang[choice]["source"].keys())[0] + self.parent.INPUT_TARGET_LANG = list(translation_lang[choice]["target"].keys())[1] + self.parent.OUTPUT_SOURCE_LANG = list(translation_lang[choice]["source"].keys())[1] + self.parent.OUTPUT_TARGET_LANG = list(translation_lang[choice]["target"].keys())[0] save_json(self.parent.PATH_CONFIG, "CHOICE_TRANSLATOR", self.parent.CHOICE_TRANSLATOR) save_json(self.parent.PATH_CONFIG, "INPUT_SOURCE_LANG", self.parent.INPUT_SOURCE_LANG) save_json(self.parent.PATH_CONFIG, "INPUT_TARGET_LANG", self.parent.INPUT_TARGET_LANG) @@ -757,7 +757,7 @@ class ToplevelWindowConfig(CTkToplevel): self.optionmenu_translation_input_source_language = CTkOptionMenu( self.tabview_config.tab(config_tab_title_translation), command=self.optionmenu_translation_input_source_language_callback, - values=list(translation_lang[self.parent.CHOICE_TRANSLATOR].keys()), + values=list(translation_lang[self.parent.CHOICE_TRANSLATOR]["source"].keys()), variable=StringVar(value=self.parent.INPUT_SOURCE_LANG), font=CTkFont(family=self.parent.FONT_FAMILY), dropdown_font=CTkFont(family=self.parent.FONT_FAMILY), @@ -768,7 +768,7 @@ class ToplevelWindowConfig(CTkToplevel): if SCROLLABLE_DROPDOWN: self.scrollableDropdown_translation_input_source_language = CTkScrollableDropdown( self.optionmenu_translation_input_source_language, - values=list(translation_lang[self.parent.CHOICE_TRANSLATOR].keys()), + values=list(translation_lang[self.parent.CHOICE_TRANSLATOR]["source"].keys()), justify="left", button_color="transparent", command=self.optionmenu_translation_input_source_language_callback, @@ -792,7 +792,7 @@ class ToplevelWindowConfig(CTkToplevel): self.optionmenu_translation_input_target_language = CTkOptionMenu( self.tabview_config.tab(config_tab_title_translation), command=self.optionmenu_translation_input_target_language_callback, - values=list(translation_lang[self.parent.CHOICE_TRANSLATOR].keys()), + values=list(translation_lang[self.parent.CHOICE_TRANSLATOR]["target"].keys()), variable=StringVar(value=self.parent.INPUT_TARGET_LANG), font=CTkFont(family=self.parent.FONT_FAMILY), dropdown_font=CTkFont(family=self.parent.FONT_FAMILY), @@ -803,7 +803,7 @@ class ToplevelWindowConfig(CTkToplevel): if SCROLLABLE_DROPDOWN: self.scrollableDropdown_translation_input_target_language = CTkScrollableDropdown( self.optionmenu_translation_input_target_language, - values=list(translation_lang[self.parent.CHOICE_TRANSLATOR].keys()), + values=list(translation_lang[self.parent.CHOICE_TRANSLATOR]["target"].keys()), justify="left", button_color="transparent", command=self.optionmenu_translation_input_target_language_callback, @@ -828,7 +828,7 @@ class ToplevelWindowConfig(CTkToplevel): self.optionmenu_translation_output_source_language = CTkOptionMenu( self.tabview_config.tab(config_tab_title_translation), command=self.optionmenu_translation_output_source_language_callback, - values=list(translation_lang[self.parent.CHOICE_TRANSLATOR].keys()), + values=list(translation_lang[self.parent.CHOICE_TRANSLATOR]["source"].keys()), variable=StringVar(value=self.parent.OUTPUT_SOURCE_LANG), font=CTkFont(family=self.parent.FONT_FAMILY), dropdown_font=CTkFont(family=self.parent.FONT_FAMILY), @@ -839,7 +839,7 @@ class ToplevelWindowConfig(CTkToplevel): if SCROLLABLE_DROPDOWN: self.scrollableDropdown_translation_output_source_language = CTkScrollableDropdown( self.optionmenu_translation_output_source_language, - values=list(translation_lang[self.parent.CHOICE_TRANSLATOR].keys()), + values=list(translation_lang[self.parent.CHOICE_TRANSLATOR]["source"].keys()), justify="left", button_color="transparent", command=self.optionmenu_translation_output_source_language_callback, @@ -863,7 +863,7 @@ class ToplevelWindowConfig(CTkToplevel): self.optionmenu_translation_output_target_language = CTkOptionMenu( self.tabview_config.tab(config_tab_title_translation), command=self.optionmenu_translation_output_target_language_callback, - values=list(translation_lang[self.parent.CHOICE_TRANSLATOR].keys()), + values=list(translation_lang[self.parent.CHOICE_TRANSLATOR]["target"].keys()), variable=StringVar(value=self.parent.OUTPUT_TARGET_LANG), font=CTkFont(family=self.parent.FONT_FAMILY), dropdown_font=CTkFont(family=self.parent.FONT_FAMILY), @@ -874,7 +874,7 @@ class ToplevelWindowConfig(CTkToplevel): if SCROLLABLE_DROPDOWN: self.scrollableDropdown_translation_output_target_language = CTkScrollableDropdown( self.optionmenu_translation_output_target_language, - values=list(translation_lang[self.parent.CHOICE_TRANSLATOR].keys()), + values=list(translation_lang[self.parent.CHOICE_TRANSLATOR]["target"].keys()), justify="left", button_color="transparent", command=self.optionmenu_translation_output_target_language_callback, From 546eb7e1fc08cddfc2e9689edb2a7c1626bf0b6d Mon Sep 17 00:00:00 2001 From: misygauziya Date: Thu, 27 Jul 2023 15:09:03 +0900 Subject: [PATCH 13/18] =?UTF-8?q?[bugfix]=20checkbox=E5=8B=95=E4=BD=9C?= =?UTF-8?q?=E4=B8=AD=E3=81=ABconfig=20window=E3=81=8C=E9=96=8B=E3=81=91?= =?UTF-8?q?=E3=82=8B=E5=95=8F=E9=A1=8C=E3=82=92=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- VRCT.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/VRCT.py b/VRCT.py index d027e81b..3dae5308 100644 --- a/VRCT.py +++ b/VRCT.py @@ -516,6 +516,7 @@ class App(CTk): print_textbox(self.textbox_message_system_log, "Start voice2chatbox", "INFO") self.checkbox_transcription_send.configure(state="normal") self.checkbox_transcription_receive.configure(state="normal") + self.button_config.configure(state="normal", fg_color=["#3B8ED0", "#1F6AA5"]) def transcription_send_stop(self): if isinstance(self.mic_print_transcript, thread_fnc): @@ -528,6 +529,7 @@ class App(CTk): print_textbox(self.textbox_message_system_log, "Stop voice2chatbox", "INFO") self.checkbox_transcription_send.configure(state="normal") self.checkbox_transcription_receive.configure(state="normal") + self.button_config.configure(state="normal", fg_color=["#3B8ED0", "#1F6AA5"]) def transcription_send_stop_for_config(self): if isinstance(self.mic_print_transcript, thread_fnc): @@ -542,7 +544,7 @@ class App(CTk): def checkbox_transcription_send_callback(self): self.checkbox_transcription_send.configure(state="disabled") self.checkbox_transcription_receive.configure(state="disabled") - self.update() + self.button_config.configure(state="disabled", fg_color=["gray92", "gray14"]) if self.checkbox_transcription_send.get() is True: th_transcription_send_start = Thread(target=self.transcription_send_start) th_transcription_send_start.daemon = True @@ -618,6 +620,7 @@ class App(CTk): print_textbox(self.textbox_message_system_log, "Stop speaker2log", "INFO") self.checkbox_transcription_send.configure(state="normal") self.checkbox_transcription_receive.configure(state="normal") + self.button_config.configure(state="normal", fg_color=["#3B8ED0", "#1F6AA5"]) def transcription_receive_stop_for_config(self): if isinstance(self.spk_print_transcript, thread_fnc): @@ -632,7 +635,7 @@ class App(CTk): def checkbox_transcription_receive_callback(self): self.checkbox_transcription_send.configure(state="disabled") self.checkbox_transcription_receive.configure(state="disabled") - self.update() + self.button_config.configure(state="disabled", fg_color=["gray92", "gray14"]) if self.checkbox_transcription_receive.get() is True: th_transcription_receive_start = Thread(target=self.transcription_receive_start) th_transcription_receive_start.daemon = True From a1fcf0702b2c062d7f989e432fe6c74aa2b2b061 Mon Sep 17 00:00:00 2001 From: misygauziya Date: Thu, 27 Jul 2023 15:09:58 +0900 Subject: [PATCH 14/18] =?UTF-8?q?[bugfix]=20checkbox=E3=82=92=E6=8A=BC?= =?UTF-8?q?=E3=81=97=E3=81=9F=E6=99=82=E3=81=ABconfig=20button=E3=81=AE?= =?UTF-8?q?=E3=82=B5=E3=82=A4=E3=82=BA=E3=81=8C=E5=A4=89=E5=8C=96=E3=81=99?= =?UTF-8?q?=E3=82=8B=E5=95=8F=E9=A1=8C=E3=82=92=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- VRCT.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/VRCT.py b/VRCT.py index 3dae5308..b4f2a18a 100644 --- a/VRCT.py +++ b/VRCT.py @@ -325,8 +325,8 @@ class App(CTk): # add button information self.button_information = CTkButton( self.sidebar_frame, - text="", - width=25, + text=None, + width=36, command=self.button_information_callback, image=CTkImage(Image_open(os_path.join(os_path.dirname(__file__), "img", "info-icon-white.png"))) ) @@ -336,8 +336,8 @@ class App(CTk): # add button config self.button_config = CTkButton( self.sidebar_frame, - text="", - width=25, + text=None, + width=36, command=self.button_config_callback, image=CTkImage(Image_open(os_path.join(os_path.dirname(__file__), "img", "config-icon-white.png"))) ) From 3b0ee5325df7a0f6315bf4f0d39eea873c763194 Mon Sep 17 00:00:00 2001 From: misygauziya Date: Thu, 27 Jul 2023 15:11:08 +0900 Subject: [PATCH 15/18] =?UTF-8?q?[Update]=20=E4=B8=8D=E8=A6=81=E3=81=AA?= =?UTF-8?q?=E3=82=B3=E3=83=BC=E3=83=89=E3=82=92=E5=89=8A=E9=99=A4/typo?= =?UTF-8?q?=E3=82=92=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- VRCT.py | 102 ++++++++++++++++++++++++++++---------------------------- 1 file changed, 51 insertions(+), 51 deletions(-) diff --git a/VRCT.py b/VRCT.py index b4f2a18a..5c15803f 100644 --- a/VRCT.py +++ b/VRCT.py @@ -331,7 +331,6 @@ class App(CTk): image=CTkImage(Image_open(os_path.join(os_path.dirname(__file__), "img", "info-icon-white.png"))) ) self.button_information.grid(row=5, column=0, padx=(10, 5), pady=(5, 5), sticky="wse") - self.information_window = None # add button config self.button_config = CTkButton( @@ -555,59 +554,60 @@ class App(CTk): th_transcription_send_stop.start() def transcription_receive_start(self): - self.spk_audio_queue = Queue() - spk_device = [device for device in get_output_device_list() if device["name"] == self.CHOICE_SPEAKER_DEVICE][0] - self.spk_audio_recorder = SelectedSpeakerRecorder( - spk_device, - self.INPUT_SPEAKER_ENERGY_THRESHOLD, - self.INPUT_SPEAKER_DYNAMIC_ENERGY_THRESHOLD, - self.INPUT_SPEAKER_RECORD_TIMEOUT, - ) - self.spk_audio_recorder.record_into_queue(self.spk_audio_queue) - self.spk_transcriber = AudioTranscriber( - speaker=True, - source=self.spk_audio_recorder.source, - language=transcription_lang[self.INPUT_SPEAKER_VOICE_LANGUAGE], - phrase_timeout=self.INPUT_SPEAKER_PHRASE_TIMEOUT, - max_phrases=self.INPUT_SPEAKER_MAX_PHRASES, - ) + self.spk_audio_queue = Queue() + spk_device = [device for device in get_output_device_list() if device["name"] == self.CHOICE_SPEAKER_DEVICE][0] + self.spk_audio_recorder = SelectedSpeakerRecorder( + spk_device, + self.INPUT_SPEAKER_ENERGY_THRESHOLD, + self.INPUT_SPEAKER_DYNAMIC_ENERGY_THRESHOLD, + self.INPUT_SPEAKER_RECORD_TIMEOUT, + ) + self.spk_audio_recorder.record_into_queue(self.spk_audio_queue) + self.spk_transcriber = AudioTranscriber( + speaker=True, + source=self.spk_audio_recorder.source, + language=transcription_lang[self.INPUT_SPEAKER_VOICE_LANGUAGE], + phrase_timeout=self.INPUT_SPEAKER_PHRASE_TIMEOUT, + max_phrases=self.INPUT_SPEAKER_MAX_PHRASES, + ) - def spk_transcript_to_textbox(): - self.spk_transcriber.transcribe_audio_queue(self.spk_audio_queue) - message = self.spk_transcriber.get_transcript() - if len(message) > 0: - # translate - if self.checkbox_translation.get() is False: - voice_message = f"{message}" - elif self.translator.translator_status[self.CHOICE_TRANSLATOR] is False: - print_textbox(self.textbox_message_log, "Auth Key or language setting is incorrect", "ERROR") - print_textbox(self.textbox_message_system_log, "Auth Key or language setting is incorrect", "ERROR") - voice_message = f"{message}" - else: - result = self.translator.translate( - translator_name=self.CHOICE_TRANSLATOR, - source_language=self.OUTPUT_SOURCE_LANG, - target_language=self.OUTPUT_TARGET_LANG, - message=message - ) - voice_message = self.MESSAGE_FORMAT.replace("[message]", message).replace("[translation]", result) - # send OSC message - # send_message(voice_message, self.OSC_IP_ADDRESS, self.OSC_PORT) + def spk_transcript_to_textbox(): + self.spk_transcriber.transcribe_audio_queue(self.spk_audio_queue) + message = self.spk_transcriber.get_transcript() + if len(message) > 0: + # translate + if self.checkbox_translation.get() is False: + voice_message = f"{message}" + elif self.translator.translator_status[self.CHOICE_TRANSLATOR] is False: + print_textbox(self.textbox_message_log, "Auth Key or language setting is incorrect", "ERROR") + print_textbox(self.textbox_message_system_log, "Auth Key or language setting is incorrect", "ERROR") + voice_message = f"{message}" + else: + result = self.translator.translate( + translator_name=self.CHOICE_TRANSLATOR, + source_language=self.OUTPUT_SOURCE_LANG, + target_language=self.OUTPUT_TARGET_LANG, + message=message + ) + voice_message = self.MESSAGE_FORMAT.replace("[message]", message).replace("[translation]", result) + # send OSC message + # send_message(voice_message, self.OSC_IP_ADDRESS, self.OSC_PORT) - if self.checkbox_transcription_receive.get() is True: - # update textbox message receive log - print_textbox(self.textbox_message_log, f"{voice_message}", "RECEIVE") - print_textbox(self.textbox_message_receive_log, f"{voice_message}", "RECEIVE") - if self.ENABLE_NOTICE_XSOVERLAY is True: - notification_xsoverlay_for_vrct(content=f"{voice_message}") + if self.checkbox_transcription_receive.get() is True: + # update textbox message receive log + print_textbox(self.textbox_message_log, f"{voice_message}", "RECEIVE") + print_textbox(self.textbox_message_receive_log, f"{voice_message}", "RECEIVE") + if self.ENABLE_NOTICE_XSOVERLAY is True: + notification_xsoverlay_for_vrct(content=f"{voice_message}") - self.spk_print_transcript = thread_fnc(spk_transcript_to_textbox) - self.spk_print_transcript.daemon = True - self.spk_print_transcript.start() - print_textbox(self.textbox_message_log, "Start speaker2log", "INFO") - print_textbox(self.textbox_message_system_log, "Start speaker2log", "INFO") - self.checkbox_transcription_send.configure(state="normal") - self.checkbox_transcription_receive.configure(state="normal") + self.spk_print_transcript = thread_fnc(spk_transcript_to_textbox) + self.spk_print_transcript.daemon = True + self.spk_print_transcript.start() + print_textbox(self.textbox_message_log, "Start speaker2log", "INFO") + print_textbox(self.textbox_message_system_log, "Start speaker2log", "INFO") + self.checkbox_transcription_send.configure(state="normal") + self.checkbox_transcription_receive.configure(state="normal") + self.button_config.configure(state="normal", fg_color=["#3B8ED0", "#1F6AA5"]) def transcription_receive_stop(self): if isinstance(self.spk_print_transcript, thread_fnc): From aab21dc9b44cf2316e6ed444fdafb132f050e6a3 Mon Sep 17 00:00:00 2001 From: misygauziya Date: Sun, 30 Jul 2023 00:40:10 +0900 Subject: [PATCH 16/18] =?UTF-8?q?[Update]=20=E3=83=91=E3=83=83=E3=82=B1?= =?UTF-8?q?=E3=83=BC=E3=82=B8=E3=81=AE=E3=82=A4=E3=83=B3=E3=82=B9=E3=83=88?= =?UTF-8?q?=E3=83=BC=E3=83=AB=E6=96=B9=E6=B3=95=E3=82=92=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 20 +++----------------- install.bat | 4 ++++ 2 files changed, 7 insertions(+), 17 deletions(-) create mode 100644 install.bat diff --git a/README.md b/README.md index 72eae057..a97b88cb 100644 --- a/README.md +++ b/README.md @@ -15,26 +15,12 @@ VRChatのChatBoxにOSC経由でメッセージを送信するツール - translators(https://github.com/misyaguziya/translators) - custom_speech_recognition(https://github.com/misyaguziya/custom_speech_recognition) -deepl-translate/translators/custom_speech_recognitionについては追加実装をしています。`pip install`でinstallした場合、動かないので注意 +**deepl-translate/translators/custom_speech_recognitionについては追加実装をしています** +**`pip install`でinstallした場合、動かないので注意** ## install ```bash -pip install -r requirements.txt -``` - -```bash -git clone https://github.com/misyaguziya/translators.git -cd translators -python ./setup.py install -cd ../ -git clone https://github.com/misyaguziya/deepl-translate.git -cd deepl-translate -python ./setup.py install -cd ../ -git clone https://github.com/misyaguziya/custom_speech_recognition.git -cd custom_speech_recognition -python ./setup.py install -cd ../ +./install.bat ``` ## Usage diff --git a/install.bat b/install.bat new file mode 100644 index 00000000..d54ef800 --- /dev/null +++ b/install.bat @@ -0,0 +1,4 @@ +pip install -r requirements.txt +pip install git+https://github.com/misyaguziya/translators +pip install git+https://github.com/misyaguziya/deepl-translate +pip install git+https://github.com/misyaguziya/custom_speech_recognition \ No newline at end of file From 9518f83668a5d21779459a9fbb5164a1f53a690e Mon Sep 17 00:00:00 2001 From: misygauziya Date: Sun, 30 Jul 2023 01:47:05 +0900 Subject: [PATCH 17/18] [Update] information v1.3.2 --- README.md | 19 +++++++++++++------ README.txt | 18 ++++++++++++------ docs/vrct_logo.png | Bin 0 -> 7182 bytes window_information.py | 20 +++++++++++++------- 4 files changed, 38 insertions(+), 19 deletions(-) create mode 100644 docs/vrct_logo.png diff --git a/README.md b/README.md index a97b88cb..deabccbe 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,11 @@ +
+ +![](docs/vrct_logo.png) + # VRCT (VRChat Chatbox Translator & Transcription) +
+ ## Overview VRChatのChatBoxにOSC経由でメッセージを送信するツール 翻訳エンジンを使用してメッセージとその翻訳部分を同時に送信することができる @@ -61,26 +67,26 @@ ptyhon VRCT.py - Appearance Theme: ウィンドウテーマを選択 - UI Scaling: UIサイズを調整 - Font Family: 表示フォントを選択 - - **(New!) UI Language: UIの表示言語を選択** + - UI Language: UIの表示言語を選択 - Translation tab - Select Translator: 翻訳エンジンの変更 - Send Language: 送信するメッセージに対して翻訳する言語[source, target]を選択 - Receive Language: 受信したメッセージに対して翻訳する言語[source, target]を選択 - Transcription tab - - **(New!) Input Mic Host: マイクのホストAPIを選択** + - Input Mic Host: マイクのホストAPIを選択 - Input Mic Device: マイクを選択 - Input Mic Voice Language: 入力する音声の言語 - Input Mic Energy Threshold: 音声取得のしきい値 - - **(New!) Check threshold point: Input Mic Energy Thresholdのしきい値を視覚化** + - Check threshold point: Input Mic Energy Thresholdのしきい値を視覚化 - Input Mic Dynamic Energy Threshold: 音声取得のしきい値の自動調整 - Input Mic Phase Timeout: 文字起こしする音声時間の上限 - Input Mic Record Timeout: 音声の区切りの無音時間 - Input Mic Max Phrases: 保留する単語の上限 - - **(New!) Input Mic Word Filter: MICの文字起こし時にWord Filterで設定した文字が入っていた場合にChatboxに表示しない (ex AAA,BBB,CCC)** + - Input Mic Word Filter: MICの文字起こし時にWord Filterで設定した文字が入っていた場合にChatboxに表示しない (ex AAA,BBB,CCC) - Input Speaker Device: スピーカーを選択 - Input Speaker Voice Language: 受信する音声の言語 - Input Speaker Energy Threshold: 音声取得のしきい値 - - **(New!) Check threshold point: (New!)Input Speaker Energy Thresholdのしきい値を視覚化** + - Check threshold point: Input Speaker Energy Thresholdのしきい値を視覚化 - Input Speaker Dynamic Energy Threshold: 音声取得のしきい値の自動調整 - Input Speaker Record Timeout: 音声の区切りの無音時間 - Input Speaker Phase Timeout: 文字起こしする音声時間の上限 @@ -94,7 +100,8 @@ ptyhon VRCT.py - [translation]が翻訳されたメッセージに置換される - 初期フォーマット:`[message]([translation])` - Others tab - - **(New!) Auto clear chat box: メッセージ送信後に書き込んだメッセージを空にする** + - Auto clear chat box: メッセージ送信後に書き込んだメッセージを空にする + - **(New!) Notification XSOverlay: XSOverlayの通知機能を有効(VR only)** ## Author みしゃ(misyaguzi) diff --git a/README.txt b/README.txt index 831d308e..10647b74 100644 --- a/README.txt +++ b/README.txt @@ -42,26 +42,26 @@ VRChatで使用されるChatBoxをOSC経由でメッセージを送信するツ Appearance Theme: ウィンドウテーマを選択 UI Scaling: UIサイズを調整 Font Family: 表示フォントを選択 - (New!) UI Language: UIの表示言語を選択 + UI Language: UIの表示言語を選択 Translationタブ Select Translator: 翻訳エンジンの変更 Send Language: 送信するメッセージに対して翻訳する言語[source, target]を選択 Receive Language: 受信したメッセージに対して翻訳する言語[source, target]を選択 Transcriptionタブ - (New!) Input Mic Host: マイクのホストAPIを選択 + Input Mic Host: マイクのホストAPIを選択 Input Mic Device: マイクを選択 Input Mic Voice Language: 入力する音声の言語 Input Mic Energy Threshold: 音声取得のしきい値 - (New!) Check threshold point: Input Mic Energy Thresholdのしきい値を視覚化 + Check threshold point: Input Mic Energy Thresholdのしきい値を視覚化 Input Mic Dynamic Energy Threshold: 音声取得のしきい値の自動調整 Input Mic Record Timeout: 音声の区切りの無音時間 Input Mic Phase Timeout: 文字起こしする音声時間の上限 Input Mic Max Phrases: 保留する単語の上限 - (New!) Input Mic Word Filter: MICの文字起こし時にWord Filterで設定した文字が入っていた場合にChatboxに表示しない (ex AAA,BBB,CCC) + Input Mic Word Filter: MICの文字起こし時にWord Filterで設定した文字が入っていた場合にChatboxに表示しない (ex AAA,BBB,CCC) Input Speaker Device: スピーカーを選択 Input Speaker Voice Language: 受信する音声の言語 Input Speaker Energy Threshold: 音声取得のしきい値 - (New!) Check threshold point: (New!)Input Speaker Energy Thresholdのしきい値を視覚化 + Check threshold point: Input Speaker Energy Thresholdのしきい値を視覚化 Input Speaker Dynamic Energy Threshold: 音声取得のしきい値の自動調整 Input Speaker Record Timeout: 音声の区切りの無音時間 Input Speaker Phase Timeout: 文字起こしする音声時間の上限 @@ -75,7 +75,8 @@ VRChatで使用されるChatBoxをOSC経由でメッセージを送信するツ [translation]が翻訳されたメッセージに置換される 初期フォーマット:"[message]([translation])" Othersタブ - (New!) Auto clear chat box: メッセージ送信後に書き込んだメッセージを空にする + Auto clear chat box: メッセージ送信後に書き込んだメッセージを空にする + (New!) Notification XSOverlay: XSOverlayの通知機能を有効(VR only) 設定の初期化 config.jsonを削除 @@ -121,6 +122,11 @@ https://twitter.com/misya_ai - 半角入力時に一部の文字が書き込めないバグを修正 [2023-07-22: v1.3.1] - UIの表示言語選択に韓国語を追加 +[2023-07-30: v1.3.2] +- 試験的にXSOverlayへの通知機能を追加 +- checkbox ONの状態でもConfigを開けるように変更 +- 文字起こし言語の表示を修正 +- いくつかのバグを修正 # 注意事項 再配布とかはやめてね \ No newline at end of file diff --git a/docs/vrct_logo.png b/docs/vrct_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..de568b6ece6dc291dfa26a31dd8815fbf8e7f14c GIT binary patch literal 7182 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 literal 0 HcmV?d00001 diff --git a/window_information.py b/window_information.py index cc0d3b7f..8e912c0d 100644 --- a/window_information.py +++ b/window_information.py @@ -19,7 +19,7 @@ class ToplevelWindowInformation(CTkToplevel): font=CTkFont(family=self.parent.FONT_FAMILY) ) self.textbox_information.grid(row=0, column=0, padx=(10, 10), pady=(10, 10), sticky="nsew") - textbox_information_message = """VRCT(v1.3.1) + textbox_information_message = """VRCT(v1.3.2) # 概要 VRChatで使用されるChatBoxをOSC経由でメッセージを送信するツールになります。 @@ -62,26 +62,26 @@ VRChatで使用されるChatBoxをOSC経由でメッセージを送信するツ Appearance Theme: ウィンドウテーマを選択 UI Scaling: UIサイズを調整 Font Family: 表示フォントを選択 - (New!) UI Language: UIの表示言語を選択 + UI Language: UIの表示言語を選択 Translationタブ Select Translator: 翻訳エンジンの変更 Send Language: 送信するメッセージに対して翻訳する言語[source, target]を選択 Receive Language: 受信したメッセージに対して翻訳する言語[source, target]を選択 Transcriptionタブ - (New!) Input Mic Host: マイクのホストAPIを選択 + Input Mic Host: マイクのホストAPIを選択 Input Mic Device: マイクを選択 Input Mic Voice Language: 入力する音声の言語 Input Mic Energy Threshold: 音声取得のしきい値 - (New!) Check threshold point: Input Mic Energy Thresholdのしきい値を視覚化 + Check threshold point: Input Mic Energy Thresholdのしきい値を視覚化 Input Mic Dynamic Energy Threshold: 音声取得のしきい値の自動調整 Input Mic Record Timeout: 音声の区切りの無音時間 Input Mic Phase Timeout: 文字起こしする音声時間の上限 Input Mic Max Phrases: 保留する単語の上限 - (New!) Input Mic Word Filter: MICの文字起こし時にWord Filterで設定した文字が入っていた場合にChatboxに表示しない (ex AAA,BBB,CCC) + Input Mic Word Filter: MICの文字起こし時にWord Filterで設定した文字が入っていた場合にChatboxに表示しない (ex AAA,BBB,CCC) Input Speaker Device: スピーカーを選択 Input Speaker Voice Language: 受信する音声の言語 Input Speaker Energy Threshold: 音声取得のしきい値 - (New!) Check threshold point: (New!)Input Speaker Energy Thresholdのしきい値を視覚化 + Check threshold point: Input Speaker Energy Thresholdのしきい値を視覚化 Input Speaker Dynamic Energy Threshold: 音声取得のしきい値の自動調整 Input Speaker Record Timeout: 音声の区切りの無音時間 Input Speaker Phase Timeout: 文字起こしする音声時間の上限 @@ -95,7 +95,8 @@ VRChatで使用されるChatBoxをOSC経由でメッセージを送信するツ [translation]が翻訳されたメッセージに置換される 初期フォーマット:"[message]([translation])" Othersタブ - (New!) Auto clear chat box: メッセージ送信後に書き込んだメッセージを空にする + Auto clear chat box: メッセージ送信後に書き込んだメッセージを空にする + (New!) Notification XSOverlay: XSOverlayの通知機能を有効(VR only) 設定の初期化 config.jsonを削除 @@ -141,6 +142,11 @@ https://twitter.com/misya_ai - 半角入力時に一部の文字が書き込めないバグを修正 [2023-07-22: v1.3.1] - UIの表示言語選択に韓国語を追加 +[2023-07-30: v1.3.2] +- 試験的にXSOverlayへの通知機能を追加 +- checkbox ONの状態でもConfigを開けるように変更 +- 文字起こし言語の表示を修正 +- いくつかのバグを修正 # 注意事項 再配布とかはやめてね From 49a0687947b73014d21c7e3c253bd714f653b9c8 Mon Sep 17 00:00:00 2001 From: misygauziya Date: Sun, 30 Jul 2023 01:52:25 +0900 Subject: [PATCH 18/18] [bugfix] typo!!!! --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index deabccbe..20da4395 100644 --- a/README.md +++ b/README.md @@ -31,7 +31,7 @@ VRChatのChatBoxにOSC経由でメッセージを送信するツール ## Usage ```bash -ptyhon VRCT.py +python VRCT.py ``` ## Features