Merge branch 'develop'

This commit is contained in:
misyaguziya
2023-06-28 02:26:51 +09:00
7 changed files with 538 additions and 166 deletions

View File

@@ -86,6 +86,10 @@ https://twitter.com/misya_ai
[2023-06-20: v1.0] [2023-06-20: v1.0]
- マイクからの音声の文字起こし機能を追加 - マイクからの音声の文字起こし機能を追加
- スピーカーからの音声の文字起こし機能を追加 - スピーカーからの音声の文字起こし機能を追加
[2023-06-28: v1.1]
- いくつかのバクを修正
- 翻訳/文字起こし言語の表記を略称からわかりやすい文字に変更
- 文字起こしの処理の軽量化
# 注意事項 # 注意事項
再配布とかはやめてね 再配布とかはやめてね

77
VRCT.py
View File

@@ -1,9 +1,8 @@
import os import os
import json import json
import queue import tkinter as tk
import customtkinter import customtkinter
from PIL import Image from PIL import Image
import pyaudiowpatch as pyaudio
import utils import utils
import translation import translation
@@ -16,6 +15,10 @@ class App(customtkinter.CTk):
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs) super().__init__(*args, **kwargs)
# init instance
self.translator = translation.Translator()
self.vr = transcription.VoiceRecognizer()
# init config # init config
self.PATH_CONFIG = "./config.json" self.PATH_CONFIG = "./config.json"
## main window ## main window
@@ -30,17 +33,17 @@ class App(customtkinter.CTk):
self.FONT_FAMILY = "Yu Gothic UI" self.FONT_FAMILY = "Yu Gothic UI"
## Translation ## Translation
self.CHOICE_TRANSLATOR = "DeepL(web)" self.CHOICE_TRANSLATOR = "DeepL(web)"
self.INPUT_SOURCE_LANG = "JA" self.INPUT_SOURCE_LANG = "Japanese"
self.INPUT_TARGET_LANG = "EN" self.INPUT_TARGET_LANG = "English"
self.OUTPUT_SOURCE_LANG = "EN" self.OUTPUT_SOURCE_LANG = "English"
self.OUTPUT_TARGET_LANG = "JA" self.OUTPUT_TARGET_LANG = "Japanese"
## Transcription ## Transcription
self.CHOICE_MIC_DEVICE = None 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_IS_DYNAMIC = False
self.INPUT_MIC_THRESHOLD = 300 self.INPUT_MIC_THRESHOLD = 300
self.CHOICE_SPEAKER_DEVICE = None 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 self.INPUT_SPEAKER_INTERVAL = 4
## Parameter ## Parameter
@@ -60,60 +63,88 @@ class App(customtkinter.CTk):
config = json.load(fp) config = json.load(fp)
# main window # main window
if "ENABLE_TRANSLATION" in config.keys(): if "ENABLE_TRANSLATION" in config.keys():
if type(config["ENABLE_TRANSLATION"]) is bool:
self.ENABLE_TRANSLATION = config["ENABLE_TRANSLATION"] self.ENABLE_TRANSLATION = config["ENABLE_TRANSLATION"]
if "ENABLE_TRANSCRIPTION_SEND" in config.keys(): if "ENABLE_TRANSCRIPTION_SEND" in config.keys():
if type(config["ENABLE_TRANSCRIPTION_SEND"]) is bool:
self.ENABLE_TRANSCRIPTION_SEND = config["ENABLE_TRANSCRIPTION_SEND"] self.ENABLE_TRANSCRIPTION_SEND = config["ENABLE_TRANSCRIPTION_SEND"]
if "ENABLE_TRANSCRIPTION_RECEIVE" in config.keys(): if "ENABLE_TRANSCRIPTION_RECEIVE" in config.keys():
if type(config["ENABLE_TRANSCRIPTION_RECEIVE"]) is bool:
self.ENABLE_TRANSCRIPTION_RECEIVE = config["ENABLE_TRANSCRIPTION_RECEIVE"] self.ENABLE_TRANSCRIPTION_RECEIVE = config["ENABLE_TRANSCRIPTION_RECEIVE"]
if "ENABLE_FOREGROUND" in config.keys(): if "ENABLE_FOREGROUND" in config.keys():
if type(config["ENABLE_FOREGROUND"]) is bool:
self.ENABLE_FOREGROUND = config["ENABLE_FOREGROUND"] self.ENABLE_FOREGROUND = config["ENABLE_FOREGROUND"]
# tab ui # tab ui
if "TRANSPARENCY" in config.keys(): if "TRANSPARENCY" in config.keys():
if type(config["TRANSPARENCY"]) is int:
if 0 <= config["TRANSPARENCY"] <= 100:
self.TRANSPARENCY = config["TRANSPARENCY"] self.TRANSPARENCY = config["TRANSPARENCY"]
if "APPEARANCE_THEME" in config.keys(): if "APPEARANCE_THEME" in config.keys():
if config["APPEARANCE_THEME"] in ["Light", "Dark", "System"]:
self.APPEARANCE_THEME = config["APPEARANCE_THEME"] self.APPEARANCE_THEME = config["APPEARANCE_THEME"]
if "UI_SCALING" in config.keys(): if "UI_SCALING" in config.keys():
if config["UI_SCALING"] in ["80%", "90%", "100%", "110%", "120%"]:
self.UI_SCALING = config["UI_SCALING"] self.UI_SCALING = config["UI_SCALING"]
if "FONT_FAMILY" in config.keys(): if "FONT_FAMILY" in config.keys():
if config["FONT_FAMILY"] in list(tk.font.families()):
self.FONT_FAMILY = config["FONT_FAMILY"] self.FONT_FAMILY = config["FONT_FAMILY"]
# translation # translation
if "CHOICE_TRANSLATOR" in config.keys(): if "CHOICE_TRANSLATOR" in config.keys():
if config["CHOICE_TRANSLATOR"] in list(self.translator.translator_status.keys()):
self.CHOICE_TRANSLATOR = config["CHOICE_TRANSLATOR"] self.CHOICE_TRANSLATOR = config["CHOICE_TRANSLATOR"]
if "INPUT_SOURCE_LANG" in config.keys(): if "INPUT_SOURCE_LANG" in config.keys():
if config["INPUT_SOURCE_LANG"] in self.translator.languages[self.CHOICE_TRANSLATOR]:
self.INPUT_SOURCE_LANG = config["INPUT_SOURCE_LANG"] self.INPUT_SOURCE_LANG = config["INPUT_SOURCE_LANG"]
if "INPUT_TARGET_LANG" in config.keys(): if "INPUT_TARGET_LANG" in config.keys():
if config["INPUT_SOURCE_LANG"] in self.translator.languages[self.CHOICE_TRANSLATOR]:
self.INPUT_TARGET_LANG = config["INPUT_TARGET_LANG"] self.INPUT_TARGET_LANG = config["INPUT_TARGET_LANG"]
if "OUTPUT_SOURCE_LANG" in config.keys(): if "OUTPUT_SOURCE_LANG" in config.keys():
if config["INPUT_SOURCE_LANG"] in self.translator.languages[self.CHOICE_TRANSLATOR]:
self.OUTPUT_SOURCE_LANG = config["OUTPUT_SOURCE_LANG"] self.OUTPUT_SOURCE_LANG = config["OUTPUT_SOURCE_LANG"]
if "OUTPUT_TARGET_LANG" in config.keys(): if "OUTPUT_TARGET_LANG" in config.keys():
if config["INPUT_SOURCE_LANG"] in self.translator.languages[self.CHOICE_TRANSLATOR]:
self.OUTPUT_TARGET_LANG = config["OUTPUT_TARGET_LANG"] self.OUTPUT_TARGET_LANG = config["OUTPUT_TARGET_LANG"]
# Transcription # Transcription
if "CHOICE_MIC_DEVICE" in config.keys(): if "CHOICE_MIC_DEVICE" in config.keys():
if config["CHOICE_MIC_DEVICE"] in [device["name"] for device in self.vr.search_input_device()]:
self.CHOICE_MIC_DEVICE = config["CHOICE_MIC_DEVICE"] self.CHOICE_MIC_DEVICE = config["CHOICE_MIC_DEVICE"]
if "INPUT_MIC_VOICE_LANGUAGE" in config.keys(): if "INPUT_MIC_VOICE_LANGUAGE" in config.keys():
if config["INPUT_MIC_VOICE_LANGUAGE"] in list(self.vr.languages):
self.INPUT_MIC_VOICE_LANGUAGE = config["INPUT_MIC_VOICE_LANGUAGE"] self.INPUT_MIC_VOICE_LANGUAGE = config["INPUT_MIC_VOICE_LANGUAGE"]
if "INPUT_MIC_IS_DYNAMIC" in config.keys(): if "INPUT_MIC_IS_DYNAMIC" in config.keys():
if type(config["INPUT_MIC_IS_DYNAMIC"]) is bool:
self.INPUT_MIC_IS_DYNAMIC = config["INPUT_MIC_IS_DYNAMIC"] self.INPUT_MIC_IS_DYNAMIC = config["INPUT_MIC_IS_DYNAMIC"]
if "INPUT_MIC_THRESHOLD" in config.keys(): if "INPUT_MIC_THRESHOLD" in config.keys():
if type(config["INPUT_MIC_THRESHOLD"]) is int:
self.INPUT_MIC_THRESHOLD = config["INPUT_MIC_THRESHOLD"] self.INPUT_MIC_THRESHOLD = config["INPUT_MIC_THRESHOLD"]
if "CHOICE_SPEAKER_DEVICE" in config.keys(): if "CHOICE_SPEAKER_DEVICE" in config.keys():
if config["CHOICE_SPEAKER_DEVICE"] in [device["name"] for device in self.vr.search_output_device()]:
self.CHOICE_SPEAKER_DEVICE = config["CHOICE_SPEAKER_DEVICE"] self.CHOICE_SPEAKER_DEVICE = config["CHOICE_SPEAKER_DEVICE"]
if "INPUT_SPEAKER_VOICE_LANGUAGE" in config.keys(): if "INPUT_SPEAKER_VOICE_LANGUAGE" in config.keys():
if config["INPUT_SPEAKER_VOICE_LANGUAGE"] in list(self.vr.languages):
self.INPUT_SPEAKER_VOICE_LANGUAGE = config["INPUT_SPEAKER_VOICE_LANGUAGE"] self.INPUT_SPEAKER_VOICE_LANGUAGE = config["INPUT_SPEAKER_VOICE_LANGUAGE"]
if "INPUT_SPEAKER_INTERVAL" in config.keys(): if "INPUT_SPEAKER_INTERVAL" in config.keys():
if type(config["INPUT_SPEAKER_INTERVAL"]) is int:
self.INPUT_SPEAKER_INTERVAL = config["INPUT_SPEAKER_INTERVAL"] self.INPUT_SPEAKER_INTERVAL = config["INPUT_SPEAKER_INTERVAL"]
# Parameter # Parameter
if "OSC_IP_ADDRESS" in config.keys(): if "OSC_IP_ADDRESS" in config.keys():
if type(config["OSC_IP_ADDRESS"]) is str:
self.OSC_IP_ADDRESS = config["OSC_IP_ADDRESS"] self.OSC_IP_ADDRESS = config["OSC_IP_ADDRESS"]
if "OSC_PORT" in config.keys(): if "OSC_PORT" in config.keys():
if type(config["OSC_PORT"]) is int:
self.OSC_PORT = config["OSC_PORT"] self.OSC_PORT = config["OSC_PORT"]
if "AUTH_KEYS" in config.keys(): 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(): if "MESSAGE_FORMAT" in config.keys():
if type(config["MESSAGE_FORMAT"]) is str:
self.MESSAGE_FORMAT = config["MESSAGE_FORMAT"] self.MESSAGE_FORMAT = config["MESSAGE_FORMAT"]
with open(self.PATH_CONFIG, 'w') as fp: with open(self.PATH_CONFIG, 'w') as fp:
@@ -235,6 +266,7 @@ class App(customtkinter.CTk):
self.tabview_logs.add("receive") self.tabview_logs.add("receive")
self.tabview_logs.add("system") self.tabview_logs.add("system")
self.tabview_logs.grid(row=0, column=1, padx=0, pady=0, sticky="nsew") 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._segmented_button.grid(sticky="W")
self.tabview_logs.tab("log").grid_rowconfigure(0, weight=1) self.tabview_logs.tab("log").grid_rowconfigure(0, weight=1)
self.tabview_logs.tab("log").grid_columnconfigure(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") self.entry_message_box.grid(row=1, column=1, columnspan=2, padx=5, pady=(5, 10), sticky="nsew")
# set default values # set default values
## set translator instance ## set translator
self.translator = translation.Translator()
if self.translator.authentication(self.CHOICE_TRANSLATOR, self.AUTH_KEYS[self.CHOICE_TRANSLATOR]) is False: if self.translator.authentication(self.CHOICE_TRANSLATOR, self.AUTH_KEYS[self.CHOICE_TRANSLATOR]) is False:
# error update Auth key # 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_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") 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 ## set checkbox enable translation
if self.ENABLE_TRANSLATION: if self.ENABLE_TRANSLATION:
self.checkbox_translation.select() self.checkbox_translation.select()
@@ -407,6 +430,7 @@ class App(customtkinter.CTk):
interval=int(self.INPUT_SPEAKER_INTERVAL), interval=int(self.INPUT_SPEAKER_INTERVAL),
language=self.INPUT_SPEAKER_VOICE_LANGUAGE, language=self.INPUT_SPEAKER_VOICE_LANGUAGE,
) )
self.vr.init_spk()
self.vr.start_spk_recording() self.vr.start_spk_recording()
self.th_vr_recognize_spk = utils.thread_fnc(self.vr_recognize_spk) self.th_vr_recognize_spk = utils.thread_fnc(self.vr_recognize_spk)
self.th_vr_recognize_spk.start() self.th_vr_recognize_spk.start()
@@ -421,6 +445,7 @@ class App(customtkinter.CTk):
utils.save_json(self.PATH_CONFIG, "ENABLE_TRANSCRIPTION_RECEIVE", self.ENABLE_TRANSCRIPTION_RECEIVE) utils.save_json(self.PATH_CONFIG, "ENABLE_TRANSCRIPTION_RECEIVE", self.ENABLE_TRANSCRIPTION_RECEIVE)
def vr_listen_mic(self): def vr_listen_mic(self):
if self.checkbox_transcription_send.get() is True:
self.vr.listen_mic() self.vr.listen_mic()
def vr_recognize_mic(self): def vr_recognize_mic(self):
@@ -441,6 +466,8 @@ class App(customtkinter.CTk):
message=message message=message
) )
voice_message = self.MESSAGE_FORMAT.replace("[message]", message).replace("[translation]", result) voice_message = self.MESSAGE_FORMAT.replace("[message]", message).replace("[translation]", result)
if self.checkbox_transcription_send.get() is True:
# send OSC message # send OSC message
osc_tools.send_message(voice_message, self.OSC_IP_ADDRESS, self.OSC_PORT) osc_tools.send_message(voice_message, self.OSC_IP_ADDRESS, self.OSC_PORT)
# update textbox message log # update textbox message log
@@ -448,6 +475,7 @@ class App(customtkinter.CTk):
utils.print_textbox(self.textbox_message_send_log, f"{voice_message}", "SEND") utils.print_textbox(self.textbox_message_send_log, f"{voice_message}", "SEND")
def vr_listen_spk(self): def vr_listen_spk(self):
if self.checkbox_transcription_receive.get() is True:
self.vr.listen_spk() self.vr.listen_spk()
def vr_recognize_spk(self): def vr_recognize_spk(self):
@@ -470,6 +498,8 @@ class App(customtkinter.CTk):
voice_message = self.MESSAGE_FORMAT.replace("[message]", message).replace("[translation]", result) voice_message = self.MESSAGE_FORMAT.replace("[message]", message).replace("[translation]", result)
# send OSC message # send OSC message
# osc_tools.send_message(voice_message, self.OSC_IP_ADDRESS, self.OSC_PORT) # osc_tools.send_message(voice_message, self.OSC_IP_ADDRESS, self.OSC_PORT)
if self.checkbox_transcription_receive.get() is True:
# update textbox message receive log # update textbox message receive log
utils.print_textbox(self.textbox_message_log, f"{voice_message}", "RECEIVE") utils.print_textbox(self.textbox_message_log, f"{voice_message}", "RECEIVE")
utils.print_textbox(self.textbox_message_receive_log, f"{voice_message}", "RECEIVE") utils.print_textbox(self.textbox_message_receive_log, f"{voice_message}", "RECEIVE")
@@ -542,5 +572,6 @@ if __name__ == "__main__":
app = App() app = App()
app.mainloop() app.mainloop()
except Exception as e: except Exception as e:
with open("./error.log", "r") as fp: import traceback
fp.write(f"{e}") with open('error.log', 'a') as f:
traceback.print_exc(file=f)

