From c2e904f5761be0b46662feff4a4c48e11242da18 Mon Sep 17 00:00:00 2001 From: CN_ChiTu <36254426+CNChTu@users.noreply.github.com> Date: Tue, 11 Apr 2023 20:03:24 +0800 Subject: [PATCH] =?UTF-8?q?gui=E6=94=AF=E6=8C=81=E5=A4=9A=E8=AF=AD?= =?UTF-8?q?=E8=A8=80=20(#33)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * gui支持多语言 采用和ddspsvc仓库gui一样的多语言方式 * Create gitkeep * gui支持多语言 --- gui.py | 34 +++++++++--------- language/gitkeep | 1 + language/language_gui.py | 77 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 95 insertions(+), 17 deletions(-) create mode 100644 language/gitkeep create mode 100644 language/language_gui.py diff --git a/gui.py b/gui.py index 85b3dcc..f25a4a3 100644 --- a/gui.py +++ b/gui.py @@ -8,7 +8,7 @@ import torch.nn.functional as F #import matplotlib.pyplot as plt from infer_pack.models import SynthesizerTrnMs256NSFsid, SynthesizerTrnMs256NSFsid_nono - +from language import language_gui device = torch.device("cuda" if torch.cuda.is_available() else "cpu") @@ -160,31 +160,31 @@ class GUI: input_devices,output_devices,_, _=self.get_devices() layout=[ [ - sg.Frame(title='加载模型/Load Model',layout=[ - [sg.Input(default_text='TEMP\\atri.pth',key='pth_path'),sg.FileBrowse('选择.pth文件/.pth File')], - [sg.Input(default_text='TEMP\\added_IVF512_Flat_atri_baseline_src_feat.index',key='index_path'),sg.FileBrowse('选择.index文件/.index File')], - [sg.Input(default_text='TEMP\\big_src_feature_atri.npy',key='npy_path'),sg.FileBrowse('选择.npy文件/.npy File')] + sg.Frame(title=i18n('加载模型/Load Model'),layout=[ + [sg.Input(default_text='TEMP\\atri.pth',key='pth_path'),sg.FileBrowse(i18n('选择.pth文件/.pth File'))], + [sg.Input(default_text='TEMP\\added_IVF512_Flat_atri_baseline_src_feat.index',key='index_path'),sg.FileBrowse(i18n('选择.index文件/.index File'))], + [sg.Input(default_text='TEMP\\big_src_feature_atri.npy',key='npy_path'),sg.FileBrowse(i18n('选择.npy文件/.npy File'))] ]) ], [ sg.Frame(layout=[ - [sg.Text("输入设备/Input Device"),sg.Combo(input_devices,key='sg_input_device',default_value=input_devices[sd.default.device[0]])], - [sg.Text("输出设备/Output Device"),sg.Combo(output_devices,key='sg_output_device',default_value=output_devices[sd.default.device[1]])] - ],title='音频设备(请使用同种类驱动)/Audio Devices') + [sg.Text(i18n("输入设备/Input Device")),sg.Combo(input_devices,key='sg_input_device',default_value=input_devices[sd.default.device[0]])], + [sg.Text(i18n("输出设备/Output Device")),sg.Combo(output_devices,key='sg_output_device',default_value=output_devices[sd.default.device[1]])] + ],title=i18n('音频设备(请使用同种类驱动)/Audio Devices')) ], [ sg.Frame(layout=[ - [sg.Text('响应阈值/Silence Threhold'),sg.Slider(range=(-60,0),key='threhold',resolution=1,orientation='h',default_value=-30)], - [sg.Text("音调设置/Pitch Offset"),sg.Slider(range=(-24,24),key='pitch',resolution=1,orientation='h',default_value=12)] + [sg.Text(i18n('响应阈值/Silence Threhold')),sg.Slider(range=(-60,0),key='threhold',resolution=1,orientation='h',default_value=-30)], + [sg.Text(i18n("音调设置/Pitch Offset")),sg.Slider(range=(-24,24),key='pitch',resolution=1,orientation='h',default_value=12)] - ],title='常规设置/Common'), + ],title=i18n('常规设置/Common')), sg.Frame(layout=[ - [sg.Text('采样长度/Sample Length'),sg.Slider(range=(0.1,3.0),key='block_time',resolution=0.1,orientation='h',default_value=1.0)], - [sg.Text('淡入淡出长度/Crossfade Length'),sg.Slider(range=(0.01,0.15),key='crossfade_length',resolution=0.01,orientation='h',default_value=0.08)], - [sg.Text('额外推理时长/Extra Length'),sg.Slider(range=(0.05,3.00),key='extra_time',resolution=0.01,orientation='h',default_value=0.05)] - ],title='性能设置/Performance') + [sg.Text(i18n('采样长度/Sample Length')),sg.Slider(range=(0.1,3.0),key='block_time',resolution=0.1,orientation='h',default_value=1.0)], + [sg.Text(i18n('淡入淡出长度/Crossfade Length')),sg.Slider(range=(0.01,0.15),key='crossfade_length',resolution=0.01,orientation='h',default_value=0.08)], + [sg.Text(i18n('额外推理时长/Extra Length')),sg.Slider(range=(0.05,3.00),key='extra_time',resolution=0.01,orientation='h',default_value=0.05)] + ],title=i18n('性能设置/Performance')) ], - [sg.Button('开始音频转换',key='start_vc'),sg.Button('停止音频转换',key='stop_vc')] + [sg.Button(i18n('开始音频转换'),key='start_vc'),sg.Button(i18n('停止音频转换'),key='stop_vc')] ] self.window=sg.Window('RVC - GUI',layout=layout) @@ -326,5 +326,5 @@ class GUI: sd.default.device[1]=output_device_indices[output_devices.index(output_device)] print("input device:"+str(sd.default.device[0])+":"+str(input_device)) print("output device:"+str(sd.default.device[1])+":"+str(output_device)) - +i18n = language_gui.I18nAuto() gui=GUI() \ No newline at end of file diff --git a/language/gitkeep b/language/gitkeep new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/language/gitkeep @@ -0,0 +1 @@ + diff --git a/language/language_gui.py b/language/language_gui.py new file mode 100644 index 0000000..8ea3c81 --- /dev/null +++ b/language/language_gui.py @@ -0,0 +1,77 @@ +import locale +''' +本地化方式如下所示,此文件是"gui.py"的文本内容 +''' + +LANGUAGE_LIST = ['zh_CN', 'en_US'] +LANGUAGE_ALL = { + 'zh_CN': { + 'SUPER': 'END', + 'LANGUAGE': 'zh_CN', + '加载模型/Load Model': '加载模型', + '选择.pth文件/.pth File': '选择.pth文件', + '选择.index文件/.index File': '选择.index文件', + '选择.npy文件/.npy File': '选择.npy文件', + "输入设备/Input Device": "输入设备", + "输出设备/Output Device": "输出设备", + '音频设备(请使用同种类驱动)/Audio Devices': '音频设备(请使用同种类驱动)', + '响应阈值/Silence Threhold': '响应阈值', + '音调设置/Pitch Offset': '音调设置', + '常规设置/Common': '常规设置', + '采样长度/Sample Length': '采样长度', + '淡入淡出长度/Crossfade Length': '淡入淡出长度', + '额外推理时长/Extra Length': '额外推理时长', + '性能设置/Performance': '性能设置', + '开始音频转换': '开始音频转换', + '停止音频转换': '停止音频转换' + }, + 'en_US': { + 'SUPER': 'zh_CN', + 'LANGUAGE': 'en_US', + '加载模型/Load Model': 'Load Model', + '选择.pth文件/.pth File': 'Select .pth File', + '选择.index文件/.index File': 'Select .index File', + '选择.npy文件/.npy File': 'Select .npy File', + "输入设备/Input Device": "Input Device", + "输出设备/Output Device": "Output Device", + '音频设备(请使用同种类驱动)/Audio Devices': 'Audio Devices(Please use the same type of driver)', + '响应阈值/Silence Threhold': 'Silence Threhold', + '音调设置/Pitch Offset': 'Pitch Offset', + '常规设置/Common': 'Common', + '采样长度/Sample Length': 'Sample Length', + '淡入淡出长度/Crossfade Length': 'Crossfade Length', + '额外推理时长/Extra Length': 'Extra Length', + '性能设置/Performance': 'Performance', + '开始音频转换': 'Start VC', + '停止音频转换': 'Stop VC' + } +} + + +class I18nAuto: + def __init__(self, language=None): + self.language_list = LANGUAGE_LIST + self.language_all = LANGUAGE_ALL + self.language_map = {} + if language is None: + language = 'auto' + if language == 'auto': + language = locale.getdefaultlocale()[0] + if language not in self.language_list: + language = 'zh_CN' + self.language = language + super_language_list = [] + while self.language_all[language]['SUPER'] != 'END': + super_language_list.append(language) + language = self.language_all[language]['SUPER'] + super_language_list.append('zh_CN') + super_language_list.reverse() + for _lang in super_language_list: + self.read_language(self.language_all[_lang]) + + def read_language(self, lang_dict: dict): + for _key in lang_dict.keys(): + self.language_map[_key] = lang_dict[_key] + + def __call__(self, key): + return self.language_map[key]