├── .gitignore ├── LICENSE ├── README.md ├── conf └── config.ini ├── docs └── 构思.md ├── main.py ├── requirements.txt ├── ui ├── guiclass.py ├── mydialog.py ├── mygui.py ├── mywidget.py ├── pyuic │ ├── ui_add_authorizationinfo.py │ ├── ui_add_dataset.py │ ├── ui_biaobei_pingce.py │ ├── ui_dataset_view.py │ ├── ui_del_info_wav.py │ ├── ui_edit_info.py │ ├── ui_output_dataset_speaker.py │ ├── ui_pingce_jindutiao.py │ ├── ui_select_dataset.py │ ├── ui_select_file_long_wav.py │ ├── ui_select_file_wav_srt.py │ └── ui_select_workspace.py └── uifiles │ ├── add_authorizationinfo.ui │ ├── add_dataset.ui │ ├── add_voice.ui │ ├── biaobei_pingce.ui │ ├── dataset_view.ui │ ├── del_info_wav.ui │ ├── edit_info.ui │ ├── output_dataset_speaker.ui │ ├── pingce_jindutiao.ui │ ├── select_dataset.ui │ ├── select_file_long_wav.ui │ ├── select_file_wav_srt.ui │ └── select_workspace.ui ├── utils ├── add_path.py ├── global_obj.py ├── log.py ├── peewee_orm.py ├── qt_tools.py ├── request_tools.py ├── sqlitedb.py ├── tool_str.py └── tools.py └── 编译.bat /.gitignore: -------------------------------------------------------------------------------- 1 | .idea 2 | temp 3 | venv 4 | logs 5 | workspace 6 | lib 7 | build 8 | dist 9 | imgs 10 | *.spec 11 | out -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 李子 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # sound_dataset_tools2 2 | 3 | ## 介绍 4 | 本工具主要用于快速制作语音数据集,可一键导出VITS等项目所需的训练数据集 5 | 6 | **注意:你正在查看项目的r1.0分支,本分支将停止更新新功能,仅做维护和留档,未来项目经过重构后会以r2.0分支为主** 7 | 8 | 特色: 9 | 10 | GUI界面! 11 | 12 | **中文文档** 13 | 14 | 支持 音频+字幕/纯音频自动切割 两种方式导入数据(未来会更多) 15 | 16 | 自动优化了音频的切割效果,(尽量)避免出现断音 17 | 18 | 可直接导出符合VITS等项目要求的数据集格式,声道数/采样率均可设置 19 | 20 | 引入语音评测功能,通过为数据打分可以快速从海量数据中筛选出优质数据集 21 | 22 | ## 软件架构 23 | 数据库:sqlite、peewee 24 | 25 | 界面:PySide6 26 | 27 | 音频处理:FFMPEG、pydub等 28 | 29 | 30 | ## 安装教程 31 | 32 | ### 运行编译好的exe文件 33 | 34 | 进入 github 的 [Release](https://github.com/kslz/sound_dataset_tools2/releases) 界面 或 gitee 的[发行版](https://gitee.com/kslizi/sound_dataset_tools2/releases/)界面 根据提示下载对应的压缩包双击即可启动程序 35 | 36 | ### 从源代码运行 37 | 38 | 1. 克隆本项目 39 | 40 | gitee: 41 | 42 | ``` 43 | git clone https://gitee.com/kslizi/sound_dataset_tools2.git 44 | ``` 45 | 46 | github: 47 | 48 | ``` 49 | git clone https://github.com/kslz/sound_dataset_tools2.git 50 | ``` 51 | 52 | 2. 安装[ffmpeg](https://www.gyan.dev/ffmpeg/builds/ffmpeg-git-essentials.7z) 53 | 54 | 你可以通过配置环境变量,也可以将下载得到的ffmpeg压缩包解压然后在exe根目录下新建lib文件夹,将解压得到的bin文件夹改名为ffmpeg,然后复制到lib目录下,最后的目录结构如图所示 55 | 56 | ![image-20230306190922062](https://cdn.jsdelivr.net/gh/kslz/blogImage@main/img/image-20230306190922062.png) 57 | 58 | 3. 安装其他库 59 | 60 | ``` 61 | pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple 62 | ``` 63 | 64 | 65 | 66 | ## 使用说明 67 | 68 | ### 运行项目 69 | 70 | ``` 71 | python main.py 72 | ``` 73 | 74 | ### 选择工作区 75 | 76 | ![image-20230306191102551](https://cdn.jsdelivr.net/gh/kslz/blogImage@main/img/image-20230306191102551.png) 77 | 78 | 如果你当前的目录空间不足可以指定其他目录,导入的文件、数据库、生成的数据集都会存放在指定目录中 79 | 80 | ### 数据集选择界面 81 | 82 | 你可以在这里添加,修改,删除数据集。每个数据集之间互相独立。点击进入按钮,进入数据集。 83 | 84 | ![image-20230306191345259](https://cdn.jsdelivr.net/gh/kslz/blogImage@main/img/image-20230306191345259.png) 85 | 86 | ### 数据集概览界面 87 | 88 | 在此你可以对数据进行导入、导出、处理等操作 89 | 90 | ![image-20230306191504981](https://cdn.jsdelivr.net/gh/kslz/blogImage@main/img/image-20230306191504981.png) 91 | 92 | #### 导入数据 93 | 94 | 注意:所有导入数据的方式都经过了自动优化,关于自动优化的具体逻辑请见文末。 95 | 96 | ##### 从文件导入(音频+字幕) 97 | 98 | 点击按钮,在弹窗中选择预先处理好的音频和字幕文件,支持视频文件和几乎所有(ffmpeg支持的)格式的音频文件导入,同时请输入发音人。关于字幕的获取请参见文末。 99 | 100 | ![image-20230306191737405](https://cdn.jsdelivr.net/gh/kslz/blogImage@main/img/image-20230306191737405.png) 101 | 102 | 导入后的界面如图所示,你可以在左侧的下拉框中选择翻页,也可以点击试听音频段 103 | 104 | ![image-20230325203520340](https://cdn.jsdelivr.net/gh/kslz/blogImage@main/img/image-20230325203520340.png) 105 | 106 | 点击快速导出后会将当前音频导出至 `.\workspace\output\fastoutput\` 目录下 107 | 108 | ##### 从文件导入(长音频) 109 | 110 | 点击按钮,在弹窗中选择预先处理好的音频文件,支持视频文件和几乎所有(ffmpeg支持的)格式的音频文件导入,同时请输入合适的发音人、最短静音长度、静音阈值信息 111 | 112 | 最短静音长度:当静音长度达到这个数值时进行一次裁切 113 | 114 | 静音阈值:当音频响度低于这个数值时则视为静音,如果你的音频底噪很低,可以适当调低此值获得更好的结果,反之则提高。 115 | 116 | ![image-20230306192153819](https://cdn.jsdelivr.net/gh/kslz/blogImage@main/img/image-20230306192153819.png) 117 | 118 | 导入后的界面如图所示,需要注意的是因为只有短音频,所以裁切出的音频段没有标注文本,将在未来引入语音识别以进行自动标注。 119 | 120 | ![image-20230306192556509](https://cdn.jsdelivr.net/gh/kslz/blogImage@main/img/image-20230306192556509.png) 121 | 122 | #### 删除数据 123 | 124 | ##### 根据源音频删除数据 125 | 126 | 点击按钮后选择一个当前数据集中数据对应的音频,点击确定后音频本身和相关联的数据都会被删除 127 | 128 | ![image-20230306192718584](https://cdn.jsdelivr.net/gh/kslz/blogImage@main/img/image-20230306192718584.png) 129 | 130 | #### 导出数据 131 | 132 | ##### 导出数据集(单发音人) 133 | 134 | 点击按钮后选择参数,你也可以选择对应预设然后点击应用按钮应用预设,如果你不了解这些值的含义使用默认即可。 135 | 136 | 注: 137 | 138 | 归一化:即响度匹配,会按照所输入的值进行音频音量进行自动缩放 139 | 140 | 目前的导出逻辑中将跳过标注文本中包含英文或数字的数据,不过如果有标注文本为空,仍会进行导出 141 | 142 | 点击下一步即可进行数据集导出,窗口可能会卡一下,请耐心等待。 143 | 144 | ![image-20230306193433527](https://cdn.jsdelivr.net/gh/kslz/blogImage@main/img/image-20230306193433527.png) 145 | 146 | ![image-20230306193407322](https://cdn.jsdelivr.net/gh/kslz/blogImage@main/img/image-20230306193407322.png) 147 | 148 | 导出后的文件可在对应目录找到 149 | 150 | ![image-20230306193521430](https://cdn.jsdelivr.net/gh/kslz/blogImage@main/img/image-20230306193521430.png) 151 | 152 | #### 语音评测 153 | 154 | 语音评测功能可以通过商用评测接口为语句打分,以实现快速挑选优质数据的功能。 155 | 156 | 目前已接入标贝语音评测接口 157 | 158 | ##### 标贝语音评测 159 | 160 | ###### 添加授权信息 161 | 162 | 首先进入软件设置-授权管理页面,点击添加按钮,输入名称等字段,应用类型选择语音评测。 163 | 164 | ![image-20230806115645788](https://cdn.jsdelivr.net/gh/kslz/blogImage@main/img/image-20230806115645788.png) 165 | 166 | 标贝相关字段请进入 [标贝开放平台-语音评测页面](https://ai.data-baker.com/#/expand/evaluating) 开通服务后查看(目前为免费试用期,想白嫖的尽快) 167 | 168 | ![image-20230806120051148](https://cdn.jsdelivr.net/gh/kslz/blogImage@main/img/image-20230806120051148.png) 169 | 170 | 添加完毕后会自动进行校验,期间请关闭代理程序。 171 | 172 | ###### 进行数据评测 173 | 174 | 然后进入数据处理页面,点击标贝语音评测,选择相应授权信息后即可开始评测。 175 | 176 | ![image-20230806120245067](https://cdn.jsdelivr.net/gh/kslz/blogImage@main/img/image-20230806120245067.png) 177 | 178 | ![image-20230806120318125](https://cdn.jsdelivr.net/gh/kslz/blogImage@main/img/image-20230806120318125.png) 179 | 180 | ###### 根据评测结果导出 181 | 182 | 返回数据集概览页面,点击导出按钮,在评测相关的部分选择标贝评测,并填入对应分数要求 183 | 184 | ![image-20230806120507462](https://cdn.jsdelivr.net/gh/kslz/blogImage@main/img/image-20230806120507462.png) 185 | 186 | 注意:选择评测的话,未进行评测的数据将不会被导出,同时因为标贝评测只支持中文,所以选择后所有英文数据也都不会被导出。 187 | 188 | 点击下一步,确认后即可开始导出 189 | 190 | ![image-20230806120653755](https://cdn.jsdelivr.net/gh/kslz/blogImage@main/img/image-20230806120653755.png) 191 | 192 | ![image-20230806120927179](https://cdn.jsdelivr.net/gh/kslz/blogImage@main/img/image-20230806120927179.png) 193 | 194 | 另附:不选择评测时的导出结果 195 | 196 | ![image-20230806121007747](https://cdn.jsdelivr.net/gh/kslz/blogImage@main/img/image-20230806121007747.png) 197 | 198 | ## 开发计划 199 | 200 | ~~编译exe版本~~ 201 | 202 | 通过ASR标注 203 | 204 | ~~应用语音评测~~ 205 | 206 | 应用声纹识别 207 | 208 | 导出多发音人数据集 209 | 210 | ~~快速导出~~ 211 | 212 | ...... 213 | 214 | 215 | 216 | ## 常见问题 217 | 218 | 1. **如何获取字幕?** 219 | 220 | 使用剪映或videoSRT等工具获取SRT字幕文件,可以参考以下链接: 221 | 222 | [剪映导出字幕](https://jingyan.baidu.com/article/c35dbcb0881b6fc817fcbcd2.html) 223 | 224 | [video-srt-windows](https://github.com/wxbool/video-srt-windows) 225 | 226 | [videosrt-pro](https://www.yuque.com/viggo-t7cdi/videosrt-pro/cpwtwl#KKySG) 227 | 228 | 2. **自动优化的逻辑?** 229 | 230 | 优化逻辑是从起位置开始向前截取10ms 检查这10ms和start到start+10两段的响度比较,如果前面的响度小则把start向前挪,直到找到一个响度最小的位置,end也是类似的逻辑,这样能尽量避免音频被截断 231 | 232 | 另外剪映生成的字幕有时会讲一句话拆成多句,每句之间相隔33毫秒以内,遇到这种情况程序会将这些字幕合成一句。 233 | 234 | 3. **如何升级exe版本** 235 | 236 | 下载新的压缩包后将其中的exe文件替换到原来的旧版软件相同路径,覆盖原文件即可 237 | 238 | 3. **待补充...** 239 | -------------------------------------------------------------------------------- /conf/config.ini: -------------------------------------------------------------------------------- 1 | [program_configs] 2 | default_workspace = .\workspace 3 | 4 | -------------------------------------------------------------------------------- /docs/构思.md: -------------------------------------------------------------------------------- 1 | sound_dataset_tools2 2 | 3 | 语音数据集制作工具 4 | 5 | 6 | 7 | 目录结构 8 | 9 | ```text 10 | sound_dataset_tools2 11 | conf 12 | config.ini 常规配置文件 13 | utils 14 | tools.py 常规工具函数 15 | xunfei.py 讯飞相关工具函数 16 | biaobei.py 标贝相关工具函数 17 | sqlite.py 数据库相关 18 | ui 19 | uifiles 存放*.ui的目录 20 | ui_***.py 转换后的pyqt文件 21 | workspace 工作区 22 | db 23 | workspace.db存放工作区相关信息 24 | work1... 存放不同的工作项目 25 | 0_rawvoice 存放原始音频 26 | 0_srt 存放srt文件 27 | 1_ 28 | 29 | 30 | 31 | 32 | 33 | 34 | ``` 35 | 36 | ## 概念 37 | 38 | 工作区:一个文件夹,里面存放数据集,每个工作区对应一个sqlite文件 39 | 40 | 数据集:与其他数据及互相独立,里面存放源音频,字幕文件, 41 | 42 | ## 工作流程 43 | 44 | 1,进入页面要求输入工作区位置,默认填写为同目录下的位置 45 | 46 | 2,进入后展示现有数据集信息,有一个按钮可以新建数据集,有一个按钮可以进入数据集 47 | 48 | 3,新建数据集窗口可以填写数据集名称、简介 49 | 50 | 4,进入数据集窗口后展示数据集信息,历史导入的音频文件、有一个导入新音频的按钮,可以导入新音频文件和SRT文件 51 | 52 | 53 | 54 | 1,根据 srt 文件裁切语音文件 55 | 56 | 2,直接根据静音帧切割语音文件 57 | 58 | 59 | 60 | ## 程序流程 61 | 62 | 1. 运行main.py 63 | 2. 初始化程序 init_program() 64 | 1. 读取ini文件,放入全局变量中 65 | 3. guiclass.main() 66 | 1. 定义guilogger日志 67 | 2. 展示工作区选择窗口 SelectWorkspaceWindow 68 | 4. 工作区选择窗口 69 | 1. 确定 70 | 2. 退出:close_program() 71 | 5. 数据集窗口 72 | 1. 数据集概览tab 73 | 1. 展示表格 74 | 1. 展示列:文本/发音人/是否已切割/ 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | ## 数据库 83 | 84 | ### 表 85 | 86 | #### 工作区表 87 | 88 | workspace_tbl 89 | 90 | | 列名 | 类型 | 非null | 备注 | 91 | | ----------------------- | ------- | ------ | ------------ | 92 | | workspace_id | INTEGER | | id | 93 | | workspace_name | TEXT | | 工作区名 | 94 | | workspace_create_time | | | 创建时间 | 95 | | workspace_last_use_time | | | 上次使用时间 | 96 | | workspace_info | | | 工作区说明 | 97 | 98 | #### 数据集表 99 | 100 | dataset_tbl 101 | 102 | | 列名 | 类型 | 非null | 备注 | 103 | | --------------------- | ------- | ------ | ------------ | 104 | | dataset_id | INTEGER | | id | 105 | | dataset_name | TEXT | | 数据集名 | 106 | | dataset_create_time | | | 创建时间 | 107 | | dataset_last_use_time | | | 上次使用时间 | 108 | | dataset_info | | | 数据集说明 | 109 | 110 | #### 数据表 111 | 112 | info_tbl 113 | 114 | | 列名 | 类型 | 非null | 外键 | 备注 | 115 | | ------------------ | ------- | ------ | ---- | -------------------------- | 116 | | info_id | INTEGER | | | id | 117 | | dataset_id | INTEGER | | 外键 | 外键 | 118 | | info_text | | | | 音频段对应的文本 | 119 | | info_pinyin | | | | 文本的拼音 | 120 | | info_speaker | | | | 发音人 | 121 | | info_raw_file_path | | | | 原音频文件位置 | 122 | | info_start_time | | | | 音频段开始时间(毫秒 | 123 | | info_end_time | | | | 音频段结束时间(毫秒 | 124 | | info_acc_score | | | | 句子准确度得分 | 125 | | info_flu_score | | | | 句子流利度得分 | 126 | | info_int_score | | | | 句子完整度得分 | 127 | | info_all_score | | | | 总得分 | 128 | | info__file_path | | | | 文件被导出的位置 | 129 | | info_is_del | | | | 是否已删除 0未删除 1已删除 | 130 | | | | | | | 131 | 132 | 133 | 134 | ## 样例 135 | 136 | ``` 137 | dump 138 | ├── dev 139 | │ ├── norm 140 | │ └── raw 141 | ├── phone_id_map.txt 142 | ├── speaker_id_map.txt 143 | ├── test 144 | │ ├── norm 145 | │ └── raw 146 | └── train 147 | ├── energy_stats.npy 148 | ├── norm 149 | ├── pitch_stats.npy 150 | ├── raw 151 | └── speech_stats.npy 152 | ``` 153 | 154 | 155 | 156 | 以下是一个共享模块示例,该模块包含一个数据库连接对象: 157 | 158 | ``` 159 | pythonCopy code# shared_module.py 160 | import sqlite3 161 | 162 | # Create a database connection object 163 | conn = sqlite3.connect("database.db") 164 | 165 | # Use the connection object 166 | def fetch_data(query): 167 | cursor = conn.cursor() 168 | cursor.execute(query) 169 | return cursor.fetchall() 170 | ``` 171 | 172 | 以下是另一个模块,该模块导入了共享模块并使用了该模块中的数据库连接对象: 173 | 174 | ``` 175 | pythonCopy code# another_module.py 176 | import shared_module 177 | 178 | # Use the shared database connection object 179 | data = shared_module.fetch_data("SELECT * FROM table") 180 | print(data) 181 | ``` 182 | 183 | 在上面的代码中,`shared_module.py`模块定义了一个数据库连接对象,并定义了一个使用该连接对象的函数。`another_module.py`模块导入了`shared_module.py`模块,并使用了该模块中的数据库连接对象。由于对象是共享的,因此不需要在多个模块中创建多个数据库连接对象,这可以提高代码的可维护性。 -------------------------------------------------------------------------------- /main.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | """ 3 | @Time : 2023/1/30/030 17:53 4 | @Author : 李子 5 | @Url : https://github.com/kslz 6 | """ 7 | import utils.add_path 8 | import configparser 9 | 10 | from utils import global_obj 11 | from utils.tools import init_program 12 | import ui.guiclass 13 | 14 | 15 | def main(): 16 | init_program() 17 | config = global_obj.get_value("config") 18 | config: configparser.ConfigParser 19 | ui.guiclass.main() 20 | 21 | pass 22 | 23 | 24 | if __name__ == '__main__': 25 | main() 26 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | peewee==3.15.4 2 | PySide6==6.4.2 3 | PySide6-Addons==6.4.2 4 | PySide6-Essentials==6.4.2 5 | shiboken6==6.4.2 6 | pysrt==1.1.2 7 | pydub==0.25.1 8 | pyaudio==0.2.13 9 | ffmpeg-python==0.2.0 10 | pypinyin==0.48.0 11 | requests==2.28.2 -------------------------------------------------------------------------------- /ui/guiclass.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | """ 3 | @Time : 2023/1/30/030 18:08 4 | @Author : 李子 5 | @Url : https://github.com/kslz 6 | """ 7 | from PySide6.QtWidgets import QApplication 8 | 9 | from ui.mygui import * 10 | from utils import global_obj 11 | from utils.log import creatlogger 12 | 13 | 14 | def main(): 15 | global config 16 | config = global_obj.get_value("config") 17 | app = QApplication([]) 18 | select_workspace_window = SelectWorkspaceWindow() 19 | select_dataset_window = SelectDatasetWindow() 20 | 21 | # 绑定【展示数据集选择页面】的信号和槽,并且提前查询数据库,将数据库信息填入表格中 22 | select_workspace_window.show_select_dataset_window.connect(select_dataset_window.add_dataset_data) 23 | select_workspace_window.show_select_dataset_window.connect(select_dataset_window.show) 24 | 25 | # 绑定添加数据集按钮信号和对应的槽 26 | select_dataset_window.ui.pushButton.clicked.connect(select_dataset_window.open_add_dataset_window) 27 | 28 | 29 | 30 | 31 | 32 | select_workspace_window.show() 33 | guilogger.debug("进入工作区选择窗口") 34 | 35 | 36 | 37 | 38 | 39 | app.exec() 40 | 41 | 42 | if __name__ == "__main__": 43 | main() 44 | -------------------------------------------------------------------------------- /ui/mygui.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | """ 3 | @Time : 2023/2/13/013 13:35 4 | @Author : 李子 5 | @Url : https://github.com/kslz 6 | """ 7 | 8 | import peewee 9 | from PySide6 import QtGui 10 | from PySide6.QtWidgets import QMainWindow, QWidget, QTableWidgetItem, QHBoxLayout 11 | 12 | from ui.mydialog import * 13 | from ui.mywidget import * 14 | from ui.pyuic.ui_add_dataset import Ui_Dialog 15 | from ui.pyuic.ui_select_dataset import Ui_MainWindow 16 | from ui.pyuic.ui_select_workspace import Ui_Form 17 | from ui.pyuic.ui_dataset_view import Ui_DatasetMainWindow 18 | from utils.tools import * 19 | 20 | global config 21 | 22 | 23 | def getconfig(): 24 | global config 25 | config = global_obj.get_value("config") 26 | 27 | 28 | class DatasetWindow(QMainWindow): 29 | reopen = Signal() 30 | 31 | # refresh_authorization_table = Signal(object) 32 | 33 | def __init__(self, dataset_id): 34 | super().__init__() 35 | # 使用ui文件导入定义界面类 36 | self.ui = Ui_DatasetMainWindow() 37 | # 初始化界面 38 | self.ui.setupUi(self) 39 | self.set_table_style() 40 | self.dataset_id = dataset_id 41 | self.page_number = 1 42 | self.page_size = 15 43 | self.refresh_table() 44 | self.refresh_authorization_table() 45 | # self.ui.tabWidget.setTabVisible(1, False) 46 | # self.ui.tabWidget.setTabVisible(2, False) 47 | 48 | # 连接信号 49 | self.ui.comboBox.currentIndexChanged.connect(self.change_page_number) 50 | self.ui.pushButton_add_wav_srt.clicked.connect(self.add_from_file_wav_srt) 51 | self.ui.pushButton_add_long_wav.clicked.connect(self.add_from_file_long_wav) 52 | self.ui.pushButton_add_biaobei.clicked.connect(lambda: self.open_add_authorization_dialog(DbStr.BiaoBei)) 53 | self.ui.pushButton_add_xunfei.clicked.connect(lambda: self.open_add_authorization_dialog(DbStr.XunFei)) 54 | self.ui.pushButton_output_speaker.clicked.connect(self.open_output_speaker_dialog) 55 | self.ui.pushButton_biaobei_pingce.clicked.connect(self.open_biaobei_pingce) 56 | self.ui.pushButton_del_by_raw_wav.clicked.connect(self.open_del_info_by_wav_dialog) 57 | 58 | def set_table_style(self): 59 | 60 | # 数据集表格 61 | self.ui.tableWidget.setColumnWidth(0, 100) 62 | self.ui.tableWidget.setColumnWidth(1, 500) 63 | self.ui.tableWidget.setColumnWidth(2, 125) 64 | self.ui.tableWidget.setColumnWidth(3, 130) 65 | self.ui.tableWidget.setColumnWidth(4, 270) 66 | self.ui.tableWidget.verticalHeader().setDefaultSectionSize(26) # 设置行高24 67 | header = self.ui.tableWidget.horizontalHeader() 68 | header.setDefaultAlignment(QtCore.Qt.AlignLeft) # 设置表头左对齐 69 | # 创建一个字体对象,并设置字号为12 70 | font = QtGui.QFont() 71 | font.setPointSize(12) 72 | font.setBold(True) 73 | # 将字体对象设置为表头的字体 74 | header.setFont(font) 75 | 76 | # 授权管理页两个表格 77 | self.ui.tableWidget_biaobei.setColumnWidth(0, 50) 78 | self.ui.tableWidget_biaobei.setColumnWidth(1, 150) 79 | self.ui.tableWidget_biaobei.setColumnWidth(2, 150) 80 | self.ui.tableWidget_biaobei.setColumnWidth(3, 200) 81 | self.ui.tableWidget_biaobei.setColumnWidth(4, 200) 82 | self.ui.tableWidget_biaobei.setColumnWidth(5, 200) 83 | 84 | self.ui.tableWidget_xunfei.setColumnWidth(0, 50) 85 | self.ui.tableWidget_xunfei.setColumnWidth(1, 150) 86 | self.ui.tableWidget_xunfei.setColumnWidth(2, 150) 87 | self.ui.tableWidget_xunfei.setColumnWidth(3, 200) 88 | self.ui.tableWidget_xunfei.setColumnWidth(4, 200) 89 | self.ui.tableWidget_xunfei.setColumnWidth(5, 200) 90 | 91 | def open_add_authorization_dialog(self, company): 92 | add_authorization_dialog = AddAuthentication(self, company) 93 | add_authorization_dialog.exec_() 94 | self.refresh_authorization_table() 95 | 96 | def open_output_speaker_dialog(self): 97 | output_speaker_dialog = OutPutSpeaker(self, self.dataset_id) 98 | output_speaker_dialog.exec_() 99 | 100 | def open_del_info_by_wav_dialog(self): 101 | del_info_by_wav = DelInfoByWav(self, self.dataset_id) 102 | del_info_by_wav.exec_() 103 | 104 | def refresh_authorization_table(self): 105 | self.ui.tableWidget_biaobei.setRowCount(0) 106 | biaobei_list = get_authorizationinfo(DbStr.BiaoBei) 107 | for line in biaobei_list: 108 | row = self.ui.tableWidget_biaobei.rowCount() 109 | self.ui.tableWidget_biaobei.insertRow(row) 110 | self.ui.tableWidget_biaobei.setItem(row, 0, QTableWidgetItem(str(line.authorizationinfo_id))) 111 | self.ui.tableWidget_biaobei.setItem(row, 1, QTableWidgetItem(line.authorizationinfo_name)) 112 | self.ui.tableWidget_biaobei.setItem(row, 2, QTableWidgetItem(line.authorizationinfo_app)) 113 | self.ui.tableWidget_biaobei.setItem(row, 3, QTableWidgetItem(line.authorizationinfo_APPID)) 114 | self.ui.tableWidget_biaobei.setItem(row, 4, QTableWidgetItem(line.authorizationinfo_APISecret)) 115 | self.ui.tableWidget_biaobei.setItem(row, 5, QTableWidgetItem(line.authorizationinfo_APIKey)) 116 | 117 | self.ui.tableWidget_xunfei.setRowCount(0) 118 | xunfei_list = get_authorizationinfo(DbStr.XunFei) 119 | for line in xunfei_list: 120 | row = self.ui.tableWidget_xunfei.rowCount() 121 | self.ui.tableWidget_xunfei.insertRow(row) 122 | self.ui.tableWidget_xunfei.setItem(row, 0, QTableWidgetItem(line.authorizationinfo_id)) 123 | self.ui.tableWidget_xunfei.setItem(row, 1, QTableWidgetItem(line.authorizationinfo_name)) 124 | self.ui.tableWidget_xunfei.setItem(row, 2, QTableWidgetItem(line.authorizationinfo_app)) 125 | self.ui.tableWidget_xunfei.setItem(row, 3, QTableWidgetItem(line.authorizationinfo_APPID)) 126 | self.ui.tableWidget_xunfei.setItem(row, 4, QTableWidgetItem(line.authorizationinfo_APISecret)) 127 | self.ui.tableWidget_xunfei.setItem(row, 5, QTableWidgetItem(line.authorizationinfo_APIKey)) 128 | 129 | def change_page_number(self, index): 130 | new_page_num = self.ui.comboBox.itemData(index) 131 | self.refresh_table(new_page_num) 132 | self.page_number = new_page_num 133 | 134 | def refresh_table(self, page_number=0): 135 | # QcomboBox在被清空的时候也会发出currentIndexChanged信号,找这个问题花了一个小时 136 | # 警钟敲烂 137 | self.ui.comboBox.blockSignals(True) 138 | page_size = self.page_size 139 | if page_number == 0: 140 | page_number = self.page_number 141 | self.ui.tableWidget.setRowCount(0) 142 | self.ui.comboBox.clear() 143 | total_count, results = get_dataset_window_info(self.dataset_id, page_size, page_number) 144 | pagecount = 1 145 | while total_count > 0: 146 | start = page_size * (pagecount - 1) + 1 147 | if total_count >= page_size: 148 | end = start + page_size - 1 149 | else: 150 | end = start + total_count - 1 151 | self.ui.comboBox.addItem(f"第 {str(pagecount)} 页 {str(start)} ~ {str(end)}", pagecount) 152 | total_count -= page_size 153 | pagecount += 1 154 | 155 | self.btn_dict = {} 156 | for i, result in enumerate(results, start=1): 157 | index = i + (page_number - 1) * page_size 158 | info_id = result['info_id'] 159 | info_text = result['info_text'] 160 | info_start_time = result['info_start_time'] 161 | info_end_time = result['info_end_time'] 162 | info_file_path = result['info_raw_file_path'] 163 | info_is_del = result['info_is_del'] 164 | if result['info_shibie_speaker'] != None: 165 | speaker = result['info_shibie_speaker'] 166 | else: 167 | speaker = result['info_speaker'] 168 | # is_separate_file = result['is_separate_file'] 169 | row = self.ui.tableWidget.rowCount() 170 | self.ui.tableWidget.insertRow(row) 171 | self.ui.tableWidget.setItem(row, 0, QTableWidgetItem(str(index))) 172 | self.ui.tableWidget.setItem(row, 1, QTableWidgetItem(info_text)) 173 | self.ui.tableWidget.setItem(row, 2, QTableWidgetItem(speaker)) 174 | # if is_separate_file == 0: 175 | # is_separate_file = "否" 176 | # if is_separate_file == 1: 177 | # is_separate_file = "是" 178 | # self.ui.tableWidget.setItem(row, 3, QTableWidgetItem(is_separate_file)) 179 | # self.ui.tableWidget.setItem(row, 5, QTableWidgetItem(str(info_id) + "一些操作")) 180 | 181 | # btn_shiting = PlaySoundBTN('试听', info_id, self) 182 | btn_shiting = AudioButton(info_file_path, info_start_time, info_end_time, self) 183 | btn_shiting.setMinimumWidth(50) 184 | btn_fastoutput = FastOutputSoundBTN('快速导出', info_id, self) 185 | btn_fastoutput.setMinimumWidth(80) 186 | btn_bianji = BianJiBTN('编辑', info_id) 187 | btn_bianji.setMinimumWidth(50) 188 | btn_bianji.on_clicked.connect(self.edit_info) 189 | btn_shanchu = DeleteBTN('删除', info_id, self, info_is_del) 190 | btn_shanchu.setMinimumWidth(70) 191 | self.btn_dict[f"{row}_shiting"] = btn_shiting 192 | self.btn_dict[f"{row}_fastoutput"] = btn_fastoutput 193 | self.btn_dict[f"{row}_bianji"] = btn_bianji 194 | self.btn_dict[f"{row}_shanchu"] = btn_shanchu 195 | layout = QHBoxLayout() 196 | layout.addWidget(self.btn_dict[f"{row}_shiting"]) 197 | layout.addWidget(self.btn_dict[f"{row}_fastoutput"]) 198 | layout.addWidget(self.btn_dict[f"{row}_bianji"]) 199 | layout.addWidget(self.btn_dict[f"{row}_shanchu"]) 200 | self.btn_dict = {} 201 | layout.setContentsMargins(0, 0, 0, 0) 202 | layout.setSpacing(1) 203 | caozuo_widget = QWidget() 204 | caozuo_widget.setLayout(layout) 205 | self.ui.tableWidget.setCellWidget(row, 4, caozuo_widget) 206 | 207 | self.ui.comboBox.setCurrentIndex(page_number - 1) 208 | self.ui.comboBox.blockSignals(False) 209 | 210 | def open_biaobei_pingce(self): 211 | biaobei_pingce = BiaobeiPingce(self, self.dataset_id) 212 | biaobei_pingce.exec_() 213 | 214 | def closeEvent(self, event): 215 | self.reopen.emit() 216 | super().closeEvent(event) 217 | 218 | def add_from_file_wav_srt(self): 219 | add_wav_srt_window = SelectWavSrtFile(self, self.dataset_id) 220 | add_wav_srt_window.exec_() 221 | 222 | def add_from_file_long_wav(self): 223 | add_long_wav_window = SelectLongWavFile(self, self.dataset_id) 224 | add_long_wav_window.exec_() 225 | 226 | def edit_info(self, info_id): 227 | edit_info_window = EditInfo(self,info_id) 228 | edit_info_window.windowClosed.connect(self.refresh_table) 229 | edit_info_window.exec_() 230 | pass 231 | 232 | 233 | class AddDatasetWindow(QDialog): 234 | refresh_table = Signal() 235 | 236 | def __init__(self, parent, useby="add", dataset_id=None): 237 | super().__init__(parent) 238 | # 使用ui文件导入定义界面类 239 | self.ui = Ui_Dialog() 240 | # 初始化界面 241 | self.ui.setupUi(self) 242 | self.ui.buttonBox.rejected.connect(self.goback) 243 | self.useby = useby 244 | self.dataset_id = dataset_id 245 | if useby != "add": 246 | self.setWindowTitle("编辑数据集") 247 | self.ui.buttonBox.accepted.connect(self.edit_dataset) 248 | dataset = Dataset.get_by_id(self.dataset_id) 249 | self.ui.lineEdit.setText(dataset.dataset_name) 250 | self.ui.textEdit.setText(dataset.dataset_info) 251 | self.dataset_oldname = dataset.dataset_name 252 | else: 253 | self.ui.buttonBox.accepted.connect(self.add_dataset) 254 | 255 | def edit_dataset(self): 256 | dataset_name = self.ui.lineEdit.text() 257 | dataset_info = self.ui.textEdit.toPlainText() 258 | if dataset_name == "": 259 | guilogger.error("修改失败,数据集名称为空") 260 | self.show_error("修改失败,数据集名称为空") 261 | return 262 | try: 263 | dataset = Dataset.update(dataset_name=dataset_name, dataset_info=dataset_info).where( 264 | Dataset.dataset_id == self.dataset_id).execute() 265 | except peewee.IntegrityError as e: 266 | if "UNIQUE constraint failed" in str(e): 267 | guilogger.error("修改失败,数据集名称重复") 268 | self.show_error("修改失败,数据集名称重复") 269 | else: 270 | guilogger.error(e) 271 | else: 272 | guilogger.info(f"数据集 {dataset_name} 成功修改") 273 | self.refresh_table.emit() 274 | self.close() 275 | 276 | pass 277 | 278 | def add_dataset(self): 279 | dataset_name = self.ui.lineEdit.text() 280 | datset_info = self.ui.textEdit.toPlainText() 281 | # print(datset_info) 282 | if dataset_name == "": 283 | guilogger.error("添加失败,数据集名称为空") 284 | self.show_error("添加失败,数据集名称为空") 285 | return 286 | 287 | try: 288 | dataset = Dataset(dataset_name=dataset_name, dataset_info=datset_info) 289 | dataset.save() 290 | except peewee.IntegrityError as e: 291 | if "UNIQUE constraint failed" in str(e): 292 | guilogger.error("添加失败,数据集名称重复") 293 | self.show_error("添加失败,数据集名称重复") 294 | else: 295 | guilogger.error(e) 296 | else: 297 | guilogger.info(f"数据集 {dataset_name} 添加成功") 298 | self.refresh_table.emit() 299 | self.close() 300 | 301 | def show_error(self, text): 302 | self.ui.label_3.setText(text) 303 | 304 | def goback(self): 305 | self.close() 306 | 307 | 308 | class SelectDatasetWindow(QMainWindow): 309 | def __init__(self): 310 | super().__init__() 311 | # 使用ui文件导入定义界面类 312 | self.ui = Ui_MainWindow() 313 | # 初始化界面 314 | self.ui.setupUi(self) 315 | self.ui.tableWidget.setColumnWidth(0, 100) 316 | self.ui.tableWidget.setColumnWidth(1, 130) 317 | self.ui.tableWidget.setColumnWidth(2, 130) 318 | self.ui.tableWidget.setColumnWidth(3, 200) 319 | self.ui.tableWidget.setColumnWidth(4, 120) 320 | # self.ui.tableWidget.verticalHeader().setVisible(True) 321 | 322 | def add_dataset_data(self): 323 | """ 324 | 刷新表格数据,从数据库中取出数据集信息填入表格 325 | 326 | :return: 327 | """ 328 | # dataset1 = Dataset.create(dataset_name="test1") 329 | # dataset2 = Dataset.create(dataset_name="test2") 330 | self.ui.tableWidget.setRowCount(0) 331 | datasets = Dataset.select() 332 | for dataset in datasets: 333 | self.addData(dataset.dataset_id, 334 | dataset.dataset_name, 335 | dataset.dataset_create_time, 336 | dataset.dataset_last_use_time, 337 | dataset.dataset_info) 338 | 339 | def addData(self, dataset_id=None, dataset_name=None, dataset_createtime=None, dataset_lastusetime=None, 340 | dataset_info=None): 341 | row = self.ui.tableWidget.rowCount() 342 | self.ui.tableWidget.insertRow(row) 343 | self.ui.tableWidget.setItem(row, 0, QTableWidgetItem(str(dataset_name))) 344 | self.ui.tableWidget.setItem(row, 1, QTableWidgetItem(str(dataset_createtime))) 345 | self.ui.tableWidget.setItem(row, 2, QTableWidgetItem(str(dataset_lastusetime))) 346 | # self.ui.tableWidget.setItem(row, 3, QTableWidgetItem(str(dataset_info))) 347 | info_cell = QTableWidgetItem() 348 | info_cell.setText(dataset_info) 349 | info_cell.setToolTip(f"
{huanhang(dataset_info)}
") 350 | self.ui.tableWidget.setItem(row, 3, info_cell) 351 | 352 | btn_jr = QPushButton('进入', self) 353 | btn_jr.clicked.connect(lambda: self.openDatasetWindow(dataset_id)) 354 | btn_bj = QPushButton('编辑', self) 355 | btn_bj.clicked.connect(lambda: self.edit_dataset(dataset_id)) 356 | btn_sc = QPushButton('删除', self) 357 | btn_sc.clicked.connect(lambda: self.del_dataset(dataset_id, dataset_name)) 358 | layout = QHBoxLayout() 359 | layout.addWidget(btn_jr) 360 | layout.addWidget(btn_bj) 361 | layout.addWidget(btn_sc) 362 | layout.setContentsMargins(1, 1, 1, 1) 363 | layout.setSpacing(1) 364 | caozuo_widget = QWidget() 365 | caozuo_widget.setLayout(layout) 366 | self.ui.tableWidget.setCellWidget(row, 4, caozuo_widget) 367 | 368 | def open_add_dataset_window(self, useby="add"): 369 | self.add_window = AddDatasetWindow(self) 370 | self.add_window.refresh_table.connect(self.add_dataset_data) 371 | # self.add_window.setModal(True) 372 | # self.add_window.show() 373 | self.add_window.exec_() 374 | 375 | def openDatasetWindow(self, dataset_id): 376 | self.hide() 377 | self.update_dataset_dataset_last_use_time(dataset_id) 378 | self.add_dataset_data() 379 | self.dataset_window = DatasetWindow(dataset_id) 380 | self.dataset_window.show() 381 | self.dataset_window.reopen.connect(self.show) 382 | 383 | pass 384 | 385 | def edit_dataset(self, dataset_id): 386 | self.edit_window = AddDatasetWindow(self, useby="edit", dataset_id=dataset_id) 387 | self.edit_window.refresh_table.connect(self.add_dataset_data) 388 | # self.add_window.setModal(True) 389 | # self.add_window.show() 390 | self.edit_window.exec_() 391 | 392 | def update_dataset_dataset_last_use_time(self, dataset_id): 393 | Dataset.update(dataset_last_use_time=datetime.now().replace(microsecond=0)).where( 394 | Dataset.dataset_id == dataset_id).execute() 395 | # User.update(age=20).where(User.username=="charlie").execute() 396 | 397 | def del_dataset(self, dataset_id, dataset_name): 398 | """ 399 | 考虑做伪删除,但是感觉没必要 400 | 401 | """ 402 | msg_box = QMessageBox() # 后悔药(不 403 | msg_box.setWindowTitle("提示") 404 | msg_box.setText(f"确认删除数据集 {dataset_name} 吗?\n{dataset_name} 将会永久失去!(真的很久!)") 405 | msg_box.setIcon(QMessageBox.Question) 406 | 407 | # 添加按钮 408 | yes_button = msg_box.addButton("确定", QMessageBox.AcceptRole) 409 | no_button = msg_box.addButton("取消", QMessageBox.RejectRole) 410 | 411 | # 显示消息框,等待用户响应 412 | msg_box.exec() 413 | 414 | # 获取用户的响应 415 | button_clicked = msg_box.clickedButton() 416 | if button_clicked == yes_button: 417 | try: 418 | # dataset = Dataset.delete().where(Dataset.dataset_id == dataset_id) 419 | # self.add_dataset_data() 420 | dataset = Dataset.get(Dataset.dataset_id == dataset_id) 421 | name = dataset.dataset_name 422 | dataset.delete_instance() 423 | del_file_by_dataset_id(dataset_id) 424 | 425 | except Exception as e: 426 | guilogger.error(f"删除数据集 id={dataset_id} 失败") 427 | guilogger.error(e) 428 | else: 429 | guilogger.info(f"数据集 {name} 成功删除") 430 | finally: 431 | self.add_dataset_data() 432 | 433 | else: 434 | pass 435 | 436 | 437 | class SelectWorkspaceWindow(QWidget): 438 | show_select_dataset_window = Signal() 439 | 440 | def __init__(self): 441 | super().__init__() 442 | # 使用ui文件导入定义界面类 443 | self.ui = Ui_Form() 444 | # 初始化界面 445 | self.ui.setupUi(self) 446 | getconfig() 447 | self.input_default_workspace() 448 | 449 | def input_default_workspace(self): 450 | default_workspace = config["program_configs"]["default_workspace"] 451 | # default_workspace = os.path.abspath(default_workspace) 452 | self.ui.lineEdit.setText(default_workspace) 453 | 454 | def close_program(self): 455 | self.close() 456 | 457 | def get_workspace(self): 458 | workspace_path = self.ui.lineEdit.text() 459 | global_obj.set_value("workspace_path", workspace_path) 460 | inti_workspace(workspace_path) 461 | config["program_configs"]["default_workspace"] = workspace_path 462 | update_ini_config(config) 463 | self.show_select_dataset_window.emit() 464 | self.close() 465 | 466 | # if os.path.exists(workspace_path): 467 | # print("路径存在") 468 | # else: 469 | # print("路径不存在") 470 | 471 | pass 472 | -------------------------------------------------------------------------------- /ui/mywidget.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | """ 3 | @Time : 2023/4/10/010 11:10 4 | @Author : 李子 5 | @Url : https://github.com/kslz 6 | """ 7 | from PySide6 import QtCore 8 | from PySide6.QtCore import Signal, QThread 9 | from PySide6.QtWidgets import QPushButton 10 | 11 | from utils.tools import * 12 | 13 | 14 | class FastOutputSoundBTN(QPushButton): 15 | def __init__(self, text, info_id, parent): 16 | super().__init__(text, parent) 17 | self.info_id = info_id 18 | self.clicked.connect(self.fast_output_sound) 19 | # self.setText("快速导出") 20 | # info = Info.get_by_id(self.info_id) 21 | # wav_path = info.info_raw_file_path 22 | # start_time = info.info_start_time 23 | # end_time = info.info_end_time 24 | 25 | def fast_output_sound(self): 26 | info = Info.get_by_id(self.info_id) 27 | wav_path = info.info_raw_file_path 28 | start_time = info.info_start_time 29 | end_time = info.info_end_time 30 | output_name = str(self.info_id) + ".wav" 31 | fast_output_sound(wav_path, start_time, end_time, output_name) 32 | 33 | class DeleteBTN(QPushButton): 34 | def __init__(self, text, info_id, parent, info_is_del): 35 | super().__init__(text, parent) 36 | self.info_id = info_id 37 | self.info_is_del = info_is_del 38 | if self.info_is_del == False: 39 | self.setText("删除") 40 | else: 41 | self.setText("恢复") 42 | 43 | self.clicked.connect(self.change_is_del_sound) 44 | 45 | def change_is_del_sound(self): 46 | # 肯定是伪删除 47 | new_is_del = True if self.info_is_del == False else False 48 | Info.update(info_is_del=new_is_del).where(Info.info_id == self.info_id).execute() 49 | self.info_is_del = new_is_del 50 | if self.info_is_del == False: 51 | self.setText("删除") 52 | else: 53 | self.setText("恢复") 54 | 55 | 56 | 57 | class PlaySoundBTN(QPushButton): 58 | class PlaySoundThread(QtCore.QThread): 59 | update_signal = Signal(str, bool) 60 | 61 | # stop_thread_signal = Signal() 62 | 63 | def __init__(self, wav_path, start_time, end_time): 64 | super().__init__() 65 | # self.stop_flag = False 66 | # self.stop_thread_signal.connect(self.stop_thread) 67 | self.wav_path = wav_path 68 | self.start_time = start_time 69 | self.end_time = end_time 70 | 71 | def run(self): 72 | self.update_signal.emit("播放中", False) 73 | play_by_ffmpeg(self.wav_path, self.start_time, self.end_time) 74 | self.update_signal.emit("试听", True) 75 | 76 | # def stop_thread(self): 77 | # self.stop_flag = True 78 | # print("收到停止信号") 79 | # self.wait() 80 | 81 | def __init__(self, text, info_id, parent): 82 | super().__init__(text, parent) 83 | self.info_id = info_id 84 | self.clicked.connect(self.play_or_stop_sound) 85 | info = Info.get_by_id(self.info_id) 86 | wav_path = info.info_raw_file_path 87 | start_time = info.info_start_time 88 | end_time = info.info_end_time 89 | # self.thread1 = QThread(self) # 创建一个线程 不行 没用明白,先这样吧 90 | self.play_thread = self.PlaySoundThread(wav_path, start_time, end_time) # 实例化线程类 91 | # self.play_thread.moveToThread(self.thread1) # 将类移动到线程中运行 92 | # self.thread1.started.connect(self.play_thread.run) 93 | self.play_thread.update_signal.connect(lambda text, is_enabled: self.set_text(text, is_enabled)) 94 | 95 | def play_or_stop_sound(self): 96 | # 多线程避免阻塞界面 97 | if self.text() == "试听": 98 | self.play_thread.start() 99 | else: 100 | # 终止播放失败 101 | # self.play_thread.stop_thread_signal.emit() 102 | # self.play_thread.exit() 103 | # self.set_text("试听", True) 104 | pass 105 | 106 | def set_text(self, text, is_enabled): 107 | self.setText(text) 108 | # self.setEnabled(is_enabled) 109 | 110 | 111 | class BianJiBTN(QPushButton): 112 | on_clicked = Signal(int) 113 | 114 | def __init__(self, text, info_id): 115 | super().__init__(text=text) 116 | self.info_id = info_id 117 | self.clicked.connect(self.button_clicked) 118 | 119 | def button_clicked(self): 120 | self.on_clicked.emit(self.info_id) 121 | 122 | 123 | class AudioButton(QPushButton): 124 | def __init__(self, wav_path, start_time, end_time, parent=None): 125 | super().__init__(parent) 126 | self.setText("试听") 127 | self.audio_thread = None 128 | self.wav_path = wav_path 129 | self.start_time = start_time 130 | self.end_time = end_time 131 | 132 | # 连接按钮点击事件的槽函数 133 | self.clicked.connect(self.on_button_clicked) 134 | 135 | def on_button_clicked(self): 136 | if self.audio_thread is not None and self.audio_thread.is_playing: 137 | # 如果音频正在播放,停止播放 138 | # print("停止播放") 139 | self.audio_thread.stop() 140 | self.audio_thread.wait() 141 | self.audio_thread = None 142 | self.setText("试听") 143 | else: 144 | # 如果音频没有在播放,开始播放 145 | self.audio_thread = AudioThread(self.wav_path, self.start_time, self.end_time) 146 | self.audio_thread.finished.connect(self.on_audio_finished) 147 | self.audio_thread.start() 148 | self.setText("停止") 149 | 150 | def on_audio_finished(self): 151 | self.audio_thread = None 152 | self.setText("试听") 153 | 154 | 155 | # 自定义的音频播放线程 156 | class AudioThread(QThread): 157 | finished = Signal() # 定义一个信号,用于通知播放完成 158 | 159 | def __init__(self, wav_path, start_time, end_time, parent=None): 160 | super().__init__(parent) 161 | self.is_playing = False 162 | self.wav_path = wav_path 163 | self.start_time = start_time 164 | self.end_time = end_time 165 | 166 | def run(self): 167 | self.is_playing = True 168 | 169 | # play_by_ffmpeg(self.wav_path, self.start_time, self.end_time) 170 | # 如果用函数形式调用,执行self.audio_thread.terminate()的时候声音就会卡几秒才停,直接写代码就可以秒停,原因未知 171 | wav_path = self.wav_path 172 | start_time = self.start_time 173 | end_time = self.end_time 174 | 175 | duration = (end_time - start_time) / 1000 176 | start_time = start_time / 1000 177 | 178 | # 从长音频文件中提取指定时间段的音频 179 | output = ( 180 | ffmpeg 181 | .input(wav_path, ss=start_time, t=duration) 182 | # .filter("loudnorm", I="-23", dual_mono="true") # 归一化 183 | .output('pipe:', format='wav', ar=44100) 184 | .run(capture_stdout=True) 185 | ) 186 | 187 | # 播放输出的音频 188 | self.process = subprocess.Popen(['ffplay', "-nodisp", "-autoexit", '-'], stdin=subprocess.PIPE) 189 | self.process.communicate(output[0]) 190 | 191 | self.is_playing = False 192 | self.finished.emit() # 发送播放完成的信号 193 | 194 | def stop(self): 195 | if self.process and self.process.poll() is None: # 检查子进程是否在运行 196 | self.process.terminate() # 终止子进程 197 | 198 | 199 | class AudioNowButton(AudioButton): 200 | def __init__(self, wav_path, start_time, end_time, parent=None): 201 | super().__init__(wav_path, start_time, end_time, parent) 202 | self.clicked.disconnect(super().on_button_clicked) 203 | 204 | def on_button_clicked_new(self, start_time, end_time): 205 | self.start_time = int(start_time) 206 | self.end_time = int(end_time) 207 | 208 | self.on_button_clicked() 209 | -------------------------------------------------------------------------------- /ui/pyuic/ui_add_authorizationinfo.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | ################################################################################ 4 | ## Form generated from reading UI file 'add_authorizationinfo.ui' 5 | ## 6 | ## Created by: Qt User Interface Compiler version 6.4.2 7 | ## 8 | ## WARNING! All changes made in this file will be lost when recompiling UI file! 9 | ################################################################################ 10 | 11 | from PySide6.QtCore import (QCoreApplication, QDate, QDateTime, QLocale, 12 | QMetaObject, QObject, QPoint, QRect, 13 | QSize, QTime, QUrl, Qt) 14 | from PySide6.QtGui import (QBrush, QColor, QConicalGradient, QCursor, 15 | QFont, QFontDatabase, QGradient, QIcon, 16 | QImage, QKeySequence, QLinearGradient, QPainter, 17 | QPalette, QPixmap, QRadialGradient, QTransform) 18 | from PySide6.QtWidgets import (QApplication, QComboBox, QDialog, QLabel, 19 | QLineEdit, QPushButton, QSizePolicy, QWidget) 20 | 21 | class Ui_AddAuthenticationDialog(object): 22 | def setupUi(self, AddAuthenticationDialog): 23 | if not AddAuthenticationDialog.objectName(): 24 | AddAuthenticationDialog.setObjectName(u"AddAuthenticationDialog") 25 | AddAuthenticationDialog.resize(400, 500) 26 | font = QFont() 27 | font.setPointSize(12) 28 | AddAuthenticationDialog.setFont(font) 29 | self.label = QLabel(AddAuthenticationDialog) 30 | self.label.setObjectName(u"label") 31 | self.label.setGeometry(QRect(20, 20, 181, 21)) 32 | self.lineEdit_name = QLineEdit(AddAuthenticationDialog) 33 | self.lineEdit_name.setObjectName(u"lineEdit_name") 34 | self.lineEdit_name.setGeometry(QRect(20, 50, 351, 21)) 35 | self.label_2 = QLabel(AddAuthenticationDialog) 36 | self.label_2.setObjectName(u"label_2") 37 | self.label_2.setGeometry(QRect(20, 90, 191, 21)) 38 | self.label_3 = QLabel(AddAuthenticationDialog) 39 | self.label_3.setObjectName(u"label_3") 40 | self.label_3.setGeometry(QRect(20, 160, 201, 21)) 41 | self.label_4 = QLabel(AddAuthenticationDialog) 42 | self.label_4.setObjectName(u"label_4") 43 | self.label_4.setGeometry(QRect(20, 230, 141, 21)) 44 | self.lineEdit_appid = QLineEdit(AddAuthenticationDialog) 45 | self.lineEdit_appid.setObjectName(u"lineEdit_appid") 46 | self.lineEdit_appid.setGeometry(QRect(20, 120, 351, 21)) 47 | self.lineEdit_apisecret = QLineEdit(AddAuthenticationDialog) 48 | self.lineEdit_apisecret.setObjectName(u"lineEdit_apisecret") 49 | self.lineEdit_apisecret.setGeometry(QRect(20, 190, 351, 21)) 50 | self.lineEdit_apikey = QLineEdit(AddAuthenticationDialog) 51 | self.lineEdit_apikey.setObjectName(u"lineEdit_apikey") 52 | self.lineEdit_apikey.setGeometry(QRect(20, 260, 351, 21)) 53 | self.label_error = QLabel(AddAuthenticationDialog) 54 | self.label_error.setObjectName(u"label_error") 55 | self.label_error.setGeometry(QRect(20, 390, 351, 21)) 56 | self.label_error.setStyleSheet(u"color: red;") 57 | self.pushButton_close = QPushButton(AddAuthenticationDialog) 58 | self.pushButton_close.setObjectName(u"pushButton_close") 59 | self.pushButton_close.setGeometry(QRect(264, 440, 111, 24)) 60 | self.pushButton_commit = QPushButton(AddAuthenticationDialog) 61 | self.pushButton_commit.setObjectName(u"pushButton_commit") 62 | self.pushButton_commit.setGeometry(QRect(130, 440, 111, 24)) 63 | self.comboBox_app = QComboBox(AddAuthenticationDialog) 64 | self.comboBox_app.setObjectName(u"comboBox_app") 65 | self.comboBox_app.setGeometry(QRect(20, 330, 111, 22)) 66 | self.label_5 = QLabel(AddAuthenticationDialog) 67 | self.label_5.setObjectName(u"label_5") 68 | self.label_5.setGeometry(QRect(20, 300, 141, 21)) 69 | 70 | self.retranslateUi(AddAuthenticationDialog) 71 | 72 | QMetaObject.connectSlotsByName(AddAuthenticationDialog) 73 | # setupUi 74 | 75 | def retranslateUi(self, AddAuthenticationDialog): 76 | AddAuthenticationDialog.setWindowTitle(QCoreApplication.translate("AddAuthenticationDialog", u"\u6dfb\u52a0\u6388\u6743\u4fe1\u606f", None)) 77 | self.label.setText(QCoreApplication.translate("AddAuthenticationDialog", u"\u540d\u79f0", None)) 78 | self.label_2.setText(QCoreApplication.translate("AddAuthenticationDialog", u"APPID", None)) 79 | self.label_3.setText(QCoreApplication.translate("AddAuthenticationDialog", u"APISecret\uff08client_secret\uff09", None)) 80 | self.label_4.setText(QCoreApplication.translate("AddAuthenticationDialog", u"APIKey\uff08client_id\uff09", None)) 81 | self.label_error.setText("") 82 | self.pushButton_close.setText(QCoreApplication.translate("AddAuthenticationDialog", u"\u53d6\u6d88", None)) 83 | self.pushButton_commit.setText(QCoreApplication.translate("AddAuthenticationDialog", u"\u63d0\u4ea4", None)) 84 | self.label_5.setText(QCoreApplication.translate("AddAuthenticationDialog", u"\u5e94\u7528\u7c7b\u578b", None)) 85 | # retranslateUi 86 | 87 | -------------------------------------------------------------------------------- /ui/pyuic/ui_add_dataset.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | ################################################################################ 4 | ## Form generated from reading UI file 'add_dataset.ui' 5 | ## 6 | ## Created by: Qt User Interface Compiler version 6.4.2 7 | ## 8 | ## WARNING! All changes made in this file will be lost when recompiling UI file! 9 | ################################################################################ 10 | 11 | from PySide6.QtCore import (QCoreApplication, QDate, QDateTime, QLocale, 12 | QMetaObject, QObject, QPoint, QRect, 13 | QSize, QTime, QUrl, Qt) 14 | from PySide6.QtGui import (QBrush, QColor, QConicalGradient, QCursor, 15 | QFont, QFontDatabase, QGradient, QIcon, 16 | QImage, QKeySequence, QLinearGradient, QPainter, 17 | QPalette, QPixmap, QRadialGradient, QTransform) 18 | from PySide6.QtWidgets import (QAbstractButton, QApplication, QDialog, QDialogButtonBox, 19 | QLabel, QLineEdit, QSizePolicy, QTextEdit, 20 | QWidget) 21 | 22 | class Ui_Dialog(object): 23 | def setupUi(self, Dialog): 24 | if not Dialog.objectName(): 25 | Dialog.setObjectName(u"Dialog") 26 | Dialog.resize(400, 300) 27 | Dialog.setMinimumSize(QSize(400, 300)) 28 | Dialog.setMaximumSize(QSize(400, 300)) 29 | self.buttonBox = QDialogButtonBox(Dialog) 30 | self.buttonBox.setObjectName(u"buttonBox") 31 | self.buttonBox.setGeometry(QRect(30, 240, 341, 51)) 32 | self.buttonBox.setOrientation(Qt.Horizontal) 33 | self.buttonBox.setStandardButtons(QDialogButtonBox.Cancel|QDialogButtonBox.Ok) 34 | self.label = QLabel(Dialog) 35 | self.label.setObjectName(u"label") 36 | self.label.setGeometry(QRect(20, 20, 91, 16)) 37 | font = QFont() 38 | font.setPointSize(12) 39 | self.label.setFont(font) 40 | self.label_2 = QLabel(Dialog) 41 | self.label_2.setObjectName(u"label_2") 42 | self.label_2.setGeometry(QRect(20, 50, 91, 16)) 43 | self.label_2.setFont(font) 44 | self.lineEdit = QLineEdit(Dialog) 45 | self.lineEdit.setObjectName(u"lineEdit") 46 | self.lineEdit.setGeometry(QRect(120, 18, 251, 23)) 47 | self.lineEdit.setFont(font) 48 | self.lineEdit.setStyleSheet(u"padding: 0px;") 49 | self.textEdit = QTextEdit(Dialog) 50 | self.textEdit.setObjectName(u"textEdit") 51 | self.textEdit.setGeometry(QRect(120, 50, 251, 181)) 52 | self.textEdit.setFont(font) 53 | self.label_3 = QLabel(Dialog) 54 | self.label_3.setObjectName(u"label_3") 55 | self.label_3.setGeometry(QRect(20, 248, 191, 31)) 56 | self.label_3.setFont(font) 57 | self.label_3.setStyleSheet(u"color:red") 58 | 59 | self.retranslateUi(Dialog) 60 | self.buttonBox.rejected.connect(Dialog.reject) 61 | 62 | QMetaObject.connectSlotsByName(Dialog) 63 | # setupUi 64 | 65 | def retranslateUi(self, Dialog): 66 | Dialog.setWindowTitle(QCoreApplication.translate("Dialog", u"\u6dfb\u52a0\u6570\u636e\u96c6", None)) 67 | self.label.setText(QCoreApplication.translate("Dialog", u"\u6570\u636e\u96c6\u540d\u79f0\uff1a", None)) 68 | self.label_2.setText(QCoreApplication.translate("Dialog", u"\u6570\u636e\u96c6\u7b80\u4ecb\uff1a", None)) 69 | self.lineEdit.setText("") 70 | self.textEdit.setHtml(QCoreApplication.translate("Dialog", u"\n" 71 | "\n" 77 | "


