diff --git a/REDME.txt b/README.txt similarity index 95% rename from REDME.txt rename to README.txt index c13a7629..ef6e28a5 100644 --- a/REDME.txt +++ b/README.txt @@ -86,6 +86,10 @@ https://twitter.com/misya_ai [2023-06-20: v1.0] - マイクからの音声の文字起こし機能を追加 - スピーカーからの音声の文字起こし機能を追加 +[2023-06-28: v1.1] +- いくつかのバクを修正 +- 翻訳/文字起こし言語の表記を略称からわかりやすい文字に変更 +- 文字起こしの処理の軽量化 # 注意事項 再配布とかはやめてね \ No newline at end of file diff --git a/VRCT.py b/VRCT.py index c138dcde..902f6534 100644 --- a/VRCT.py +++ b/VRCT.py @@ -1,9 +1,8 @@ import os import json -import queue +import tkinter as tk import customtkinter from PIL import Image -import pyaudiowpatch as pyaudio import utils import translation @@ -16,6 +15,10 @@ class App(customtkinter.CTk): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) + # init instance + self.translator = translation.Translator() + self.vr = transcription.VoiceRecognizer() + # init config self.PATH_CONFIG = "./config.json" ## main window @@ -30,17 +33,17 @@ class App(customtkinter.CTk): self.FONT_FAMILY = "Yu Gothic UI" ## Translation self.CHOICE_TRANSLATOR = "DeepL(web)" - self.INPUT_SOURCE_LANG = "JA" - self.INPUT_TARGET_LANG = "EN" - self.OUTPUT_SOURCE_LANG = "EN" - self.OUTPUT_TARGET_LANG = "JA" + self.INPUT_SOURCE_LANG = "Japanese" + self.INPUT_TARGET_LANG = "English" + self.OUTPUT_SOURCE_LANG = "English" + self.OUTPUT_TARGET_LANG = "Japanese" ## Transcription - self.CHOICE_MIC_DEVICE = None - self.INPUT_MIC_VOICE_LANGUAGE = "ja-JP" + self.CHOICE_MIC_DEVICE = self.vr.search_default_device()[0] + self.INPUT_MIC_VOICE_LANGUAGE = "Japanese Japan" self.INPUT_MIC_IS_DYNAMIC = False self.INPUT_MIC_THRESHOLD = 300 - self.CHOICE_SPEAKER_DEVICE = None - self.INPUT_SPEAKER_VOICE_LANGUAGE = "en-US" + self.CHOICE_SPEAKER_DEVICE = self.vr.search_default_device()[1] + self.INPUT_SPEAKER_VOICE_LANGUAGE = "English United States" self.INPUT_SPEAKER_INTERVAL = 4 ## Parameter @@ -60,61 +63,89 @@ class App(customtkinter.CTk): config = json.load(fp) # main window if "ENABLE_TRANSLATION" in config.keys(): - self.ENABLE_TRANSLATION = config["ENABLE_TRANSLATION"] + if type(config["ENABLE_TRANSLATION"]) is bool: + self.ENABLE_TRANSLATION = config["ENABLE_TRANSLATION"] if "ENABLE_TRANSCRIPTION_SEND" in config.keys(): - self.ENABLE_TRANSCRIPTION_SEND = config["ENABLE_TRANSCRIPTION_SEND"] + if type(config["ENABLE_TRANSCRIPTION_SEND"]) is bool: + self.ENABLE_TRANSCRIPTION_SEND = config["ENABLE_TRANSCRIPTION_SEND"] if "ENABLE_TRANSCRIPTION_RECEIVE" in config.keys(): - self.ENABLE_TRANSCRIPTION_RECEIVE = config["ENABLE_TRANSCRIPTION_RECEIVE"] + if type(config["ENABLE_TRANSCRIPTION_RECEIVE"]) is bool: + self.ENABLE_TRANSCRIPTION_RECEIVE = config["ENABLE_TRANSCRIPTION_RECEIVE"] if "ENABLE_FOREGROUND" in config.keys(): - self.ENABLE_FOREGROUND = config["ENABLE_FOREGROUND"] + if type(config["ENABLE_FOREGROUND"]) is bool: + self.ENABLE_FOREGROUND = config["ENABLE_FOREGROUND"] # tab ui if "TRANSPARENCY" in config.keys(): - self.TRANSPARENCY = config["TRANSPARENCY"] + if type(config["TRANSPARENCY"]) is int: + if 0 <= config["TRANSPARENCY"] <= 100: + self.TRANSPARENCY = config["TRANSPARENCY"] if "APPEARANCE_THEME" in config.keys(): - self.APPEARANCE_THEME = config["APPEARANCE_THEME"] + if config["APPEARANCE_THEME"] in ["Light", "Dark", "System"]: + self.APPEARANCE_THEME = config["APPEARANCE_THEME"] if "UI_SCALING" in config.keys(): - self.UI_SCALING = config["UI_SCALING"] + if config["UI_SCALING"] in ["80%", "90%", "100%", "110%", "120%"]: + self.UI_SCALING = config["UI_SCALING"] if "FONT_FAMILY" in config.keys(): - self.FONT_FAMILY = config["FONT_FAMILY"] + if config["FONT_FAMILY"] in list(tk.font.families()): + self.FONT_FAMILY = config["FONT_FAMILY"] # translation if "CHOICE_TRANSLATOR" in config.keys(): - self.CHOICE_TRANSLATOR = config["CHOICE_TRANSLATOR"] + if config["CHOICE_TRANSLATOR"] in list(self.translator.translator_status.keys()): + self.CHOICE_TRANSLATOR = config["CHOICE_TRANSLATOR"] if "INPUT_SOURCE_LANG" in config.keys(): - self.INPUT_SOURCE_LANG = config["INPUT_SOURCE_LANG"] + if config["INPUT_SOURCE_LANG"] in self.translator.languages[self.CHOICE_TRANSLATOR]: + self.INPUT_SOURCE_LANG = config["INPUT_SOURCE_LANG"] if "INPUT_TARGET_LANG" in config.keys(): - self.INPUT_TARGET_LANG = config["INPUT_TARGET_LANG"] + if config["INPUT_SOURCE_LANG"] in self.translator.languages[self.CHOICE_TRANSLATOR]: + self.INPUT_TARGET_LANG = config["INPUT_TARGET_LANG"] if "OUTPUT_SOURCE_LANG" in config.keys(): - self.OUTPUT_SOURCE_LANG = config["OUTPUT_SOURCE_LANG"] + if config["INPUT_SOURCE_LANG"] in self.translator.languages[self.CHOICE_TRANSLATOR]: + self.OUTPUT_SOURCE_LANG = config["OUTPUT_SOURCE_LANG"] if "OUTPUT_TARGET_LANG" in config.keys(): - self.OUTPUT_TARGET_LANG = config["OUTPUT_TARGET_LANG"] + if config["INPUT_SOURCE_LANG"] in self.translator.languages[self.CHOICE_TRANSLATOR]: + self.OUTPUT_TARGET_LANG = config["OUTPUT_TARGET_LANG"] # Transcription if "CHOICE_MIC_DEVICE" in config.keys(): - self.CHOICE_MIC_DEVICE = config["CHOICE_MIC_DEVICE"] + if config["CHOICE_MIC_DEVICE"] in [device["name"] for device in self.vr.search_input_device()]: + self.CHOICE_MIC_DEVICE = config["CHOICE_MIC_DEVICE"] if "INPUT_MIC_VOICE_LANGUAGE" in config.keys(): - self.INPUT_MIC_VOICE_LANGUAGE = config["INPUT_MIC_VOICE_LANGUAGE"] + if config["INPUT_MIC_VOICE_LANGUAGE"] in list(self.vr.languages): + self.INPUT_MIC_VOICE_LANGUAGE = config["INPUT_MIC_VOICE_LANGUAGE"] if "INPUT_MIC_IS_DYNAMIC" in config.keys(): - self.INPUT_MIC_IS_DYNAMIC = config["INPUT_MIC_IS_DYNAMIC"] + if type(config["INPUT_MIC_IS_DYNAMIC"]) is bool: + self.INPUT_MIC_IS_DYNAMIC = config["INPUT_MIC_IS_DYNAMIC"] if "INPUT_MIC_THRESHOLD" in config.keys(): - self.INPUT_MIC_THRESHOLD = config["INPUT_MIC_THRESHOLD"] + if type(config["INPUT_MIC_THRESHOLD"]) is int: + self.INPUT_MIC_THRESHOLD = config["INPUT_MIC_THRESHOLD"] if "CHOICE_SPEAKER_DEVICE" in config.keys(): - self.CHOICE_SPEAKER_DEVICE = config["CHOICE_SPEAKER_DEVICE"] + if config["CHOICE_SPEAKER_DEVICE"] in [device["name"] for device in self.vr.search_output_device()]: + self.CHOICE_SPEAKER_DEVICE = config["CHOICE_SPEAKER_DEVICE"] if "INPUT_SPEAKER_VOICE_LANGUAGE" in config.keys(): - self.INPUT_SPEAKER_VOICE_LANGUAGE = config["INPUT_SPEAKER_VOICE_LANGUAGE"] + if config["INPUT_SPEAKER_VOICE_LANGUAGE"] in list(self.vr.languages): + self.INPUT_SPEAKER_VOICE_LANGUAGE = config["INPUT_SPEAKER_VOICE_LANGUAGE"] if "INPUT_SPEAKER_INTERVAL" in config.keys(): - self.INPUT_SPEAKER_INTERVAL = config["INPUT_SPEAKER_INTERVAL"] + if type(config["INPUT_SPEAKER_INTERVAL"]) is int: + self.INPUT_SPEAKER_INTERVAL = config["INPUT_SPEAKER_INTERVAL"] # Parameter if "OSC_IP_ADDRESS" in config.keys(): - self.OSC_IP_ADDRESS = config["OSC_IP_ADDRESS"] + if type(config["OSC_IP_ADDRESS"]) is str: + self.OSC_IP_ADDRESS = config["OSC_IP_ADDRESS"] if "OSC_PORT" in config.keys(): - self.OSC_PORT = config["OSC_PORT"] + if type(config["OSC_PORT"]) is int: + self.OSC_PORT = config["OSC_PORT"] if "AUTH_KEYS" in config.keys(): - self.AUTH_KEYS = config["AUTH_KEYS"] + if type(config["AUTH_KEYS"]) is dict: + if set(config["AUTH_KEYS"].keys()) == set(self.AUTH_KEYS.keys()): + for key, value in config["AUTH_KEYS"].items(): + if type(value) is str: + self.AUTH_KEYS[key] = config["AUTH_KEYS"][key] if "MESSAGE_FORMAT" in config.keys(): - self.MESSAGE_FORMAT = config["MESSAGE_FORMAT"] + if type(config["MESSAGE_FORMAT"]) is str: + self.MESSAGE_FORMAT = config["MESSAGE_FORMAT"] with open(self.PATH_CONFIG, 'w') as fp: config = { @@ -235,6 +266,7 @@ class App(customtkinter.CTk): self.tabview_logs.add("receive") self.tabview_logs.add("system") self.tabview_logs.grid(row=0, column=1, padx=0, pady=0, sticky="nsew") + self.tabview_logs._segmented_button.configure(font=customtkinter.CTkFont(family=self.FONT_FAMILY)) self.tabview_logs._segmented_button.grid(sticky="W") self.tabview_logs.tab("log").grid_rowconfigure(0, weight=1) self.tabview_logs.tab("log").grid_columnconfigure(0, weight=1) @@ -287,21 +319,12 @@ class App(customtkinter.CTk): self.entry_message_box.grid(row=1, column=1, columnspan=2, padx=5, pady=(5, 10), sticky="nsew") # set default values - ## set translator instance - self.translator = translation.Translator() + ## set translator if self.translator.authentication(self.CHOICE_TRANSLATOR, self.AUTH_KEYS[self.CHOICE_TRANSLATOR]) is False: # error update Auth key utils.print_textbox(self.textbox_message_log, "Auth Key or language setting is incorrect", "ERROR") utils.print_textbox(self.textbox_message_system_log, "Auth Key or language setting is incorrect", "ERROR") - ## set transcription instance - self.mic_queue = queue.Queue() - self.spk_queue = queue.Queue() - self.p = pyaudio.PyAudio() - self.vr = transcription.VoiceRecognizer(self.p, self.mic_queue, self.spk_queue) - self.CHOICE_MIC_DEVICE = self.CHOICE_MIC_DEVICE if self.CHOICE_MIC_DEVICE is not None else self.vr.search_default_device()[0] - self.CHOICE_SPEAKER_DEVICE = self.CHOICE_SPEAKER_DEVICE if self.CHOICE_SPEAKER_DEVICE is not None else self.vr.search_default_device()[1] - ## set checkbox enable translation if self.ENABLE_TRANSLATION: self.checkbox_translation.select() @@ -407,6 +430,7 @@ class App(customtkinter.CTk): interval=int(self.INPUT_SPEAKER_INTERVAL), language=self.INPUT_SPEAKER_VOICE_LANGUAGE, ) + self.vr.init_spk() self.vr.start_spk_recording() self.th_vr_recognize_spk = utils.thread_fnc(self.vr_recognize_spk) self.th_vr_recognize_spk.start() @@ -421,7 +445,8 @@ class App(customtkinter.CTk): utils.save_json(self.PATH_CONFIG, "ENABLE_TRANSCRIPTION_RECEIVE", self.ENABLE_TRANSCRIPTION_RECEIVE) def vr_listen_mic(self): - self.vr.listen_mic() + if self.checkbox_transcription_send.get() is True: + self.vr.listen_mic() def vr_recognize_mic(self): message = self.vr.recognize_mic() @@ -441,14 +466,17 @@ class App(customtkinter.CTk): message=message ) voice_message = self.MESSAGE_FORMAT.replace("[message]", message).replace("[translation]", result) - # send OSC message - osc_tools.send_message(voice_message, self.OSC_IP_ADDRESS, self.OSC_PORT) - # update textbox message log - utils.print_textbox(self.textbox_message_log, f"{voice_message}", "SEND") - utils.print_textbox(self.textbox_message_send_log, f"{voice_message}", "SEND") + + if self.checkbox_transcription_send.get() is True: + # send OSC message + osc_tools.send_message(voice_message, self.OSC_IP_ADDRESS, self.OSC_PORT) + # update textbox message log + utils.print_textbox(self.textbox_message_log, f"{voice_message}", "SEND") + utils.print_textbox(self.textbox_message_send_log, f"{voice_message}", "SEND") def vr_listen_spk(self): - self.vr.listen_spk() + if self.checkbox_transcription_receive.get() is True: + self.vr.listen_spk() def vr_recognize_spk(self): message = self.vr.recognize_spk() @@ -470,9 +498,11 @@ class App(customtkinter.CTk): voice_message = self.MESSAGE_FORMAT.replace("[message]", message).replace("[translation]", result) # send OSC message # osc_tools.send_message(voice_message, self.OSC_IP_ADDRESS, self.OSC_PORT) - # update textbox message receive log - utils.print_textbox(self.textbox_message_log, f"{voice_message}", "RECEIVE") - utils.print_textbox(self.textbox_message_receive_log, f"{voice_message}", "RECEIVE") + + if self.checkbox_transcription_receive.get() is True: + # update textbox message receive log + utils.print_textbox(self.textbox_message_log, f"{voice_message}", "RECEIVE") + utils.print_textbox(self.textbox_message_receive_log, f"{voice_message}", "RECEIVE") def checkbox_foreground_callback(self): self.ENABLE_FOREGROUND = self.checkbox_foreground.get() @@ -542,5 +572,6 @@ if __name__ == "__main__": app = App() app.mainloop() except Exception as e: - with open("./error.log", "r") as fp: - fp.write(f"{e}") \ No newline at end of file + import traceback + with open('error.log', 'a') as f: + traceback.print_exc(file=f) \ No newline at end of file diff --git a/languages.py b/languages.py new file mode 100644 index 00000000..5f512980 --- /dev/null +++ b/languages.py @@ -0,0 +1,282 @@ +recognize_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" +} + +deepl_lang = { + "Japanese":"ja", + "English American":"en-US", + "English British":"en-GB", + "Bulgarian":"bg", + "Czech":"cs", + "Danish":"da", + "German":"de", + "Greek":"el", + "English":"en", + "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", + "Portuguese Brazilian":"pt-BR", + "Portuguese European":"pt-PT", + "Romanian":"ro", + "Russian":"ru", + "Slovak":"sk", + "Slovenian":"sl", + "Swedish":"sv", + "Turkish":"tr", + "Ukrainian":"uk", + "Chinese":"zh" +} + +deepl_translate_lang = { + "Japanese":"JA", + "English":"EN", + "Bulgarian":"BG", + "Chinese":"ZH", + "Czech":"CS", + "Danish":"DA", + "Dutch":"NL", + "Estonian":"ET", + "Finnish":"FI", + "French":"FR", + "German":"DE", + "Greek":"EL", + "Hungarian":"HU", + "Italian":"IT", + "Latvian":"LV", + "Lithuanian":"LT", + "Polish":"PL", + "Portuguese":"PT", + "Romanian":"RO", + "Russian":"RU", + "Slovak":"SK", + "Slovenian":"SL", + "Spanish":"ES", + "Swedish":"SV" +} + +translators_bing_lang = { + "japanese":"ja", + "english":"en", + "chinese":"zh", + "arabic":"ar", + "russian":"ru", + "french":"fr", + "german":"de", + "spanish":"es", + "portuguese":"pt", + "italian":"it", + "korean":"ko", + "greek":"el", + "dutch":"nl", + "hindi":"hi", + "turkish":"tr", + "malay":"ms", + "thai":"th", + "vietnamese":"vi", + "indonesian":"id", + "hebrew":"he", + "polish":"pl", + "czech":"cs", + "hungarian":"hu", + "estonian":"et", + "bulgarian":"bg", + "danish":"da", + "finnish":"fi", + "romanian":"ro", + "swedish":"sv", + "slovenian":"sl", + "persian/farsi":"fa", + "bosnian":"bs", + "serbian":"sr", + "fijian":"fj", + "filipino":"tl", + "haitiancreole":"ht", + "catalan":"ca", + "croatian":"hr", + "latvian":"lv", + "lithuanian":"lt", + "urdu":"ur", + "ukrainian":"uk", + "welsh":"cy", + "tahiti":"ty", + "tongan":"to", + "swahili":"sw", + "samoan":"sm", + "slovak":"sk", + "afrikaans":"af", + "norwegian":"no", + "bengali":"bn", + "malagasy":"mg", + "maltese":"mt", + "queretaro otomi":"otq", + "klingon/tlhingan hol":"tlh", + "gujarati":"gu", + "tamil":"ta", + "telugu":"te", + "punjabi":"pa", + "irish":"ga" +} + +translators_google_lang = { + "japanese":"ja", + "english":"en", + "chinese":"zh", + "arabic":"ar", + "russian":"ru", + "french":"fr", + "german":"de", + "spanish":"es", + "portuguese":"pt", + "italian":"it", + "korean":"ko", + "greek":"el", + "dutch":"nl", + "hindi":"hi", + "turkish":"tr", + "malay":"ms", + "thai":"th", + "vietnamese":"vi", + "indonesian":"id", + "hebrew":"he", + "polish":"pl", + "mongolian":"mn", + "czech":"cs", + "hungarian":"hu", + "estonian":"et", + "bulgarian":"bg", + "danish":"da", + "finnish":"fi", + "romanian":"ro", + "swedish":"sv", + "slovenian":"sl", + "persian/farsi":"fa", + "bosnian":"bs", + "serbian":"sr", + "filipino":"tl", + "haitiancreole":"ht", + "catalan":"ca", + "croatian":"hr", + "latvian":"lv", + "lithuanian":"lt", + "urdu":"ur", + "ukrainian":"uk", + "welsh":"cy", + "swahili":"sw", + "samoan":"sm", + "slovak":"sk", + "afrikaans":"af", + "norwegian":"no", + "bengali":"bn", + "malagasy":"mg", + "maltese":"mt", + "gujarati":"gu", + "tamil":"ta", + "telugu":"te", + "punjabi":"pa", + "amharic":"am", + "azerbaijani":"az", + "belarusian":"be", + "cebuano":"ceb", + "esperanto":"eo", + "basque":"eu", + "irish":"ga" +} \ No newline at end of file diff --git a/transcription.py b/transcription.py index 9a746d79..98021064 100644 --- a/transcription.py +++ b/transcription.py @@ -1,41 +1,37 @@ -import sounddevice as sd +import queue import speech_recognition as sr import pyaudiowpatch as pyaudio +import languages # VoiceRecognizer class VoiceRecognizer(): - def __init__(self, p_audio, mic_queue, spk_queue): + def __init__(self): self.r = sr.Recognizer() - self.p = p_audio + self.p = pyaudio.PyAudio() - self.languages = [ - "ja-JP","en-US","en-GB","af-ZA","ar-DZ","ar-BH","ar-EG","ar-IL","ar-IQ","ar-JO","ar-KW","ar-LB","ar-MA", - "ar-OM","ar-PS","ar-QA","ar-SA","ar-TN","ar-AE","eu-ES","bg-BG","ca-ES","cmn-Hans-CN","cmn-Hans-HK", - "cmn-Hant-TW","yue-Hant-HK","hr_HR","cs-CZ","da-DK","en-AU","en-CA","en-IN","en-IE","en-NZ","en-PH", - "en-ZA","fa-IR","fr-FR","fil-PH","gl-ES","de-DE","el-GR","fi-FI","he-IL","hi-IN","hu-HU","id-ID","is-IS", - "it-IT","it-CH","ko-KR","lt-LT","ms-MY","nl-NL","nb-NO","pl-PL","pt-BR","pt-PT","ro-RO","ru-RU","sr-RS", - "sk-SK","sl-SI","es-AR","es-BO","es-CL","es-CO","es-CR","es-DO","es-EC","es-SV","es-GT","es-HN","es-MX", - "es-NI","es-PA","es-PY","es-PE","es-PR","es-ES","es-UY","es-US","es-VE","sv-SE","th-TH","tr-TR","uk-UA", - "vi-VN","zu-ZA" - ] + self.dict_languages = languages.recognize_lang + self.languages = list(self.dict_languages.keys()) self.mic_device_name = None self.mic_threshold = 50 self.mic_is_dynamic = False - self.mic_language = "ja-JP" - self.mic_queue = mic_queue + self.mic_language = "Japanese Japan" + self.mic_queue = queue.Queue(10) self.spk_device = None self.spk_interval = 3 - self.spk_language = "ja-JP" + self.spk_language = "Japanese Japan" self.spk_stream = None - self.spk_queue = spk_queue + self.spk_queue = queue.Queue(10) def search_input_device(self): devices = [] - device_list = sd.query_devices() - for device in device_list: - if device["max_input_channels"] > 0: - devices.append(device) + with pyaudio.PyAudio() as p: + wasapi_info = p.get_host_api_info_by_type(pyaudio.paWASAPI) + for host_index in range(0, p.get_host_api_count()): + for device_index in range(0, p. get_host_api_info_by_index(host_index)['deviceCount']): + device = p.get_device_info_by_host_api_device_index(host_index, device_index) + if device["hostApi"] == wasapi_info["index"] and device["maxInputChannels"] > 0 and device["isLoopbackDevice"] is False: + devices.append(device) return devices def search_output_device(self): @@ -50,21 +46,31 @@ class VoiceRecognizer(): return devices def search_default_device(self): - device_list = sd.query_devices() - mic_index = sd.default.device[0] - name_mic = device_list[mic_index]["name"] with pyaudio.PyAudio() as p: wasapi_info = p.get_host_api_info_by_type(pyaudio.paWASAPI) - default_speakers = p.get_device_info_by_index(wasapi_info["defaultOutputDevice"]) + defaultInputDevice, defaultOutputDevice = wasapi_info["defaultInputDevice"], wasapi_info["defaultOutputDevice"] - if not default_speakers["isLoopbackDevice"]: - for loopback in p.get_loopback_device_info_generator(): - if default_speakers["name"] in loopback["name"]: - name_spk = loopback["name"] + for host_index in range(0, p.get_host_api_count()): + for device_index in range(0, p. get_host_api_info_by_index(host_index)['deviceCount']): + device = p.get_device_info_by_host_api_device_index(host_index, device_index) + if device["index"] == defaultInputDevice: + default_mics = device + name_mic = default_mics["name"] break + + for host_index in range(0, p.get_host_api_count()): + for device_index in range(0, p. get_host_api_info_by_index(host_index)['deviceCount']): + device = p.get_device_info_by_host_api_device_index(host_index, device_index) + if device["index"] == defaultOutputDevice: + default_speakers = device + if not default_speakers["isLoopbackDevice"]: + for loopback in p.get_loopback_device_info_generator(): + if default_speakers["name"] in loopback["name"]: + name_spk = loopback["name"] + break return name_mic, name_spk - def set_mic(self, device_name, threshold=50, is_dynamic=False, language="ja-JP"): + def set_mic(self, device_name, threshold=50, is_dynamic=False, language="Japanese Japan"): input_device_list = self.search_input_device() self.mic_device_name = [device["index"] for device in input_device_list if device["name"] == device_name][0] self.mic_threshold = threshold @@ -72,6 +78,9 @@ class VoiceRecognizer(): self.mic_language = language def init_mic(self): + while self.mic_queue.empty() is False: + self.mic_queue.get() + self.r.energy_threshold = self.mic_threshold if self.mic_is_dynamic: with self.mic as source: @@ -85,17 +94,21 @@ class VoiceRecognizer(): def recognize_mic(self): try: audio = self.mic_queue.get() - text = self.r.recognize_google(audio, language=self.mic_language) + text = self.r.recognize_google(audio, language=self.dict_languages[self.mic_language]) except: text = "" return text - def set_spk(self, device_name, interval, language): + def set_spk(self, device_name, interval=4, language="Japanese Japan"): output_device_list = self.search_output_device() self.spk_device = [device for device in output_device_list if device["name"] == device_name][0] self.spk_interval = interval self.spk_language = language + def init_spk(self): + while self.spk_queue.empty() is False: + self.spk_queue.get() + def spk_record_callback(self, in_data, frame_count, time_info, status): self.spk_queue.put(in_data) return (in_data, pyaudio.paContinue) @@ -127,51 +140,55 @@ class VoiceRecognizer(): try: in_data = self.spk_queue.get() audio_data = sr.AudioData(in_data, int(self.spk_device["defaultSampleRate"]), self.spk_interval) - text = self.r.recognize_google(audio_data, language=self.spk_language) + text = self.r.recognize_google(audio_data, language=self.dict_languages[self.spk_language]) except: text = "" return text if __name__ == "__main__": - import queue - import threading + # import queue + # import threading - mic_queue = queue.Queue() - spk_queue = queue.Queue() - vr = VoiceRecognizer(mic_queue, spk_queue) + # mic_queue = queue.Queue() + # spk_queue = queue.Queue() + # vr = VoiceRecognizer(mic_queue, spk_queue) - mic_name, spk_name = vr.search_default_device() - print("mic_name", mic_name) - print("spk_name", spk_name) + # mic_name, spk_name = vr.search_default_device() + # print("mic_name", mic_name) + # print("spk_name", spk_name) - ############################################################### - vr.set_mic(device_name=mic_name, threshold=300, is_dynamic=False, language="ja-JP") - vr.init_mic() + # ############################################################### + # vr.set_mic(device_name=mic_name, threshold=300, is_dynamic=False, language="ja-JP") + # vr.init_mic() - def vr_listen_mic(): - while True: - vr.listen_mic() + # def vr_listen_mic(): + # while True: + # vr.listen_mic() - def vr_recognize_mic(): - while True: - text = vr.recognize_mic() - if len(text) > 0: - print(text) - th_vr_listen_mic = threading.Thread(target=vr_listen_mic) - th_vr_listen_mic.start() - th_vr_recognize_mic = threading.Thread(target=vr_recognize_mic) - th_vr_recognize_mic.start() - ############################################################### + # def vr_recognize_mic(): + # while True: + # text = vr.recognize_mic() + # if len(text) > 0: + # print(text) + # th_vr_listen_mic = threading.Thread(target=vr_listen_mic) + # th_vr_listen_mic.start() + # th_vr_recognize_mic = threading.Thread(target=vr_recognize_mic) + # th_vr_recognize_mic.start() + # ############################################################### - ############################################################### - vr.set_spk(device_name=spk_name, interval=4, language="ja-JP") - vr.start_spk_recording() + # ############################################################### + # vr.set_spk(device_name=spk_name, interval=4, language="ja-JP") + # vr.start_spk_recording() - def vr_recognize_spk(): - while True: - text = vr.recognize_spk() - if len(text) > 0: - print(text) - th_vr_recognize_spk = threading.Thread(target=vr_recognize_spk) - th_vr_recognize_spk.start() - ############################################################### \ No newline at end of file + # def vr_recognize_spk(): + # while True: + # text = vr.recognize_spk() + # if len(text) > 0: + # print(text) + # th_vr_recognize_spk = threading.Thread(target=vr_recognize_spk) + # th_vr_recognize_spk.start() + # ############################################################### + + vr = VoiceRecognizer() + print(vr.search_input_device()) + print(vr.search_default_device()) \ No newline at end of file diff --git a/translation.py b/translation.py index cbb96f4f..58f8ad8c 100644 --- a/translation.py +++ b/translation.py @@ -1,6 +1,7 @@ import deepl import deepl_translate import translators as ts +import languages # Translator class Translator(): @@ -11,30 +12,18 @@ class Translator(): "Google(web)": False, "Bing(web)": False, } + + self.dict_languages = {} + self.dict_languages["DeepL(web)"] = languages.deepl_translate_lang + self.dict_languages["DeepL(auth)"] = languages.deepl_lang + self.dict_languages["Google(web)"] = languages.translators_google_lang + self.dict_languages["Bing(web)"] = languages.translators_bing_lang + self.languages = {} - self.languages["DeepL(web)"] = [ - "JA","EN","BG","ZH","CS","DA","NL","ET","FI","FR","DE","EL","HU","IT", - "LV","LT","PL","PT","RO","RU","SK","SL","ES","SV", - ] - self.languages["DeepL(auth)"] = [ - "JA","EN-US","EN-GB","BG","CS","DA","DE","EL","ES","ET","FI","FR","HU", - "ID","IT","KO","LT","LV","NB","NL","PL","PT","PT-BR","PT-PT","RO","RU", - "SK","SL","SV","TR","UK","ZH", - ] - self.languages["Google(web)"] = [ - "ja","en","zh","ar","ru","fr","de","es","pt","it","ko","el","nl","hi", - "tr","ms","th","vi","id","he","pl","mn","cs","hu","et","bg","da","fi", - "ro","sv","sl","fa","bs","sr","tl","ht","ca","hr","lv","lt","ur","uk", - "cy","sw","sm","sk","af","no","bn","mg","mt","gu","ta","te","pa","am", - "az","be","ceb","eo","eu","ga" - ] - self.languages["Bing(web)"] = [ - "ja","en","zh","ar","ru","fr","de","es","pt","it","ko","el","nl","hi", - "tr","ms","th","vi","id","he","pl","cs","hu","et","bg","da","fi","ro", - "sv","sl","fa","bs","sr","fj","tl","ht","ca","hr","lv","lt","ur","uk", - "cy","ty","to","sw","sm","sk","af","no","bn","mg","mt","otq","tlh","gu", - "ta","te","pa","ga" - ] + self.languages["DeepL(web)"] = list(self.dict_languages["DeepL(web)"].keys()) + self.languages["DeepL(auth)"] = list(self.dict_languages["DeepL(auth)"].keys()) + self.languages["Google(web)"] = list(self.dict_languages["Google(web)"].keys()) + self.languages["Bing(web)"] = list(self.dict_languages["Bing(web)"].keys()) self.deepl_client = None def authentication(self, translator_name, authkey=None): @@ -62,13 +51,31 @@ class Translator(): result = False try: if translator_name == "DeepL(web)": - result = deepl_translate.translate(source_language=source_language, target_language=target_language, text=message) + result = deepl_translate.translate( + source_language=self.dict_languages["DeepL(web)"][source_language], + target_language=self.dict_languages["DeepL(web)"][target_language], + text=message + ) elif translator_name == "DeepL(auth)": - result = self.deepl_client.translate_text(message, source_lang=source_language, target_lang=target_language).text + result = self.deepl_client.translate_text( + message, + source_lang=self.dict_languages["DeepL(auth)"][source_language], + target_lang=self.dict_languages["DeepL(auth)"][target_language], + ).text elif translator_name == "Google(web)": - result = ts.translate_text(query_text=message, translator="google", from_language=source_language, to_language=target_language) + result = ts.translate_text( + query_text=message, + translator="google", + from_language=self.dict_languages["Google(web)"][source_language], + to_language=self.dict_languages["Google(web)"][target_language], + ) elif translator_name == "Bing(web)": - result = ts.translate_text(query_text=message, translator="bing", from_language=source_language, to_language=target_language) + result = ts.translate_text( + query_text=message, + translator="bing", + from_language=self.dict_languages["Bing(web)"][source_language], + to_language=self.dict_languages["Bing(web)"][target_language], + ) except: pass return result \ No newline at end of file diff --git a/window_config.py b/window_config.py index d10fc407..b9314236 100644 --- a/window_config.py +++ b/window_config.py @@ -59,9 +59,11 @@ class ToplevelWindowConfig(customtkinter.CTkToplevel): self.tabview_config.tab("UI"), values=["Light", "Dark", "System"], command=self.optionmenu_theme_callback, - variable=customtkinter.StringVar(value=self.parent.APPEARANCE_THEME) + variable=customtkinter.StringVar(value=self.parent.APPEARANCE_THEME), + font=customtkinter.CTkFont(family=self.parent.FONT_FAMILY), ) self.optionmenu_appearance_theme.grid(row=1, column=1, columnspan=1, padx=5, pady=5, sticky="nsew") + self.optionmenu_appearance_theme._dropdown_menu.configure(font=customtkinter.CTkFont(family=self.parent.FONT_FAMILY)) ## optionmenu UI scaling self.label_ui_scaling = customtkinter.CTkLabel( @@ -75,9 +77,11 @@ class ToplevelWindowConfig(customtkinter.CTkToplevel): self.tabview_config.tab("UI"), values=["80%", "90%", "100%", "110%", "120%"], command=self.optionmenu_ui_scaling_callback, - variable=customtkinter.StringVar(value=self.parent.UI_SCALING) + variable=customtkinter.StringVar(value=self.parent.UI_SCALING), + font=customtkinter.CTkFont(family=self.parent.FONT_FAMILY), ) self.optionmenu_ui_scaling.grid(row=2, column=1, columnspan=1, padx=5, pady=5, sticky="nsew") + self.optionmenu_ui_scaling._dropdown_menu.configure(font=customtkinter.CTkFont(family=self.parent.FONT_FAMILY)) ## optionmenu font family self.label_font_family = customtkinter.CTkLabel( @@ -92,9 +96,11 @@ class ToplevelWindowConfig(customtkinter.CTkToplevel): self.tabview_config.tab("UI"), values=font_families, command=self.optionmenu_font_family_callback, - variable=customtkinter.StringVar(value=self.parent.FONT_FAMILY) + variable=customtkinter.StringVar(value=self.parent.FONT_FAMILY), + font=customtkinter.CTkFont(family=self.parent.FONT_FAMILY), ) self.optionmenu_font_family.grid(row=3, column=1, columnspan=1, padx=5, pady=5, sticky="nsew") + self.optionmenu_font_family._dropdown_menu.configure(font=customtkinter.CTkFont(family=self.parent.FONT_FAMILY)) # tab Translation ## optionmenu translation translator @@ -102,17 +108,18 @@ class ToplevelWindowConfig(customtkinter.CTkToplevel): self.tabview_config.tab("Translation"), text="Select Translator:", fg_color="transparent", - font=customtkinter.CTkFont(family=self.parent.FONT_FAMILY) + font=customtkinter.CTkFont(family=self.parent.FONT_FAMILY), ) self.label_translation_translator.grid(row=0, column=0, columnspan=1, padx=5, pady=5, sticky="nsw") self.optionmenu_translation_translator = customtkinter.CTkOptionMenu( self.tabview_config.tab("Translation"), values=list(self.parent.translator.translator_status.keys()), command=self.optionmenu_translation_translator_callback, + variable=customtkinter.StringVar(value=self.parent.CHOICE_TRANSLATOR), font=customtkinter.CTkFont(family=self.parent.FONT_FAMILY), - variable=customtkinter.StringVar(value=self.parent.CHOICE_TRANSLATOR) ) self.optionmenu_translation_translator.grid(row=0, column=1, columnspan=3 ,padx=5, pady=5, sticky="nsew") + self.optionmenu_translation_translator._dropdown_menu.configure(font=customtkinter.CTkFont(family=self.parent.FONT_FAMILY)) ## optionmenu translation input language self.label_translation_input_language = customtkinter.CTkLabel( @@ -127,11 +134,12 @@ class ToplevelWindowConfig(customtkinter.CTkToplevel): self.optionmenu_translation_input_source_language = customtkinter.CTkOptionMenu( self.tabview_config.tab("Translation"), command=self.optionmenu_translation_input_source_language_callback, - font=customtkinter.CTkFont(family=self.parent.FONT_FAMILY), values=self.parent.translator.languages[self.parent.CHOICE_TRANSLATOR], variable=customtkinter.StringVar(value=self.parent.INPUT_SOURCE_LANG), + font=customtkinter.CTkFont(family=self.parent.FONT_FAMILY), ) self.optionmenu_translation_input_source_language.grid(row=1, column=1, columnspan=1, padx=5, pady=5, sticky="nsew") + self.optionmenu_translation_input_source_language._dropdown_menu.configure(font=customtkinter.CTkFont(family=self.parent.FONT_FAMILY)) ## label translation input arrow self.label_translation_input_arrow = customtkinter.CTkLabel( @@ -146,11 +154,12 @@ class ToplevelWindowConfig(customtkinter.CTkToplevel): self.optionmenu_translation_input_target_language = customtkinter.CTkOptionMenu( self.tabview_config.tab("Translation"), command=self.optionmenu_translation_input_target_language_callback, - font=customtkinter.CTkFont(family=self.parent.FONT_FAMILY), values=self.parent.translator.languages[self.parent.CHOICE_TRANSLATOR], variable=customtkinter.StringVar(value=self.parent.INPUT_TARGET_LANG), + font=customtkinter.CTkFont(family=self.parent.FONT_FAMILY), ) self.optionmenu_translation_input_target_language.grid(row=1, column=3, columnspan=1, padx=5, pady=5, sticky="nsew") + self.optionmenu_translation_input_target_language._dropdown_menu.configure(font=customtkinter.CTkFont(family=self.parent.FONT_FAMILY)) ## optionmenu translation output language self.label_translation_output_language = customtkinter.CTkLabel( @@ -165,11 +174,12 @@ class ToplevelWindowConfig(customtkinter.CTkToplevel): self.optionmenu_translation_output_source_language = customtkinter.CTkOptionMenu( self.tabview_config.tab("Translation"), command=self.optionmenu_translation_output_source_language_callback, - font=customtkinter.CTkFont(family=self.parent.FONT_FAMILY), values=self.parent.translator.languages[self.parent.CHOICE_TRANSLATOR], variable=customtkinter.StringVar(value=self.parent.OUTPUT_SOURCE_LANG), + font=customtkinter.CTkFont(family=self.parent.FONT_FAMILY), ) self.optionmenu_translation_output_source_language.grid(row=2, column=1, columnspan=1, padx=5, pady=5, sticky="nsew") + self.optionmenu_translation_output_source_language._dropdown_menu.configure(font=customtkinter.CTkFont(family=self.parent.FONT_FAMILY)) ## label translation output arrow self.label_translation_output_arrow = customtkinter.CTkLabel( @@ -184,11 +194,12 @@ class ToplevelWindowConfig(customtkinter.CTkToplevel): self.optionmenu_translation_output_target_language = customtkinter.CTkOptionMenu( self.tabview_config.tab("Translation"), command=self.optionmenu_translation_output_target_language_callback, - font=customtkinter.CTkFont(family=self.parent.FONT_FAMILY), values=self.parent.translator.languages[self.parent.CHOICE_TRANSLATOR], variable=customtkinter.StringVar(value=self.parent.OUTPUT_TARGET_LANG), + font=customtkinter.CTkFont(family=self.parent.FONT_FAMILY), ) self.optionmenu_translation_output_target_language.grid(row=2, column=3, columnspan=1, padx=5, pady=5, sticky="nsew") + self.optionmenu_translation_output_target_language._dropdown_menu.configure(font=customtkinter.CTkFont(family=self.parent.FONT_FAMILY)) # tab Transcription ## optionmenu input mic device @@ -203,10 +214,11 @@ class ToplevelWindowConfig(customtkinter.CTkToplevel): self.tabview_config.tab("Transcription"), values=[device["name"] for device in self.parent.vr.search_input_device()], command=self.optionmenu_input_mic_device_callback, + variable=customtkinter.StringVar(value=self.parent.CHOICE_MIC_DEVICE), font=customtkinter.CTkFont(family=self.parent.FONT_FAMILY), - variable=customtkinter.StringVar(value=self.parent.CHOICE_MIC_DEVICE) ) self.optionmenu_input_mic_device.grid(row=0, column=1, columnspan=1 ,padx=5, pady=5, sticky="nsew") + self.optionmenu_input_mic_device._dropdown_menu.configure(font=customtkinter.CTkFont(family=self.parent.FONT_FAMILY)) ## optionmenu input mic voice language self.label_input_mic_voice_language = customtkinter.CTkLabel( @@ -220,10 +232,11 @@ class ToplevelWindowConfig(customtkinter.CTkToplevel): self.tabview_config.tab("Transcription"), values=list(self.parent.vr.languages), command=self.optionmenu_input_mic_voice_language_callback, + variable=customtkinter.StringVar(value=self.parent.INPUT_MIC_VOICE_LANGUAGE), font=customtkinter.CTkFont(family=self.parent.FONT_FAMILY), - variable=customtkinter.StringVar(value=self.parent.INPUT_MIC_VOICE_LANGUAGE) ) self.optionmenu_input_mic_voice_language.grid(row=1, column=1, columnspan=1 ,padx=5, pady=5, sticky="nsew") + self.optionmenu_input_mic_voice_language._dropdown_menu.configure(font=customtkinter.CTkFont(family=self.parent.FONT_FAMILY)) ## checkbox input mic in dynamic self.label_input_mic_is_dynamic = customtkinter.CTkLabel( @@ -275,10 +288,11 @@ class ToplevelWindowConfig(customtkinter.CTkToplevel): self.tabview_config.tab("Transcription"), values=[device["name"] for device in self.parent.vr.search_output_device()], command=self.optionmenu_input_speaker_device_callback, - font=customtkinter.CTkFont(family=self.parent.FONT_FAMILY), variable=customtkinter.StringVar(value=self.parent.CHOICE_SPEAKER_DEVICE), + font=customtkinter.CTkFont(family=self.parent.FONT_FAMILY), ) self.optionmenu_input_speaker_device.grid(row=4, column=1, columnspan=1 ,padx=5, pady=5, sticky="nsew") + self.optionmenu_input_speaker_device._dropdown_menu.configure(font=customtkinter.CTkFont(family=self.parent.FONT_FAMILY)) ## optionmenu input speaker voice language self.label_input_speaker_voice_language = customtkinter.CTkLabel( @@ -292,10 +306,11 @@ class ToplevelWindowConfig(customtkinter.CTkToplevel): self.tabview_config.tab("Transcription"), values=list(self.parent.vr.languages), command=self.optionmenu_input_speaker_voice_language_callback, - font=customtkinter.CTkFont(family=self.parent.FONT_FAMILY), variable=customtkinter.StringVar(value=self.parent.INPUT_SPEAKER_VOICE_LANGUAGE), + font=customtkinter.CTkFont(family=self.parent.FONT_FAMILY), ) self.optionmenu_input_speaker_voice_language.grid(row=5, column=1, columnspan=1 ,padx=5, pady=5, sticky="nsew") + self.optionmenu_input_speaker_voice_language._dropdown_menu.configure(font=customtkinter.CTkFont(family=self.parent.FONT_FAMILY)) ## entry input speaker interval self.label_input_speaker_interval = customtkinter.CTkLabel( @@ -402,35 +417,47 @@ class ToplevelWindowConfig(customtkinter.CTkToplevel): self.label_transparency.configure(font=customtkinter.CTkFont(family=choice)) self.label_appearance_theme.configure(font=customtkinter.CTkFont(family=choice)) self.optionmenu_appearance_theme.configure(font=customtkinter.CTkFont(family=choice)) + self.optionmenu_appearance_theme._dropdown_menu.configure(font=customtkinter.CTkFont(family=choice)) self.label_ui_scaling.configure(font=customtkinter.CTkFont(family=choice)) self.optionmenu_ui_scaling.configure(font=customtkinter.CTkFont(family=choice)) + self.optionmenu_ui_scaling._dropdown_menu.configure(font=customtkinter.CTkFont(family=choice)) self.label_font_family.configure(font=customtkinter.CTkFont(family=choice)) self.optionmenu_font_family.configure(font=customtkinter.CTkFont(family=choice)) + self.optionmenu_font_family._dropdown_menu.configure(font=customtkinter.CTkFont(family=choice)) # tab Translation self.label_translation_translator.configure(font=customtkinter.CTkFont(family=choice)) self.optionmenu_translation_translator.configure(font=customtkinter.CTkFont(family=choice)) + self.optionmenu_translation_translator._dropdown_menu.configure(font=customtkinter.CTkFont(family=choice)) self.label_translation_input_language.configure(font=customtkinter.CTkFont(family=choice)) self.optionmenu_translation_input_source_language.configure(font=customtkinter.CTkFont(family=choice)) + self.optionmenu_translation_input_source_language._dropdown_menu.configure(font=customtkinter.CTkFont(family=choice)) self.label_translation_input_arrow.configure(font=customtkinter.CTkFont(family=choice)) self.optionmenu_translation_input_target_language.configure(font=customtkinter.CTkFont(family=choice)) + self.optionmenu_translation_input_target_language._dropdown_menu.configure(font=customtkinter.CTkFont(family=choice)) self.label_translation_output_language.configure(font=customtkinter.CTkFont(family=choice)) self.optionmenu_translation_output_source_language.configure(font=customtkinter.CTkFont(family=choice)) - self.label_translation_output_arrow.configure(font=customtkinter.CTkFont(family=choice)) + self.optionmenu_translation_output_source_language._dropdown_menu.configure(font=customtkinter.CTkFont(family=choice)) self.label_translation_output_arrow.configure(font=customtkinter.CTkFont(family=choice)) self.optionmenu_translation_output_target_language.configure(font=customtkinter.CTkFont(family=choice)) + self.optionmenu_translation_output_target_language._dropdown_menu.configure(font=customtkinter.CTkFont(family=choice)) # tab Transcription self.label_input_mic_device.configure(font=customtkinter.CTkFont(family=choice)) self.optionmenu_input_mic_device.configure(font=customtkinter.CTkFont(family=choice)) + self.optionmenu_input_mic_device._dropdown_menu.configure(font=customtkinter.CTkFont(family=choice)) self.label_input_mic_voice_language.configure(font=customtkinter.CTkFont(family=choice)) self.optionmenu_input_mic_voice_language.configure(font=customtkinter.CTkFont(family=choice)) + self.optionmenu_input_mic_voice_language._dropdown_menu.configure(font=customtkinter.CTkFont(family=choice)) self.label_input_mic_is_dynamic.configure(font=customtkinter.CTkFont(family=choice)) self.label_input_mic_threshold.configure(font=customtkinter.CTkFont(family=choice)) + self.entry_input_mic_threshold.configure(font=customtkinter.CTkFont(family=choice)) self.label_input_speaker_device.configure(font=customtkinter.CTkFont(family=choice)) self.optionmenu_input_speaker_device.configure(font=customtkinter.CTkFont(family=choice)) + self.optionmenu_input_speaker_device._dropdown_menu.configure(font=customtkinter.CTkFont(family=choice)) self.label_input_speaker_voice_language.configure(font=customtkinter.CTkFont(family=choice)) self.optionmenu_input_speaker_voice_language.configure(font=customtkinter.CTkFont(family=choice)) + self.optionmenu_input_speaker_voice_language._dropdown_menu.configure(font=customtkinter.CTkFont(family=choice)) self.label_input_speaker_interval.configure(font=customtkinter.CTkFont(family=choice)) self.entry_input_speaker_interval.configure(font=customtkinter.CTkFont(family=choice)) diff --git a/window_information.py b/window_information.py index 2b7056e9..96c2afd2 100644 --- a/window_information.py +++ b/window_information.py @@ -18,7 +18,7 @@ class ToplevelWindowInformation(customtkinter.CTkToplevel): font=customtkinter.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.0) + textbox_information_message = """VRCT(v1.1) # 概要 VRChatで使用されるChatBoxをOSC経由でメッセージを送信するツールになります。 @@ -109,6 +109,10 @@ https://twitter.com/misya_ai [2023-06-20: v1.0] - マイクからの音声の文字起こし機能を追加 - スピーカーからの音声の文字起こし機能を追加 +[2023-06-28: v1.1] +- いくつかのバクを修正 +- 翻訳/文字起こし言語の表記を略称からわかりやすい文字に変更 +- 文字起こしの処理の軽量化 # 注意事項 再配布とかはやめてね