diff --git a/VRCT.py b/VRCT.py index 864ca661..902f6534 100644 --- a/VRCT.py +++ b/VRCT.py @@ -33,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 = self.vr.search_default_device()[0] - self.INPUT_MIC_VOICE_LANGUAGE = "ja-JP" + self.INPUT_MIC_VOICE_LANGUAGE = "Japanese Japan" self.INPUT_MIC_IS_DYNAMIC = False self.INPUT_MIC_THRESHOLD = 300 self.CHOICE_SPEAKER_DEVICE = self.vr.search_default_device()[1] - self.INPUT_SPEAKER_VOICE_LANGUAGE = "en-US" + self.INPUT_SPEAKER_VOICE_LANGUAGE = "English United States" self.INPUT_SPEAKER_INTERVAL = 4 ## Parameter 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 56a6554a..98021064 100644 --- a/transcription.py +++ b/transcription.py @@ -1,6 +1,7 @@ import queue import speech_recognition as sr import pyaudiowpatch as pyaudio +import languages # VoiceRecognizer class VoiceRecognizer(): @@ -8,25 +9,17 @@ class VoiceRecognizer(): self.r = sr.Recognizer() 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_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 = queue.Queue(10) @@ -77,7 +70,7 @@ class VoiceRecognizer(): 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 @@ -101,12 +94,12 @@ 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 @@ -147,7 +140,7 @@ 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 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