", None)) 78 | self.label_3.setText("") 79 | # retranslateUi 80 | 81 | -------------------------------------------------------------------------------- /ui/pyuic/ui_biaobei_pingce.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | ################################################################################ 4 | ## Form generated from reading UI file 'biaobei_pingce.ui' 5 | ## 6 | ## Created by: Qt User Interface Compiler version 6.4.2 7 | ## 8 | ## WARNING! All changes made in this file will be lost when recompiling UI file! 9 | ################################################################################ 10 | 11 | from PySide6.QtCore import (QCoreApplication, QDate, QDateTime, QLocale, 12 | QMetaObject, QObject, QPoint, QRect, 13 | QSize, QTime, QUrl, Qt) 14 | from PySide6.QtGui import (QBrush, QColor, QConicalGradient, QCursor, 15 | QFont, QFontDatabase, QGradient, QIcon, 16 | QImage, QKeySequence, QLinearGradient, QPainter, 17 | QPalette, QPixmap, QRadialGradient, QTransform) 18 | from PySide6.QtWidgets import (QApplication, QCheckBox, QComboBox, QDialog, 19 | QLabel, QPushButton, QSizePolicy, QWidget) 20 | 21 | class Ui_BiaobeiPingceDialog(object): 22 | def setupUi(self, BiaobeiPingceDialog): 23 | if not BiaobeiPingceDialog.objectName(): 24 | BiaobeiPingceDialog.setObjectName(u"BiaobeiPingceDialog") 25 | BiaobeiPingceDialog.resize(400, 300) 26 | font = QFont() 27 | font.setPointSize(12) 28 | BiaobeiPingceDialog.setFont(font) 29 | self.checkBox = QCheckBox(BiaobeiPingceDialog) 30 | self.checkBox.setObjectName(u"checkBox") 31 | self.checkBox.setGeometry(QRect(30, 30, 221, 20)) 32 | self.checkBox_2 = QCheckBox(BiaobeiPingceDialog) 33 | self.checkBox_2.setObjectName(u"checkBox_2") 34 | self.checkBox_2.setGeometry(QRect(30, 60, 281, 20)) 35 | self.checkBox_2.setCheckable(True) 36 | self.checkBox_2.setChecked(True) 37 | self.pushButton_quxiao = QPushButton(BiaobeiPingceDialog) 38 | self.pushButton_quxiao.setObjectName(u"pushButton_quxiao") 39 | self.pushButton_quxiao.setGeometry(QRect(310, 260, 75, 24)) 40 | self.pushButton_queding = QPushButton(BiaobeiPingceDialog) 41 | self.pushButton_queding.setObjectName(u"pushButton_queding") 42 | self.pushButton_queding.setGeometry(QRect(220, 260, 75, 24)) 43 | self.comboBox = QComboBox(BiaobeiPingceDialog) 44 | self.comboBox.setObjectName(u"comboBox") 45 | self.comboBox.setGeometry(QRect(160, 90, 131, 22)) 46 | self.label = QLabel(BiaobeiPingceDialog) 47 | self.label.setObjectName(u"label") 48 | self.label.setGeometry(QRect(30, 90, 111, 16)) 49 | self.label_error = QLabel(BiaobeiPingceDialog) 50 | self.label_error.setObjectName(u"label_error") 51 | self.label_error.setGeometry(QRect(30, 230, 351, 16)) 52 | self.label_error.setStyleSheet(u"color:red") 53 | 54 | self.retranslateUi(BiaobeiPingceDialog) 55 | 56 | QMetaObject.connectSlotsByName(BiaobeiPingceDialog) 57 | # setupUi 58 | 59 | def retranslateUi(self, BiaobeiPingceDialog): 60 | BiaobeiPingceDialog.setWindowTitle(QCoreApplication.translate("BiaobeiPingceDialog", u"\u6807\u8d1d\u8bed\u97f3\u8bc4\u6d4b", None)) 61 | self.checkBox.setText(QCoreApplication.translate("BiaobeiPingceDialog", u"\u53ea\u5bf9\u672a\u6253\u5206\u7684\u6570\u636e\u8fdb\u884c\u8bc4\u6d4b", None)) 62 | self.checkBox_2.setText(QCoreApplication.translate("BiaobeiPingceDialog", u"\u53ea\u5bf9\u652f\u6301\u7684\u6570\u636e\u8fdb\u884c\u8bc4\u6d4b\uff08\u7eaf\u4e2d\u6587\uff09", None)) 63 | self.pushButton_quxiao.setText(QCoreApplication.translate("BiaobeiPingceDialog", u"\u53d6\u6d88", None)) 64 | self.pushButton_queding.setText(QCoreApplication.translate("BiaobeiPingceDialog", u"\u786e\u5b9a", None)) 65 | self.label.setText(QCoreApplication.translate("BiaobeiPingceDialog", u"\u9009\u62e9\u6388\u6743\u4fe1\u606f\uff1a", None)) 66 | self.label_error.setText("") 67 | # retranslateUi 68 | 69 | -------------------------------------------------------------------------------- /ui/pyuic/ui_dataset_view.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | ################################################################################ 4 | ## Form generated from reading UI file 'dataset_view.ui' 5 | ## 6 | ## Created by: Qt User Interface Compiler version 6.4.2 7 | ## 8 | ## WARNING! All changes made in this file will be lost when recompiling UI file! 9 | ################################################################################ 10 | 11 | from PySide6.QtCore import (QCoreApplication, QDate, QDateTime, QLocale, 12 | QMetaObject, QObject, QPoint, QRect, 13 | QSize, QTime, QUrl, Qt) 14 | from PySide6.QtGui import (QBrush, QColor, QConicalGradient, QCursor, 15 | QFont, QFontDatabase, QGradient, QIcon, 16 | QImage, QKeySequence, QLinearGradient, QPainter, 17 | QPalette, QPixmap, QRadialGradient, QTransform) 18 | from PySide6.QtWidgets import (QAbstractItemView, QApplication, QComboBox, QGroupBox, 19 | QHeaderView, QLabel, QMainWindow, QMenuBar, 20 | QPushButton, QSizePolicy, QStatusBar, QTabWidget, 21 | QTableWidget, QTableWidgetItem, QVBoxLayout, QWidget) 22 | 23 | class Ui_DatasetMainWindow(object): 24 | def setupUi(self, DatasetMainWindow): 25 | if not DatasetMainWindow.objectName(): 26 | DatasetMainWindow.setObjectName(u"DatasetMainWindow") 27 | DatasetMainWindow.resize(1200, 800) 28 | DatasetMainWindow.setMinimumSize(QSize(1200, 800)) 29 | DatasetMainWindow.setMaximumSize(QSize(1200, 800)) 30 | self.centralwidget = QWidget(DatasetMainWindow) 31 | self.centralwidget.setObjectName(u"centralwidget") 32 | self.tabWidget = QTabWidget(self.centralwidget) 33 | self.tabWidget.setObjectName(u"tabWidget") 34 | self.tabWidget.setGeometry(QRect(10, 10, 1181, 681)) 35 | font = QFont() 36 | font.setPointSize(12) 37 | self.tabWidget.setFont(font) 38 | self.tab = QWidget() 39 | self.tab.setObjectName(u"tab") 40 | self.verticalLayout_2 = QVBoxLayout(self.tab) 41 | self.verticalLayout_2.setObjectName(u"verticalLayout_2") 42 | self.widget_2 = QWidget(self.tab) 43 | self.widget_2.setObjectName(u"widget_2") 44 | self.tableWidget = QTableWidget(self.widget_2) 45 | if (self.tableWidget.columnCount() < 5): 46 | self.tableWidget.setColumnCount(5) 47 | __qtablewidgetitem = QTableWidgetItem() 48 | self.tableWidget.setHorizontalHeaderItem(0, __qtablewidgetitem) 49 | __qtablewidgetitem1 = QTableWidgetItem() 50 | self.tableWidget.setHorizontalHeaderItem(1, __qtablewidgetitem1) 51 | __qtablewidgetitem2 = QTableWidgetItem() 52 | self.tableWidget.setHorizontalHeaderItem(2, __qtablewidgetitem2) 53 | __qtablewidgetitem3 = QTableWidgetItem() 54 | self.tableWidget.setHorizontalHeaderItem(3, __qtablewidgetitem3) 55 | __qtablewidgetitem4 = QTableWidgetItem() 56 | self.tableWidget.setHorizontalHeaderItem(4, __qtablewidgetitem4) 57 | if (self.tableWidget.rowCount() < 10): 58 | self.tableWidget.setRowCount(10) 59 | __qtablewidgetitem5 = QTableWidgetItem() 60 | self.tableWidget.setVerticalHeaderItem(0, __qtablewidgetitem5) 61 | __qtablewidgetitem6 = QTableWidgetItem() 62 | self.tableWidget.setVerticalHeaderItem(1, __qtablewidgetitem6) 63 | __qtablewidgetitem7 = QTableWidgetItem() 64 | self.tableWidget.setVerticalHeaderItem(2, __qtablewidgetitem7) 65 | __qtablewidgetitem8 = QTableWidgetItem() 66 | self.tableWidget.setVerticalHeaderItem(3, __qtablewidgetitem8) 67 | __qtablewidgetitem9 = QTableWidgetItem() 68 | self.tableWidget.setVerticalHeaderItem(4, __qtablewidgetitem9) 69 | __qtablewidgetitem10 = QTableWidgetItem() 70 | self.tableWidget.setVerticalHeaderItem(5, __qtablewidgetitem10) 71 | __qtablewidgetitem11 = QTableWidgetItem() 72 | self.tableWidget.setVerticalHeaderItem(6, __qtablewidgetitem11) 73 | __qtablewidgetitem12 = QTableWidgetItem() 74 | self.tableWidget.setVerticalHeaderItem(7, __qtablewidgetitem12) 75 | __qtablewidgetitem13 = QTableWidgetItem() 76 | self.tableWidget.setVerticalHeaderItem(8, __qtablewidgetitem13) 77 | __qtablewidgetitem14 = QTableWidgetItem() 78 | self.tableWidget.setVerticalHeaderItem(9, __qtablewidgetitem14) 79 | self.tableWidget.setObjectName(u"tableWidget") 80 | self.tableWidget.setGeometry(QRect(10, 10, 1141, 421)) 81 | self.tableWidget.setFont(font) 82 | self.tableWidget.setEditTriggers(QAbstractItemView.NoEditTriggers) 83 | self.tableWidget.verticalHeader().setVisible(False) 84 | self.tableWidget.verticalHeader().setMinimumSectionSize(20) 85 | self.comboBox = QComboBox(self.widget_2) 86 | self.comboBox.setObjectName(u"comboBox") 87 | self.comboBox.setGeometry(QRect(10, 440, 201, 31)) 88 | font1 = QFont() 89 | font1.setPointSize(10) 90 | self.comboBox.setFont(font1) 91 | self.pushButton_add_wav_srt = QPushButton(self.widget_2) 92 | self.pushButton_add_wav_srt.setObjectName(u"pushButton_add_wav_srt") 93 | self.pushButton_add_wav_srt.setGeometry(QRect(230, 440, 231, 31)) 94 | self.pushButton_output_speaker = QPushButton(self.widget_2) 95 | self.pushButton_output_speaker.setObjectName(u"pushButton_output_speaker") 96 | self.pushButton_output_speaker.setGeometry(QRect(920, 440, 231, 31)) 97 | self.pushButton_add_long_wav = QPushButton(self.widget_2) 98 | self.pushButton_add_long_wav.setObjectName(u"pushButton_add_long_wav") 99 | self.pushButton_add_long_wav.setGeometry(QRect(230, 490, 231, 31)) 100 | self.pushButton_del_by_raw_wav = QPushButton(self.widget_2) 101 | self.pushButton_del_by_raw_wav.setObjectName(u"pushButton_del_by_raw_wav") 102 | self.pushButton_del_by_raw_wav.setGeometry(QRect(580, 440, 231, 31)) 103 | 104 | self.verticalLayout_2.addWidget(self.widget_2) 105 | 106 | self.tabWidget.addTab(self.tab, "") 107 | self.tab_2 = QWidget() 108 | self.tab_2.setObjectName(u"tab_2") 109 | self.verticalLayout = QVBoxLayout(self.tab_2) 110 | self.verticalLayout.setObjectName(u"verticalLayout") 111 | self.widget = QWidget(self.tab_2) 112 | self.widget.setObjectName(u"widget") 113 | self.pushButton_biaobei_pingce = QPushButton(self.widget) 114 | self.pushButton_biaobei_pingce.setObjectName(u"pushButton_biaobei_pingce") 115 | self.pushButton_biaobei_pingce.setGeometry(QRect(20, 20, 211, 51)) 116 | 117 | self.verticalLayout.addWidget(self.widget) 118 | 119 | self.tabWidget.addTab(self.tab_2, "") 120 | self.tab_3 = QWidget() 121 | self.tab_3.setObjectName(u"tab_3") 122 | self.label = QLabel(self.tab_3) 123 | self.label.setObjectName(u"label") 124 | self.label.setGeometry(QRect(20, 10, 271, 21)) 125 | self.label.setFont(font) 126 | self.tabWidget_2 = QTabWidget(self.tab_3) 127 | self.tabWidget_2.setObjectName(u"tabWidget_2") 128 | self.tabWidget_2.setGeometry(QRect(20, 50, 1141, 601)) 129 | self.tab_4 = QWidget() 130 | self.tab_4.setObjectName(u"tab_4") 131 | self.groupBox = QGroupBox(self.tab_4) 132 | self.groupBox.setObjectName(u"groupBox") 133 | self.groupBox.setGeometry(QRect(10, 10, 1111, 271)) 134 | self.tableWidget_biaobei = QTableWidget(self.groupBox) 135 | if (self.tableWidget_biaobei.columnCount() < 6): 136 | self.tableWidget_biaobei.setColumnCount(6) 137 | __qtablewidgetitem15 = QTableWidgetItem() 138 | self.tableWidget_biaobei.setHorizontalHeaderItem(0, __qtablewidgetitem15) 139 | __qtablewidgetitem16 = QTableWidgetItem() 140 | self.tableWidget_biaobei.setHorizontalHeaderItem(1, __qtablewidgetitem16) 141 | __qtablewidgetitem17 = QTableWidgetItem() 142 | self.tableWidget_biaobei.setHorizontalHeaderItem(2, __qtablewidgetitem17) 143 | __qtablewidgetitem18 = QTableWidgetItem() 144 | self.tableWidget_biaobei.setHorizontalHeaderItem(3, __qtablewidgetitem18) 145 | __qtablewidgetitem19 = QTableWidgetItem() 146 | self.tableWidget_biaobei.setHorizontalHeaderItem(4, __qtablewidgetitem19) 147 | __qtablewidgetitem20 = QTableWidgetItem() 148 | self.tableWidget_biaobei.setHorizontalHeaderItem(5, __qtablewidgetitem20) 149 | self.tableWidget_biaobei.setObjectName(u"tableWidget_biaobei") 150 | self.tableWidget_biaobei.setGeometry(QRect(20, 20, 961, 231)) 151 | self.tableWidget_biaobei.setEditTriggers(QAbstractItemView.NoEditTriggers) 152 | self.tableWidget_biaobei.verticalHeader().setVisible(False) 153 | self.pushButton_add_biaobei = QPushButton(self.groupBox) 154 | self.pushButton_add_biaobei.setObjectName(u"pushButton_add_biaobei") 155 | self.pushButton_add_biaobei.setGeometry(QRect(990, 20, 111, 41)) 156 | self.groupBox_2 = QGroupBox(self.tab_4) 157 | self.groupBox_2.setObjectName(u"groupBox_2") 158 | self.groupBox_2.setGeometry(QRect(10, 290, 1111, 271)) 159 | self.pushButton_add_xunfei = QPushButton(self.groupBox_2) 160 | self.pushButton_add_xunfei.setObjectName(u"pushButton_add_xunfei") 161 | self.pushButton_add_xunfei.setGeometry(QRect(990, 20, 111, 41)) 162 | self.tableWidget_xunfei = QTableWidget(self.groupBox_2) 163 | if (self.tableWidget_xunfei.columnCount() < 6): 164 | self.tableWidget_xunfei.setColumnCount(6) 165 | __qtablewidgetitem21 = QTableWidgetItem() 166 | self.tableWidget_xunfei.setHorizontalHeaderItem(0, __qtablewidgetitem21) 167 | __qtablewidgetitem22 = QTableWidgetItem() 168 | self.tableWidget_xunfei.setHorizontalHeaderItem(1, __qtablewidgetitem22) 169 | __qtablewidgetitem23 = QTableWidgetItem() 170 | self.tableWidget_xunfei.setHorizontalHeaderItem(2, __qtablewidgetitem23) 171 | __qtablewidgetitem24 = QTableWidgetItem() 172 | self.tableWidget_xunfei.setHorizontalHeaderItem(3, __qtablewidgetitem24) 173 | __qtablewidgetitem25 = QTableWidgetItem() 174 | self.tableWidget_xunfei.setHorizontalHeaderItem(4, __qtablewidgetitem25) 175 | __qtablewidgetitem26 = QTableWidgetItem() 176 | self.tableWidget_xunfei.setHorizontalHeaderItem(5, __qtablewidgetitem26) 177 | self.tableWidget_xunfei.setObjectName(u"tableWidget_xunfei") 178 | self.tableWidget_xunfei.setGeometry(QRect(20, 20, 961, 231)) 179 | self.tableWidget_xunfei.setEditTriggers(QAbstractItemView.NoEditTriggers) 180 | self.tableWidget_xunfei.verticalHeader().setVisible(False) 181 | self.tabWidget_2.addTab(self.tab_4, "") 182 | self.tab_5 = QWidget() 183 | self.tab_5.setObjectName(u"tab_5") 184 | self.tabWidget_2.addTab(self.tab_5, "") 185 | self.tabWidget.addTab(self.tab_3, "") 186 | DatasetMainWindow.setCentralWidget(self.centralwidget) 187 | self.menubar = QMenuBar(DatasetMainWindow) 188 | self.menubar.setObjectName(u"menubar") 189 | self.menubar.setGeometry(QRect(0, 0, 1200, 22)) 190 | DatasetMainWindow.setMenuBar(self.menubar) 191 | self.statusbar = QStatusBar(DatasetMainWindow) 192 | self.statusbar.setObjectName(u"statusbar") 193 | DatasetMainWindow.setStatusBar(self.statusbar) 194 | 195 | self.retranslateUi(DatasetMainWindow) 196 | 197 | self.tabWidget.setCurrentIndex(0) 198 | self.tabWidget_2.setCurrentIndex(0) 199 | 200 | 201 | QMetaObject.connectSlotsByName(DatasetMainWindow) 202 | # setupUi 203 | 204 | def retranslateUi(self, DatasetMainWindow): 205 | DatasetMainWindow.setWindowTitle(QCoreApplication.translate("DatasetMainWindow", u"\u6570\u636e\u96c6", None)) 206 | ___qtablewidgetitem = self.tableWidget.horizontalHeaderItem(0) 207 | ___qtablewidgetitem.setText(QCoreApplication.translate("DatasetMainWindow", u"\u5e8f\u53f7", None)); 208 | ___qtablewidgetitem1 = self.tableWidget.horizontalHeaderItem(1) 209 | ___qtablewidgetitem1.setText(QCoreApplication.translate("DatasetMainWindow", u"\u6807\u6ce8\u6587\u672c", None)); 210 | ___qtablewidgetitem2 = self.tableWidget.horizontalHeaderItem(2) 211 | ___qtablewidgetitem2.setText(QCoreApplication.translate("DatasetMainWindow", u"\u53d1\u97f3\u4eba", None)); 212 | ___qtablewidgetitem3 = self.tableWidget.horizontalHeaderItem(3) 213 | ___qtablewidgetitem3.setText(QCoreApplication.translate("DatasetMainWindow", u"\u6807\u7b7e", None)); 214 | ___qtablewidgetitem4 = self.tableWidget.horizontalHeaderItem(4) 215 | ___qtablewidgetitem4.setText(QCoreApplication.translate("DatasetMainWindow", u"\u64cd\u4f5c", None)); 216 | ___qtablewidgetitem5 = self.tableWidget.verticalHeaderItem(0) 217 | ___qtablewidgetitem5.setText(QCoreApplication.translate("DatasetMainWindow", u"\u65b0\u5efa\u884c", None)); 218 | ___qtablewidgetitem6 = self.tableWidget.verticalHeaderItem(1) 219 | ___qtablewidgetitem6.setText(QCoreApplication.translate("DatasetMainWindow", u"\u65b0\u5efa\u884c", None)); 220 | ___qtablewidgetitem7 = self.tableWidget.verticalHeaderItem(2) 221 | ___qtablewidgetitem7.setText(QCoreApplication.translate("DatasetMainWindow", u"\u65b0\u5efa\u884c", None)); 222 | ___qtablewidgetitem8 = self.tableWidget.verticalHeaderItem(3) 223 | ___qtablewidgetitem8.setText(QCoreApplication.translate("DatasetMainWindow", u"\u65b0\u5efa\u884c", None)); 224 | ___qtablewidgetitem9 = self.tableWidget.verticalHeaderItem(4) 225 | ___qtablewidgetitem9.setText(QCoreApplication.translate("DatasetMainWindow", u"\u65b0\u5efa\u884c", None)); 226 | ___qtablewidgetitem10 = self.tableWidget.verticalHeaderItem(5) 227 | ___qtablewidgetitem10.setText(QCoreApplication.translate("DatasetMainWindow", u"\u65b0\u5efa\u884c", None)); 228 | ___qtablewidgetitem11 = self.tableWidget.verticalHeaderItem(6) 229 | ___qtablewidgetitem11.setText(QCoreApplication.translate("DatasetMainWindow", u"\u65b0\u5efa\u884c", None)); 230 | ___qtablewidgetitem12 = self.tableWidget.verticalHeaderItem(7) 231 | ___qtablewidgetitem12.setText(QCoreApplication.translate("DatasetMainWindow", u"\u65b0\u5efa\u884c", None)); 232 | ___qtablewidgetitem13 = self.tableWidget.verticalHeaderItem(8) 233 | ___qtablewidgetitem13.setText(QCoreApplication.translate("DatasetMainWindow", u"\u65b0\u5efa\u884c", None)); 234 | ___qtablewidgetitem14 = self.tableWidget.verticalHeaderItem(9) 235 | ___qtablewidgetitem14.setText(QCoreApplication.translate("DatasetMainWindow", u"\u65b0\u5efa\u884c", None)); 236 | self.pushButton_add_wav_srt.setText(QCoreApplication.translate("DatasetMainWindow", u"\u4ece\u6587\u4ef6\u5bfc\u5165\uff08\u97f3\u9891+\u5b57\u5e55\uff09", None)) 237 | self.pushButton_output_speaker.setText(QCoreApplication.translate("DatasetMainWindow", u"\u5bfc\u51fa\u6570\u636e\u96c6\uff08\u5355\u53d1\u97f3\u4eba\uff09", None)) 238 | self.pushButton_add_long_wav.setText(QCoreApplication.translate("DatasetMainWindow", u"\u4ece\u6587\u4ef6\u5bfc\u5165\uff08\u957f\u97f3\u9891\uff09", None)) 239 | self.pushButton_del_by_raw_wav.setText(QCoreApplication.translate("DatasetMainWindow", u"\u6839\u636e\u6e90\u97f3\u9891\u5220\u9664\u6570\u636e", None)) 240 | self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab), QCoreApplication.translate("DatasetMainWindow", u"\u6570\u636e\u96c6\u6982\u89c8", None)) 241 | self.pushButton_biaobei_pingce.setText(QCoreApplication.translate("DatasetMainWindow", u"\u6807\u8d1d\u8bed\u97f3\u8bc4\u6d4b", None)) 242 | self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_2), QCoreApplication.translate("DatasetMainWindow", u"\u6570\u636e\u5904\u7406", None)) 243 | self.label.setText(QCoreApplication.translate("DatasetMainWindow", u"\u6ce8\u610f\uff1a\u672c\u9875\u8bbe\u7f6e\u5728\u672c\u5de5\u4f5c\u533a\u4e0b\u901a\u7528", None)) 244 | self.groupBox.setTitle(QCoreApplication.translate("DatasetMainWindow", u"\u6807\u8d1d", None)) 245 | ___qtablewidgetitem15 = self.tableWidget_biaobei.horizontalHeaderItem(0) 246 | ___qtablewidgetitem15.setText(QCoreApplication.translate("DatasetMainWindow", u"id", None)); 247 | ___qtablewidgetitem16 = self.tableWidget_biaobei.horizontalHeaderItem(1) 248 | ___qtablewidgetitem16.setText(QCoreApplication.translate("DatasetMainWindow", u"\u540d\u79f0", None)); 249 | ___qtablewidgetitem17 = self.tableWidget_biaobei.horizontalHeaderItem(2) 250 | ___qtablewidgetitem17.setText(QCoreApplication.translate("DatasetMainWindow", u"APP\u7c7b\u578b", None)); 251 | ___qtablewidgetitem18 = self.tableWidget_biaobei.horizontalHeaderItem(3) 252 | ___qtablewidgetitem18.setText(QCoreApplication.translate("DatasetMainWindow", u"APPID", None)); 253 | ___qtablewidgetitem19 = self.tableWidget_biaobei.horizontalHeaderItem(4) 254 | ___qtablewidgetitem19.setText(QCoreApplication.translate("DatasetMainWindow", u"APISecret\uff08client_secret\uff09", None)); 255 | ___qtablewidgetitem20 = self.tableWidget_biaobei.horizontalHeaderItem(5) 256 | ___qtablewidgetitem20.setText(QCoreApplication.translate("DatasetMainWindow", u"APIKey\uff08client_id\uff09", None)); 257 | self.pushButton_add_biaobei.setText(QCoreApplication.translate("DatasetMainWindow", u"\u6dfb\u52a0", None)) 258 | self.groupBox_2.setTitle(QCoreApplication.translate("DatasetMainWindow", u"\u8baf\u98de", None)) 259 | self.pushButton_add_xunfei.setText(QCoreApplication.translate("DatasetMainWindow", u"\u6dfb\u52a0", None)) 260 | ___qtablewidgetitem21 = self.tableWidget_xunfei.horizontalHeaderItem(0) 261 | ___qtablewidgetitem21.setText(QCoreApplication.translate("DatasetMainWindow", u"id", None)); 262 | ___qtablewidgetitem22 = self.tableWidget_xunfei.horizontalHeaderItem(1) 263 | ___qtablewidgetitem22.setText(QCoreApplication.translate("DatasetMainWindow", u"\u540d\u79f0", None)); 264 | ___qtablewidgetitem23 = self.tableWidget_xunfei.horizontalHeaderItem(2) 265 | ___qtablewidgetitem23.setText(QCoreApplication.translate("DatasetMainWindow", u"APP\u7c7b\u578b", None)); 266 | ___qtablewidgetitem24 = self.tableWidget_xunfei.horizontalHeaderItem(3) 267 | ___qtablewidgetitem24.setText(QCoreApplication.translate("DatasetMainWindow", u"APPID", None)); 268 | ___qtablewidgetitem25 = self.tableWidget_xunfei.horizontalHeaderItem(4) 269 | ___qtablewidgetitem25.setText(QCoreApplication.translate("DatasetMainWindow", u"APISecret\uff08client_secret\uff09", None)); 270 | ___qtablewidgetitem26 = self.tableWidget_xunfei.horizontalHeaderItem(5) 271 | ___qtablewidgetitem26.setText(QCoreApplication.translate("DatasetMainWindow", u"APIKey\uff08client_id\uff09", None)); 272 | self.tabWidget_2.setTabText(self.tabWidget_2.indexOf(self.tab_4), QCoreApplication.translate("DatasetMainWindow", u"\u6388\u6743\u7ba1\u7406", None)) 273 | self.tabWidget_2.setTabText(self.tabWidget_2.indexOf(self.tab_5), QCoreApplication.translate("DatasetMainWindow", u"\u5168\u5c40\u8bbe\u7f6e", None)) 274 | self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_3), QCoreApplication.translate("DatasetMainWindow", u"\u8f6f\u4ef6\u8bbe\u7f6e", None)) 275 | # retranslateUi 276 | 277 | -------------------------------------------------------------------------------- /ui/pyuic/ui_del_info_wav.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | ################################################################################ 4 | ## Form generated from reading UI file 'del_info_wav.ui' 5 | ## 6 | ## Created by: Qt User Interface Compiler version 6.4.2 7 | ## 8 | ## WARNING! All changes made in this file will be lost when recompiling UI file! 9 | ################################################################################ 10 | 11 | from PySide6.QtCore import (QCoreApplication, QDate, QDateTime, QLocale, 12 | QMetaObject, QObject, QPoint, QRect, 13 | QSize, QTime, QUrl, Qt) 14 | from PySide6.QtGui import (QBrush, QColor, QConicalGradient, QCursor, 15 | QFont, QFontDatabase, QGradient, QIcon, 16 | QImage, QKeySequence, QLinearGradient, QPainter, 17 | QPalette, QPixmap, QRadialGradient, QTransform) 18 | from PySide6.QtWidgets import (QApplication, QComboBox, QDialog, QLabel, 19 | QPushButton, QSizePolicy, QWidget) 20 | 21 | class Ui_del_info_wav_Dialog(object): 22 | def setupUi(self, del_info_wav_Dialog): 23 | if not del_info_wav_Dialog.objectName(): 24 | del_info_wav_Dialog.setObjectName(u"del_info_wav_Dialog") 25 | del_info_wav_Dialog.resize(600, 250) 26 | del_info_wav_Dialog.setMinimumSize(QSize(600, 250)) 27 | del_info_wav_Dialog.setMaximumSize(QSize(600, 250)) 28 | font = QFont() 29 | font.setPointSize(12) 30 | del_info_wav_Dialog.setFont(font) 31 | self.label = QLabel(del_info_wav_Dialog) 32 | self.label.setObjectName(u"label") 33 | self.label.setGeometry(QRect(20, 21, 561, 20)) 34 | self.label_2 = QLabel(del_info_wav_Dialog) 35 | self.label_2.setObjectName(u"label_2") 36 | self.label_2.setGeometry(QRect(30, 70, 81, 16)) 37 | self.pushButton_back = QPushButton(del_info_wav_Dialog) 38 | self.pushButton_back.setObjectName(u"pushButton_back") 39 | self.pushButton_back.setGeometry(QRect(500, 200, 81, 24)) 40 | self.pushButton_submit = QPushButton(del_info_wav_Dialog) 41 | self.pushButton_submit.setObjectName(u"pushButton_submit") 42 | self.pushButton_submit.setGeometry(QRect(390, 200, 81, 24)) 43 | self.error_lable = QLabel(del_info_wav_Dialog) 44 | self.error_lable.setObjectName(u"error_lable") 45 | self.error_lable.setGeometry(QRect(30, 170, 541, 16)) 46 | self.error_lable.setFont(font) 47 | self.error_lable.setStyleSheet(u"color: red;") 48 | self.comboBox_files = QComboBox(del_info_wav_Dialog) 49 | self.comboBox_files.setObjectName(u"comboBox_files") 50 | self.comboBox_files.setGeometry(QRect(130, 70, 381, 22)) 51 | 52 | self.retranslateUi(del_info_wav_Dialog) 53 | 54 | QMetaObject.connectSlotsByName(del_info_wav_Dialog) 55 | # setupUi 56 | 57 | def retranslateUi(self, del_info_wav_Dialog): 58 | del_info_wav_Dialog.setWindowTitle(QCoreApplication.translate("del_info_wav_Dialog", u"\u5220\u9664\u6570\u636e", None)) 59 | self.label.setText(QCoreApplication.translate("del_info_wav_Dialog", u"\u9009\u62e9\u4e00\u4e2a\u4e4b\u524d\u5bfc\u5165\u7684\u97f3\u9891\u6587\u4ef6\uff0c\u5220\u9664\u4e0e\u6b64\u6587\u4ef6\u5173\u8054\u7684\u6570\u636e", None)) 60 | self.label_2.setText(QCoreApplication.translate("del_info_wav_Dialog", u"\u97f3\u9891\u6587\u4ef6\uff1a", None)) 61 | self.pushButton_back.setText(QCoreApplication.translate("del_info_wav_Dialog", u"\u53d6\u6d88", None)) 62 | self.pushButton_submit.setText(QCoreApplication.translate("del_info_wav_Dialog", u"\u786e\u5b9a", None)) 63 | self.error_lable.setText("") 64 | # retranslateUi 65 | 66 | -------------------------------------------------------------------------------- /ui/pyuic/ui_edit_info.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | ################################################################################ 4 | ## Form generated from reading UI file 'edit_info.ui' 5 | ## 6 | ## Created by: Qt User Interface Compiler version 6.4.2 7 | ## 8 | ## WARNING! All changes made in this file will be lost when recompiling UI file! 9 | ################################################################################ 10 | 11 | from PySide6.QtCore import (QCoreApplication, QDate, QDateTime, QLocale, 12 | QMetaObject, QObject, QPoint, QRect, 13 | QSize, QTime, QUrl, Qt) 14 | from PySide6.QtGui import (QBrush, QColor, QConicalGradient, QCursor, 15 | QFont, QFontDatabase, QGradient, QIcon, 16 | QImage, QKeySequence, QLinearGradient, QPainter, 17 | QPalette, QPixmap, QRadialGradient, QTransform) 18 | from PySide6.QtWidgets import (QApplication, QDialog, QLabel, QLineEdit, 19 | QPushButton, QSizePolicy, QWidget) 20 | 21 | class Ui_EditInfoDialog(object): 22 | def setupUi(self, EditInfoDialog): 23 | if not EditInfoDialog.objectName(): 24 | EditInfoDialog.setObjectName(u"EditInfoDialog") 25 | EditInfoDialog.resize(400, 300) 26 | font = QFont() 27 | font.setPointSize(12) 28 | EditInfoDialog.setFont(font) 29 | self.label = QLabel(EditInfoDialog) 30 | self.label.setObjectName(u"label") 31 | self.label.setGeometry(QRect(20, 20, 111, 20)) 32 | self.label_info_id = QLabel(EditInfoDialog) 33 | self.label_info_id.setObjectName(u"label_info_id") 34 | self.label_info_id.setGeometry(QRect(150, 20, 111, 20)) 35 | self.label_3 = QLabel(EditInfoDialog) 36 | self.label_3.setObjectName(u"label_3") 37 | self.label_3.setGeometry(QRect(20, 50, 111, 20)) 38 | self.lineEdit_info_text = QLineEdit(EditInfoDialog) 39 | self.lineEdit_info_text.setObjectName(u"lineEdit_info_text") 40 | self.lineEdit_info_text.setGeometry(QRect(150, 50, 231, 21)) 41 | self.label_4 = QLabel(EditInfoDialog) 42 | self.label_4.setObjectName(u"label_4") 43 | self.label_4.setGeometry(QRect(20, 80, 111, 20)) 44 | self.pushButton_2 = QPushButton(EditInfoDialog) 45 | self.pushButton_2.setObjectName(u"pushButton_2") 46 | self.pushButton_2.setGeometry(QRect(320, 260, 75, 24)) 47 | self.pushButton_3 = QPushButton(EditInfoDialog) 48 | self.pushButton_3.setObjectName(u"pushButton_3") 49 | self.pushButton_3.setGeometry(QRect(230, 260, 75, 24)) 50 | self.label_info_speaker = QLabel(EditInfoDialog) 51 | self.label_info_speaker.setObjectName(u"label_info_speaker") 52 | self.label_info_speaker.setGeometry(QRect(150, 80, 231, 20)) 53 | self.label_5 = QLabel(EditInfoDialog) 54 | self.label_5.setObjectName(u"label_5") 55 | self.label_5.setGeometry(QRect(20, 110, 121, 20)) 56 | self.label_6 = QLabel(EditInfoDialog) 57 | self.label_6.setObjectName(u"label_6") 58 | self.label_6.setGeometry(QRect(20, 140, 121, 20)) 59 | self.lineEdit_info_starttime = QLineEdit(EditInfoDialog) 60 | self.lineEdit_info_starttime.setObjectName(u"lineEdit_info_starttime") 61 | self.lineEdit_info_starttime.setGeometry(QRect(150, 110, 231, 21)) 62 | self.lineEdit_info_endtime = QLineEdit(EditInfoDialog) 63 | self.lineEdit_info_endtime.setObjectName(u"lineEdit_info_endtime") 64 | self.lineEdit_info_endtime.setGeometry(QRect(150, 140, 231, 21)) 65 | 66 | self.retranslateUi(EditInfoDialog) 67 | 68 | QMetaObject.connectSlotsByName(EditInfoDialog) 69 | # setupUi 70 | 71 | def retranslateUi(self, EditInfoDialog): 72 | EditInfoDialog.setWindowTitle(QCoreApplication.translate("EditInfoDialog", u"\u6570\u636e\u7f16\u8f91", None)) 73 | self.label.setText(QCoreApplication.translate("EditInfoDialog", u"\u6570\u636eid:", None)) 74 | self.label_info_id.setText(QCoreApplication.translate("EditInfoDialog", u"\u6570\u636eid", None)) 75 | self.label_3.setText(QCoreApplication.translate("EditInfoDialog", u"\u6807\u6ce8\u6587\u672c\uff1a", None)) 76 | self.lineEdit_info_text.setText("") 77 | self.label_4.setText(QCoreApplication.translate("EditInfoDialog", u"\u53d1\u97f3\u4eba\uff1a", None)) 78 | self.pushButton_2.setText(QCoreApplication.translate("EditInfoDialog", u"\u53d6\u6d88", None)) 79 | self.pushButton_3.setText(QCoreApplication.translate("EditInfoDialog", u"\u786e\u5b9a", None)) 80 | self.label_info_speaker.setText(QCoreApplication.translate("EditInfoDialog", u"\u6570\u636eid", None)) 81 | self.label_5.setText(QCoreApplication.translate("EditInfoDialog", u"\u5f00\u59cb\u65f6\u95f4(ms)\uff1a", None)) 82 | self.label_6.setText(QCoreApplication.translate("EditInfoDialog", u"\u7ed3\u675f\u65f6\u95f4(ms)\uff1a", None)) 83 | self.lineEdit_info_starttime.setText("") 84 | self.lineEdit_info_endtime.setText("") 85 | # retranslateUi 86 | 87 | -------------------------------------------------------------------------------- /ui/pyuic/ui_output_dataset_speaker.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | ################################################################################ 4 | ## Form generated from reading UI file 'output_dataset_speaker.ui' 5 | ## 6 | ## Created by: Qt User Interface Compiler version 6.4.2 7 | ## 8 | ## WARNING! All changes made in this file will be lost when recompiling UI file! 9 | ################################################################################ 10 | 11 | from PySide6.QtCore import (QCoreApplication, QDate, QDateTime, QLocale, 12 | QMetaObject, QObject, QPoint, QRect, 13 | QSize, QTime, QUrl, Qt) 14 | from PySide6.QtGui import (QBrush, QColor, QConicalGradient, QCursor, 15 | QFont, QFontDatabase, QGradient, QIcon, 16 | QImage, QKeySequence, QLinearGradient, QPainter, 17 | QPalette, QPixmap, QRadialGradient, QTransform) 18 | from PySide6.QtWidgets import (QApplication, QCheckBox, QComboBox, QDialog, 19 | QGroupBox, QHBoxLayout, QLabel, QLineEdit, 20 | QPushButton, QSizePolicy, QStackedWidget, QVBoxLayout, 21 | QWidget) 22 | 23 | class Ui_OutPutSpeakerDialog(object): 24 | def setupUi(self, OutPutSpeakerDialog): 25 | if not OutPutSpeakerDialog.objectName(): 26 | OutPutSpeakerDialog.setObjectName(u"OutPutSpeakerDialog") 27 | OutPutSpeakerDialog.resize(540, 581) 28 | font = QFont() 29 | font.setPointSize(12) 30 | OutPutSpeakerDialog.setFont(font) 31 | self.stackedWidget = QStackedWidget(OutPutSpeakerDialog) 32 | self.stackedWidget.setObjectName(u"stackedWidget") 33 | self.stackedWidget.setGeometry(QRect(20, 10, 511, 371)) 34 | self.page = QWidget() 35 | self.page.setObjectName(u"page") 36 | self.label_2 = QLabel(self.page) 37 | self.label_2.setObjectName(u"label_2") 38 | self.label_2.setGeometry(QRect(20, 131, 131, 16)) 39 | self.lineEdit_sample_rate = QLineEdit(self.page) 40 | self.lineEdit_sample_rate.setObjectName(u"lineEdit_sample_rate") 41 | self.lineEdit_sample_rate.setGeometry(QRect(290, 170, 191, 21)) 42 | self.comboBox_geshi = QComboBox(self.page) 43 | self.comboBox_geshi.setObjectName(u"comboBox_geshi") 44 | self.comboBox_geshi.setGeometry(QRect(290, 90, 191, 22)) 45 | self.label_3 = QLabel(self.page) 46 | self.label_3.setObjectName(u"label_3") 47 | self.label_3.setGeometry(QRect(20, 171, 131, 16)) 48 | self.label = QLabel(self.page) 49 | self.label.setObjectName(u"label") 50 | self.label.setGeometry(QRect(20, 90, 221, 20)) 51 | self.lineEdit_qianzhui = QLineEdit(self.page) 52 | self.lineEdit_qianzhui.setObjectName(u"lineEdit_qianzhui") 53 | self.lineEdit_qianzhui.setGeometry(QRect(290, 130, 191, 21)) 54 | self.label_9 = QLabel(self.page) 55 | self.label_9.setObjectName(u"label_9") 56 | self.label_9.setGeometry(QRect(20, 250, 131, 16)) 57 | self.comboBox_speaker = QComboBox(self.page) 58 | self.comboBox_speaker.setObjectName(u"comboBox_speaker") 59 | self.comboBox_speaker.setGeometry(QRect(290, 250, 191, 22)) 60 | self.groupBox_2 = QGroupBox(self.page) 61 | self.groupBox_2.setObjectName(u"groupBox_2") 62 | self.groupBox_2.setGeometry(QRect(10, 10, 491, 71)) 63 | self.pushButton_read_preinstall = QPushButton(self.groupBox_2) 64 | self.pushButton_read_preinstall.setObjectName(u"pushButton_read_preinstall") 65 | self.pushButton_read_preinstall.setGeometry(QRect(280, 30, 111, 24)) 66 | self.pushButton_read_preinstall.setFont(font) 67 | self.comboBox_preinstall = QComboBox(self.groupBox_2) 68 | self.comboBox_preinstall.setObjectName(u"comboBox_preinstall") 69 | self.comboBox_preinstall.setGeometry(QRect(10, 30, 211, 22)) 70 | self.label_4 = QLabel(self.page) 71 | self.label_4.setObjectName(u"label_4") 72 | self.label_4.setGeometry(QRect(20, 211, 131, 16)) 73 | self.comboBox_channel = QComboBox(self.page) 74 | self.comboBox_channel.addItem("") 75 | self.comboBox_channel.addItem("") 76 | self.comboBox_channel.setObjectName(u"comboBox_channel") 77 | self.comboBox_channel.setGeometry(QRect(290, 210, 191, 22)) 78 | self.checkBox_auto_skip = QCheckBox(self.page) 79 | self.checkBox_auto_skip.setObjectName(u"checkBox_auto_skip") 80 | self.checkBox_auto_skip.setGeometry(QRect(290, 290, 111, 20)) 81 | self.checkBox_auto_skip.setChecked(True) 82 | self.label_5 = QLabel(self.page) 83 | self.label_5.setObjectName(u"label_5") 84 | self.label_5.setGeometry(QRect(20, 290, 201, 16)) 85 | self.label_guiyihua = QLabel(self.page) 86 | self.label_guiyihua.setObjectName(u"label_guiyihua") 87 | self.label_guiyihua.setGeometry(QRect(20, 330, 261, 41)) 88 | self.label_guiyihua.setAlignment(Qt.AlignLeading|Qt.AlignLeft|Qt.AlignTop) 89 | self.lineEdit_guiyihua = QLineEdit(self.page) 90 | self.lineEdit_guiyihua.setObjectName(u"lineEdit_guiyihua") 91 | self.lineEdit_guiyihua.setGeometry(QRect(290, 330, 191, 21)) 92 | self.stackedWidget.addWidget(self.page) 93 | self.page_2 = QWidget() 94 | self.page_2.setObjectName(u"page_2") 95 | self.groupBox = QGroupBox(self.page_2) 96 | self.groupBox.setObjectName(u"groupBox") 97 | self.groupBox.setGeometry(QRect(0, 30, 501, 231)) 98 | self.label_cengji = QLabel(self.groupBox) 99 | self.label_cengji.setObjectName(u"label_cengji") 100 | self.label_cengji.setGeometry(QRect(10, 50, 231, 141)) 101 | self.label_cengji.setAlignment(Qt.AlignLeading|Qt.AlignLeft|Qt.AlignTop) 102 | self.label_geshi = QLabel(self.groupBox) 103 | self.label_geshi.setObjectName(u"label_geshi") 104 | self.label_geshi.setGeometry(QRect(260, 50, 231, 141)) 105 | self.label_geshi.setAlignment(Qt.AlignLeading|Qt.AlignLeft|Qt.AlignTop) 106 | self.label_6 = QLabel(self.groupBox) 107 | self.label_6.setObjectName(u"label_6") 108 | self.label_6.setGeometry(QRect(10, 26, 151, 16)) 109 | font1 = QFont() 110 | font1.setPointSize(12) 111 | font1.setBold(True) 112 | self.label_6.setFont(font1) 113 | self.label_7 = QLabel(self.groupBox) 114 | self.label_7.setObjectName(u"label_7") 115 | self.label_7.setGeometry(QRect(260, 26, 151, 16)) 116 | self.label_7.setFont(font1) 117 | self.label_8 = QLabel(self.groupBox) 118 | self.label_8.setObjectName(u"label_8") 119 | self.label_8.setGeometry(QRect(10, 200, 141, 20)) 120 | self.label_file_num = QLabel(self.groupBox) 121 | self.label_file_num.setObjectName(u"label_file_num") 122 | self.label_file_num.setGeometry(QRect(160, 200, 151, 20)) 123 | self.stackedWidget.addWidget(self.page_2) 124 | self.pushButton_next = QPushButton(OutPutSpeakerDialog) 125 | self.pushButton_next.setObjectName(u"pushButton_next") 126 | self.pushButton_next.setGeometry(QRect(430, 540, 75, 24)) 127 | self.pushButton_back = QPushButton(OutPutSpeakerDialog) 128 | self.pushButton_back.setObjectName(u"pushButton_back") 129 | self.pushButton_back.setGeometry(QRect(320, 540, 75, 24)) 130 | self.label_error = QLabel(OutPutSpeakerDialog) 131 | self.label_error.setObjectName(u"label_error") 132 | self.label_error.setGeometry(QRect(40, 520, 271, 16)) 133 | self.label_error.setFont(font) 134 | self.label_error.setStyleSheet(u"color:red") 135 | self.groupBox_3 = QGroupBox(OutPutSpeakerDialog) 136 | self.groupBox_3.setObjectName(u"groupBox_3") 137 | self.groupBox_3.setGeometry(QRect(30, 390, 491, 131)) 138 | self.comboBox_pingce = QComboBox(self.groupBox_3) 139 | self.comboBox_pingce.setObjectName(u"comboBox_pingce") 140 | self.comboBox_pingce.setGeometry(QRect(10, 30, 211, 22)) 141 | self.horizontalLayoutWidget = QWidget(self.groupBox_3) 142 | self.horizontalLayoutWidget.setObjectName(u"horizontalLayoutWidget") 143 | self.horizontalLayoutWidget.setGeometry(QRect(240, 20, 241, 101)) 144 | self.horizontalLayout = QHBoxLayout(self.horizontalLayoutWidget) 145 | self.horizontalLayout.setObjectName(u"horizontalLayout") 146 | self.horizontalLayout.setContentsMargins(0, 0, 0, 0) 147 | self.verticalLayout_left = QVBoxLayout() 148 | self.verticalLayout_left.setObjectName(u"verticalLayout_left") 149 | 150 | self.horizontalLayout.addLayout(self.verticalLayout_left) 151 | 152 | self.verticalLayout_right = QVBoxLayout() 153 | self.verticalLayout_right.setObjectName(u"verticalLayout_right") 154 | 155 | self.horizontalLayout.addLayout(self.verticalLayout_right) 156 | 157 | self.label_10 = QLabel(self.groupBox_3) 158 | self.label_10.setObjectName(u"label_10") 159 | self.label_10.setGeometry(QRect(10, 60, 211, 61)) 160 | self.label_10.setWordWrap(True) 161 | 162 | self.retranslateUi(OutPutSpeakerDialog) 163 | 164 | self.stackedWidget.setCurrentIndex(0) 165 | 166 | 167 | QMetaObject.connectSlotsByName(OutPutSpeakerDialog) 168 | # setupUi 169 | 170 | def retranslateUi(self, OutPutSpeakerDialog): 171 | OutPutSpeakerDialog.setWindowTitle(QCoreApplication.translate("OutPutSpeakerDialog", u"\u5bfc\u51fa\u6570\u636e\u96c6", None)) 172 | self.label_2.setText(QCoreApplication.translate("OutPutSpeakerDialog", u"\u6dfb\u52a0\u97f3\u9891\u6587\u4ef6\u524d\u7f00", None)) 173 | self.lineEdit_sample_rate.setText("") 174 | self.label_3.setText(QCoreApplication.translate("OutPutSpeakerDialog", u"\u97f3\u9891\u6587\u4ef6\u91c7\u6837\u7387", None)) 175 | self.label.setText(QCoreApplication.translate("OutPutSpeakerDialog", u"\u8f93\u51fa\u6587\u4ef6\u5c42\u7ea7\u548c\u6807\u6ce8\u6587\u4ef6\u683c\u5f0f", None)) 176 | self.lineEdit_qianzhui.setText("") 177 | self.label_9.setText(QCoreApplication.translate("OutPutSpeakerDialog", u"\u53d1\u97f3\u4eba", None)) 178 | self.groupBox_2.setTitle(QCoreApplication.translate("OutPutSpeakerDialog", u"\u9884\u8bbe", None)) 179 | self.pushButton_read_preinstall.setText(QCoreApplication.translate("OutPutSpeakerDialog", u"\u8bfb\u53d6\u6240\u9009\u9884\u8bbe", None)) 180 | self.label_4.setText(QCoreApplication.translate("OutPutSpeakerDialog", u"\u58f0\u9053\u6570", None)) 181 | self.comboBox_channel.setItemText(0, QCoreApplication.translate("OutPutSpeakerDialog", u"1", None)) 182 | self.comboBox_channel.setItemText(1, QCoreApplication.translate("OutPutSpeakerDialog", u"2", None)) 183 | 184 | self.checkBox_auto_skip.setText(QCoreApplication.translate("OutPutSpeakerDialog", u"\u662f", None)) 185 | self.label_5.setText(QCoreApplication.translate("OutPutSpeakerDialog", u"\u81ea\u52a8\u8df3\u8fc7\u542b\u6709\u975e\u4e2d\u6587\u7684\u6570\u636e", None)) 186 | self.label_guiyihua.setText(QCoreApplication.translate("OutPutSpeakerDialog", u"\u5f52\u4e00\u5316\uff08\u7559\u7a7a\u4e3a\u4e0d\u8fdb\u884c\u5f52\u4e00\u5316\uff09\n" 187 | "\u8303\u56f4\u4e3a-70~-5", None)) 188 | self.lineEdit_guiyihua.setText(QCoreApplication.translate("OutPutSpeakerDialog", u"-23", None)) 189 | self.groupBox.setTitle(QCoreApplication.translate("OutPutSpeakerDialog", u"\u9884\u89c8", None)) 190 | self.label_cengji.setText(QCoreApplication.translate("OutPutSpeakerDialog", u"sounds\n" 191 | " - 1.wav\n" 192 | " - 2.wav\n" 193 | " ......\n" 194 | "labels.txt", None)) 195 | self.label_geshi.setText(QCoreApplication.translate("OutPutSpeakerDialog", u"1.wav|\u4f60\u597d\u4e16\u754c\n" 196 | "2.wav|\u4e16\u754c\u4f60\u597d\n" 197 | "......", None)) 198 | self.label_6.setText(QCoreApplication.translate("OutPutSpeakerDialog", u"\u6587\u4ef6\u5c42\u7ea7\uff1a", None)) 199 | self.label_7.setText(QCoreApplication.translate("OutPutSpeakerDialog", u"\u6807\u6ce8\u6587\u4ef6\u5185\u5bb9\uff1a", None)) 200 | self.label_8.setText(QCoreApplication.translate("OutPutSpeakerDialog", u"\u9884\u8ba1\u5bfc\u51fa\u6587\u4ef6\u6570\u91cf\uff1a", None)) 201 | self.label_file_num.setText("") 202 | self.pushButton_next.setText(QCoreApplication.translate("OutPutSpeakerDialog", u"\u4e0b\u4e00\u6b65", None)) 203 | self.pushButton_back.setText(QCoreApplication.translate("OutPutSpeakerDialog", u"\u4e0a\u4e00\u6b65", None)) 204 | self.label_error.setText("") 205 | self.groupBox_3.setTitle(QCoreApplication.translate("OutPutSpeakerDialog", u"\u8bc4\u6d4b\u76f8\u5173", None)) 206 | self.comboBox_pingce.setPlaceholderText("") 207 | self.label_10.setText(QCoreApplication.translate("OutPutSpeakerDialog", u"\u9009\u62e9\u8bc4\u6d4b\u4f9d\u636e\u540e\u53ef\u4ee5\u8fc7\u6ee4\u5bfc\u51fa\u7684\u6570\u636e\uff0c\u53ea\u4f1a\u5bfc\u51fa\u6307\u5b9a\u5206\u6570\u8d85\u8fc7\u9650\u5b9a\u503c\u7684\u6570\u636e\u3002", None)) 208 | # retranslateUi 209 | 210 | -------------------------------------------------------------------------------- /ui/pyuic/ui_pingce_jindutiao.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | ################################################################################ 4 | ## Form generated from reading UI file 'pingce_jindutiao.ui' 5 | ## 6 | ## Created by: Qt User Interface Compiler version 6.4.2 7 | ## 8 | ## WARNING! All changes made in this file will be lost when recompiling UI file! 9 | ################################################################################ 10 | 11 | from PySide6.QtCore import (QCoreApplication, QDate, QDateTime, QLocale, 12 | QMetaObject, QObject, QPoint, QRect, 13 | QSize, QTime, QUrl, Qt) 14 | from PySide6.QtGui import (QBrush, QColor, QConicalGradient, QCursor, 15 | QFont, QFontDatabase, QGradient, QIcon, 16 | QImage, QKeySequence, QLinearGradient, QPainter, 17 | QPalette, QPixmap, QRadialGradient, QTransform) 18 | from PySide6.QtWidgets import (QApplication, QDialog, QProgressBar, QPushButton, 19 | QSizePolicy, QWidget) 20 | 21 | class Ui_PingcejinduDialog(object): 22 | def setupUi(self, PingcejinduDialog): 23 | if not PingcejinduDialog.objectName(): 24 | PingcejinduDialog.setObjectName(u"PingcejinduDialog") 25 | PingcejinduDialog.resize(351, 111) 26 | self.progressBar = QProgressBar(PingcejinduDialog) 27 | self.progressBar.setObjectName(u"progressBar") 28 | self.progressBar.setGeometry(QRect(20, 20, 311, 23)) 29 | font = QFont() 30 | font.setPointSize(12) 31 | self.progressBar.setFont(font) 32 | self.progressBar.setMinimum(0) 33 | self.progressBar.setMaximum(0) 34 | self.progressBar.setValue(0) 35 | self.progressBar.setTextDirection(QProgressBar.TopToBottom) 36 | self.pushButton_stop = QPushButton(PingcejinduDialog) 37 | self.pushButton_stop.setObjectName(u"pushButton_stop") 38 | self.pushButton_stop.setGeometry(QRect(20, 60, 75, 24)) 39 | self.pushButton_stop.setFont(font) 40 | 41 | self.retranslateUi(PingcejinduDialog) 42 | 43 | QMetaObject.connectSlotsByName(PingcejinduDialog) 44 | # setupUi 45 | 46 | def retranslateUi(self, PingcejinduDialog): 47 | PingcejinduDialog.setWindowTitle(QCoreApplication.translate("PingcejinduDialog", u"\u8bed\u97f3\u8bc4\u6d4b", None)) 48 | self.progressBar.setFormat(QCoreApplication.translate("PingcejinduDialog", u"%v/%m", None)) 49 | self.pushButton_stop.setText(QCoreApplication.translate("PingcejinduDialog", u"\u505c\u6b62", None)) 50 | # retranslateUi 51 | 52 | -------------------------------------------------------------------------------- /ui/pyuic/ui_select_dataset.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | ################################################################################ 4 | ## Form generated from reading UI file 'select_dataset.ui' 5 | ## 6 | ## Created by: Qt User Interface Compiler version 6.4.2 7 | ## 8 | ## WARNING! All changes made in this file will be lost when recompiling UI file! 9 | ################################################################################ 10 | 11 | from PySide6.QtCore import (QCoreApplication, QDate, QDateTime, QLocale, 12 | QMetaObject, QObject, QPoint, QRect, 13 | QSize, QTime, QUrl, Qt) 14 | from PySide6.QtGui import (QBrush, QColor, QConicalGradient, QCursor, 15 | QFont, QFontDatabase, QGradient, QIcon, 16 | QImage, QKeySequence, QLinearGradient, QPainter, 17 | QPalette, QPixmap, QRadialGradient, QTransform) 18 | from PySide6.QtWidgets import (QAbstractItemView, QApplication, QHeaderView, QMainWindow, 19 | QMenuBar, QPushButton, QSizePolicy, QStatusBar, 20 | QTableWidget, QTableWidgetItem, QWidget) 21 | 22 | class Ui_MainWindow(object): 23 | def setupUi(self, MainWindow): 24 | if not MainWindow.objectName(): 25 | MainWindow.setObjectName(u"MainWindow") 26 | MainWindow.resize(800, 600) 27 | MainWindow.setMinimumSize(QSize(800, 600)) 28 | MainWindow.setMaximumSize(QSize(800, 600)) 29 | self.centralwidget = QWidget(MainWindow) 30 | self.centralwidget.setObjectName(u"centralwidget") 31 | self.tableWidget = QTableWidget(self.centralwidget) 32 | if (self.tableWidget.columnCount() < 5): 33 | self.tableWidget.setColumnCount(5) 34 | __qtablewidgetitem = QTableWidgetItem() 35 | self.tableWidget.setHorizontalHeaderItem(0, __qtablewidgetitem) 36 | __qtablewidgetitem1 = QTableWidgetItem() 37 | self.tableWidget.setHorizontalHeaderItem(1, __qtablewidgetitem1) 38 | __qtablewidgetitem2 = QTableWidgetItem() 39 | self.tableWidget.setHorizontalHeaderItem(2, __qtablewidgetitem2) 40 | __qtablewidgetitem3 = QTableWidgetItem() 41 | self.tableWidget.setHorizontalHeaderItem(3, __qtablewidgetitem3) 42 | __qtablewidgetitem4 = QTableWidgetItem() 43 | self.tableWidget.setHorizontalHeaderItem(4, __qtablewidgetitem4) 44 | self.tableWidget.setObjectName(u"tableWidget") 45 | self.tableWidget.setGeometry(QRect(50, 50, 701, 441)) 46 | self.tableWidget.setEditTriggers(QAbstractItemView.NoEditTriggers) 47 | self.pushButton = QPushButton(self.centralwidget) 48 | self.pushButton.setObjectName(u"pushButton") 49 | self.pushButton.setGeometry(QRect(50, 510, 101, 31)) 50 | font = QFont() 51 | font.setPointSize(11) 52 | self.pushButton.setFont(font) 53 | MainWindow.setCentralWidget(self.centralwidget) 54 | self.menubar = QMenuBar(MainWindow) 55 | self.menubar.setObjectName(u"menubar") 56 | self.menubar.setGeometry(QRect(0, 0, 800, 22)) 57 | MainWindow.setMenuBar(self.menubar) 58 | self.statusbar = QStatusBar(MainWindow) 59 | self.statusbar.setObjectName(u"statusbar") 60 | MainWindow.setStatusBar(self.statusbar) 61 | 62 | self.retranslateUi(MainWindow) 63 | 64 | QMetaObject.connectSlotsByName(MainWindow) 65 | # setupUi 66 | 67 | def retranslateUi(self, MainWindow): 68 | MainWindow.setWindowTitle(QCoreApplication.translate("MainWindow", u"\u9009\u62e9\u6570\u636e\u96c6", None)) 69 | ___qtablewidgetitem = self.tableWidget.horizontalHeaderItem(0) 70 | ___qtablewidgetitem.setText(QCoreApplication.translate("MainWindow", u"\u6570\u636e\u96c6\u540d", None)); 71 | ___qtablewidgetitem1 = self.tableWidget.horizontalHeaderItem(1) 72 | ___qtablewidgetitem1.setText(QCoreApplication.translate("MainWindow", u"\u521b\u5efa\u65f6\u95f4", None)); 73 | ___qtablewidgetitem2 = self.tableWidget.horizontalHeaderItem(2) 74 | ___qtablewidgetitem2.setText(QCoreApplication.translate("MainWindow", u"\u4e0a\u6b21\u4f7f\u7528\u65f6\u95f4", None)); 75 | ___qtablewidgetitem3 = self.tableWidget.horizontalHeaderItem(3) 76 | ___qtablewidgetitem3.setText(QCoreApplication.translate("MainWindow", u"\u5907\u6ce8", None)); 77 | ___qtablewidgetitem4 = self.tableWidget.horizontalHeaderItem(4) 78 | ___qtablewidgetitem4.setText(QCoreApplication.translate("MainWindow", u"\u64cd\u4f5c", None)); 79 | self.pushButton.setText(QCoreApplication.translate("MainWindow", u"\u6dfb\u52a0\u6570\u636e\u96c6", None)) 80 | # retranslateUi 81 | 82 | -------------------------------------------------------------------------------- /ui/pyuic/ui_select_file_long_wav.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | ################################################################################ 4 | ## Form generated from reading UI file 'select_file_long_wav.ui' 5 | ## 6 | ## Created by: Qt User Interface Compiler version 6.4.2 7 | ## 8 | ## WARNING! All changes made in this file will be lost when recompiling UI file! 9 | ################################################################################ 10 | 11 | from PySide6.QtCore import (QCoreApplication, QDate, QDateTime, QLocale, 12 | QMetaObject, QObject, QPoint, QRect, 13 | QSize, QTime, QUrl, Qt) 14 | from PySide6.QtGui import (QBrush, QColor, QConicalGradient, QCursor, 15 | QFont, QFontDatabase, QGradient, QIcon, 16 | QImage, QKeySequence, QLinearGradient, QPainter, 17 | QPalette, QPixmap, QRadialGradient, QTransform) 18 | from PySide6.QtWidgets import (QApplication, QDialog, QLabel, QLineEdit, 19 | QPushButton, QSizePolicy, QWidget) 20 | 21 | class Ui_select_file_long_wav_Dialog(object): 22 | def setupUi(self, select_file_long_wav_Dialog): 23 | if not select_file_long_wav_Dialog.objectName(): 24 | select_file_long_wav_Dialog.setObjectName(u"select_file_long_wav_Dialog") 25 | select_file_long_wav_Dialog.resize(600, 250) 26 | select_file_long_wav_Dialog.setMinimumSize(QSize(600, 250)) 27 | select_file_long_wav_Dialog.setMaximumSize(QSize(600, 250)) 28 | font = QFont() 29 | font.setPointSize(12) 30 | select_file_long_wav_Dialog.setFont(font) 31 | self.lineEdit_wav = QLineEdit(select_file_long_wav_Dialog) 32 | self.lineEdit_wav.setObjectName(u"lineEdit_wav") 33 | self.lineEdit_wav.setGeometry(QRect(110, 70, 371, 21)) 34 | self.label = QLabel(select_file_long_wav_Dialog) 35 | self.label.setObjectName(u"label") 36 | self.label.setGeometry(QRect(20, 21, 341, 20)) 37 | self.label_2 = QLabel(select_file_long_wav_Dialog) 38 | self.label_2.setObjectName(u"label_2") 39 | self.label_2.setGeometry(QRect(30, 70, 81, 16)) 40 | self.pushButton_select_wav = QPushButton(select_file_long_wav_Dialog) 41 | self.pushButton_select_wav.setObjectName(u"pushButton_select_wav") 42 | self.pushButton_select_wav.setGeometry(QRect(500, 69, 81, 23)) 43 | self.pushButton_back = QPushButton(select_file_long_wav_Dialog) 44 | self.pushButton_back.setObjectName(u"pushButton_back") 45 | self.pushButton_back.setGeometry(QRect(500, 200, 81, 24)) 46 | self.pushButton_submit = QPushButton(select_file_long_wav_Dialog) 47 | self.pushButton_submit.setObjectName(u"pushButton_submit") 48 | self.pushButton_submit.setGeometry(QRect(390, 200, 81, 24)) 49 | self.error_lable = QLabel(select_file_long_wav_Dialog) 50 | self.error_lable.setObjectName(u"error_lable") 51 | self.error_lable.setGeometry(QRect(30, 170, 541, 16)) 52 | self.error_lable.setFont(font) 53 | self.error_lable.setStyleSheet(u"color: red;") 54 | self.lineEdit_spk = QLineEdit(select_file_long_wav_Dialog) 55 | self.lineEdit_spk.setObjectName(u"lineEdit_spk") 56 | self.lineEdit_spk.setGeometry(QRect(110, 100, 371, 21)) 57 | self.label_4 = QLabel(select_file_long_wav_Dialog) 58 | self.label_4.setObjectName(u"label_4") 59 | self.label_4.setGeometry(QRect(30, 100, 81, 16)) 60 | self.label_5 = QLabel(select_file_long_wav_Dialog) 61 | self.label_5.setObjectName(u"label_5") 62 | self.label_5.setGeometry(QRect(30, 130, 141, 16)) 63 | self.lineEdit_min_silence_len = QLineEdit(select_file_long_wav_Dialog) 64 | self.lineEdit_min_silence_len.setObjectName(u"lineEdit_min_silence_len") 65 | self.lineEdit_min_silence_len.setGeometry(QRect(170, 130, 101, 21)) 66 | self.lineEdit_non_silence_thresh = QLineEdit(select_file_long_wav_Dialog) 67 | self.lineEdit_non_silence_thresh.setObjectName(u"lineEdit_non_silence_thresh") 68 | self.lineEdit_non_silence_thresh.setGeometry(QRect(430, 130, 101, 21)) 69 | self.label_6 = QLabel(select_file_long_wav_Dialog) 70 | self.label_6.setObjectName(u"label_6") 71 | self.label_6.setGeometry(QRect(290, 130, 131, 16)) 72 | 73 | self.retranslateUi(select_file_long_wav_Dialog) 74 | 75 | QMetaObject.connectSlotsByName(select_file_long_wav_Dialog) 76 | # setupUi 77 | 78 | def retranslateUi(self, select_file_long_wav_Dialog): 79 | select_file_long_wav_Dialog.setWindowTitle(QCoreApplication.translate("select_file_long_wav_Dialog", u"\u5bfc\u5165\u6587\u4ef6", None)) 80 | self.lineEdit_wav.setText("") 81 | self.label.setText(QCoreApplication.translate("select_file_long_wav_Dialog", u"\u8bf7\u9009\u62e9\u4e00\u4e2a\u97f3\u9891\u6587\u4ef6\u548c\u5b83\u5bf9\u5e94\u7684SRT\u5b57\u5e55\u6587\u4ef6", None)) 82 | self.label_2.setText(QCoreApplication.translate("select_file_long_wav_Dialog", u"\u97f3\u9891\u6587\u4ef6\uff1a", None)) 83 | self.pushButton_select_wav.setText(QCoreApplication.translate("select_file_long_wav_Dialog", u"\u9009\u62e9\u6587\u4ef6", None)) 84 | self.pushButton_back.setText(QCoreApplication.translate("select_file_long_wav_Dialog", u"\u53d6\u6d88", None)) 85 | self.pushButton_submit.setText(QCoreApplication.translate("select_file_long_wav_Dialog", u"\u786e\u5b9a", None)) 86 | self.error_lable.setText("") 87 | self.lineEdit_spk.setText("") 88 | self.label_4.setText(QCoreApplication.translate("select_file_long_wav_Dialog", u"\u53d1\u97f3\u4eba\uff1a", None)) 89 | self.label_5.setText(QCoreApplication.translate("select_file_long_wav_Dialog", u"\u6700\u77ed\u9759\u97f3\u957f\u5ea6(ms)\uff1a", None)) 90 | self.lineEdit_min_silence_len.setText("") 91 | self.lineEdit_non_silence_thresh.setText("") 92 | self.label_6.setText(QCoreApplication.translate("select_file_long_wav_Dialog", u"\u9759\u97f3\u9608\u503c(dBFS)\uff1a", None)) 93 | # retranslateUi 94 | 95 | -------------------------------------------------------------------------------- /ui/pyuic/ui_select_file_wav_srt.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | ################################################################################ 4 | ## Form generated from reading UI file 'select_file_wav_srt.ui' 5 | ## 6 | ## Created by: Qt User Interface Compiler version 6.4.2 7 | ## 8 | ## WARNING! All changes made in this file will be lost when recompiling UI file! 9 | ################################################################################ 10 | 11 | from PySide6.QtCore import (QCoreApplication, QDate, QDateTime, QLocale, 12 | QMetaObject, QObject, QPoint, QRect, 13 | QSize, QTime, QUrl, Qt) 14 | from PySide6.QtGui import (QBrush, QColor, QConicalGradient, QCursor, 15 | QFont, QFontDatabase, QGradient, QIcon, 16 | QImage, QKeySequence, QLinearGradient, QPainter, 17 | QPalette, QPixmap, QRadialGradient, QTransform) 18 | from PySide6.QtWidgets import (QApplication, QCheckBox, QDialog, QLabel, 19 | QLineEdit, QPushButton, QSizePolicy, QWidget) 20 | 21 | class Ui_select_file_wav_srt_Dialog(object): 22 | def setupUi(self, select_file_wav_srt_Dialog): 23 | if not select_file_wav_srt_Dialog.objectName(): 24 | select_file_wav_srt_Dialog.setObjectName(u"select_file_wav_srt_Dialog") 25 | select_file_wav_srt_Dialog.resize(600, 300) 26 | select_file_wav_srt_Dialog.setMinimumSize(QSize(600, 300)) 27 | select_file_wav_srt_Dialog.setMaximumSize(QSize(600, 300)) 28 | font = QFont() 29 | font.setPointSize(12) 30 | select_file_wav_srt_Dialog.setFont(font) 31 | self.lineEdit_wav = QLineEdit(select_file_wav_srt_Dialog) 32 | self.lineEdit_wav.setObjectName(u"lineEdit_wav") 33 | self.lineEdit_wav.setGeometry(QRect(110, 70, 371, 21)) 34 | self.label = QLabel(select_file_wav_srt_Dialog) 35 | self.label.setObjectName(u"label") 36 | self.label.setGeometry(QRect(20, 21, 341, 20)) 37 | self.label_2 = QLabel(select_file_wav_srt_Dialog) 38 | self.label_2.setObjectName(u"label_2") 39 | self.label_2.setGeometry(QRect(30, 70, 81, 16)) 40 | self.lineEdit_srt = QLineEdit(select_file_wav_srt_Dialog) 41 | self.lineEdit_srt.setObjectName(u"lineEdit_srt") 42 | self.lineEdit_srt.setGeometry(QRect(110, 100, 371, 21)) 43 | self.label_3 = QLabel(select_file_wav_srt_Dialog) 44 | self.label_3.setObjectName(u"label_3") 45 | self.label_3.setGeometry(QRect(30, 100, 81, 16)) 46 | self.pushButton_select_wav = QPushButton(select_file_wav_srt_Dialog) 47 | self.pushButton_select_wav.setObjectName(u"pushButton_select_wav") 48 | self.pushButton_select_wav.setGeometry(QRect(500, 69, 81, 23)) 49 | self.pushButton_select_srt = QPushButton(select_file_wav_srt_Dialog) 50 | self.pushButton_select_srt.setObjectName(u"pushButton_select_srt") 51 | self.pushButton_select_srt.setGeometry(QRect(500, 99, 81, 23)) 52 | self.pushButton_back = QPushButton(select_file_wav_srt_Dialog) 53 | self.pushButton_back.setObjectName(u"pushButton_back") 54 | self.pushButton_back.setGeometry(QRect(500, 210, 81, 24)) 55 | self.pushButton_submit = QPushButton(select_file_wav_srt_Dialog) 56 | self.pushButton_submit.setObjectName(u"pushButton_submit") 57 | self.pushButton_submit.setGeometry(QRect(390, 210, 81, 24)) 58 | self.error_lable = QLabel(select_file_wav_srt_Dialog) 59 | self.error_lable.setObjectName(u"error_lable") 60 | self.error_lable.setGeometry(QRect(30, 190, 541, 16)) 61 | self.error_lable.setFont(font) 62 | self.error_lable.setStyleSheet(u"color: red;") 63 | self.lineEdit_spk = QLineEdit(select_file_wav_srt_Dialog) 64 | self.lineEdit_spk.setObjectName(u"lineEdit_spk") 65 | self.lineEdit_spk.setGeometry(QRect(110, 130, 371, 21)) 66 | self.label_4 = QLabel(select_file_wav_srt_Dialog) 67 | self.label_4.setObjectName(u"label_4") 68 | self.label_4.setGeometry(QRect(30, 130, 81, 16)) 69 | self.checkBox_ismerge = QCheckBox(select_file_wav_srt_Dialog) 70 | self.checkBox_ismerge.setObjectName(u"checkBox_ismerge") 71 | self.checkBox_ismerge.setGeometry(QRect(30, 160, 421, 20)) 72 | 73 | self.retranslateUi(select_file_wav_srt_Dialog) 74 | 75 | QMetaObject.connectSlotsByName(select_file_wav_srt_Dialog) 76 | # setupUi 77 | 78 | def retranslateUi(self, select_file_wav_srt_Dialog): 79 | select_file_wav_srt_Dialog.setWindowTitle(QCoreApplication.translate("select_file_wav_srt_Dialog", u"\u5bfc\u5165\u6587\u4ef6", None)) 80 | self.lineEdit_wav.setText("") 81 | self.label.setText(QCoreApplication.translate("select_file_wav_srt_Dialog", u"\u8bf7\u9009\u62e9\u4e00\u4e2a\u97f3\u9891\u6587\u4ef6\u548c\u5b83\u5bf9\u5e94\u7684SRT\u5b57\u5e55\u6587\u4ef6", None)) 82 | self.label_2.setText(QCoreApplication.translate("select_file_wav_srt_Dialog", u"\u97f3\u9891\u6587\u4ef6\uff1a", None)) 83 | self.lineEdit_srt.setText("") 84 | self.label_3.setText(QCoreApplication.translate("select_file_wav_srt_Dialog", u"\u5b57\u5e55\u6587\u4ef6\uff1a", None)) 85 | self.pushButton_select_wav.setText(QCoreApplication.translate("select_file_wav_srt_Dialog", u"\u9009\u62e9\u6587\u4ef6", None)) 86 | self.pushButton_select_srt.setText(QCoreApplication.translate("select_file_wav_srt_Dialog", u"\u9009\u62e9\u6587\u4ef6", None)) 87 | self.pushButton_back.setText(QCoreApplication.translate("select_file_wav_srt_Dialog", u"\u53d6\u6d88", None)) 88 | self.pushButton_submit.setText(QCoreApplication.translate("select_file_wav_srt_Dialog", u"\u786e\u5b9a", None)) 89 | self.error_lable.setText("") 90 | self.lineEdit_spk.setText("") 91 | self.label_4.setText(QCoreApplication.translate("select_file_wav_srt_Dialog", u"\u53d1\u97f3\u4eba\uff1a", None)) 92 | self.checkBox_ismerge.setText(QCoreApplication.translate("select_file_wav_srt_Dialog", u"\u81ea\u52a8\u5c06\u76f8\u79bb\u8fc7\u8fd1\u7684\u5b57\u5e55\u5408\u4e3a\u4e00\u4e2a\uff08\u526a\u6620\u5b57\u5e55\u5efa\u8bae\u52fe\u9009\uff09", None)) 93 | # retranslateUi 94 | 95 | -------------------------------------------------------------------------------- /ui/pyuic/ui_select_workspace.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | ################################################################################ 4 | ## Form generated from reading UI file 'select_workspace.ui' 5 | ## 6 | ## Created by: Qt User Interface Compiler version 6.4.2 7 | ## 8 | ## WARNING! All changes made in this file will be lost when recompiling UI file! 9 | ################################################################################ 10 | 11 | from PySide6.QtCore import (QCoreApplication, QDate, QDateTime, QLocale, 12 | QMetaObject, QObject, QPoint, QRect, 13 | QSize, QTime, QUrl, Qt) 14 | from PySide6.QtGui import (QBrush, QColor, QConicalGradient, QCursor, 15 | QFont, QFontDatabase, QGradient, QIcon, 16 | QImage, QKeySequence, QLinearGradient, QPainter, 17 | QPalette, QPixmap, QRadialGradient, QTransform) 18 | from PySide6.QtWidgets import (QApplication, QLabel, QLineEdit, QPushButton, 19 | QSizePolicy, QWidget) 20 | 21 | class Ui_Form(object): 22 | def setupUi(self, Form): 23 | if not Form.objectName(): 24 | Form.setObjectName(u"Form") 25 | Form.resize(400, 200) 26 | Form.setMinimumSize(QSize(400, 200)) 27 | Form.setMaximumSize(QSize(400, 200)) 28 | self.pushButton = QPushButton(Form) 29 | self.pushButton.setObjectName(u"pushButton") 30 | self.pushButton.setGeometry(QRect(280, 150, 100, 30)) 31 | self.pushButton_2 = QPushButton(Form) 32 | self.pushButton_2.setObjectName(u"pushButton_2") 33 | self.pushButton_2.setGeometry(QRect(160, 150, 100, 30)) 34 | self.lineEdit = QLineEdit(Form) 35 | self.lineEdit.setObjectName(u"lineEdit") 36 | self.lineEdit.setGeometry(QRect(80, 60, 291, 21)) 37 | font = QFont() 38 | font.setPointSize(10) 39 | self.lineEdit.setFont(font) 40 | self.label = QLabel(Form) 41 | self.label.setObjectName(u"label") 42 | self.label.setGeometry(QRect(30, 60, 53, 21)) 43 | self.label.setFont(font) 44 | 45 | self.retranslateUi(Form) 46 | self.pushButton.clicked.connect(Form.close_program) 47 | self.pushButton_2.clicked.connect(Form.get_workspace) 48 | 49 | QMetaObject.connectSlotsByName(Form) 50 | # setupUi 51 | 52 | def retranslateUi(self, Form): 53 | Form.setWindowTitle(QCoreApplication.translate("Form", u"\u9009\u62e9\u5de5\u4f5c\u533a", None)) 54 | self.pushButton.setText(QCoreApplication.translate("Form", u"\u9000\u51fa", None)) 55 | self.pushButton_2.setText(QCoreApplication.translate("Form", u"\u786e\u5b9a", None)) 56 | self.lineEdit.setPlaceholderText(QCoreApplication.translate("Form", u"\u8bf7\u5728\u8fd9\u91cc\u8f93\u5165\u5de5\u4f5c\u533a\u8def\u5f84\uff0c\u652f\u6301\u76f8\u5bf9\u8def\u5f84", None)) 57 | self.label.setText(QCoreApplication.translate("Form", u"\u5de5\u4f5c\u533a\uff1a", None)) 58 | # retranslateUi 59 | 60 | -------------------------------------------------------------------------------- /ui/uifiles/add_authorizationinfo.ui: -------------------------------------------------------------------------------- 1 | 2 | 3 | AddAuthenticationDialog 4 | 5 | 6 | 7 | 0 8 | 0 9 | 400 10 | 500 11 | 12 | 13 | 14 | 15 | 12 16 | 17 | 18 | 19 | 添加授权信息 20 | 21 | 22 | 23 | 24 | 20 25 | 20 26 | 181 27 | 21 28 | 29 | 30 | 31 | 名称 32 | 33 | 34 | 35 | 36 | 37 | 20 38 | 50 39 | 351 40 | 21 41 | 42 | 43 | 44 | 45 | 46 | 47 | 20 48 | 90 49 | 191 50 | 21 51 | 52 | 53 | 54 | APPID 55 | 56 | 57 | 58 | 59 | 60 | 20 61 | 160 62 | 201 63 | 21 64 | 65 | 66 | 67 | APISecret(client_secret) 68 | 69 | 70 | 71 | 72 | 73 | 20 74 | 230 75 | 141 76 | 21 77 | 78 | 79 | 80 | APIKey(client_id) 81 | 82 | 83 | 84 | 85 | 86 | 20 87 | 120 88 | 351 89 | 21 90 | 91 | 92 | 93 | 94 | 95 | 96 | 20 97 | 190 98 | 351 99 | 21 100 | 101 | 102 | 103 | 104 | 105 | 106 | 20 107 | 260 108 | 351 109 | 21 110 | 111 | 112 | 113 | 114 | 115 | 116 | 20 117 | 390 118 | 351 119 | 21 120 | 121 | 122 | 123 | color: red; 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 264 133 | 440 134 | 111 135 | 24 136 | 137 | 138 | 139 | 取消 140 | 141 | 142 | 143 | 144 | 145 | 130 146 | 440 147 | 111 148 | 24 149 | 150 | 151 | 152 | 提交 153 | 154 | 155 | 156 | 157 | 158 | 20 159 | 330 160 | 111 161 | 22 162 | 163 | 164 | 165 | 166 | 167 | 168 | 20 169 | 300 170 | 141 171 | 21 172 | 173 | 174 | 175 | 应用类型 176 | 177 | 178 | 179 | 180 | 181 | 182 | -------------------------------------------------------------------------------- /ui/uifiles/add_dataset.ui: -------------------------------------------------------------------------------- 1 | 2 | 3 | Dialog 4 | 5 | 6 | 7 | 0 8 | 0 9 | 400 10 | 300 11 | 12 | 13 | 14 | 15 | 400 16 | 300 17 | 18 | 19 | 20 | 21 | 400 22 | 300 23 | 24 | 25 | 26 | 添加数据集 27 | 28 | 29 | 30 | 31 | 30 32 | 240 33 | 341 34 | 51 35 | 36 | 37 | 38 | Qt::Horizontal 39 | 40 | 41 | QDialogButtonBox::Cancel|QDialogButtonBox::Ok 42 | 43 | 44 | 45 | 46 | 47 | 20 48 | 20 49 | 91 50 | 16 51 | 52 | 53 | 54 | 55 | 12 56 | 57 | 58 | 59 | 数据集名称: 60 | 61 | 62 | 63 | 64 | 65 | 20 66 | 50 67 | 91 68 | 16 69 | 70 | 71 | 72 | 73 | 12 74 | 75 | 76 | 77 | 数据集简介: 78 | 79 | 80 | 81 | 82 | 83 | 120 84 | 18 85 | 251 86 | 23 87 | 88 | 89 | 90 | 91 | 12 92 | 93 | 94 | 95 | padding: 0px; 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 120 105 | 50 106 | 251 107 | 181 108 | 109 | 110 | 111 | 112 | 12 113 | 114 | 115 | 116 | <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> 117 | <html><head><meta name="qrichtext" content="1" /><meta charset="utf-8" /><style type="text/css"> 118 | p, li { white-space: pre-wrap; } 119 | hr { height: 1px; border-width: 0; } 120 | li.unchecked::marker { content: "\2610"; } 121 | li.checked::marker { content: "\2612"; } 122 | </style></head><body style=" font-family:'Microsoft YaHei UI'; font-size:12pt; font-weight:400; font-style:normal;"> 123 | <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html> 124 | 125 | 126 | 127 | 128 | 129 | 20 130 | 248 131 | 191 132 | 31 133 | 134 | 135 | 136 | 137 | 12 138 | 139 | 140 | 141 | color:red 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | buttonBox 152 | rejected() 153 | Dialog 154 | reject() 155 | 156 | 157 | 316 158 | 260 159 | 160 | 161 | 286 162 | 274 163 | 164 | 165 | 166 | 167 | 168 | -------------------------------------------------------------------------------- /ui/uifiles/add_voice.ui: -------------------------------------------------------------------------------- 1 | 2 | 3 | MainWindow 4 | 5 | 6 | 7 | 0 8 | 0 9 | 800 10 | 600 11 | 12 | 13 | 14 | 为数据集添加音频 15 | 16 | 17 | 18 | 19 | 20 | 20 21 | 40 22 | 761 23 | 501 24 | 25 | 26 | 27 | 0 28 | 29 | 30 | 31 | 音频+字幕 32 | 33 | 34 | 35 | 36 | 只有音频 37 | 38 | 39 | 40 | 41 | 110 42 | 60 43 | 53 44 | 16 45 | 46 | 47 | 48 | todo... 49 | 50 | 51 | 52 | 53 | 54 | 其他 55 | 56 | 57 | 58 | 59 | 80 60 | 60 61 | 53 62 | 16 63 | 64 | 65 | 66 | todo... 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 20 75 | 10 76 | 371 77 | 20 78 | 79 | 80 | 81 | 82 | 12 83 | 84 | 85 | 86 | 选择不同的添加音频方式 87 | 88 | 89 | 90 | 91 | 92 | 93 | 0 94 | 0 95 | 800 96 | 22 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | -------------------------------------------------------------------------------- /ui/uifiles/biaobei_pingce.ui: -------------------------------------------------------------------------------- 1 | 2 | 3 | BiaobeiPingceDialog 4 | 5 | 6 | 7 | 0 8 | 0 9 | 400 10 | 300 11 | 12 | 13 | 14 | 15 | 12 16 | 17 | 18 | 19 | 标贝语音评测 20 | 21 | 22 | 23 | 24 | 30 25 | 30 26 | 221 27 | 20 28 | 29 | 30 | 31 | 只对未打分的数据进行评测 32 | 33 | 34 | 35 | 36 | 37 | 30 38 | 60 39 | 281 40 | 20 41 | 42 | 43 | 44 | 只对支持的数据进行评测(纯中文) 45 | 46 | 47 | true 48 | 49 | 50 | true 51 | 52 | 53 | 54 | 55 | 56 | 310 57 | 260 58 | 75 59 | 24 60 | 61 | 62 | 63 | 取消 64 | 65 | 66 | 67 | 68 | 69 | 220 70 | 260 71 | 75 72 | 24 73 | 74 | 75 | 76 | 确定 77 | 78 | 79 | 80 | 81 | 82 | 160 83 | 90 84 | 131 85 | 22 86 | 87 | 88 | 89 | 90 | 91 | 92 | 30 93 | 90 94 | 111 95 | 16 96 | 97 | 98 | 99 | 选择授权信息: 100 | 101 | 102 | 103 | 104 | 105 | 30 106 | 230 107 | 351 108 | 16 109 | 110 | 111 | 112 | color:red 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | -------------------------------------------------------------------------------- /ui/uifiles/dataset_view.ui: -------------------------------------------------------------------------------- 1 | 2 | 3 | DatasetMainWindow 4 | 5 | 6 | 7 | 0 8 | 0 9 | 1200 10 | 800 11 | 12 | 13 | 14 | 15 | 1200 16 | 800 17 | 18 | 19 | 20 | 21 | 1200 22 | 800 23 | 24 | 25 | 26 | 数据集 27 | 28 | 29 | 30 | 31 | 32 | 10 33 | 10 34 | 1181 35 | 681 36 | 37 | 38 | 39 | 40 | 12 41 | 42 | 43 | 44 | 0 45 | 46 | 47 | 48 | 数据集概览 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 10 57 | 10 58 | 1141 59 | 421 60 | 61 | 62 | 63 | 64 | 12 65 | 66 | 67 | 68 | QAbstractItemView::NoEditTriggers 69 | 70 | 71 | false 72 | 73 | 74 | 20 75 | 76 | 77 | 78 | 新建行 79 | 80 | 81 | 82 | 83 | 新建行 84 | 85 | 86 | 87 | 88 | 新建行 89 | 90 | 91 | 92 | 93 | 新建行 94 | 95 | 96 | 97 | 98 | 新建行 99 | 100 | 101 | 102 | 103 | 新建行 104 | 105 | 106 | 107 | 108 | 新建行 109 | 110 | 111 | 112 | 113 | 新建行 114 | 115 | 116 | 117 | 118 | 新建行 119 | 120 | 121 | 122 | 123 | 新建行 124 | 125 | 126 | 127 | 128 | 序号 129 | 130 | 131 | 132 | 133 | 标注文本 134 | 135 | 136 | 137 | 138 | 发音人 139 | 140 | 141 | 142 | 143 | 标签 144 | 145 | 146 | 147 | 148 | 操作 149 | 150 | 151 | 152 | 153 | 154 | 155 | 10 156 | 440 157 | 201 158 | 31 159 | 160 | 161 | 162 | 163 | 10 164 | 165 | 166 | 167 | 168 | 169 | 170 | 230 171 | 440 172 | 231 173 | 31 174 | 175 | 176 | 177 | 从文件导入(音频+字幕) 178 | 179 | 180 | 181 | 182 | 183 | 920 184 | 440 185 | 231 186 | 31 187 | 188 | 189 | 190 | 导出数据集(单发音人) 191 | 192 | 193 | 194 | 195 | 196 | 230 197 | 490 198 | 231 199 | 31 200 | 201 | 202 | 203 | 从文件导入(长音频) 204 | 205 | 206 | 207 | 208 | 209 | 580 210 | 440 211 | 231 212 | 31 213 | 214 | 215 | 216 | 根据源音频删除数据 217 | 218 | 219 | 220 | 221 | 222 | 223 | 224 | 225 | 数据处理 226 | 227 | 228 | 229 | 230 | 231 | 232 | 233 | 20 234 | 20 235 | 211 236 | 51 237 | 238 | 239 | 240 | 标贝语音评测 241 | 242 | 243 | 244 | 245 | 246 | 247 | 248 | 249 | 软件设置 250 | 251 | 252 | 253 | 254 | 20 255 | 10 256 | 271 257 | 21 258 | 259 | 260 | 261 | 262 | 12 263 | 264 | 265 | 266 | 注意:本页设置在本工作区下通用 267 | 268 | 269 | 270 | 271 | 272 | 20 273 | 50 274 | 1141 275 | 601 276 | 277 | 278 | 279 | 0 280 | 281 | 282 | 283 | 授权管理 284 | 285 | 286 | 287 | 288 | 10 289 | 10 290 | 1111 291 | 271 292 | 293 | 294 | 295 | 标贝 296 | 297 | 298 | 299 | 300 | 20 301 | 20 302 | 961 303 | 231 304 | 305 | 306 | 307 | QAbstractItemView::NoEditTriggers 308 | 309 | 310 | false 311 | 312 | 313 | 314 | id 315 | 316 | 317 | 318 | 319 | 名称 320 | 321 | 322 | 323 | 324 | APP类型 325 | 326 | 327 | 328 | 329 | APPID 330 | 331 | 332 | 333 | 334 | APISecret(client_secret) 335 | 336 | 337 | 338 | 339 | APIKey(client_id) 340 | 341 | 342 | 343 | 344 | 345 | 346 | 990 347 | 20 348 | 111 349 | 41 350 | 351 | 352 | 353 | 添加 354 | 355 | 356 | 357 | 358 | 359 | 360 | 10 361 | 290 362 | 1111 363 | 271 364 | 365 | 366 | 367 | 讯飞 368 | 369 | 370 | 371 | 372 | 990 373 | 20 374 | 111 375 | 41 376 | 377 | 378 | 379 | 添加 380 | 381 | 382 | 383 | 384 | 385 | 20 386 | 20 387 | 961 388 | 231 389 | 390 | 391 | 392 | QAbstractItemView::NoEditTriggers 393 | 394 | 395 | false 396 | 397 | 398 | 399 | id 400 | 401 | 402 | 403 | 404 | 名称 405 | 406 | 407 | 408 | 409 | APP类型 410 | 411 | 412 | 413 | 414 | APPID 415 | 416 | 417 | 418 | 419 | APISecret(client_secret) 420 | 421 | 422 | 423 | 424 | APIKey(client_id) 425 | 426 | 427 | 428 | 429 | 430 | 431 | 432 | 全局设置 433 | 434 | 435 | 436 | 437 | 438 | 439 | 440 | 441 | 442 | 0 443 | 0 444 | 1200 445 | 22 446 | 447 | 448 | 449 | 450 | 451 | 452 | 453 | 454 | -------------------------------------------------------------------------------- /ui/uifiles/del_info_wav.ui: -------------------------------------------------------------------------------- 1 | 2 | 3 | del_info_wav_Dialog 4 | 5 | 6 | 7 | 0 8 | 0 9 | 600 10 | 250 11 | 12 | 13 | 14 | 15 | 600 16 | 250 17 | 18 | 19 | 20 | 21 | 600 22 | 250 23 | 24 | 25 | 26 | 27 | 12 28 | 29 | 30 | 31 | 删除数据 32 | 33 | 34 | 35 | 36 | 20 37 | 21 38 | 561 39 | 20 40 | 41 | 42 | 43 | 选择一个之前导入的音频文件,删除与此文件关联的数据 44 | 45 | 46 | 47 | 48 | 49 | 30 50 | 70 51 | 81 52 | 16 53 | 54 | 55 | 56 | 音频文件: 57 | 58 | 59 | 60 | 61 | 62 | 500 63 | 200 64 | 81 65 | 24 66 | 67 | 68 | 69 | 取消 70 | 71 | 72 | 73 | 74 | 75 | 390 76 | 200 77 | 81 78 | 24 79 | 80 | 81 | 82 | 确定 83 | 84 | 85 | 86 | 87 | 88 | 30 89 | 170 90 | 541 91 | 16 92 | 93 | 94 | 95 | 96 | 12 97 | 98 | 99 | 100 | color: red; 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 130 110 | 70 111 | 381 112 | 22 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | -------------------------------------------------------------------------------- /ui/uifiles/edit_info.ui: -------------------------------------------------------------------------------- 1 | 2 | 3 | EditInfoDialog 4 | 5 | 6 | 7 | 0 8 | 0 9 | 400 10 | 300 11 | 12 | 13 | 14 | 15 | 12 16 | 17 | 18 | 19 | 数据编辑 20 | 21 | 22 | 23 | 24 | 20 25 | 20 26 | 111 27 | 20 28 | 29 | 30 | 31 | 数据id: 32 | 33 | 34 | 35 | 36 | 37 | 150 38 | 20 39 | 111 40 | 20 41 | 42 | 43 | 44 | 数据id 45 | 46 | 47 | 48 | 49 | 50 | 20 51 | 50 52 | 111 53 | 20 54 | 55 | 56 | 57 | 标注文本: 58 | 59 | 60 | 61 | 62 | 63 | 150 64 | 50 65 | 231 66 | 21 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 20 77 | 80 78 | 111 79 | 20 80 | 81 | 82 | 83 | 发音人: 84 | 85 | 86 | 87 | 88 | 89 | 320 90 | 260 91 | 75 92 | 24 93 | 94 | 95 | 96 | 取消 97 | 98 | 99 | 100 | 101 | 102 | 230 103 | 260 104 | 75 105 | 24 106 | 107 | 108 | 109 | 确定 110 | 111 | 112 | 113 | 114 | 115 | 150 116 | 80 117 | 231 118 | 20 119 | 120 | 121 | 122 | 数据id 123 | 124 | 125 | 126 | 127 | 128 | 20 129 | 110 130 | 121 131 | 20 132 | 133 | 134 | 135 | 开始时间(ms): 136 | 137 | 138 | 139 | 140 | 141 | 20 142 | 140 143 | 121 144 | 20 145 | 146 | 147 | 148 | 结束时间(ms): 149 | 150 | 151 | 152 | 153 | 154 | 150 155 | 110 156 | 231 157 | 21 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 150 168 | 140 169 | 231 170 | 21 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | 181 | -------------------------------------------------------------------------------- /ui/uifiles/output_dataset_speaker.ui: -------------------------------------------------------------------------------- 1 | 2 | 3 | OutPutSpeakerDialog 4 | 5 | 6 | 7 | 0 8 | 0 9 | 540 10 | 581 11 | 12 | 13 | 14 | 15 | 12 16 | 17 | 18 | 19 | 导出数据集 20 | 21 | 22 | 23 | 24 | 20 25 | 10 26 | 511 27 | 371 28 | 29 | 30 | 31 | 0 32 | 33 | 34 | 35 | 36 | 37 | 20 38 | 131 39 | 131 40 | 16 41 | 42 | 43 | 44 | 添加音频文件前缀 45 | 46 | 47 | 48 | 49 | 50 | 290 51 | 170 52 | 191 53 | 21 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 290 64 | 90 65 | 191 66 | 22 67 | 68 | 69 | 70 | 71 | 72 | 73 | 20 74 | 171 75 | 131 76 | 16 77 | 78 | 79 | 80 | 音频文件采样率 81 | 82 | 83 | 84 | 85 | 86 | 20 87 | 90 88 | 221 89 | 20 90 | 91 | 92 | 93 | 输出文件层级和标注文件格式 94 | 95 | 96 | 97 | 98 | 99 | 290 100 | 130 101 | 191 102 | 21 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 20 113 | 250 114 | 131 115 | 16 116 | 117 | 118 | 119 | 发音人 120 | 121 | 122 | 123 | 124 | 125 | 290 126 | 250 127 | 191 128 | 22 129 | 130 | 131 | 132 | 133 | 134 | 135 | 10 136 | 10 137 | 491 138 | 71 139 | 140 | 141 | 142 | 预设 143 | 144 | 145 | 146 | 147 | 280 148 | 30 149 | 111 150 | 24 151 | 152 | 153 | 154 | 155 | 12 156 | 157 | 158 | 159 | 读取所选预设 160 | 161 | 162 | 163 | 164 | 165 | 10 166 | 30 167 | 211 168 | 22 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 20 177 | 211 178 | 131 179 | 16 180 | 181 | 182 | 183 | 声道数 184 | 185 | 186 | 187 | 188 | 189 | 290 190 | 210 191 | 191 192 | 22 193 | 194 | 195 | 196 | 197 | 1 198 | 199 | 200 | 201 | 202 | 2 203 | 204 | 205 | 206 | 207 | 208 | 209 | 290 210 | 290 211 | 111 212 | 20 213 | 214 | 215 | 216 | 217 | 218 | 219 | true 220 | 221 | 222 | 223 | 224 | 225 | 20 226 | 290 227 | 201 228 | 16 229 | 230 | 231 | 232 | 自动跳过含有非中文的数据 233 | 234 | 235 | 236 | 237 | 238 | 20 239 | 330 240 | 261 241 | 41 242 | 243 | 244 | 245 | 归一化(留空为不进行归一化) 246 | 范围为-70~-5 247 | 248 | 249 | Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop 250 | 251 | 252 | 253 | 254 | 255 | 290 256 | 330 257 | 191 258 | 21 259 | 260 | 261 | 262 | -23 263 | 264 | 265 | 266 | 267 | 268 | 269 | 270 | 0 271 | 30 272 | 501 273 | 231 274 | 275 | 276 | 277 | 预览 278 | 279 | 280 | 281 | 282 | 10 283 | 50 284 | 231 285 | 141 286 | 287 | 288 | 289 | sounds 290 | - 1.wav 291 | - 2.wav 292 | ...... 293 | labels.txt 294 | 295 | 296 | Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop 297 | 298 | 299 | 300 | 301 | 302 | 260 303 | 50 304 | 231 305 | 141 306 | 307 | 308 | 309 | 1.wav|你好世界 310 | 2.wav|世界你好 311 | ...... 312 | 313 | 314 | Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop 315 | 316 | 317 | 318 | 319 | 320 | 10 321 | 26 322 | 151 323 | 16 324 | 325 | 326 | 327 | 328 | 12 329 | true 330 | 331 | 332 | 333 | 文件层级: 334 | 335 | 336 | 337 | 338 | 339 | 260 340 | 26 341 | 151 342 | 16 343 | 344 | 345 | 346 | 347 | 12 348 | true 349 | 350 | 351 | 352 | 标注文件内容: 353 | 354 | 355 | 356 | 357 | 358 | 10 359 | 200 360 | 141 361 | 20 362 | 363 | 364 | 365 | 预计导出文件数量: 366 | 367 | 368 | 369 | 370 | 371 | 160 372 | 200 373 | 151 374 | 20 375 | 376 | 377 | 378 | 379 | 380 | 381 | 382 | 383 | 384 | 385 | 386 | 387 | 430 388 | 540 389 | 75 390 | 24 391 | 392 | 393 | 394 | 下一步 395 | 396 | 397 | 398 | 399 | 400 | 320 401 | 540 402 | 75 403 | 24 404 | 405 | 406 | 407 | 上一步 408 | 409 | 410 | 411 | 412 | 413 | 40 414 | 520 415 | 271 416 | 16 417 | 418 | 419 | 420 | 421 | 12 422 | 423 | 424 | 425 | color:red 426 | 427 | 428 | 429 | 430 | 431 | 432 | 433 | 434 | 30 435 | 390 436 | 491 437 | 131 438 | 439 | 440 | 441 | 评测相关 442 | 443 | 444 | 445 | 446 | 10 447 | 30 448 | 211 449 | 22 450 | 451 | 452 | 453 | 454 | 455 | 456 | 457 | 458 | 459 | 240 460 | 20 461 | 241 462 | 101 463 | 464 | 465 | 466 | 467 | 468 | 469 | 470 | 471 | 472 | 473 | 474 | 475 | 476 | 477 | 10 478 | 60 479 | 211 480 | 61 481 | 482 | 483 | 484 | 选择评测依据后可以过滤导出的数据,只会导出指定分数超过限定值的数据。 485 | 486 | 487 | true 488 | 489 | 490 | 491 | 492 | 493 | 494 | 495 | -------------------------------------------------------------------------------- /ui/uifiles/pingce_jindutiao.ui: -------------------------------------------------------------------------------- 1 | 2 | 3 | PingcejinduDialog 4 | 5 | 6 | 7 | 0 8 | 0 9 | 351 10 | 111 11 | 12 | 13 | 14 | 语音评测 15 | 16 | 17 | 18 | 19 | 20 20 | 20 21 | 311 22 | 23 23 | 24 | 25 | 26 | 27 | 12 28 | 29 | 30 | 31 | 0 32 | 33 | 34 | 0 35 | 36 | 37 | 0 38 | 39 | 40 | QProgressBar::TopToBottom 41 | 42 | 43 | %v/%m 44 | 45 | 46 | 47 | 48 | 49 | 20 50 | 60 51 | 75 52 | 24 53 | 54 | 55 | 56 | 57 | 12 58 | 59 | 60 | 61 | 停止 62 | 63 | 64 | 65 | 66 | 67 | 68 | -------------------------------------------------------------------------------- /ui/uifiles/select_dataset.ui: -------------------------------------------------------------------------------- 1 | 2 | 3 | MainWindow 4 | 5 | 6 | 7 | 0 8 | 0 9 | 800 10 | 600 11 | 12 | 13 | 14 | 15 | 800 16 | 600 17 | 18 | 19 | 20 | 21 | 800 22 | 600 23 | 24 | 25 | 26 | 选择数据集 27 | 28 | 29 | 30 | 31 | 32 | 50 33 | 50 34 | 701 35 | 441 36 | 37 | 38 | 39 | QAbstractItemView::NoEditTriggers 40 | 41 | 42 | 43 | 数据集名 44 | 45 | 46 | 47 | 48 | 创建时间 49 | 50 | 51 | 52 | 53 | 上次使用时间 54 | 55 | 56 | 57 | 58 | 备注 59 | 60 | 61 | 62 | 63 | 操作 64 | 65 | 66 | 67 | 68 | 69 | 70 | 50 71 | 510 72 | 101 73 | 31 74 | 75 | 76 | 77 | 78 | 11 79 | 80 | 81 | 82 | 添加数据集 83 | 84 | 85 | 86 | 87 | 88 | 89 | 0 90 | 0 91 | 800 92 | 22 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | -------------------------------------------------------------------------------- /ui/uifiles/select_file_long_wav.ui: -------------------------------------------------------------------------------- 1 | 2 | 3 | select_file_long_wav_Dialog 4 | 5 | 6 | 7 | 0 8 | 0 9 | 600 10 | 250 11 | 12 | 13 | 14 | 15 | 600 16 | 250 17 | 18 | 19 | 20 | 21 | 600 22 | 250 23 | 24 | 25 | 26 | 27 | 12 28 | 29 | 30 | 31 | 导入文件 32 | 33 | 34 | 35 | 36 | 110 37 | 70 38 | 371 39 | 21 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 20 50 | 21 51 | 341 52 | 20 53 | 54 | 55 | 56 | 请选择一个音频文件和它对应的SRT字幕文件 57 | 58 | 59 | 60 | 61 | 62 | 30 63 | 70 64 | 81 65 | 16 66 | 67 | 68 | 69 | 音频文件: 70 | 71 | 72 | 73 | 74 | 75 | 500 76 | 69 77 | 81 78 | 23 79 | 80 | 81 | 82 | 选择文件 83 | 84 | 85 | 86 | 87 | 88 | 500 89 | 200 90 | 81 91 | 24 92 | 93 | 94 | 95 | 取消 96 | 97 | 98 | 99 | 100 | 101 | 390 102 | 200 103 | 81 104 | 24 105 | 106 | 107 | 108 | 确定 109 | 110 | 111 | 112 | 113 | 114 | 30 115 | 170 116 | 541 117 | 16 118 | 119 | 120 | 121 | 122 | 12 123 | 124 | 125 | 126 | color: red; 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 110 136 | 100 137 | 371 138 | 21 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 30 149 | 100 150 | 81 151 | 16 152 | 153 | 154 | 155 | 发音人: 156 | 157 | 158 | 159 | 160 | 161 | 30 162 | 130 163 | 141 164 | 16 165 | 166 | 167 | 168 | 最短静音长度(ms): 169 | 170 | 171 | 172 | 173 | 174 | 170 175 | 130 176 | 101 177 | 21 178 | 179 | 180 | 181 | 182 | 183 | 184 | 185 | 186 | 187 | 430 188 | 130 189 | 101 190 | 21 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 290 201 | 130 202 | 131 203 | 16 204 | 205 | 206 | 207 | 静音阈值(dBFS): 208 | 209 | 210 | 211 | 212 | 213 | 214 | -------------------------------------------------------------------------------- /ui/uifiles/select_file_wav_srt.ui: -------------------------------------------------------------------------------- 1 | 2 | 3 | select_file_wav_srt_Dialog 4 | 5 | 6 | 7 | 0 8 | 0 9 | 600 10 | 300 11 | 12 | 13 | 14 | 15 | 600 16 | 300 17 | 18 | 19 | 20 | 21 | 600 22 | 300 23 | 24 | 25 | 26 | 27 | 12 28 | 29 | 30 | 31 | 导入文件 32 | 33 | 34 | 35 | 36 | 110 37 | 70 38 | 371 39 | 21 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 20 50 | 21 51 | 341 52 | 20 53 | 54 | 55 | 56 | 请选择一个音频文件和它对应的SRT字幕文件 57 | 58 | 59 | 60 | 61 | 62 | 30 63 | 70 64 | 81 65 | 16 66 | 67 | 68 | 69 | 音频文件: 70 | 71 | 72 | 73 | 74 | 75 | 110 76 | 100 77 | 371 78 | 21 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 30 89 | 100 90 | 81 91 | 16 92 | 93 | 94 | 95 | 字幕文件: 96 | 97 | 98 | 99 | 100 | 101 | 500 102 | 69 103 | 81 104 | 23 105 | 106 | 107 | 108 | 选择文件 109 | 110 | 111 | 112 | 113 | 114 | 500 115 | 99 116 | 81 117 | 23 118 | 119 | 120 | 121 | 选择文件 122 | 123 | 124 | 125 | 126 | 127 | 500 128 | 210 129 | 81 130 | 24 131 | 132 | 133 | 134 | 取消 135 | 136 | 137 | 138 | 139 | 140 | 390 141 | 210 142 | 81 143 | 24 144 | 145 | 146 | 147 | 确定 148 | 149 | 150 | 151 | 152 | 153 | 30 154 | 190 155 | 541 156 | 16 157 | 158 | 159 | 160 | 161 | 12 162 | 163 | 164 | 165 | color: red; 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 110 175 | 130 176 | 371 177 | 21 178 | 179 | 180 | 181 | 182 | 183 | 184 | 185 | 186 | 187 | 30 188 | 130 189 | 81 190 | 16 191 | 192 | 193 | 194 | 发音人: 195 | 196 | 197 | 198 | 199 | 200 | 30 201 | 160 202 | 421 203 | 20 204 | 205 | 206 | 207 | 自动将相离过近的字幕合为一个(剪映字幕建议勾选) 208 | 209 | 210 | 211 | 212 | 213 | 214 | -------------------------------------------------------------------------------- /ui/uifiles/select_workspace.ui: -------------------------------------------------------------------------------- 1 | 2 | 3 | Form 4 | 5 | 6 | 7 | 0 8 | 0 9 | 400 10 | 200 11 | 12 | 13 | 14 | 15 | 400 16 | 200 17 | 18 | 19 | 20 | 21 | 400 22 | 200 23 | 24 | 25 | 26 | 选择工作区 27 | 28 | 29 | 30 | 31 | 280 32 | 150 33 | 100 34 | 30 35 | 36 | 37 | 38 | 退出 39 | 40 | 41 | 42 | 43 | 44 | 160 45 | 150 46 | 100 47 | 30 48 | 49 | 50 | 51 | 确定 52 | 53 | 54 | 55 | 56 | 57 | 80 58 | 60 59 | 291 60 | 21 61 | 62 | 63 | 64 | 65 | 10 66 | 67 | 68 | 69 | 请在这里输入工作区路径,支持相对路径 70 | 71 | 72 | 73 | 74 | 75 | 30 76 | 60 77 | 53 78 | 21 79 | 80 | 81 | 82 | 83 | 10 84 | 85 | 86 | 87 | 工作区: 88 | 89 | 90 | 91 | 92 | 93 | 94 | pushButton 95 | clicked() 96 | Form 97 | close_program() 98 | 99 | 100 | 323 101 | 164 102 | 103 | 104 | 253 105 | 100 106 | 107 | 108 | 109 | 110 | pushButton_2 111 | clicked() 112 | Form 113 | get_workspace() 114 | 115 | 116 | 220 117 | 161 118 | 119 | 120 | 137 121 | 129 122 | 123 | 124 | 125 | 126 | 127 | close_program() 128 | get_workspace() 129 | 130 | 131 | -------------------------------------------------------------------------------- /utils/add_path.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | """ 3 | @Time : 2023/3/6/006 9:42 4 | @Author : 李子 5 | @Url : https://github.com/kslz 6 | """ 7 | import os 8 | 9 | if os.path.isfile(os.path.join("./lib/ffmpeg/", "ffmpeg.exe")): 10 | ffmpeg_path = "./lib/ffmpeg/" 11 | else: 12 | ffmpeg_path = "" 13 | os.environ["PATH"] += os.pathsep + os.path.dirname(ffmpeg_path) -------------------------------------------------------------------------------- /utils/global_obj.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | """ 3 | 神奇的全局变量 4 | @Time : 2023/2/1/001 17:07 5 | @Author : 李子 6 | @Url : https://github.com/kslz 7 | """ 8 | 9 | 10 | def _init(): 11 | global _global_dict 12 | _global_dict = {} 13 | 14 | 15 | def set_value(key, value): 16 | """ 定义一个全局变量 """ 17 | _global_dict[key] = value 18 | 19 | 20 | def get_value(key, defValue=None): 21 | """ 获取一个全局变量,不存在则返回默认值 """ 22 | try: 23 | return _global_dict[key] 24 | except KeyError: 25 | return defValue 26 | 27 | _init() 28 | -------------------------------------------------------------------------------- /utils/log.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | """ 3 | @Time : 2023/2/1/001 14:17 4 | @Author : 李子 5 | @Url : https://github.com/kslz 6 | """ 7 | 8 | import logging 9 | import os 10 | 11 | 12 | def creatlogger(logname): 13 | # 1、创建一个logger 14 | logger = logging.getLogger(logname) # 创建 logger 15 | logger.setLevel(logging.DEBUG) # 写入内容的严重级别 16 | 17 | # Handler方法有很多下面主要介绍两种:StreamHandler 和 FileHandler 18 | # 2、创建一个handler,用于写入日志文件 19 | os.makedirs('logs', exist_ok=True) 20 | fh = logging.FileHandler('logs/program.log', encoding="utf-8") # 将日志写入到logs/program.log文件 21 | fh.setLevel(logging.DEBUG) # 并且需要指定写入的内容严重级别 22 | # 再创建一个handler,用于输出到控制台 23 | ch = logging.StreamHandler() # 将日志写入控制台 24 | ch.setLevel(logging.DEBUG) # 并且需要指定写入的内容严重级别 25 | 26 | # 3、定义handler的输出格式(formatter) 27 | formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') 28 | 29 | # 4、给handler添加formatter 30 | fh.setFormatter(formatter) 31 | ch.setFormatter(formatter) 32 | 33 | # 5、给logger添加handler 34 | logger.addHandler(fh) 35 | logger.addHandler(ch) 36 | 37 | return logger 38 | 39 | 40 | guilogger = creatlogger("guilogger") 41 | requsetlogger = creatlogger("requsetlogger") 42 | 43 | if __name__ == '__main__': 44 | logger = creatlogger("testlog") 45 | # 6、进行日志输出 46 | logger.info("这是一条INFO级别的信息。") 47 | logger.debug('debug message') 48 | logger.info('info message') 49 | logger.warning('warn message') 50 | logger.error('error message') 51 | logger.critical('critical message') 52 | -------------------------------------------------------------------------------- /utils/peewee_orm.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | """ 3 | @Time : 2023/2/10/010 17:25 4 | @Author : 李子 5 | @Url : https://github.com/kslz 6 | """ 7 | from datetime import datetime 8 | from typing import Optional 9 | 10 | import peewee 11 | from peewee import * 12 | 13 | from utils.tool_str import * 14 | 15 | db = SqliteDatabase(None) 16 | 17 | 18 | class DbStr(): 19 | BiaoBei = "标贝" 20 | XunFei = "讯飞" 21 | ShengWen = "声纹识别" 22 | PingCe = "语音评测" 23 | 24 | 25 | class BaseModel(Model): 26 | class Meta: 27 | database = db 28 | 29 | 30 | class Workspace(BaseModel): 31 | workspace_id = PrimaryKeyField() 32 | workspace_name = CharField(null=False) 33 | workspace_create_time = DateTimeField(default=datetime.now) 34 | workspace_last_use_time = DateTimeField(default=datetime.now) 35 | workspace_info = CharField(null=True, help_text='工作区介绍,不要超过255字') 36 | 37 | class Meta: 38 | table_name = 'workspace_tbl' 39 | 40 | 41 | class Dataset(BaseModel): 42 | dataset_id = PrimaryKeyField() 43 | dataset_name = CharField(null=False, unique=True) 44 | dataset_create_time = DateTimeField(default=datetime.now().replace(microsecond=0)) 45 | dataset_last_use_time = DateTimeField(default=datetime.now().replace(microsecond=0)) 46 | dataset_info = TextField(null=True, help_text='数据集介绍') 47 | 48 | class Meta: 49 | table_name = 'dataset_tbl' 50 | 51 | 52 | class Info(BaseModel): 53 | info_id = PrimaryKeyField() 54 | dataset_id = ForeignKeyField(Dataset, "dataset_id", "infos", on_delete='CASCADE') 55 | info_text = CharField(null=True, ) 56 | info_pinyin = CharField(null=True, ) 57 | info_speaker = CharField(null=True, ) 58 | info_shibie_speaker = CharField(null=True, ) 59 | info_shibie_score = FloatField(null=True, ) 60 | info_raw_file_path = TextField(null=True, ) 61 | info_start_time = IntegerField(null=True, ) 62 | info_end_time = IntegerField(null=True, ) 63 | info_file_path = TextField(null=True, ) 64 | info_mfa = TextField(null=True, ) 65 | info_is_del = BooleanField(default=False) 66 | 67 | class Meta: 68 | table_name = 'info_tbl' 69 | 70 | 71 | # class SpkInfo(BaseModel): 72 | # spkinfo_id = PrimaryKeyField() 73 | # info_id = ForeignKeyField(Info, "info_id", "spkinfos", on_delete='CASCADE') 74 | # spkinfo_name = CharField() 75 | # spkinfo_score = FloatField() 76 | # 77 | # class Meta: 78 | # table_name = 'spkinfo_tbl' 79 | 80 | 81 | class AuthorizationInfo(BaseModel): 82 | authorizationinfo_id = PrimaryKeyField() 83 | authorizationinfo_name = CharField(null=False) 84 | authorizationinfo_APPID = CharField(null=False) 85 | authorizationinfo_APISecret = CharField(null=False) 86 | authorizationinfo_APIKey = CharField(null=False) 87 | authorizationinfo_company = CharField(null=False) 88 | authorizationinfo_app = CharField(null=False) 89 | authorizationinfo_token = TextField(null=True) 90 | 91 | class Meta: 92 | table_name = 'authorizationinfo_tbl' 93 | 94 | 95 | class BiaoBeiPingCeInfo(BaseModel): 96 | biaobeipingce_id = PrimaryKeyField() 97 | info_id = ForeignKeyField(Info, "info_id", on_delete='CASCADE', unique=True) 98 | biaobeipingce_acc_score = IntegerField(null=True, ) # 句子准确度得分 99 | biaobeipingce_flu_score = IntegerField(null=True, ) # 句子流利度得分 100 | biaobeipingce_int_score = IntegerField(null=True, ) # 句子完整度得分 101 | biaobeipingce_all_score = IntegerField(null=True, ) # 总得分 102 | biaobeipingce_all_text = TextField(null=True) # 完整返回数据 103 | 104 | class Meta: 105 | table_name = 'biaobeipingce_tbl' 106 | 107 | 108 | def get_authorizationinfo_by_id(authorizationinfo_id): 109 | query = AuthorizationInfo.select().where(AuthorizationInfo.authorizationinfo_id == authorizationinfo_id) 110 | results = query.execute() 111 | return results 112 | 113 | 114 | def get_pingce_info2(dataset_id): 115 | query = (BiaoBeiPingCeInfo 116 | .select(Info.info_id, BiaoBeiPingCeInfo.biaobeipingce_all_score) 117 | .join(Info) 118 | .where(Info.dataset_id == dataset_id)) 119 | 120 | results = query.execute() 121 | for result in results: 122 | info_id = result.info_id 123 | biaobeipingce_all_score = result.biaobeipingce_all_score 124 | print(f"Info ID: {info_id}, Score: {biaobeipingce_all_score}") 125 | 126 | 127 | def get_pingce_info(dataset_id, is_skip_done): 128 | query = (Info 129 | .select(Info, BiaoBeiPingCeInfo.biaobeipingce_all_score) 130 | .join(BiaoBeiPingCeInfo, JOIN.LEFT_OUTER) 131 | .where( 132 | Info.dataset_id == dataset_id, 133 | Info.info_is_del == 0, 134 | ) 135 | ) 136 | # for result in results: 137 | # info_id = result.info_id 138 | # biaobeipingce_all_score = result.biaobeipingceinfo.biaobeipingce_all_score if hasattr(result, 139 | # 'biaobeipingceinfo') else None 140 | # print(f"Info ID: {info_id}, Score: {biaobeipingce_all_score}") 141 | # 注意:在左外连接中,如果右表中没有与左表关联的数据,则在查询结果中对应的列会显示为 NULL。这在原生 SQL 查询中是可以直接访问和处理的。 142 | # 然而,在使用 Peewee ORM 进行查询时,它会尝试将查询结果映射到模型对象上,但如果某个字段在查询结果中为 NULL,Peewee 默认情况下不会为模型对象创建对应的属性。因此,在代码中直接访问不存在的属性时会引发 AttributeError。 143 | # 为了解决这个问题,我们可以使用 hasattr() 函数进行存在性检查,如之前提供的代码示例所示。这样,即使某些记录在右表中没有对应的数据,我们可以避免引发异常并正确处理这种情况。 144 | 145 | if is_skip_done: 146 | query = query.where(BiaoBeiPingCeInfo.biaobeipingce_all_score.is_null()) 147 | 148 | results = query.execute() 149 | 150 | return results 151 | 152 | pass 153 | 154 | 155 | def get_authorizationinfo(company: Optional[str] = None, app: Optional[str] = None): 156 | query = AuthorizationInfo.select() 157 | 158 | if company is not None: 159 | query = query.where(AuthorizationInfo.authorizationinfo_company == company) 160 | 161 | if app is not None: 162 | query = query.where(AuthorizationInfo.authorizationinfo_app == app) 163 | 164 | results = query.execute() 165 | 166 | return list(results) 167 | 168 | 169 | def get_dataset_window_info(dataset_id=1, page_size=15, page_number=1): 170 | subquery = ( 171 | Info 172 | .select( 173 | Info.info_id, 174 | fn.row_number().over(order_by=[Info.info_id]).alias('row_number') 175 | ) 176 | .where( 177 | # (Info.info_is_del == 0) & 178 | (Info.dataset_id == dataset_id) 179 | ) 180 | .order_by(Info.info_id) 181 | .alias('subquery') 182 | ) 183 | 184 | query = (Info 185 | .select( 186 | subquery.c.row_number.alias('index'), 187 | Info.info_id, 188 | Info.info_text, 189 | Info.info_speaker, 190 | Info.info_shibie_speaker, 191 | Info.info_start_time, 192 | Info.info_end_time, 193 | Info.info_raw_file_path, 194 | Info.info_is_del, 195 | ) 196 | .join(subquery, on=(Info.info_id == subquery.c.info_id)) 197 | .where( 198 | # (Info.info_is_del == 0) & 199 | (Info.dataset_id == dataset_id) 200 | ) 201 | .order_by( 202 | Info.info_id.asc() 203 | )) 204 | total_count = query.count() 205 | query = query.paginate(page_number, page_size) 206 | # todo 待优化 目前搜索范围外的数据时会出现空白页 207 | 208 | # 执行查询 209 | # 我发现这里的查询好像会查询很多次数据库,不过也还好吧,应该不会有人存几百万条数据进去 210 | results = list(query.dicts()) 211 | return total_count, results 212 | 213 | 214 | # def get_dataset_window_info(dataset_id=1, page_size=15, page_number=1): 215 | # # 下面的查询是chatGPT写的 216 | # # 都说先进的科技乍一看和魔法无异,想来这就是了 217 | # # 整复杂了 重来 218 | # query = (Info 219 | # .select( 220 | # Info.info_id.alias('index'), 221 | # Info.info_id, 222 | # Info.info_text, 223 | # fn.COALESCE( 224 | # SpkInfo.spkinfo_name, 225 | # Info.info_speaker).alias('speaker'), 226 | # # SQL('(CASE WHEN info_file_path = "" OR info_file_path IS NULL THEN 0 ELSE 1 END)').alias('is_separate_file') 227 | # ) 228 | # .join( 229 | # SpkInfo, 230 | # JOIN.LEFT_OUTER, 231 | # on=(Info.info_id == SpkInfo.info_id) 232 | # ) 233 | # .where( 234 | # (Info.info_is_del == 0) & 235 | # (Info.dataset_id == dataset_id) 236 | # ) 237 | # .group_by( 238 | # Info.info_id 239 | # ) 240 | # .order_by( 241 | # Info.info_id.asc() 242 | # )) 243 | # 244 | # total_count = query.count() 245 | # # print(total_count) 246 | # 247 | # # 分页 248 | # query = query.paginate(page_number, page_size) 249 | # # todo 待优化 目前搜索范围外的数据时会出现空白页 250 | # 251 | # # 执行查询 252 | # # 我发现这里的查询好像会查询很多次数据库,不过也还好吧,应该不会有人存几百万条数据进去 253 | # results = list(query.dicts()) 254 | # return total_count, results 255 | 256 | 257 | def get_speakers(dataset_id): 258 | """ 259 | 获取所有speaker值 260 | 261 | """ 262 | query = (Info 263 | .select(Info.info_speaker, Info.info_shibie_speaker) 264 | .where( 265 | (Info.info_is_del == 0) & 266 | (Info.dataset_id == dataset_id) 267 | )) 268 | result_list = [] 269 | for row in query.dicts(): 270 | if row["info_shibie_speaker"] is not None: 271 | row_result = (row["info_shibie_speaker"], "shibie_spk") 272 | else: 273 | row_result = (row["info_speaker"], "spk") 274 | if result_list.count(row_result) == 0: 275 | result_list.append(row_result) 276 | return result_list 277 | 278 | 279 | def get_file_raw_path_by_dataset_id(dataset_id): 280 | query = Info.select(Info.info_raw_file_path).distinct().where(Info.dataset_id == dataset_id) 281 | return list(query) 282 | 283 | 284 | def get_output_info(dataset_id, spk_info, pingce_dict): 285 | query = (Info 286 | .select( 287 | Info.info_id, 288 | Info.info_text, 289 | Info.info_raw_file_path, 290 | Info.info_start_time, 291 | Info.info_end_time, 292 | ) 293 | # .join(Dataset, on=(Dataset.dataset_id == Info.dataset_id)) 294 | .where( 295 | (Info.info_is_del == 0) & 296 | (Info.dataset_id == dataset_id) 297 | ) 298 | .order_by( 299 | Info.info_id.asc() 300 | )) 301 | if spk_info[1] == "shibie_spk": 302 | query = query.where(Info.info_shibie_speaker == spk_info[0]) 303 | else: 304 | query = query.where(Info.info_speaker == spk_info[0]) 305 | 306 | if len(pingce_dict) != 0: 307 | # print(pingce_dict) 308 | if pingce_dict["pingce"] == ToolStr.biaobei: 309 | query = query.join(BiaoBeiPingCeInfo, on=(Info.info_id == BiaoBeiPingCeInfo.info_id))\ 310 | .where( 311 | BiaoBeiPingCeInfo.biaobeipingce_acc_score >= pingce_dict["acc"], 312 | BiaoBeiPingCeInfo.biaobeipingce_flu_score >= pingce_dict["flu"], 313 | BiaoBeiPingCeInfo.biaobeipingce_int_score >= pingce_dict["int"], 314 | BiaoBeiPingCeInfo.biaobeipingce_all_score >= pingce_dict["all"] 315 | ) 316 | 317 | result = list(query.dicts()) 318 | # print(result) 319 | return result 320 | 321 | 322 | def update_info(text, start_time, end_time, info_id): 323 | updated_row = Info.update(info_text=text, info_start_time=start_time, info_end_time=end_time) \ 324 | .where(Info.info_id == info_id).execute() 325 | print(updated_row) 326 | 327 | 328 | def create_or_update_biaobeipingceinfo(info_id, acc_score, flu_score, int_score, all_score, all_text): 329 | try: 330 | BiaoBeiPingCeInfo.create(info_id=info_id, 331 | biaobeipingce_acc_score=acc_score, 332 | biaobeipingce_flu_score=flu_score, 333 | biaobeipingce_int_score=int_score, 334 | biaobeipingce_all_score=all_score, 335 | biaobeipingce_all_text=all_text) 336 | except peewee.IntegrityError: 337 | BiaoBeiPingCeInfo.update(biaobeipingce_acc_score=acc_score, 338 | biaobeipingce_flu_score=flu_score, 339 | biaobeipingce_int_score=int_score, 340 | biaobeipingce_all_score=all_score, 341 | biaobeipingce_all_text=all_text).where(BiaoBeiPingCeInfo.info_id == info_id).execute() 342 | 343 | pass 344 | 345 | 346 | def insert_info_many(data_list, batch_size=1000): 347 | for i in range(0, len(data_list), batch_size): 348 | with db.atomic(): 349 | Info.insert_many(data_list[i:i + batch_size]).execute() 350 | 351 | 352 | def del_info_by_raw_file_path(file_path): 353 | query = Info.delete().where(Info.info_raw_file_path == file_path) 354 | query.execute() 355 | 356 | 357 | class Course(BaseModel): 358 | id = PrimaryKeyField() 359 | title = CharField(null=False) 360 | period = IntegerField() 361 | description = CharField() 362 | 363 | class Meta: 364 | order_by = ('title',) 365 | db_table = 'course' 366 | 367 | 368 | class Teacher(BaseModel): 369 | id = PrimaryKeyField() 370 | name = CharField(null=False) 371 | gender = BooleanField() 372 | address = CharField() 373 | course_id = ForeignKeyField(Course, to_field='id', related_name="course") 374 | 375 | class Meta: 376 | order_by = ('name',) 377 | db_table = 'teacher' 378 | 379 | 380 | def add_fake_data(): 381 | Info.create(dataset_id=1, info_text="你好世界", info_speaker="说话人1", ) 382 | Info.create(dataset_id=1, info_text="你好世界2", info_speaker="说话人1", ) 383 | Info.create(dataset_id=1, info_text="你好世界3", info_speaker="说话人2", ) 384 | Info.create(dataset_id=1, info_text="你好世界4", info_speaker="说话人2", ) 385 | Info.create(dataset_id=1, info_text="你好世界5", info_speaker="说话人2", ) 386 | Info.create(dataset_id=1, info_text="你好世界6", info_speaker="说话人2", ) 387 | Info.create(dataset_id=1, info_text="你好世界7", info_speaker="说话人2", ) 388 | Info.create(dataset_id=2, info_text="你好世界8", ) 389 | Info.create(dataset_id=1, info_text="你好世界9", ) 390 | Info.create(dataset_id=1, info_text="你好世界10", info_speaker="说话人1", ) 391 | Info.create(dataset_id=1, info_text="你好世界11", info_speaker="说话人1", ) 392 | Info.create(dataset_id=1, info_text="你好世界12", info_speaker="说话人1", ) 393 | Info.create(dataset_id=1, info_text="你好世界13", info_speaker="说话人1", ) 394 | Info.create(dataset_id=1, info_text="你好世界14", ) 395 | Info.create(dataset_id=1, info_text="你好世界15", ) 396 | Info.create(dataset_id=1, info_text="你好世界16", info_speaker="说话人1", ) 397 | Info.create(dataset_id=1, info_text="你好世界17", ) 398 | Info.create(dataset_id=1, info_text="你好世界18", info_speaker="说话人1", ) 399 | Info.create(dataset_id=1, info_text="你好世界19", ) 400 | Info.create(dataset_id=1, info_text="你好世界20", info_speaker="说话人1", ) 401 | # SpkInfo.create(info_id=2, spkinfo_name="说话人a", spkinfo_score=0.89) 402 | # SpkInfo.create(info_id=2, spkinfo_name="说话人b", spkinfo_score=0.81) 403 | # SpkInfo.create(info_id=2, spkinfo_name="说话人c", spkinfo_score=0.19) 404 | # SpkInfo.create(info_id=3, spkinfo_name="说话人a", spkinfo_score=0.89) 405 | 406 | 407 | if __name__ == "__main__": 408 | db.init("../workspace/db/workspace.db") 409 | try: 410 | BiaoBeiPingCeInfo.create(info_id=312, biaobeipingce_all_score=90) 411 | except peewee.IntegrityError: 412 | BiaoBeiPingCeInfo.update(biaobeipingce_all_score=80).where(BiaoBeiPingCeInfo.info_id == 312).execute() 413 | 414 | # add_fake_data() 415 | # get_dataset_window_info() 416 | # init_peewee_db() 417 | # db1 = get_peewee_db() 418 | # 419 | # db1.connect() 420 | # create_all_tables(db1) 421 | # db.create_tables([Workspace, Dataset, Info]) 422 | # dataset1 = Dataset.create(dataset_name="test2") 423 | # info1 = Info.create(info_text="你好世界", dataset_id=dataset1) 424 | 425 | pass 426 | -------------------------------------------------------------------------------- /utils/qt_tools.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | """ 3 | @Time : 2023/6/27/027 9:11 4 | @Author : 李子 5 | @Url : https://github.com/kslz 6 | """ 7 | from PySide6.QtCore import QMutex, Signal, QObject, QMutexLocker, QRunnable, QThreadPool, Qt 8 | from PySide6.QtWidgets import QWidget, QLabel, QSpinBox, QHBoxLayout 9 | 10 | 11 | class ProgressUpdater(QObject): 12 | """ 13 | 进度更新器,用于接收任务完成信号并更新进度条 14 | """ 15 | progressUpdated = Signal(int) 16 | 17 | def __init__(self, progress_bar): 18 | super().__init__() 19 | self.progress_bar = progress_bar 20 | self.mutex = QMutex() 21 | 22 | def updateProgress(self): 23 | with QMutexLocker(self.mutex): 24 | # 更新进度条 25 | self.progress_bar.setValue(self.progress_bar.value() + 1) 26 | 27 | 28 | class SignalTool(QObject): 29 | """ 30 | 这个类唯一的作用是用来帮发不出信号的物件发出信号 31 | """ 32 | started = Signal() 33 | finished = Signal() 34 | change_count = Signal(int) 35 | 36 | 37 | class CustomThreadPool(QThreadPool): 38 | noTasksRunning = Signal() 39 | 40 | def __init__(self, parent=None): 41 | super().__init__(parent) 42 | self.activeTasks = 0 43 | self.mutex = QMutex() 44 | 45 | def start(self, arg__1, priority=0): 46 | self.changeActiveTasks(1) 47 | super().start(arg__1, priority) 48 | self.changeActiveTasks(-1) 49 | self.taskFinished() 50 | 51 | def changeActiveTasks(self, change): 52 | with QMutexLocker(self.mutex): 53 | self.activeTasks += change 54 | 55 | def taskFinished(self): 56 | with QMutexLocker(self.mutex): 57 | if self.activeTasks == 0: 58 | self.noTasksRunning.emit() 59 | 60 | 61 | class ScoreWdiget(QWidget): 62 | def __init__(self, name, k, v, parent): 63 | super().__init__(parent) 64 | 65 | self.k = k 66 | 67 | # 创建标签和旋钮框 68 | self.label = QLabel(name) 69 | self.spinbox = QSpinBox() 70 | 71 | font = self.label.font() 72 | font.setPointSize(12) 73 | self.label.setFont(font) 74 | self.spinbox.setFont(font) 75 | 76 | # 设置旋钮框的范围和初始值 77 | self.spinbox.setMinimum(0) 78 | self.spinbox.setMaximum(100) 79 | self.spinbox.setValue(v) 80 | 81 | # 创建水平布局 82 | self.layout = QHBoxLayout(self) 83 | self.layout.setContentsMargins(0, 0, 0, 0) # 这个布局的边框我找了2个小时才找出来,警钟长鸣 84 | 85 | # 将标签和旋钮框添加到布局中 86 | self.layout.addWidget(self.label) 87 | self.layout.addWidget(self.spinbox) 88 | 89 | # 设置标签靠左,旋钮框靠右 90 | self.layout.setAlignment(self.label, Qt.AlignLeft) 91 | self.layout.setAlignment(self.spinbox, Qt.AlignRight) 92 | 93 | def change_text(self, name, k, v): 94 | self.label.setText(name) 95 | self.k = k 96 | self.spinbox.setValue(v) 97 | 98 | def get_score(self, score_dict: dict): 99 | score_dict[self.k] = self.spinbox.value() 100 | -------------------------------------------------------------------------------- /utils/request_tools.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | """ 3 | @Time : 2023/2/24/024 13:38 4 | @Author : 李子 5 | @Url : https://github.com/kslz 6 | """ 7 | import json 8 | 9 | import ffmpeg 10 | import requests 11 | import base64 12 | 13 | from utils.log import requsetlogger 14 | 15 | 16 | def get_biaobei_token(client_id, client_secret): 17 | url = 'https://openapi.data-baker.com/oauth/2.0/token' 18 | 19 | payload = { 20 | 'grant_type': 'client_credentials', 21 | 'client_secret': client_secret, 22 | 'client_id': client_id 23 | } 24 | 25 | response = requests.post(url, data=payload) 26 | 27 | if response.ok: 28 | response_json = response.json() 29 | access_token = response_json.get('access_token') 30 | return access_token 31 | else: 32 | return False 33 | 34 | 35 | def pingce_biaobei(file_path, text, access_token, start_time, end_time): 36 | """ 37 | 通过标贝接口进行音频评测,并将返回的json文件保存到本地,需自行填入鉴权信息 38 | 注意:只支持采样率16k、位长16bit、单声道的pcm音频。 39 | 标贝语音评测只支持3秒以上的音频,建议使用wav2pcm2()函数进行转换 40 | 文档:https://www.data-baker.com/specs/file/eva_api_restful 41 | 42 | :param file_path: 音频文件路径 43 | :param text: 音频对应文本 44 | :param access_token: 鉴权信息(请参考文档获取) 45 | :parap start_time: 开始时间(毫秒) 46 | :parap end_time: 结束时间(毫秒) 47 | """ 48 | 49 | duration = (end_time - start_time) / 1000 50 | start_time = start_time / 1000 51 | 52 | # 从长音频文件中提取指定时间段的音频 53 | output = ( 54 | ffmpeg 55 | .input(file_path, ss=start_time, t=duration) 56 | .output('pipe:', format='s16le', acodec='pcm_s16le', ac=1, ar=16000) 57 | .run(capture_stdout=True, quiet=True) 58 | ) 59 | output = output[0] 60 | 61 | if duration < 3.1: 62 | # 因为标贝要求音频不能短于3s 所以如果不足3.1s就会生成静音段将音频补到3.1s 63 | # 这段写了一个小时,我现在已经完全了解一切 64 | silence_duration = 3.1 - duration 65 | 66 | silence = ( 67 | ffmpeg 68 | .input('anullsrc', f='lavfi', t=silence_duration) 69 | .output('pipe:', format='s16le', acodec='pcm_s16le', ac=1, ar=16000) 70 | .run(capture_stdout=True, quiet=True) 71 | ) 72 | 73 | output = output + silence[0] 74 | 75 | base64_data = base64.b64encode(output).decode("utf-8") 76 | 77 | headers = { 78 | 'Content-Type': 'application/json', 79 | 'Host': 'openapi.data-baker.com' 80 | } 81 | 82 | json_data = { 83 | 'access_token': access_token, 84 | 'format': 'pcm', 85 | 'txt': text, 86 | 'lan': 'cn', 87 | 'audio': base64_data, 88 | } 89 | 90 | response = requests.post('https://openapi.data-baker.com/cap/getCapScore', headers=headers, json=json_data) 91 | 92 | response_json = response.json() 93 | if response_json["err_no"] == 90000: 94 | return response_json 95 | requsetlogger.error(f"标贝评测请求失败,错误码: {response_json['err_no']} 错误信息: {response_json['err_msg']}") 96 | return False 97 | 98 | # response_json = response.content.decode("utf-8") 99 | # print(response_json) 100 | 101 | 102 | def test_biaobei_pingce(access_token): 103 | text = "你好世界," 104 | silence = ( 105 | ffmpeg 106 | .input('anullsrc', f='lavfi', t=3.1) 107 | .output('pipe:', format='s16le', acodec='pcm_s16le', ac=1, ar=16000) 108 | .run(capture_stdout=True, quiet=True) 109 | ) 110 | # with open("test.wav", "wb") as f: 111 | # f.write(silence[0]) 112 | base64_data = base64.b64encode(silence[0]).decode("utf-8") 113 | 114 | headers = { 115 | 'Content-Type': 'application/json', 116 | 'Host': 'openapi.data-baker.com' 117 | } 118 | 119 | json_data = { 120 | 'access_token': access_token, 121 | 'format': 'pcm', 122 | 'txt': text, 123 | 'lan': 'cn', 124 | 'audio': base64_data, 125 | } 126 | 127 | response = requests.post('https://openapi.data-baker.com/cap/getCapScore', headers=headers, json=json_data) 128 | 129 | response_json = response.json() 130 | if response_json["err_no"] == 50001 or response_json["err_no"] == 50002: 131 | return False 132 | return True 133 | -------------------------------------------------------------------------------- /utils/sqlitedb.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | """ 3 | @Time : 2023/2/9/009 17:15 4 | @Author : 李子 5 | @Url : https://github.com/kslz 6 | """ 7 | import sqlite3 8 | 9 | from utils.log import creatlogger 10 | 11 | 12 | class MyDB(): 13 | def __init__(self, path="db/data.db"): 14 | self.con = sqlite3.connect(path) 15 | self.cur = self.con.cursor() 16 | self.sqlitelogger = creatlogger("sqlitelogger") 17 | self.sqlitelogger.debug("数据库连接已启动") 18 | 19 | def init_database(self): 20 | self.create_workspace_tbl() 21 | pass 22 | 23 | def create_workspace_tbl(self): 24 | self.cur.execute('''CREATE TABLE "workspace_tbl" ( 25 | "workspace_name" TEXT, 26 | "workspace_create_time" TEXT, 27 | "workspace_last_use_time" TEXT, 28 | "workspace_info" TEXT 29 | );''') 30 | self.sqlitelogger.debug("新建工作区表") 31 | self.con.commit() 32 | 33 | def create_dataset_tbl(self): 34 | self.cur.execute('''CREATE TABLE "dataset_tbl" ( 35 | "dataset_id" INTEGER NOT NULL, 36 | "dataset_name" TEXT, 37 | "dataset_create_time" TEXT, 38 | "dataset_last_use_time" TEXT, 39 | "dataset_info" TEXT, 40 | PRIMARY KEY ("dataset_id") 41 | );''') 42 | self.sqlitelogger.debug("新建数据集表") 43 | self.con.commit() 44 | -------------------------------------------------------------------------------- /utils/tool_str.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | """ 3 | @Time : 2023/8/6 0:56 4 | @Author : 李子 5 | @Url : https://github.com/kslz 6 | """ 7 | 8 | class GeshiStr(): 9 | aishell3 = "AISHELL-3" 10 | default = "默认" 11 | vits = "VITS" 12 | sovits = "sovits" 13 | 14 | 15 | class ToolStr(): 16 | biaobei = "标贝" -------------------------------------------------------------------------------- /编译.bat: -------------------------------------------------------------------------------- 1 | pyinstaller main.py -F -n sound_dataset_tools2 2 | 3 | 4 | pip install nuitka 5 | pip install ordered-set 6 | pip install zstandard 7 | 8 | 9 | nuitka --standalone main.py --enable-plugin=pyside6 --onefile --output-dir=out --------------------------------------------------------------------------------