From 3caa54e220fdbcb45d84f90c654bc5d497c0dc76 Mon Sep 17 00:00:00 2001 From: cxxu <838808930@qq.com> Date: Wed, 10 May 2023 21:30:00 +0800 Subject: [PATCH] - initially support the interface language switch:between Chinese and English - the approch to achieve the multilanguage support depending on language string resource py file: - `zh.py` for Chinese - `en.py` for english - for convenience,these module was managed by the `multilanguage.py`module. - unfortunately,these features was test in `fviewer.py`,the main gui was still unable to work normally because the `windows.close` caused the program broken! - improve the regex_filter performance by using `re.compile` instead `re.` --- .../demo_pandas_table.cpython-39.pyc | Bin 1732 -> 1732 bytes SG/__pycache__/fviewer.cpython-39.pyc | Bin 11098 -> 10549 bytes SG/__pycache__/multilanguage.cpython-39.pyc | Bin 1199 -> 1569 bytes SG/__pycache__/table_show.cpython-39.pyc | Bin 2483 -> 2334 bytes SG/ccser_gui.py | 251 ++++++++------ .../__pycache__/beauty.cpython-39.pyc | Bin 14381 -> 11190 bytes SG/constants/__pycache__/logo.cpython-39.pyc | Bin 0 -> 1823 bytes SG/constants/beauty.py | 58 +--- SG/constants/logo.py | 9 + SG/demo_pandas_table.py | 3 +- SG/fviewer.py | 309 ++++++++++-------- SG/multilanguage.py | 43 ++- SG/snippet_cxxu.py | 2 +- SG/table_show.py | 10 +- SG/translations/__pycache__/en.cpython-39.pyc | Bin 0 -> 6963 bytes SG/translations/__pycache__/zh.cpython-39.pyc | Bin 0 -> 6869 bytes SG/translations/c2e.py | 25 ++ SG/translations/dict_to_vars.py | 29 ++ SG/translations/en.json | 12 +- SG/translations/en.py | 153 +++++++++ SG/translations/zh.py | 142 ++++++++ assets/image-20230510185320088.png | Bin 0 -> 65514 bytes config/MetaPath.py | 6 +- config/__pycache__/MetaPath.cpython-39.pyc | Bin 14171 -> 14235 bytes presentation_ppt.md | 142 ++++++++ release_note.md | 12 +- test_playground/__pycache__/m1.cpython-39.pyc | Bin 0 -> 285 bytes test_playground/m1.py | 3 + test_playground/m2.py | 5 + 29 files changed, 896 insertions(+), 318 deletions(-) create mode 100644 SG/constants/__pycache__/logo.cpython-39.pyc create mode 100644 SG/constants/logo.py create mode 100644 SG/translations/__pycache__/en.cpython-39.pyc create mode 100644 SG/translations/__pycache__/zh.cpython-39.pyc create mode 100644 SG/translations/c2e.py create mode 100644 SG/translations/dict_to_vars.py create mode 100644 SG/translations/en.py create mode 100644 SG/translations/zh.py create mode 100644 assets/image-20230510185320088.png create mode 100644 presentation_ppt.md create mode 100644 test_playground/__pycache__/m1.cpython-39.pyc create mode 100644 test_playground/m1.py create mode 100644 test_playground/m2.py diff --git a/SG/__pycache__/demo_pandas_table.cpython-39.pyc b/SG/__pycache__/demo_pandas_table.cpython-39.pyc index 949ba13276e467ff7fe6d6001c553f5d07beb757..17df63900c6661853e8d8d56ad746d1098c0daf7 100644 GIT binary patch delta 40 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 H#GwBNb7|gP delta 5454 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 R4-=IIU^zRjSiwyU{{TS4rsV(t diff --git a/SG/__pycache__/table_show.cpython-39.pyc b/SG/__pycache__/table_show.cpython-39.pyc index f1c5413c1c72f272171ede90a92403589958ddc5..15a93ca84910b5e68f61dde6ddb439162688e74f 100644 GIT binary patch delta 1000 zcmZ`&%}>-o6z@#Gce@4IO$dYteneSJ_%PxLJt@Qxkpxg&54A8u?b>ZO)7f1$Ydox1 z5;r}X7|@Geym05=Fqw;IPI5ExqHnqpPd4eVufI3%_5I#^Jt}_~as5)Mpujb{^@N-j z`tAg3_ODGoBnnX@qhZ#}hE=nWvZ4@;=x-IG_i)Xo1!6qMETT3o60?T_g;*aY+Bp^g zRZ`r?HHSI}r9%ZN1Z^l)r~mH!g(?=K0p(ug$3e>vsK=Qfr;*PSCNxR*zY_F0E2GsN zZr2O1RbH$+U8Syd5z&c3OkN@uN0RBG9tOrB_P!M$UOaFiV(1W^*~0_7evTBn>U%|& z6re!sD&7cjprF#xG15`R0R2!Fo}Cvc`ho-snUQ_NH&8iq)TP>I zXL~$sP&Oqwy~)CuvnzSXK!wnAnN^F;=WHiWBy`$_4zUVwOr~Q?05u23L1j7*@(K<5 z_-r6HSDcGgSqsN=*_!oqVL`^-k&wIpK|Vws9Fj`qU@TOaW_tGBnp|In*Q$D=!sA4` z*!=+^&!6Nu9!LVSv!+*FQCxqy5jL6;UD>+F1|4boG4WG&Ia{;G>SB0fWwz0Rh4}j? wF!_OeDVWU6?gGFs0h=Z;EZhIe7S>WDA+3nsMi7w7AzR3jqr&d8rCvmT0Eim-k^lez delta 1102 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 diff --git a/SG/constants/__pycache__/logo.cpython-39.pyc b/SG/constants/__pycache__/logo.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..eabeabc73bbc54924d2fc7105ece6d8ef383d943 GIT binary patch literal 1823 zcmb7F%}N4M6u!C$8L($)7jAlhh)AXgH!X5k10s#IF-II-w5&}n6CHzKpj8m{3_Xa; z@dbo-tvdJKIp_X4TEon6@8@^E@BCb~U9EZyuGijW__oE^f^YPz1e+sx;tIS%cEQ3@ zlhw+j2OxXdY@E#=jXQZ3;Gb~_=OLzu+^)oxK3G_{DUvey_Az++e8=xYpn`XNuQsrX@#5`ZOhLq$)Xblna%#sSG$)uB3EpkudcO z7RrKRmAJ>xkIv=+VunSyMJB$B^N)%;t1`gyoV@>`EIMK(U|H+sZ0LwJbKYhg?}{;+ z2SlHVO%}gOAeG~mCT{a{gblJq1kDB=<&6aCqG+0X4l2a+&T6IkcD?C08m;FCMmg!#Lm(d;Qya<=`d?N8QdL|I_=1 Ghy4N@!-d%Z literal 0 HcmV?d00001 diff --git a/SG/constants/beauty.py b/SG/constants/beauty.py index a48551c..31c24b6 100644 --- a/SG/constants/beauty.py +++ b/SG/constants/beauty.py @@ -1,15 +1,16 @@ import PySimpleGUI as sg # import constants.uiconfig as ufg -from SG.multilanguage import get_your_language_translator +from SG.multilanguage import get_language_translator,lang -lang = get_your_language_translator("English") import sys frame_size = (600, 50) # frame_size=600#给定一个整形数的时候,仅指定宽度,高度被自动设置为1 # frame_size=None +#listbox_size lb_size = (60, 10) +lb_narrow_size=(20,10) ml_size = (60, 20) seperator_color = "blue" score_ndigits=4 @@ -22,60 +23,9 @@ tips_bgc='lightyellow' result_font = ("Arial", 20, "bold underline") normal_font=("Arial", 10,"italic") -logo = """ -░█████╗░░█████╗░░██████╗███████╗██████╗░░░░░░░░█████╗░██╗░░░░░██╗███████╗███╗░░██╗████████╗𝓫𝔂 𝓬𝔁𝔁𝓾 -██╔══██╗██╔══██╗██╔════╝██╔════╝██╔══██╗░░░░░░██╔══██╗██║░░░░░██║██╔════╝████╗░██║╚══██╔══╝ -██║░░╚═╝██║░░╚═╝╚█████╗░█████╗░░██████╔╝█████╗██║░░╚═╝██║░░░░░██║█████╗░░██╔██╗██║░░░██║░░░ -██║░░██╗██║░░██╗░╚═══██╗██╔══╝░░██╔══██╗╚════╝██║░░██╗██║░░░░░██║██╔══╝░░██║╚████║░░░██║░░░ -╚█████╔╝╚█████╔╝██████╔╝███████╗██║░░██║░░░░░░╚█████╔╝███████╗██║███████╗██║░╚███║░░░██║░░░ -░╚════╝░░╚════╝░╚═════╝░╚══════╝╚═╝░░╚═╝░░░░░░░╚════╝░╚══════╝╚═╝╚══════╝╚═╝░░╚══╝░░░╚═╝░░░ -""" - - -pca_components_tooltip = """ -PCA components -Number of components to keep. if n_components is not set all -components are kept: - -n_components == min(n_samples, n_features) -If n_components == 'mle' and svd_solver == 'full', Minka’s MLE -is used to guess the dimension. Use of n_components == 'mle' will -interpret svd_solver == 'auto' as svd_solver == 'full'. -If 0 < n_components < 1 and svd_solver == 'full', select -the number of components such that the amount of variance that -needs to be explained is greater than the percentage specified -by n_components. -If svd_solver == 'arpack', the number of components must - be strictly less than the minimum of n_features and n_samples. - -Hence, the None case results in: - -n_components == min(n_samples, n_features) - 1 -""" -pca_svd_solver_tooltip = """ -If auto : -The solver is selected by a default policy based on X.shape and -n_components: - if the input data is larger than 500x500 and the number of components - to extract is lower than 80% of the smallest dimension of the data, - then the more efficient ‘randomized’ method is enabled. Otherwise - the exact full SVD is computed and optionally truncated afterwards. - -If full : -run exact full SVD calling the standard LAPACK solver via scipy. -linalg.svd and select the components by postprocessing - -If arpack : -run SVD truncated to n_components calling ARPACK solver via -scipy.sparse.linalg.svds. It requires strictly - 0 < n_components < min(X.shape) - -If randomized : -run randomized SVD by the method of Halko et al. -""" @@ -256,7 +206,7 @@ def option_frame( def result_frame( - title=lang["result_frame"], + title=lang.result_frame_prompt, # result="inputYourContentToHighligt", layout=None, title_color=title_color, diff --git a/SG/constants/logo.py b/SG/constants/logo.py new file mode 100644 index 0000000..d59d4fc --- /dev/null +++ b/SG/constants/logo.py @@ -0,0 +1,9 @@ +ASCII_Art_logo = """ +░█████╗░░█████╗░░██████╗███████╗██████╗░░░░░░░░█████╗░██╗░░░░░██╗███████╗███╗░░██╗████████╗𝓫𝔂 𝓬𝔁𝔁𝓾 +██╔══██╗██╔══██╗██╔════╝██╔════╝██╔══██╗░░░░░░██╔══██╗██║░░░░░██║██╔════╝████╗░██║╚══██╔══╝ +██║░░╚═╝██║░░╚═╝╚█████╗░█████╗░░██████╔╝█████╗██║░░╚═╝██║░░░░░██║█████╗░░██╔██╗██║░░░██║░░░ +██║░░██╗██║░░██╗░╚═══██╗██╔══╝░░██╔══██╗╚════╝██║░░██╗██║░░░░░██║██╔══╝░░██║╚████║░░░██║░░░ +╚█████╔╝╚█████╔╝██████╔╝███████╗██║░░██║░░░░░░╚█████╔╝███████╗██║███████╗██║░╚███║░░░██║░░░ +░╚════╝░░╚════╝░╚═════╝░╚══════╝╚═╝░░╚═╝░░░░░░░╚════╝░╚══════╝╚═╝╚══════╝╚═╝░░╚══╝░░░╚═╝░░░ + +""" \ No newline at end of file diff --git a/SG/demo_pandas_table.py b/SG/demo_pandas_table.py index ba9d164..a32a478 100644 --- a/SG/demo_pandas_table.py +++ b/SG/demo_pandas_table.py @@ -37,8 +37,7 @@ class TablePandas(): layout = self.create_table_window(df) window = sg.Window("Pandas Table Viewer", layout) return window - # def show_confution_matrix_window(df): - # window=get_confution_matrix_window(df) + def show_confution_matrix_window(self,df=None): diff --git a/SG/fviewer.py b/SG/fviewer.py index 21abc09..1d17cd1 100644 --- a/SG/fviewer.py +++ b/SG/fviewer.py @@ -8,19 +8,24 @@ from config.MetaPath import speech_dbs_dir, savee import constants.uiconfig as ufg import table_show as ts import constants.beauty as bt +from SG.multilanguage import get_language_translator # from recognizer.basic import EmotionRecognizer import data_visualization as dv +# from SG.translations import en,zh +language = "en" +lang = get_language_translator(language) + # 主题设置说明:当主题设置语句防止在程序的末尾时可能是无效的 # 猜测sg.theme()设置完主题后,后续在调用sg的元素创建方法才会有相应主题的配色 # 如果控件都已经创建好了才开始调用sg.theme()修改配色,那来不及起作用了 sg.theme(bt.ccser_theme) # 常量 -listbox_default_value_tip = "hover your mouse in this listbox area to check tooltips!" + audio_listbox_values = [ - "click filter or input regex to scan audio file!", - listbox_default_value_tip, + lang.click_filter_prompt, + lang.listbox_default_value_prompt, ] # 将变量设置在事件循环中可能会反复被初始化,这里我们应该放在事件循环的外部 @@ -34,25 +39,11 @@ selected_files = [] # er: EmotionRecognizer = None er = None t: ts.TableShow = None -filter_tooltip = """ - the listbox of files allow you to choose one or more files \n using left button of your mouse, -you can use `Ctrl+Click` to select multiple files(jump to the selected file is allowed too!) - - you can right click after you choose one or more files to do something like these: - 1.file size - 2.file path(absolute path) - 3.recognize emotion - 4.play file(audio) you choosed - *.all of above could work in multiple files one by one automatically -""" -selected_files_tooltip = """ -you can observe the files your choosed in last listBox -Whether it is a continuous selection or a skip selection, -these selected files will be tightly arranged and -the number of files will be displayed at the top -""" -filter_input_key = "filter_input" +selected_files_tooltip = lang.selected_files_tooltip +filter_tooltip = lang.filter_tooltip + +filter_input_key = "filter_input" files_browsed_key = "files browsed" selected_files_listbox_key = "selected_files_list" num_selected_files_key = "num_selected_files" @@ -64,6 +55,8 @@ audio_file_list_key = "audio_files_list" confirm_files_selected_key = "confirm files selected" confirm_folder_selected_key = "confirm folder selected" filter_audios_key = "filter audios" +speech_folder_path_input_key = "speech_folder_path_input" +speech_folder_path_chooser_key = "speech_folder_path_chooser" ## @@ -96,6 +89,15 @@ def get_audios_regex( ) # 调试模式,切片出一小部分来试验算法 # audios=audios[:50] + + # 正则表达式模式 + if filter_regex: + if verbose: + print("filter_regex:> ", filter_regex) + # 由于这里需要反复使用正则匹配,因此采用编译的方式来提高性能 + p = re.compile(filter_regex, re.IGNORECASE) + # s = re.search(filter_regex, str(path), re.IGNORECASE) + filtered_audios = [] for path in audios: # print(path) @@ -106,11 +108,9 @@ def get_audios_regex( else: path = path.absolute() # 对路径进行正则过滤 - #todo 对括号的识别有问题(得益于模块化,可以直接在这个模块内启动图形界面进行调试) + # todo 对括号的识别有问题(得益于模块化,可以直接在这个模块内启动图形界面进行调试) if filter_regex: - if verbose: - print('filter_regex:> ', filter_regex) - s = re.search(filter_regex, str(path), re.IGNORECASE) + s = p.search(str(path)) if s: filtered_audios.append(path) else: @@ -154,8 +154,7 @@ def get_audios(folder, exts, pattern="*", recursive=False, flatten=True, verbose ## # 创建GUI窗口 folder_browse_init_dir = speech_dbs_dir / savee # 作为一个初始值 -speech_folder_path_input_key = "speech_folder_path_input" -speech_folder_path_chooser_key = "speech_folder_path_chooser" + default_folder_file_list = get_audios_regex( recursive=True, speech_folder_root=speech_dbs_dir, short=True ) @@ -166,102 +165,131 @@ len_default_folder_file_list = len(default_folder_file_list) right_click_menu = [ "", - ["Show File Path", "Show File Size", "Play Audio", "Emotion Recognize"], + [lang.show_file_path, lang.show_file_size, lang.play_audio, lang.emotion_recognize], ] -audio_viewer_layout = [ - [sg.Text("Select a directory:")], - [ - sg.InputText( - default_text=speech_folder, - key=speech_folder_path_input_key, - tooltip="you can paste or type a dir path!\n or use the right side Browse button to choose a dir", - ), - sg.FolderBrowse( - initial_folder=folder_browse_init_dir, - button_text="folder browse", - change_submits=True, - key=speech_folder_path_chooser_key, - target=speech_folder_path_input_key, - # enable_events=True, - tooltip=f"choose a folder you want to do SER,\nthe default folder is {speech_folder}", - ), - ], - [sg.B(confirm_folder_selected_key)], - [ - sg.Input( - default_text="select multiple files,which will be shown here ", - key=files_browsed_key, - ), - # sg.Text(text="files selected by filesBrowse will be shown \n in the listbox below"), - sg.FilesBrowse( - target=files_browsed_key, - key="FilesBrowse", - enable_events=True, - change_submits=True, - ), - sg.OK(key="confirm files selected"), - ], - [ - sg.Text("current directory:"), - sg.Text(f"{speech_folder}", key="current_dir"), - ], - [ - sg.Checkbox( - text="Recursively scan subdirectories", - default=True, - key=recursive_checkbox_key, - enable_events=True, - ), - sg.Checkbox( - text="auto refresh", - default=False, - key=auto_refresh_checkbox_key, - enable_events=True, - ), - sg.Checkbox( - text="short path", default=True, key=short_path_checkbox_key, enable_events=True - ), - ], - [ - sg.Text("Filter by regex:"), - sg.InputText(key="filter_input", default_text="", enable_events=True), - ], - [ - sg.B(filter_audios_key, tooltip="click to manual refresh the files listbox"), - # sg.Button(ufg.close), - ], - [sg.Text(f"{len_default_folder_file_list} files", key="num_files_text")], - [ - sg.Listbox( - values=default_folder_file_list, - # size=(50, 10), - size=bt.lb_size, - key=audio_file_list_key, - enable_events=True, - bind_return_key=True, - tooltip=filter_tooltip, - # 定义位于列表中条目的右键菜单内容 - right_click_menu=right_click_menu, - select_mode=sg.LISTBOX_SELECT_MODE_EXTENDED, - no_scrollbar=True, - ) - ], - [ - sg.Text("Selected audio files:"), - sg.Text(f"0 files", key=num_selected_files_key), - ], - [ - sg.Listbox( - values=audio_listbox_values, - size=bt.lb_size, - key=selected_files_listbox_key, - tooltip=selected_files_tooltip, - right_click_menu=right_click_menu, - select_mode=sg.LISTBOX_SELECT_MODE_EXTENDED, - ) - ], -] + +files_selected_prompt = lang.files_selected_prompt + + +def audio_viewer_layout(theme=""): + if theme: + sg.theme(theme) + audio_viewer_layout = [ + + [sg.Text(lang.select_dir_prompt), + # change the visible to True to try the language and theme switch! + sg.Button("restart", visible=False)], + [ + sg.InputText( + default_text=speech_folder, + key=speech_folder_path_input_key, + tooltip=lang.path_input_tooltip, + ), + sg.FolderBrowse( + initial_folder=folder_browse_init_dir, + button_text=lang.folder_browse, + change_submits=True, + key=speech_folder_path_chooser_key, + target=speech_folder_path_input_key, + # enable_events=True, + tooltip=f"{lang.choose_folder_tooltip}{speech_folder}", + ), + ], + [sg.Button(lang.confirm_folder_selected, key=confirm_folder_selected_key)], + [ + sg.Input( + default_text=files_selected_prompt, + key=files_browsed_key, + ), + # sg.Text(text="files selected by filesBrowse will be shown \n in the listbox below"), + sg.FilesBrowse( + button_text=lang.files_browse, + target=files_browsed_key, + key="FilesBrowse", + enable_events=True, + change_submits=True, + ), + ], + [ + sg.OK( + button_text=lang.confirm_files_selected_button, + key=confirm_files_selected_key, + ), + ], + [ + sg.Text(lang.current_directory_prompt), + sg.Text(f"{speech_folder}", key="current_dir"), + ], + [ + sg.Checkbox( + text=lang.recursively_scan_subdir, + default=True, + key=recursive_checkbox_key, + enable_events=True, + ), + sg.Checkbox( + text=lang.auto_refresh, + default=False, + key=auto_refresh_checkbox_key, + enable_events=True, + ), + sg.Checkbox( + text=lang.short_path, + default=True, + key=short_path_checkbox_key, + enable_events=True, + ), + ], + [ + sg.Text(lang.filter_by_regex_prompt), + sg.InputText(key="filter_input", default_text="", enable_events=True), + ], + [ + sg.Button( + button_text=lang.filter_audios, + key=filter_audios_key, + tooltip=lang.auto_refresh_tooltip, + ), + # sg.Button(ufg.close), + ], + [sg.Text(f"{len_default_folder_file_list} files", key="num_files_text")], + [ + sg.Listbox( + values=default_folder_file_list, + # size=(50, 10), + size=bt.lb_size, + key=audio_file_list_key, + enable_events=True, + bind_return_key=True, + tooltip=filter_tooltip, + # 定义位于列表中条目的右键菜单内容 + right_click_menu=right_click_menu, + select_mode=sg.LISTBOX_SELECT_MODE_EXTENDED, + no_scrollbar=True, + ) + ], + [ + sg.Text(lang.selected_audios_prompt), + sg.Text(lang.no_files, key=num_selected_files_key), + ], + [ + sg.Listbox( + values=audio_listbox_values, + size=bt.lb_size, + key=selected_files_listbox_key, + tooltip=selected_files_tooltip, + right_click_menu=right_click_menu, + select_mode=sg.LISTBOX_SELECT_MODE_EXTENDED, + ) + ], + ] + return audio_viewer_layout + + +def make_window(theme): + window = sg.Window("Audio Viewer", audio_viewer_layout(theme), resizable=True) + return window # 定义文件大小计算函数 @@ -319,14 +347,19 @@ def get_abs_selected_pathes(speech_folder_path, selected_files): def main(): - layout = audio_viewer_layout - - window = sg.Window("Audio File Filter", layout, resizable=True) + layout = audio_viewer_layout() + global lang + window = sg.Window(lang.audios_filter, layout, resizable=True) while True: event, values = window.read() print(event, "@{event} main") if event in (sg.WINDOW_CLOSED, ufg.close): break + elif event == "restart": + window.close() + print("closed successfully!") + lang = get_language_translator("zh") + window = make_window(theme="Reds") else: # 处理事件(小心,如果下面的函数编写不当,可能使得某些控件不能够正常工作) # 例如,FolderBrowser生成的按钮点击无法呼出系统的资源管理器(或者需要反复点击) @@ -355,7 +388,7 @@ def fviewer_events(window, event=None, values=None, verbose=1): # 判断手动输入的路径是否合法 if event == confirm_folder_selected_key: path = values[speech_folder_path_input_key] - print(path, "was confirmed") + print(path, "was confirmed!") if Path(path).exists(): speech_folder = path # 更新当前speech_path控件 @@ -363,7 +396,7 @@ def fviewer_events(window, event=None, values=None, verbose=1): # 更新文件列表视图 refresh_viewer(window, speech_folder=path, values=values) else: - sg.popup_error(f"{path} not exist!") + sg.popup_error(f"{path} {lang.not_exist}") # 刷新文件列表 elif event == filter_input_key and not values[auto_refresh_checkbox_key]: return @@ -387,7 +420,7 @@ def fviewer_events(window, event=None, values=None, verbose=1): refresh_selected_view(window, num_selected_files) # 处理 "Show File Path" 事件 - elif event == "Show File Path": + elif event == lang.show_file_path: res = [] for file in selected_files: res.append(get_absolute_path(speech_folder, file)) @@ -395,7 +428,7 @@ def fviewer_events(window, event=None, values=None, verbose=1): sg.popup(selected_file_pathes, title="File Path") # 处理 "Show File Size" 事件 - elif event == "Show File Size": + elif event == lang.show_file_size: # selected_file = get_abs_selected_pathes(speech_folder_path, selected_files) res = [] for selected_file in selected_files: @@ -407,7 +440,7 @@ def fviewer_events(window, event=None, values=None, verbose=1): res = "\n".join(res) sg.popup(f"{res}", title="File Size") # 处理 "Play Audio" 事件 - elif event == "Play Audio": + elif event == lang.play_audio: pathes = get_abs_selected_pathes(speech_folder, selected_files) print(pathes, selected_files) @@ -421,7 +454,7 @@ def fviewer_events(window, event=None, values=None, verbose=1): # 播放音频 audio_file = AudioSegment.from_file(audio_path, format=ext) play(audio_file) - elif event == "Emotion Recognize": + elif event == lang.emotion_recognize: # print() # 为了完成多选文件(成批识别),经过brainstorm,提出以下idea: # 委托给ccser_gui模块来处理,通过共享变量来简单通信/创建一个媒介模块来解决相互导入的问题(对于这种简单的场景够用的) @@ -431,7 +464,7 @@ def fviewer_events(window, event=None, values=None, verbose=1): # 这里的识别应该在训练阶段完成之后才调用的,否则程序应该组织这样跨阶段的行为,提高robustness if er == None: print("请先完成识别器训练,然后再执行识别操作") - sg.popup("please train the SER model and then try angin!") + sg.popup(lang.train_model_warning, text_color="red") else: print(f"the emotion recognizer is {er}!") res_content: list[str] = [] @@ -448,7 +481,9 @@ def fviewer_events(window, event=None, values=None, verbose=1): print(emo_res, "@{emo_res}") print(abs_pathes, "@{abs_pathes}") - t = ts.TableShow(header=["emotion", "path"], data_lists=[emo_res, abs_pathes]) + t = ts.TableShow( + header=["emotion", "path"], data_lists=[emo_res, abs_pathes] + ) print(t.lists, "@{t.lists}") t.run() @@ -460,9 +495,7 @@ def fviewer_events(window, event=None, values=None, verbose=1): def refresh_selected_view(window, num_selected_files): # 数量 - window[num_selected_files_key].Update( - f"Selected audio files: ({num_selected_files} files)" - ) + window[num_selected_files_key].Update(f"({num_selected_files}{lang.files_count})") # 内容 window[selected_files_listbox_key].Update(values=selected_files) @@ -479,7 +512,7 @@ def refresh_viewer(window, speech_folder=None, values=None, delay=1, verbose=1): recursive = values[recursive_checkbox_key] short = values[short_path_checkbox_key] filter_regex = values[filter_input_key] - auto_refresh=values[auto_refresh_checkbox_key] + auto_refresh = values[auto_refresh_checkbox_key] # print(short, "@{short}🎈") @@ -496,7 +529,9 @@ def refresh_viewer(window, speech_folder=None, values=None, delay=1, verbose=1): num_files = len(audio_files) # 将扫描到的文件更新到窗口对应组件中,在下一次read方法调用时,画面就会显示新的内容 window[audio_file_list_key].update(values=audio_files) - window[num_files_key].update(f"Filtered audio files: ({num_files} files)") + window[num_files_key].update( + f"{lang.filterd_audios}({num_files} {lang.files_count})" + ) if __name__ == "__main__": diff --git a/SG/multilanguage.py b/SG/multilanguage.py index 875db00..f433e8f 100644 --- a/SG/multilanguage.py +++ b/SG/multilanguage.py @@ -1,18 +1,35 @@ import PySimpleGUI as sg import json -from config.MetaPath import trans_en,trans_zh +from config.MetaPath import trans_en_json,trans_zh_json +from SG.translations import en,zh +# lang\["(.+)"\] +#lang.$1 +lang=en +English_marks = ('English','英文','en') +Chinese_marks = ('中文',"Chinese",'zh','cn') -def get_your_language_translator(language="English"): - if language in ('English','英文'): - with open(trans_en, 'r',encoding='utf-8') as f: +def get_language_translator(language="English"): + global lang + if language in English_marks: + lang=en + # return en + # return zh + elif language in Chinese_marks: + lang=zh + return lang + +def get_language_translator_json(language="Chinese"): + if language in English_marks: + with open(trans_en_json, 'r',encoding='utf-8') as f: translations = json.load(f) - elif language in ('中文',"Chinese"): + elif language in Chinese_marks: # encoding='utf-8',否则中文字符报错:UnicodeDecodeError: 'charmap' codec can't decode byte 0x81 in position 53: character maps to - with open(trans_zh, 'r',encoding='utf-8') as f: + with open(trans_zh_json, 'r',encoding='utf-8') as f: translations = json.load(f) - return translations + lang=translations + return lang @@ -35,10 +52,11 @@ def run_app(): break elif event == 'OK': # 根据用户的选择读取相应的语言翻译文件 - translations = get_your_language_translator(values) - + translations = get_language_translator(values['language']) + print(translations,values) # 显示欢迎消息 - welcome_message = translations['welcome_message'] + # welcome_message = translations['welcome_message'] + welcome_message = translations.welcome_message window['welcome_message'].update(welcome_message) # 关闭 GUI 窗口 @@ -46,4 +64,7 @@ def run_app(): if __name__ == '__main__': - run_app() \ No newline at end of file + # res=get_your_language_translator('中文') + # print('res: ', res) + run_app() + \ No newline at end of file diff --git a/SG/snippet_cxxu.py b/SG/snippet_cxxu.py index 3046604..32668d0 100644 --- a/SG/snippet_cxxu.py +++ b/SG/snippet_cxxu.py @@ -1 +1 @@ -recursive \ No newline at end of file +emotion \ No newline at end of file diff --git a/SG/table_show.py b/SG/table_show.py index 4a28db9..eed109b 100644 --- a/SG/table_show.py +++ b/SG/table_show.py @@ -1,6 +1,8 @@ import PySimpleGUI as sg import pandas as pd from config.MetaPath import recognize_result_dir +from SG.multilanguage import get_language_translator,lang + class TableShow(): def __init__(self,header=None,data_lists=None): """将二维列表作为表格数据显示 @@ -22,7 +24,7 @@ class TableShow(): self.data_df=pd.DataFrame(self.data_rows,columns=self.header) # 创建表格布局 - warning="the save operation will comsume some time to complete!Be patient!" + save_patient_warning=lang.save_patient_warning self.layout = [ [ sg.Table( @@ -37,9 +39,9 @@ class TableShow(): expand_y=True, ) ], - [sg.Text("if you want to recognize the next batch files,please close the window first!\n in the future,the client may be support multiple threads to improve the user experience")], - [sg.Text("save result to a csv file")], - [sg.Button(f"save to file",tooltip=f"click to save to a csv file!\n{warning}")], + [sg.Text(lang.close_table_prompt)], + [sg.Text(lang.save_to_csv_prompt)], + [sg.Button(f"save to file",tooltip=f"{save_patient_warning}")], ] def run(self): diff --git a/SG/translations/__pycache__/en.cpython-39.pyc b/SG/translations/__pycache__/en.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..77a621d08ad35f594c7a360327acc8826e2d3286 GIT binary patch literal 6963 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 AX8-^I literal 0 HcmV?d00001 diff --git a/config/MetaPath.py b/config/MetaPath.py index e858a59..b4b990d 100644 --- a/config/MetaPath.py +++ b/config/MetaPath.py @@ -37,8 +37,10 @@ ravdess_files_glob_old = "data/ravdess/Actor_*" ravdess_files_glob="data/ravdess/Actor_*/*.wav" savee_files_glob = "data/savee/AudioData/*/*.wav" translations_dir=project_dir/"SG/translations" -trans_zh=translations_dir/"zh.json" -trans_en=translations_dir/"en.json" +trans_zh_json=translations_dir/"zh.json" +trans_en_json=translations_dir/"en.json" +trans_zh=translations_dir/"zh.py" +trans_en=translations_dir/"en.py" # print(trans_en.exists()) #计算绝对路径 diff --git a/config/__pycache__/MetaPath.cpython-39.pyc b/config/__pycache__/MetaPath.cpython-39.pyc index 4fb26e0aadb680bc0bf95bdc05a05843a77ca921..a485b1d4ed5eef890db98d849dac753207eb58ce 100644 GIT binary patch delta 2471 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 diff --git a/presentation_ppt.md b/presentation_ppt.md new file mode 100644 index 0000000..6bc4764 --- /dev/null +++ b/presentation_ppt.md @@ -0,0 +1,142 @@ +--- + +marp: true +# header: 'Header content' +footer: '跨库SER系统的设计与实现' +theme: gaia +class: lead + + +--- + +# 跨库语音情感识别系统的设计与实现 + + +![bg contain left:45% 98% 在这里插入图片描述](https://img-blog.csdnimg.cn/be61e759517a4f038c3eb69928e097aa.png) + + +计科1902 徐超信 +指导老师:蒋海华 + +--- + + + +## 内容目录 + +- 背景和意义 +- 开发路径 +- 实现方案 +- 基础情况 + +--- + +## 背景&意义 + +- 语音是人与人之间最重要、便捷的交流方式,不仅包含人类所要传达的语义信息,还包含人们所要表达情感信息,语言种类等各个方面。在20世纪中期,人机交互系统一直停带于语义文本这一类文字信息的理解和表达上,因此,当时所构建的人机交互系统往往只有用户表达出中性语音时才能够有效地识别出用户意图,而对于自然状态下的情感语音理解极为不佳。 +- 可见,制约着人机交互系统发展的重要因素之一在于情感智能的缺失。在此背景下,越来越多的研究者们开始着手于对情感信息的探索。语音情感识别在智能车载系统,情感机器人,医疗,服务业等领域都发挥着重要作用。 + +--- + + +## 开发路径 + + + +![bg contain right:80% 95% 在这里插入图片描述](https://img-blog.csdnimg.cn/b0fca5b946ea4e20acc513c1ed304c50.png) + + +--- + +## 实现方案 + +--- + +### 语料库的选用 + + + +- EMO-DB : 该数据集是由 10 名演员(分别从5个男性和5个女性说话人的表演语音中获得)模拟 7 种情绪产生的 10 个德语语句, 7 种情绪分别是:中性、愤怒、恐惧、喜悦、悲伤、厌恶和厌倦, 数据库共536 个样本, 该数据库已经成为许多研究的基础。 +- SAVEE: 该数据集是一个使用英国英语的多模态情感数据集。 它总共包含了 480 条语音以及 7 种不同的情感: 中性、快乐、悲伤、愤怒、惊讶、恐惧和厌恶。 这些话语由 4 个专业的男性演员产生。 为了保持情感表演的良好质量, 本数据集的所有录音均由 10 位不同的评价者在音频、视觉和视听条件下进行验证这些录音中的脚本选自常规 TIMIT 语料库。 + +--- + +- RAVDESS: 该数据集是情感语音和歌曲的多模态语料。 该数据集是性别均衡的, 由 24 名专门演员组成, 他们以中性的北美(英语)发音产生语音和歌曲样本。 对于情感性言语, 它由平静、欢乐、悲伤、愤怒、恐惧、惊讶、厌恶构成。 对于情感性的歌曲, 它由平静、欢乐、悲伤、愤怒、恐惧、惊讶、厌恶和恐惧组成。 每个表情都是在情感强度的两个层次上产生的, 带有一个附加的中性表情。 最后收集的 7 356 份录音在情感有效性、强度和真实性方面分别被评为 10 次。 对于这些收视率, 雇佣了来自北美的 247 名未经培训的研究对象。 + +--- + +- 拟选用的上述数据库既可以完成多模态的同语言不同库的跨库识别(SAVEE和RAVDESA)实验,也可以完成跨语言跨库的识别实验(EMO-DB和SAVEE或EMO-DB和RAVDESS)。其中RAVDESS虽然是单模态的语料库库,但是由于其广泛的被采用,可以用来检验SER的基本识别性能,以及和已有的实验进行对比 + +--- + +### 语音特征的提取 + +- + + +--- + +### 分类模型的构建 + + + +![ Schematic diagram of automatic encoder; ](https://img-blog.csdnimg.cn/457d8e29cd074d6a90126238ce5fd73e.png) + +本系统拟采用栈式堆叠稀疏自编码器与核函数极限学习机结合的复合网络模型(SSAE-KELM)作为识别模型。 +Stack Sparse Automatic Encoders - Kernel Extreme Learning Machine + + + +复合网络SSAE-KELM 的结构图解 +![bg contain right:70% ](https://img-blog.csdnimg.cn/63f31dd95c74414dbde9804b71b73811.png) + +--- + +![image-20230112193055545](D:\repos\blogs\graduationDesign\assets\image-20230112193055545.png) + +识别的流程 +![ 在这里插入图片描述](https://img-blog.csdnimg.cn/17fd1086b50043b2aaab511b6a675151.png) + +--- + +基于复合网络 SSAE-KELM 语音情感识别的详细步骤如下: + +1) 多层稀疏自编码器堆叠构成栈式稀疏自编码网络,初始化 SSAE 网络参数; +2) 选择情感语音库,按照大致 2:1 的比例将其分为训练集与测试集,并提取语音情感全局特征 GF; +3) 从上到下无监督逐层贪婪训练每一层 SAE,实现局部最优; +4) 结合标签通过 BP 算法微调整体网络参数,达到全局最优; +5) 提取经过SSAE 无监督预训练有监督微调后的深度特征用于训练KELM 分类器,得到相应的KELM 参数; +6) 保存训练好的网络参数,利用测试集对语音情感识别性能进行测试。 + +--- + +### 小结 + +- 本系统采用一种复合网络栈式稀疏自编码网络——核函数极限学习机,首先通过栈式稀疏自编码网络对原始特征进行无监督预训练。 +- 然后结合数据标签利用反向传播算法有监督微调,重构得到更符合大脑稀疏性且更具有区分情感信息的深度特征。 +- 最后采用人工蜂群优化算法优化的核函数极限学习机对情感进行识别分类。 + +--- + +### 语音情感识别系统的开发: + +- 本系统将在windows上开发,采用python语言和PyQT技术进行图形界面的开发。深度学习框架使用pytorch。 +- 系统功能:可视化地展示模型的训练过程和语音情感的识别过程。拟实现一个抑郁症患者情绪跟踪管理系统,比如日常性对病人发送问题,根据患者的回答进行情感分析,辅助医生分析患者病情走势 + +--- + +各部分间的关系 +![ 在这里插入图片描述](https://img-blog.csdnimg.cn/10f77de059604bd8be125e1dd3c39d55.png) + +## 系统开发 + +![image-20230510185320088](D:\repos\CCSER\SER\assets\image-20230510185320088.png) + +## 总结 + +- + + + + + diff --git a/release_note.md b/release_note.md index 8ccaaa2..4f69c04 100644 --- a/release_note.md +++ b/release_note.md @@ -23,7 +23,17 @@ - **input version under this line:** - new notes:"Sort update records in descending order of time".That would be convenient to update new version notes in the future. -- +- *current modifing:* + - ... + +- 2023-05-10@20:06:02 + - initially support the interface language switch:between Chinese and English + - the approch to achieve the multilanguage support depending on language string resource py file: + - `zh.py` for Chinese + - `en.py` for english + - for convenience,these module was managed by the `multilanguage.py`module. + - unfortunately,these features was test in `fviewer.py`,the main gui was still unable to work normally because the `windows.close` caused the program broken! + - improve the regex_filter performance by using `re.compile` instead `re.` - 2023-05-09@19:10:05 - fix some bugs. - certain adjustments to the project code. diff --git a/test_playground/__pycache__/m1.cpython-39.pyc b/test_playground/__pycache__/m1.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e1eb7428398c5e12cce9b6130a528efc4948c939 GIT binary patch literal 285 zcmYe~<>g`kg2^_~Db_&xF^Gc>3mU!X>H2CGiD0iIwR^`K5U&F}a3% z1(mlrlQUA2v*UqAfm~e-A{ZEp*ny;