282
languages.py Normal file
View File

@@ -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"
}

View File

@@ -1,40 +1,36 @@
import sounddevice as sd import queue
import speech_recognition as sr import speech_recognition as sr
import pyaudiowpatch as pyaudio import pyaudiowpatch as pyaudio
import languages
# VoiceRecognizer # VoiceRecognizer
class VoiceRecognizer(): class VoiceRecognizer():
def __init__(self, p_audio, mic_queue, spk_queue): def __init__(self):
self.r = sr.Recognizer() self.r = sr.Recognizer()
self.p = p_audio self.p = pyaudio.PyAudio()
self.languages = [ self.dict_languages = languages.recognize_lang
"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", self.languages = list(self.dict_languages.keys())
"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.mic_device_name = None self.mic_device_name = None
self.mic_threshold = 50 self.mic_threshold = 50
self.mic_is_dynamic = False self.mic_is_dynamic = False
self.mic_language = "ja-JP" self.mic_language = "Japanese Japan"
self.mic_queue = mic_queue self.mic_queue = queue.Queue(10)
self.spk_device = None self.spk_device = None
self.spk_interval = 3 self.spk_interval = 3
self.spk_language = "ja-JP" self.spk_language = "Japanese Japan"
self.spk_stream = None self.spk_stream = None
self.spk_queue = spk_queue self.spk_queue = queue.Queue(10)
def search_input_device(self): def search_input_device(self):
devices = [] devices = []
device_list = sd.query_devices() with pyaudio.PyAudio() as p:
for device in device_list: wasapi_info = p.get_host_api_info_by_type(pyaudio.paWASAPI)
if device["max_input_channels"] > 0: 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) devices.append(device)
return devices return devices
@@ -50,13 +46,23 @@ class VoiceRecognizer():
return devices return devices
def search_default_device(self): 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: with pyaudio.PyAudio() as p:
wasapi_info = p.get_host_api_info_by_type(pyaudio.paWASAPI) 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"]
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"]: if not default_speakers["isLoopbackDevice"]:
for loopback in p.get_loopback_device_info_generator(): for loopback in p.get_loopback_device_info_generator():
if default_speakers["name"] in loopback["name"]: if default_speakers["name"] in loopback["name"]:
@@ -64,7 +70,7 @@ class VoiceRecognizer():
break break
return name_mic, name_spk 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() 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_device_name = [device["index"] for device in input_device_list if device["name"] == device_name][0]
self.mic_threshold = threshold self.mic_threshold = threshold
@@ -72,6 +78,9 @@ class VoiceRecognizer():
self.mic_language = language self.mic_language = language
def init_mic(self): def init_mic(self):
while self.mic_queue.empty() is False:
self.mic_queue.get()
self.r.energy_threshold = self.mic_threshold self.r.energy_threshold = self.mic_threshold
if self.mic_is_dynamic: if self.mic_is_dynamic:
with self.mic as source: with self.mic as source:
@@ -85,17 +94,21 @@ class VoiceRecognizer():
def recognize_mic(self): def recognize_mic(self):
try: try:
audio = self.mic_queue.get() 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: except:
text = "" text = ""
return 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() 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_device = [device for device in output_device_list if device["name"] == device_name][0]
self.spk_interval = interval self.spk_interval = interval
self.spk_language = language 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): def spk_record_callback(self, in_data, frame_count, time_info, status):
self.spk_queue.put(in_data) self.spk_queue.put(in_data)
return (in_data, pyaudio.paContinue) return (in_data, pyaudio.paContinue)
@@ -127,51 +140,55 @@ class VoiceRecognizer():
try: try:
in_data = self.spk_queue.get() in_data = self.spk_queue.get()
audio_data = sr.AudioData(in_data, int(self.spk_device["defaultSampleRate"]), self.spk_interval) 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: except:
text = "" text = ""
return text return text
if __name__ == "__main__": if __name__ == "__main__":
import queue # import queue
import threading # import threading
mic_queue = queue.Queue() # mic_queue = queue.Queue()
spk_queue = queue.Queue() # spk_queue = queue.Queue()
vr = VoiceRecognizer(mic_queue, spk_queue) # vr = VoiceRecognizer(mic_queue, spk_queue)
mic_name, spk_name = vr.search_default_device() # mic_name, spk_name = vr.search_default_device()
print("mic_name", mic_name) # print("mic_name", mic_name)
print("spk_name", spk_name) # print("spk_name", spk_name)
############################################################### # ###############################################################
vr.set_mic(device_name=mic_name, threshold=300, is_dynamic=False, language="ja-JP") # vr.set_mic(device_name=mic_name, threshold=300, is_dynamic=False, language="ja-JP")
vr.init_mic() # vr.init_mic()
def vr_listen_mic(): # def vr_listen_mic():
while True: # while True:
vr.listen_mic() # vr.listen_mic()
def vr_recognize_mic(): # def vr_recognize_mic():
while True: # while True:
text = vr.recognize_mic() # text = vr.recognize_mic()
if len(text) > 0: # if len(text) > 0:
print(text) # print(text)
th_vr_listen_mic = threading.Thread(target=vr_listen_mic) # th_vr_listen_mic = threading.Thread(target=vr_listen_mic)
th_vr_listen_mic.start() # th_vr_listen_mic.start()
th_vr_recognize_mic = threading.Thread(target=vr_recognize_mic) # th_vr_recognize_mic = threading.Thread(target=vr_recognize_mic)
th_vr_recognize_mic.start() # th_vr_recognize_mic.start()
############################################################### # ###############################################################
############################################################### # ###############################################################
vr.set_spk(device_name=spk_name, interval=4, language="ja-JP") # vr.set_spk(device_name=spk_name, interval=4, language="ja-JP")
vr.start_spk_recording() # vr.start_spk_recording()
def vr_recognize_spk(): # def vr_recognize_spk():
while True: # while True:
text = vr.recognize_spk() # text = vr.recognize_spk()
if len(text) > 0: # if len(text) > 0:
print(text) # print(text)
th_vr_recognize_spk = threading.Thread(target=vr_recognize_spk) # th_vr_recognize_spk = threading.Thread(target=vr_recognize_spk)
th_vr_recognize_spk.start() # th_vr_recognize_spk.start()
############################################################### # ###############################################################
vr = VoiceRecognizer()
print(vr.search_input_device())
print(vr.search_default_device())

