From bbd7e0d6ea9b1ff67b67c9fecda0dbb6e52f5ad9 Mon Sep 17 00:00:00 2001 From: misygauziya Date: Fri, 21 Jul 2023 13:47:16 +0900 Subject: [PATCH 1/3] [bugfix]VRCT.py MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit メインウィンドウのcheckboxをclick連打すると落ちる現象に対策 --- VRCT.py | 138 ++++++++++++++++++++++++++++++++------------------------ 1 file changed, 80 insertions(+), 58 deletions(-) diff --git a/VRCT.py b/VRCT.py index 6480a7f2..d9e1c32c 100644 --- a/VRCT.py +++ b/VRCT.py @@ -8,6 +8,7 @@ from customtkinter import CTk, CTkFrame, CTkCheckBox, CTkFont, CTkButton, CTkIma from PIL.Image import open as Image_open 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 window_config import ToplevelWindowConfig @@ -432,65 +433,75 @@ class App(CTk): print_textbox(self.textbox_message_system_log, "Stop translation", "INFO") save_json(self.PATH_CONFIG, "ENABLE_TRANSLATION", self.ENABLE_TRANSLATION) + def transcription_send(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] + self.mic_audio_recorder = SelectedMicRecorder( + mic_device, + self.INPUT_MIC_ENERGY_THRESHOLD, + self.INPUT_MIC_DYNAMIC_ENERGY_THRESHOLD, + self.INPUT_MIC_RECORD_TIMEOUT, + ) + self.mic_audio_recorder.record_into_queue(self.mic_audio_queue) + self.mic_transcriber = AudioTranscriber( + speaker=False, + source=self.mic_audio_recorder.source, + language=transcription_lang[self.INPUT_MIC_VOICE_LANGUAGE], + phrase_timeout=self.INPUT_MIC_PHRASE_TIMEOUT, + max_phrases=self.INPUT_MIC_MAX_PHRASES, + ) + def mic_transcript_to_chatbox(): + self.mic_transcriber.transcribe_audio_queue(self.mic_audio_queue) + message = self.mic_transcriber.get_transcript() + if len(message) > 0: + # word filter + if len(self.keyword_processor.extract_keywords(message)) != 0: + print_textbox(self.textbox_message_log, f"Detect WordFilter :{message}", "INFO") + print_textbox(self.textbox_message_system_log, f"Detect WordFilter :{message}", "INFO") + return + + # 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.INPUT_SOURCE_LANG, + target_language=self.INPUT_TARGET_LANG, + message=message + ) + 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) + # 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") + + self.mic_print_transcript = thread_fnc(mic_transcript_to_chatbox) + self.mic_print_transcript.daemon = True + self.mic_print_transcript.start() + print_textbox(self.textbox_message_log, "Start voice2chatbox", "INFO") + print_textbox(self.textbox_message_system_log, "Start voice2chatbox", "INFO") + self.checkbox_transcription_send.configure(state="normal") + self.checkbox_transcription_receive.configure(state="normal") + def checkbox_transcription_send_callback(self): self.ENABLE_TRANSCRIPTION_SEND = self.checkbox_transcription_send.get() if self.ENABLE_TRANSCRIPTION_SEND is True: + 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.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] - self.mic_audio_recorder = SelectedMicRecorder( - mic_device, - self.INPUT_MIC_ENERGY_THRESHOLD, - self.INPUT_MIC_DYNAMIC_ENERGY_THRESHOLD, - self.INPUT_MIC_RECORD_TIMEOUT, - ) - self.mic_audio_recorder.record_into_queue(self.mic_audio_queue) - self.mic_transcriber = AudioTranscriber( - speaker=False, - source=self.mic_audio_recorder.source, - language=transcription_lang[self.INPUT_MIC_VOICE_LANGUAGE], - phrase_timeout=self.INPUT_MIC_PHRASE_TIMEOUT, - max_phrases=self.INPUT_MIC_MAX_PHRASES, - ) - def mic_transcript_to_chatbox(): - self.mic_transcriber.transcribe_audio_queue(self.mic_audio_queue) - message = self.mic_transcriber.get_transcript() - if len(message) > 0: - # word filter - if len(self.keyword_processor.extract_keywords(message)) != 0: - print_textbox(self.textbox_message_log, f"Detect WordFilter :{message}", "INFO") - print_textbox(self.textbox_message_system_log, f"Detect WordFilter :{message}", "INFO") - return + self.update() - # 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.INPUT_SOURCE_LANG, - target_language=self.INPUT_TARGET_LANG, - message=message - ) - 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) - # 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") - - self.mic_print_transcript = thread_fnc(mic_transcript_to_chatbox) - self.mic_print_transcript.daemon = True - self.mic_print_transcript.start() - - print_textbox(self.textbox_message_log, "Start voice2chatbox", "INFO") - print_textbox(self.textbox_message_system_log, "Start voice2chatbox", "INFO") + th_transcription_send = Thread(target=self.transcription_send) + th_transcription_send.daemon = True + th_transcription_send.start() else: if ((self.checkbox_translation.get() is False) and (self.checkbox_transcription_send.get() is False) and @@ -506,10 +517,7 @@ class App(CTk): print_textbox(self.textbox_message_system_log, "Stop voice2chatbox", "INFO") save_json(self.PATH_CONFIG, "ENABLE_TRANSCRIPTION_SEND", self.ENABLE_TRANSCRIPTION_SEND) - def checkbox_transcription_receive_callback(self): - self.ENABLE_TRANSCRIPTION_RECEIVE = self.checkbox_transcription_receive.get() - if self.ENABLE_TRANSCRIPTION_RECEIVE is True: - self.button_config.configure(state="disabled", fg_color=["gray92", "gray14"]) + def transcription_receive(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( @@ -559,6 +567,20 @@ class App(CTk): 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") + + def checkbox_transcription_receive_callback(self): + self.ENABLE_TRANSCRIPTION_RECEIVE = self.checkbox_transcription_receive.get() + if self.ENABLE_TRANSCRIPTION_RECEIVE is True: + 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() + + th_transcription_receive = Thread(target=self.transcription_receive) + th_transcription_receive.daemon = True + th_transcription_receive.start() else: if ((self.checkbox_translation.get() is False) and (self.checkbox_transcription_send.get() is False) and From 3a8e02f986782a3448480ebdd5b42c143d395ab6 Mon Sep 17 00:00:00 2001 From: misygauziya Date: Fri, 21 Jul 2023 14:22:19 +0900 Subject: [PATCH 2/3] [bugfix] VRCT.py MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit checkboxを外した時にも排他処理を実装 --- VRCT.py | 85 +++++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 55 insertions(+), 30 deletions(-) diff --git a/VRCT.py b/VRCT.py index d9e1c32c..84dfcb55 100644 --- a/VRCT.py +++ b/VRCT.py @@ -433,7 +433,7 @@ class App(CTk): print_textbox(self.textbox_message_system_log, "Stop translation", "INFO") save_json(self.PATH_CONFIG, "ENABLE_TRANSLATION", self.ENABLE_TRANSLATION) - def transcription_send(self): + 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] self.mic_audio_recorder = SelectedMicRecorder( @@ -491,6 +491,22 @@ class App(CTk): self.checkbox_transcription_send.configure(state="normal") self.checkbox_transcription_receive.configure(state="normal") + def transcription_send_stop(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") + 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 checkbox_transcription_send_callback(self): self.ENABLE_TRANSCRIPTION_SEND = self.checkbox_transcription_send.get() if self.ENABLE_TRANSCRIPTION_SEND is True: @@ -499,25 +515,21 @@ class App(CTk): self.button_config.configure(state="disabled", fg_color=["gray92", "gray14"]) self.update() - th_transcription_send = Thread(target=self.transcription_send) - th_transcription_send.daemon = True - th_transcription_send.start() + th_transcription_send_start = Thread(target=self.transcription_send_start) + th_transcription_send_start.daemon = True + th_transcription_send_start.start() 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"]) - 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 + 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() - print_textbox(self.textbox_message_log, "Stop voice2chatbox", "INFO") - print_textbox(self.textbox_message_system_log, "Stop voice2chatbox", "INFO") + 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(self): + 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( @@ -570,6 +582,22 @@ class App(CTk): self.checkbox_transcription_send.configure(state="normal") self.checkbox_transcription_receive.configure(state="normal") + def transcription_receive_stop(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") + 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 checkbox_transcription_receive_callback(self): self.ENABLE_TRANSCRIPTION_RECEIVE = self.checkbox_transcription_receive.get() if self.ENABLE_TRANSCRIPTION_RECEIVE is True: @@ -578,21 +606,18 @@ class App(CTk): self.button_config.configure(state="disabled", fg_color=["gray92", "gray14"]) self.update() - th_transcription_receive = Thread(target=self.transcription_receive) - th_transcription_receive.daemon = True - th_transcription_receive.start() + th_transcription_receive_start = Thread(target=self.transcription_receive_start) + th_transcription_receive_start.daemon = True + th_transcription_receive_start.start() 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"]) - 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") + 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() + th_transcription_receive_stop = Thread(target=self.transcription_receive_stop) + th_transcription_receive_stop.daemon = True + th_transcription_receive_stop.start() + save_json(self.PATH_CONFIG, "ENABLE_TRANSCRIPTION_RECEIVE", self.ENABLE_TRANSCRIPTION_RECEIVE) def checkbox_foreground_callback(self): From 731eb76040a964cc9a20058ae92cc152a7853d5f Mon Sep 17 00:00:00 2001 From: misygauziya Date: Fri, 21 Jul 2023 15:38:21 +0900 Subject: [PATCH 3/3] [update] window_config.py MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit word filterに全角半角スペースを除くように修正 --- window_config.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/window_config.py b/window_config.py index b7bdb8c0..8e75cd4b 100644 --- a/window_config.py +++ b/window_config.py @@ -345,8 +345,10 @@ class ToplevelWindowConfig(CTkToplevel): def entry_input_mic_word_filters_callback(self, event): word_filter = self.entry_input_mic_word_filter.get() + word_filter = [w.strip() for w in word_filter.split(",") if len(w.strip()) > 0] + word_filter = ",".join(word_filter) if len(word_filter) > 0: - self.parent.INPUT_MIC_WORD_FILTER = self.entry_input_mic_word_filter.get().split(",") + self.parent.INPUT_MIC_WORD_FILTER = word_filter.split(",") else: self.parent.INPUT_MIC_WORD_FILTER = [] self.parent.keyword_processor = KeywordProcessor()