NeoPy commited on
Commit
9a76abc
·
verified ·
1 Parent(s): f1f3fbb

Create train/train.py

Browse files
Files changed (1) hide show
  1. app/tabs/train/train.py +258 -0
app/tabs/train/train.py ADDED
@@ -0,0 +1,258 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import gradio as gr
2
+ from original import *
3
+
4
+
5
+
6
+ def train_tabs():
7
+ with gr.TabItem(i18n("训练")):
8
+ gr.Markdown(
9
+ value=i18n(
10
+ "step1: 填写实验配置. 实验数据放在logs下, 每个实验一个文件夹, 需手工输入实验名路径, 内含实验配置, 日志, 训练得到的模型文件. "
11
+ )
12
+ )
13
+ with gr.Row():
14
+ exp_dir1 = gr.Textbox(label=i18n("输入实验名"), value="mi-test")
15
+ sr2 = gr.Radio(
16
+ label=i18n("目标采样率"),
17
+ choices=["40k", "48k"],
18
+ value="40k",
19
+ interactive=True,
20
+ )
21
+ if_f0_3 = gr.Radio(
22
+ label=i18n("模型是否带音高指导(唱歌一定要, 语音可以不要)"),
23
+ choices=[i18n("是"), i18n("否")],
24
+ value=i18n("是"),
25
+ interactive=True,
26
+ )
27
+ version19 = gr.Radio(
28
+ label=i18n("版本"),
29
+ choices=["v1", "v2"],
30
+ value="v2",
31
+ interactive=True,
32
+ visible=True,
33
+ )
34
+ np7 = gr.Slider(
35
+ minimum=0,
36
+ maximum=config.n_cpu,
37
+ step=1,
38
+ label=i18n("提取音高和处理数据使用的CPU进程数"),
39
+ value=int(np.ceil(config.n_cpu / 1.5)),
40
+ interactive=True,
41
+ )
42
+ with gr.Group(): # 暂时单人的, 后面支持最多4人的#数据处理
43
+ gr.Markdown(
44
+ value=i18n(
45
+ "step2a: 自动遍历训练文件夹下所有可解码成音频的文件并进行切片归一化, 在实验目录下生成2个wav文件夹; 暂时只支持单人训练. "
46
+ )
47
+ )
48
+ with gr.Row():
49
+ trainset_dir4 = gr.Textbox(
50
+ label=i18n("输入训练文件夹路径"),
51
+ value=i18n("E:\\语音音频+标注\\米津玄师\\src"),
52
+ )
53
+ spk_id5 = gr.Slider(
54
+ minimum=0,
55
+ maximum=4,
56
+ step=1,
57
+ label=i18n("请指定说话人id"),
58
+ value=0,
59
+ interactive=True,
60
+ )
61
+ but1 = gr.Button(i18n("处理数据"), variant="primary")
62
+ info1 = gr.Textbox(label=i18n("输出信息"), value="")
63
+ but1.click(
64
+ preprocess_dataset,
65
+ [trainset_dir4, exp_dir1, sr2, np7],
66
+ [info1],
67
+ api_name="train_preprocess",
68
+ )
69
+ with gr.Group():
70
+ gr.Markdown(
71
+ value=i18n(
72
+ "step2b: 使用CPU提取音高(如果模型带音高), 使用GPU提取特征(选择卡号)"
73
+ )
74
+ )
75
+ with gr.Row():
76
+ with gr.Column():
77
+ gpus6 = gr.Textbox(
78
+ label=i18n(
79
+ "以-分隔输入使用的卡号, 例如 0-1-2 使用卡0和卡1和卡2"
80
+ ),
81
+ value=gpus,
82
+ interactive=True,
83
+ visible=F0GPUVisible,
84
+ )
85
+ gpu_info9 = gr.Textbox(
86
+ label=i18n("显卡信息"), value=gpu_info, visible=F0GPUVisible
87
+ )
88
+ with gr.Column():
89
+ f0method8 = gr.Radio(
90
+ label=i18n(
91
+ "选择音高提取算法:输入歌声可用pm提速,高质量语音但CPU差可用dio提速,harvest质量更好但慢,rmvpe效果最好且微吃CPU/GPU"
92
+ ),
93
+ choices=["pm", "harvest", "dio", "rmvpe", "rmvpe_gpu"],
94
+ value="rmvpe_gpu",
95
+ interactive=True,
96
+ )
97
+ gpus_rmvpe = gr.Textbox(
98
+ label=i18n(
99
+ "rmvpe卡号配置:以-分隔输入使用的不同进程卡号,例如0-0-1使用在卡0上跑2个进程并在卡1上跑1个进程"
100
+ ),
101
+ value="%s-%s" % (gpus, gpus),
102
+ interactive=True,
103
+ visible=F0GPUVisible,
104
+ )
105
+ but2 = gr.Button(i18n("特征提取"), variant="primary")
106
+ info2 = gr.Textbox(label=i18n("输出信息"), value="", max_lines=8)
107
+ f0method8.change(
108
+ fn=change_f0_method,
109
+ inputs=[f0method8],
110
+ outputs=[gpus_rmvpe],
111
+ )
112
+ but2.click(
113
+ extract_f0_feature,
114
+ [
115
+ gpus6,
116
+ np7,
117
+ f0method8,
118
+ if_f0_3,
119
+ exp_dir1,
120
+ version19,
121
+ gpus_rmvpe,
122
+ ],
123
+ [info2],
124
+ api_name="train_extract_f0_feature",
125
+ )
126
+ with gr.Group():
127
+ gr.Markdown(value=i18n("step3: 填写训练设置, 开始训练模型和索引"))
128
+ with gr.Row():
129
+ save_epoch10 = gr.Slider(
130
+ minimum=1,
131
+ maximum=50,
132
+ step=1,
133
+ label=i18n("保存频率save_every_epoch"),
134
+ value=5,
135
+ interactive=True,
136
+ )
137
+ total_epoch11 = gr.Slider(
138
+ minimum=2,
139
+ maximum=1000,
140
+ step=1,
141
+ label=i18n("总训练轮数total_epoch"),
142
+ value=20,
143
+ interactive=True,
144
+ )
145
+ batch_size12 = gr.Slider(
146
+ minimum=1,
147
+ maximum=40,
148
+ step=1,
149
+ label=i18n("每张显卡的batch_size"),
150
+ value=default_batch_size,
151
+ interactive=True,
152
+ )
153
+ if_save_latest13 = gr.Radio(
154
+ label=i18n("是否仅保存最新的ckpt文件以节省硬盘空间"),
155
+ choices=[i18n("是"), i18n("否")],
156
+ value=i18n("否"),
157
+ interactive=True,
158
+ )
159
+ if_cache_gpu17 = gr.Radio(
160
+ label=i18n(
161
+ "是否缓存所有训练集至显存. 10min以下小数据可缓存以加速训练, 大数据缓存会炸显存也加不了多少速"
162
+ ),
163
+ choices=[i18n("是"), i18n("否")],
164
+ value=i18n("否"),
165
+ interactive=True,
166
+ )
167
+ if_save_every_weights18 = gr.Radio(
168
+ label=i18n(
169
+ "是否在每次保存时间点将最终小模型保存至weights文件夹"
170
+ ),
171
+ choices=[i18n("是"), i18n("否")],
172
+ value=i18n("否"),
173
+ interactive=True,
174
+ )
175
+ with gr.Row():
176
+ pretrained_G14 = gr.Textbox(
177
+ label=i18n("加载预训练底模G路径"),
178
+ value="assets/pretrained_v2/f0G40k.pth",
179
+ interactive=True,
180
+ )
181
+ pretrained_D15 = gr.Textbox(
182
+ label=i18n("加载预训练底模D路径"),
183
+ value="assets/pretrained_v2/f0D40k.pth",
184
+ interactive=True,
185
+ )
186
+ sr2.change(
187
+ change_sr2,
188
+ [sr2, if_f0_3, version19],
189
+ [pretrained_G14, pretrained_D15],
190
+ )
191
+ version19.change(
192
+ change_version19,
193
+ [sr2, if_f0_3, version19],
194
+ [pretrained_G14, pretrained_D15, sr2],
195
+ )
196
+ if_f0_3.change(
197
+ change_f0,
198
+ [if_f0_3, sr2, version19],
199
+ [f0method8, gpus_rmvpe, pretrained_G14, pretrained_D15],
200
+ )
201
+ gpus16 = gr.Textbox(
202
+ label=i18n(
203
+ "以-分隔输入使用的卡号, 例如 0-1-2 使用卡0和卡1和卡2"
204
+ ),
205
+ value=gpus,
206
+ interactive=True,
207
+ )
208
+ but3 = gr.Button(i18n("训练模型"), variant="primary")
209
+ but4 = gr.Button(i18n("训练特征索引"), variant="primary")
210
+ but5 = gr.Button(i18n("一键训练"), variant="primary")
211
+ info3 = gr.Textbox(label=i18n("输出信息"), value="", max_lines=10)
212
+ but3.click(
213
+ click_train,
214
+ [
215
+ exp_dir1,
216
+ sr2,
217
+ if_f0_3,
218
+ spk_id5,
219
+ save_epoch10,
220
+ total_epoch11,
221
+ batch_size12,
222
+ if_save_latest13,
223
+ pretrained_G14,
224
+ pretrained_D15,
225
+ gpus16,
226
+ if_cache_gpu17,
227
+ if_save_every_weights18,
228
+ version19,
229
+ ],
230
+ info3,
231
+ api_name="train_start",
232
+ )
233
+ but4.click(train_index, [exp_dir1, version19], info3)
234
+ but5.click(
235
+ train1key,
236
+ [
237
+ exp_dir1,
238
+ sr2,
239
+ if_f0_3,
240
+ trainset_dir4,
241
+ spk_id5,
242
+ np7,
243
+ f0method8,
244
+ save_epoch10,
245
+ total_epoch11,
246
+ batch_size12,
247
+ if_save_latest13,
248
+ pretrained_G14,
249
+ pretrained_D15,
250
+ gpus16,
251
+ if_cache_gpu17,
252
+ if_save_every_weights18,
253
+ version19,
254
+ gpus_rmvpe,
255
+ ],
256
+ info3,
257
+ api_name="train_start_all",
258
+ )