View File

@@ -1,6 +1,7 @@
import deepl import deepl
import deepl_translate import deepl_translate
import translators as ts import translators as ts
import languages
# Translator # Translator
class Translator(): class Translator():
@@ -11,30 +12,18 @@ class Translator():
"Google(web)": False, "Google(web)": False,
"Bing(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 = {}
self.languages["DeepL(web)"] = [ self.languages["DeepL(web)"] = list(self.dict_languages["DeepL(web)"].keys())
"JA","EN","BG","ZH","CS","DA","NL","ET","FI","FR","DE","EL","HU","IT", self.languages["DeepL(auth)"] = list(self.dict_languages["DeepL(auth)"].keys())
"LV","LT","PL","PT","RO","RU","SK","SL","ES","SV", self.languages["Google(web)"] = list(self.dict_languages["Google(web)"].keys())
] self.languages["Bing(web)"] = list(self.dict_languages["Bing(web)"].keys())
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.deepl_client = None self.deepl_client = None
def authentication(self, translator_name, authkey=None): def authentication(self, translator_name, authkey=None):
@@ -62,13 +51,31 @@ class Translator():
result = False result = False
try: try:
if translator_name == "DeepL(web)": 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)": 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)": 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)": 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: except:
pass pass
return result return result

View File

@@ -59,9 +59,11 @@ class ToplevelWindowConfig(customtkinter.CTkToplevel):
self.tabview_config.tab("UI"), self.tabview_config.tab("UI"),
values=["Light", "Dark", "System"], values=["Light", "Dark", "System"],
command=self.optionmenu_theme_callback, 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.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 ## optionmenu UI scaling
self.label_ui_scaling = customtkinter.CTkLabel( self.label_ui_scaling = customtkinter.CTkLabel(
@@ -75,9 +77,11 @@ class ToplevelWindowConfig(customtkinter.CTkToplevel):
self.tabview_config.tab("UI"), self.tabview_config.tab("UI"),
values=["80%", "90%", "100%", "110%", "120%"], values=["80%", "90%", "100%", "110%", "120%"],
command=self.optionmenu_ui_scaling_callback, 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.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 ## optionmenu font family
self.label_font_family = customtkinter.CTkLabel( self.label_font_family = customtkinter.CTkLabel(
@@ -92,9 +96,11 @@ class ToplevelWindowConfig(customtkinter.CTkToplevel):
self.tabview_config.tab("UI"), self.tabview_config.tab("UI"),
values=font_families, values=font_families,
command=self.optionmenu_font_family_callback, 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.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 # tab Translation
## optionmenu translation translator ## optionmenu translation translator
@@ -102,17 +108,18 @@ class ToplevelWindowConfig(customtkinter.CTkToplevel):
self.tabview_config.tab("Translation"), self.tabview_config.tab("Translation"),
text="Select Translator:", text="Select Translator:",
fg_color="transparent", 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.label_translation_translator.grid(row=0, column=0, columnspan=1, padx=5, pady=5, sticky="nsw")
self.optionmenu_translation_translator = customtkinter.CTkOptionMenu( self.optionmenu_translation_translator = customtkinter.CTkOptionMenu(
self.tabview_config.tab("Translation"), self.tabview_config.tab("Translation"),
values=list(self.parent.translator.translator_status.keys()), values=list(self.parent.translator.translator_status.keys()),
command=self.optionmenu_translation_translator_callback, command=self.optionmenu_translation_translator_callback,
variable=customtkinter.StringVar(value=self.parent.CHOICE_TRANSLATOR),
font=customtkinter.CTkFont(family=self.parent.FONT_FAMILY), 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.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 ## optionmenu translation input language
self.label_translation_input_language = customtkinter.CTkLabel( self.label_translation_input_language = customtkinter.CTkLabel(
@@ -127,11 +134,12 @@ class ToplevelWindowConfig(customtkinter.CTkToplevel):
self.optionmenu_translation_input_source_language = customtkinter.CTkOptionMenu( self.optionmenu_translation_input_source_language = customtkinter.CTkOptionMenu(
self.tabview_config.tab("Translation"), self.tabview_config.tab("Translation"),
command=self.optionmenu_translation_input_source_language_callback, 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], values=self.parent.translator.languages[self.parent.CHOICE_TRANSLATOR],
variable=customtkinter.StringVar(value=self.parent.INPUT_SOURCE_LANG), 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.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 ## label translation input arrow
self.label_translation_input_arrow = customtkinter.CTkLabel( self.label_translation_input_arrow = customtkinter.CTkLabel(
@@ -146,11 +154,12 @@ class ToplevelWindowConfig(customtkinter.CTkToplevel):
self.optionmenu_translation_input_target_language = customtkinter.CTkOptionMenu( self.optionmenu_translation_input_target_language = customtkinter.CTkOptionMenu(
self.tabview_config.tab("Translation"), self.tabview_config.tab("Translation"),
command=self.optionmenu_translation_input_target_language_callback, 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], values=self.parent.translator.languages[self.parent.CHOICE_TRANSLATOR],
variable=customtkinter.StringVar(value=self.parent.INPUT_TARGET_LANG), 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.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 ## optionmenu translation output language
self.label_translation_output_language = customtkinter.CTkLabel( self.label_translation_output_language = customtkinter.CTkLabel(
@@ -165,11 +174,12 @@ class ToplevelWindowConfig(customtkinter.CTkToplevel):
self.optionmenu_translation_output_source_language = customtkinter.CTkOptionMenu( self.optionmenu_translation_output_source_language = customtkinter.CTkOptionMenu(
self.tabview_config.tab("Translation"), self.tabview_config.tab("Translation"),
command=self.optionmenu_translation_output_source_language_callback, 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], values=self.parent.translator.languages[self.parent.CHOICE_TRANSLATOR],
variable=customtkinter.StringVar(value=self.parent.OUTPUT_SOURCE_LANG), 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.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 ## label translation output arrow
self.label_translation_output_arrow = customtkinter.CTkLabel( self.label_translation_output_arrow = customtkinter.CTkLabel(
@@ -184,11 +194,12 @@ class ToplevelWindowConfig(customtkinter.CTkToplevel):
self.optionmenu_translation_output_target_language = customtkinter.CTkOptionMenu( self.optionmenu_translation_output_target_language = customtkinter.CTkOptionMenu(
self.tabview_config.tab("Translation"), self.tabview_config.tab("Translation"),
command=self.optionmenu_translation_output_target_language_callback, 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], values=self.parent.translator.languages[self.parent.CHOICE_TRANSLATOR],
variable=customtkinter.StringVar(value=self.parent.OUTPUT_TARGET_LANG), 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.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 # tab Transcription
## optionmenu input mic device ## optionmenu input mic device
@@ -203,10 +214,11 @@ class ToplevelWindowConfig(customtkinter.CTkToplevel):
self.tabview_config.tab("Transcription"), self.tabview_config.tab("Transcription"),
values=[device["name"] for device in self.parent.vr.search_input_device()], values=[device["name"] for device in self.parent.vr.search_input_device()],
command=self.optionmenu_input_mic_device_callback, command=self.optionmenu_input_mic_device_callback,
variable=customtkinter.StringVar(value=self.parent.CHOICE_MIC_DEVICE),
font=customtkinter.CTkFont(family=self.parent.FONT_FAMILY), 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.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 ## optionmenu input mic voice language
self.label_input_mic_voice_language = customtkinter.CTkLabel( self.label_input_mic_voice_language = customtkinter.CTkLabel(
@@ -220,10 +232,11 @@ class ToplevelWindowConfig(customtkinter.CTkToplevel):
self.tabview_config.tab("Transcription"), self.tabview_config.tab("Transcription"),
values=list(self.parent.vr.languages), values=list(self.parent.vr.languages),
command=self.optionmenu_input_mic_voice_language_callback, 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), 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.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 ## checkbox input mic in dynamic
self.label_input_mic_is_dynamic = customtkinter.CTkLabel( self.label_input_mic_is_dynamic = customtkinter.CTkLabel(
@@ -275,10 +288,11 @@ class ToplevelWindowConfig(customtkinter.CTkToplevel):
self.tabview_config.tab("Transcription"), self.tabview_config.tab("Transcription"),
values=[device["name"] for device in self.parent.vr.search_output_device()], values=[device["name"] for device in self.parent.vr.search_output_device()],
command=self.optionmenu_input_speaker_device_callback, command=self.optionmenu_input_speaker_device_callback,
font=customtkinter.CTkFont(family=self.parent.FONT_FAMILY),
variable=customtkinter.StringVar(value=self.parent.CHOICE_SPEAKER_DEVICE), 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.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 ## optionmenu input speaker voice language
self.label_input_speaker_voice_language = customtkinter.CTkLabel( self.label_input_speaker_voice_language = customtkinter.CTkLabel(
@@ -292,10 +306,11 @@ class ToplevelWindowConfig(customtkinter.CTkToplevel):
self.tabview_config.tab("Transcription"), self.tabview_config.tab("Transcription"),
values=list(self.parent.vr.languages), values=list(self.parent.vr.languages),
command=self.optionmenu_input_speaker_voice_language_callback, 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), 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.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 ## entry input speaker interval
self.label_input_speaker_interval = customtkinter.CTkLabel( 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_transparency.configure(font=customtkinter.CTkFont(family=choice))
self.label_appearance_theme.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.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.label_ui_scaling.configure(font=customtkinter.CTkFont(family=choice))
self.optionmenu_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.label_font_family.configure(font=customtkinter.CTkFont(family=choice))
self.optionmenu_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 # tab Translation
self.label_translation_translator.configure(font=customtkinter.CTkFont(family=choice)) self.label_translation_translator.configure(font=customtkinter.CTkFont(family=choice))
self.optionmenu_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.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.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.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.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.label_translation_output_language.configure(font=customtkinter.CTkFont(family=choice))
self.optionmenu_translation_output_source_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.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.configure(font=customtkinter.CTkFont(family=choice))
self.optionmenu_translation_output_target_language._dropdown_menu.configure(font=customtkinter.CTkFont(family=choice))
# tab Transcription # tab Transcription
self.label_input_mic_device.configure(font=customtkinter.CTkFont(family=choice)) 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.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.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.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_is_dynamic.configure(font=customtkinter.CTkFont(family=choice))
self.label_input_mic_threshold.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.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.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.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.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.label_input_speaker_interval.configure(font=customtkinter.CTkFont(family=choice))
self.entry_input_speaker_interval.configure(font=customtkinter.CTkFont(family=choice)) self.entry_input_speaker_interval.configure(font=customtkinter.CTkFont(family=choice))

View File

@@ -18,7 +18,7 @@ class ToplevelWindowInformation(customtkinter.CTkToplevel):
font=customtkinter.CTkFont(family=self.parent.FONT_FAMILY) font=customtkinter.CTkFont(family=self.parent.FONT_FAMILY)
) )
self.textbox_information.grid(row=0, column=0, padx=(10, 10), pady=(10, 10), sticky="nsew") 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経由でメッセージを送信するツールになります。 VRChatで使用されるChatBoxをOSC経由でメッセージを送信するツールになります。
@@ -109,6 +109,10 @@ https://twitter.com/misya_ai
[2023-06-20: v1.0] [2023-06-20: v1.0]
- マイクからの音声の文字起こし機能を追加 - マイクからの音声の文字起こし機能を追加
- スピーカーからの音声の文字起こし機能を追加 - スピーカーからの音声の文字起こし機能を追加
[2023-06-28: v1.1]
- いくつかのバクを修正
- 翻訳/文字起こし言語の表記を略称からわかりやすい文字に変更
- 文字起こしの処理の軽量化
# 注意事項 # 注意事項
再配布とかはやめてね 再配布とかはやめてね