NeoPy commited on
Commit
fcbb65d
·
verified ·
1 Parent(s): 70ec2d7

Update app/app.py

Browse files
Files changed (1) hide show
  1. app/app.py +6 -795
app/app.py CHANGED
@@ -1,7 +1,8 @@
1
  import gradio as gr
2
  from original import *
3
-
4
-
 
5
 
6
  with gr.Blocks(title="RVC UI") as app:
7
  gr.Label("RVC UI")
@@ -11,799 +12,9 @@ with gr.Blocks(title="RVC UI") as app:
11
  )
12
  )
13
  with gr.Tabs():
14
- with gr.TabItem(i18n("模型推理")):
15
- with gr.Row():
16
- sid0 = gr.Dropdown(label=i18n("推理音色"), choices=sorted(names))
17
- with gr.Column():
18
- refresh_button = gr.Button(
19
- i18n("刷新音色列表和索引路径"), variant="primary"
20
- )
21
- clean_button = gr.Button(i18n("卸载音色省显存"), variant="primary")
22
- spk_item = gr.Slider(
23
- minimum=0,
24
- maximum=2333,
25
- step=1,
26
- label=i18n("请选择说话人id"),
27
- value=0,
28
- visible=False,
29
- interactive=True,
30
- )
31
- clean_button.click(
32
- fn=clean, inputs=[], outputs=[sid0], api_name="infer_clean"
33
- )
34
- with gr.TabItem(i18n("单次推理")):
35
- with gr.Group():
36
- with gr.Row():
37
- with gr.Column():
38
- vc_transform0 = gr.Number(
39
- label=i18n("变调(整数, 半音数量, 升八度12降八度-12)"),
40
- value=0,
41
- )
42
- input_audio0 = gr.Textbox(
43
- label=i18n(
44
- "输入待处理音频文件路径(默认是正确格式示例)"
45
- ),
46
- placeholder="C:\\Users\\Desktop\\audio_example.wav",
47
- )
48
- file_index1 = gr.Textbox(
49
- label=i18n(
50
- "特征检索库文件路径,为空则使用下拉的选择结果"
51
- ),
52
- placeholder="C:\\Users\\Desktop\\model_example.index",
53
- interactive=True,
54
- )
55
- file_index2 = gr.Dropdown(
56
- label=i18n("自动检测index路径,下拉式选择(dropdown)"),
57
- choices=sorted(index_paths),
58
- interactive=True,
59
- )
60
- f0method0 = gr.Radio(
61
- label=i18n(
62
- "选择音高提取算法,输入歌声可用pm提速,harvest低音好但巨慢无比,crepe效果好但吃GPU,rmvpe效果最好且微吃GPU"
63
- ),
64
- choices=(
65
- ["pm", "harvest", "crepe", "rmvpe"]
66
- if config.dml == False
67
- else ["pm", "harvest", "rmvpe"]
68
- ),
69
- value="rmvpe",
70
- interactive=True,
71
- )
72
-
73
- with gr.Column():
74
- resample_sr0 = gr.Slider(
75
- minimum=0,
76
- maximum=48000,
77
- label=i18n("后处理重采样至最终采样率,0为不进行重采样"),
78
- value=0,
79
- step=1,
80
- interactive=True,
81
- )
82
- rms_mix_rate0 = gr.Slider(
83
- minimum=0,
84
- maximum=1,
85
- label=i18n(
86
- "输入源音量包络替换输出音量包络融合比例,越靠近1越使用输出包络"
87
- ),
88
- value=0.25,
89
- interactive=True,
90
- )
91
- protect0 = gr.Slider(
92
- minimum=0,
93
- maximum=0.5,
94
- label=i18n(
95
- "保护清辅音和呼吸声,防止电音撕裂等artifact,拉满0.5不开启,调低加大保护力度但可能降低索引效果"
96
- ),
97
- value=0.33,
98
- step=0.01,
99
- interactive=True,
100
- )
101
- filter_radius0 = gr.Slider(
102
- minimum=0,
103
- maximum=7,
104
- label=i18n(
105
- ">=3则使用对harvest音高识别的结果使用中值滤波,数值为滤波半径,使用可以削弱哑音"
106
- ),
107
- value=3,
108
- step=1,
109
- interactive=True,
110
- )
111
- index_rate1 = gr.Slider(
112
- minimum=0,
113
- maximum=1,
114
- label=i18n("检索特征占比"),
115
- value=0.75,
116
- interactive=True,
117
- )
118
- f0_file = gr.File(
119
- label=i18n(
120
- "F0曲线文件, 可选, 一行一个音高, 代替默认F0及升降调"
121
- ),
122
- visible=False,
123
- )
124
-
125
- refresh_button.click(
126
- fn=change_choices,
127
- inputs=[],
128
- outputs=[sid0, file_index2],
129
- api_name="infer_refresh",
130
- )
131
- # file_big_npy1 = gr.Textbox(
132
- # label=i18n("特征文件路径"),
133
- # value="E:\\codes\py39\\vits_vc_gpu_train\\logs\\mi-test-1key\\total_fea.npy",
134
- # interactive=True,
135
- # )
136
- with gr.Group():
137
- with gr.Column():
138
- but0 = gr.Button(i18n("转换"), variant="primary")
139
- with gr.Row():
140
- vc_output1 = gr.Textbox(label=i18n("输出信息"))
141
- vc_output2 = gr.Audio(
142
- label=i18n("输出音频(右下角三个点,点了可以下载)")
143
- )
144
-
145
- but0.click(
146
- vc.vc_single,
147
- [
148
- spk_item,
149
- input_audio0,
150
- vc_transform0,
151
- f0_file,
152
- f0method0,
153
- file_index1,
154
- file_index2,
155
- # file_big_npy1,
156
- index_rate1,
157
- filter_radius0,
158
- resample_sr0,
159
- rms_mix_rate0,
160
- protect0,
161
- ],
162
- [vc_output1, vc_output2],
163
- api_name="infer_convert",
164
- )
165
- with gr.TabItem(i18n("批量推理")):
166
- gr.Markdown(
167
- value=i18n(
168
- "批量转换, 输入待转换音频文件夹, 或上传多个音频文件, 在指定文件夹(默认opt)下输出转换的音频. "
169
- )
170
- )
171
- with gr.Row():
172
- with gr.Column():
173
- vc_transform1 = gr.Number(
174
- label=i18n("变调(整数, 半音数量, 升八度12降八度-12)"),
175
- value=0,
176
- )
177
- opt_input = gr.Textbox(
178
- label=i18n("指定输出文件夹"), value="opt"
179
- )
180
- file_index3 = gr.Textbox(
181
- label=i18n("特征检索库文件路径,为空则使用下拉的选择结果"),
182
- value="",
183
- interactive=True,
184
- )
185
- file_index4 = gr.Dropdown(
186
- label=i18n("自动检测index路径,下拉式选择(dropdown)"),
187
- choices=sorted(index_paths),
188
- interactive=True,
189
- )
190
- f0method1 = gr.Radio(
191
- label=i18n(
192
- "选择音高提取算法,输入歌声可用pm提速,harvest低音好但巨慢无比,crepe效果好但吃GPU,rmvpe效果最好且微吃GPU"
193
- ),
194
- choices=(
195
- ["pm", "harvest", "crepe", "rmvpe"]
196
- if config.dml == False
197
- else ["pm", "harvest", "rmvpe"]
198
- ),
199
- value="rmvpe",
200
- interactive=True,
201
- )
202
- format1 = gr.Radio(
203
- label=i18n("导出文件格式"),
204
- choices=["wav", "flac", "mp3", "m4a"],
205
- value="wav",
206
- interactive=True,
207
- )
208
-
209
- refresh_button.click(
210
- fn=lambda: change_choices()[1],
211
- inputs=[],
212
- outputs=file_index4,
213
- api_name="infer_refresh_batch",
214
- )
215
- # file_big_npy2 = gr.Textbox(
216
- # label=i18n("特征文件路径"),
217
- # value="E:\\codes\\py39\\vits_vc_gpu_train\\logs\\mi-test-1key\\total_fea.npy",
218
- # interactive=True,
219
- # )
220
-
221
- with gr.Column():
222
- resample_sr1 = gr.Slider(
223
- minimum=0,
224
- maximum=48000,
225
- label=i18n("后处理重采样至最终采样率,0为不进行重采样"),
226
- value=0,
227
- step=1,
228
- interactive=True,
229
- )
230
- rms_mix_rate1 = gr.Slider(
231
- minimum=0,
232
- maximum=1,
233
- label=i18n(
234
- "输入源音量包络替换输出音量包络融合比例,越靠近1越使用输出包络"
235
- ),
236
- value=1,
237
- interactive=True,
238
- )
239
- protect1 = gr.Slider(
240
- minimum=0,
241
- maximum=0.5,
242
- label=i18n(
243
- "保护清辅音和呼吸声,防止电音撕裂等artifact,拉满0.5不开启,调低加大保护力度但可能降低索引效果"
244
- ),
245
- value=0.33,
246
- step=0.01,
247
- interactive=True,
248
- )
249
- filter_radius1 = gr.Slider(
250
- minimum=0,
251
- maximum=7,
252
- label=i18n(
253
- ">=3则使用对harvest音高识别的结果使用中值滤波,数值为滤波半径,使用可以削弱哑音"
254
- ),
255
- value=3,
256
- step=1,
257
- interactive=True,
258
- )
259
- index_rate2 = gr.Slider(
260
- minimum=0,
261
- maximum=1,
262
- label=i18n("检索特征占比"),
263
- value=1,
264
- interactive=True,
265
- )
266
- with gr.Row():
267
- dir_input = gr.Textbox(
268
- label=i18n(
269
- "输入待处理音频文件夹路径(去文件管理器地址栏拷就行了)"
270
- ),
271
- placeholder="C:\\Users\\Desktop\\input_vocal_dir",
272
- )
273
- inputs = gr.File(
274
- file_count="multiple",
275
- label=i18n("也可批量输入音频文件, 二选一, 优先读文件夹"),
276
- )
277
-
278
- with gr.Row():
279
- but1 = gr.Button(i18n("转换"), variant="primary")
280
- vc_output3 = gr.Textbox(label=i18n("输出信息"))
281
-
282
- but1.click(
283
- vc.vc_multi,
284
- [
285
- spk_item,
286
- dir_input,
287
- opt_input,
288
- inputs,
289
- vc_transform1,
290
- f0method1,
291
- file_index3,
292
- file_index4,
293
- # file_big_npy2,
294
- index_rate2,
295
- filter_radius1,
296
- resample_sr1,
297
- rms_mix_rate1,
298
- protect1,
299
- format1,
300
- ],
301
- [vc_output3],
302
- api_name="infer_convert_batch",
303
- )
304
- sid0.change(
305
- fn=vc.get_vc,
306
- inputs=[sid0, protect0, protect1],
307
- outputs=[spk_item, protect0, protect1, file_index2, file_index4],
308
- api_name="infer_change_voice",
309
- )
310
- with gr.TabItem(i18n("伴奏人声分离&去混响&去回声")):
311
- with gr.Group():
312
- gr.Markdown(
313
- value=i18n(
314
- "人声伴奏分离批量处理, 使用UVR5模型。 <br>合格的文件夹路��格式举例: E:\\codes\\py39\\vits_vc_gpu\\白鹭霜华测试样例(去文件管理器地址栏拷就行了)。 <br>模型分为三类: <br>1、保留人声:不带和声的音频选这个,对主人声保留比HP5更好。内置HP2和HP3两个模型,HP3可能轻微漏伴奏但对主人声保留比HP2稍微好一丁点; <br>2、仅保留主人声:带和声的音频选这个,对主人声可能有削弱。内置HP5一个模型; <br> 3、去混响、去延迟模型(by FoxJoy):<br>  (1)MDX-Net(onnx_dereverb):对于双通道混响是最好的选择,不能去除单通道混响;<br>&emsp;(234)DeEcho:去除延迟效果。Aggressive比Normal去除得更彻底,DeReverb额外去除混响,可去除单声道混响,但是对高频重的板式混响去不干净。<br>去混响/去延迟,附:<br>1、DeEcho-DeReverb模型的耗时是另外2个DeEcho模型的接近2倍;<br>2、MDX-Net-Dereverb模型挺慢的;<br>3、个人推荐的最干净的配置是先MDX-Net再DeEcho-Aggressive。"
315
- )
316
- )
317
- with gr.Row():
318
- with gr.Column():
319
- dir_wav_input = gr.Textbox(
320
- label=i18n("输入待处理音频文件夹路径"),
321
- placeholder="C:\\Users\\Desktop\\todo-songs",
322
- )
323
- wav_inputs = gr.File(
324
- file_count="multiple",
325
- label=i18n("也可批量输入音频文件, 二选一, 优先读文件夹"),
326
- )
327
- with gr.Column():
328
- model_choose = gr.Dropdown(
329
- label=i18n("模型"), choices=uvr5_names
330
- )
331
- agg = gr.Slider(
332
- minimum=0,
333
- maximum=20,
334
- step=1,
335
- label="人声提取激进程度",
336
- value=10,
337
- interactive=True,
338
- visible=False, # 先不开放调整
339
- )
340
- opt_vocal_root = gr.Textbox(
341
- label=i18n("指定输出主人声文件夹"), value="opt"
342
- )
343
- opt_ins_root = gr.Textbox(
344
- label=i18n("指定输出非主人声文件夹"), value="opt"
345
- )
346
- format0 = gr.Radio(
347
- label=i18n("导出文件格式"),
348
- choices=["wav", "flac", "mp3", "m4a"],
349
- value="flac",
350
- interactive=True,
351
- )
352
- but2 = gr.Button(i18n("转换"), variant="primary")
353
- vc_output4 = gr.Textbox(label=i18n("输出信息"))
354
- but2.click(
355
- uvr,
356
- [
357
- model_choose,
358
- dir_wav_input,
359
- opt_vocal_root,
360
- wav_inputs,
361
- opt_ins_root,
362
- agg,
363
- format0,
364
- ],
365
- [vc_output4],
366
- api_name="uvr_convert",
367
- )
368
- with gr.TabItem(i18n("训练")):
369
- gr.Markdown(
370
- value=i18n(
371
- "step1: 填写实验配置. 实验数据放在logs下, 每个实验一个文件夹, 需手工输入实验名路径, 内含实验配置, 日志, 训练得到的模型文件. "
372
- )
373
- )
374
- with gr.Row():
375
- exp_dir1 = gr.Textbox(label=i18n("输入实验名"), value="mi-test")
376
- sr2 = gr.Radio(
377
- label=i18n("目标采样率"),
378
- choices=["40k", "48k"],
379
- value="40k",
380
- interactive=True,
381
- )
382
- if_f0_3 = gr.Radio(
383
- label=i18n("模型是否带音高指导(唱歌一定要, 语音可以不要)"),
384
- choices=[i18n("是"), i18n("否")],
385
- value=i18n("是"),
386
- interactive=True,
387
- )
388
- version19 = gr.Radio(
389
- label=i18n("版本"),
390
- choices=["v1", "v2"],
391
- value="v2",
392
- interactive=True,
393
- visible=True,
394
- )
395
- np7 = gr.Slider(
396
- minimum=0,
397
- maximum=config.n_cpu,
398
- step=1,
399
- label=i18n("提取音高和处理数据使用的CPU进程数"),
400
- value=int(np.ceil(config.n_cpu / 1.5)),
401
- interactive=True,
402
- )
403
- with gr.Group(): # 暂时单人的, 后面支持最多4人的#数据处理
404
- gr.Markdown(
405
- value=i18n(
406
- "step2a: 自动遍历训练文件夹下所有可解码成音频的文件并进行切片归一化, 在实验目录下生成2个wav文件夹; 暂时只支持单人训练. "
407
- )
408
- )
409
- with gr.Row():
410
- trainset_dir4 = gr.Textbox(
411
- label=i18n("输入训练文件夹路径"),
412
- value=i18n("E:\\语音音频+标注\\米津玄师\\src"),
413
- )
414
- spk_id5 = gr.Slider(
415
- minimum=0,
416
- maximum=4,
417
- step=1,
418
- label=i18n("请指定说话人id"),
419
- value=0,
420
- interactive=True,
421
- )
422
- but1 = gr.Button(i18n("处理数据"), variant="primary")
423
- info1 = gr.Textbox(label=i18n("输出信息"), value="")
424
- but1.click(
425
- preprocess_dataset,
426
- [trainset_dir4, exp_dir1, sr2, np7],
427
- [info1],
428
- api_name="train_preprocess",
429
- )
430
- with gr.Group():
431
- gr.Markdown(
432
- value=i18n(
433
- "step2b: 使用CPU提取音高(如果模型带音高), 使用GPU提取特征(选择卡号)"
434
- )
435
- )
436
- with gr.Row():
437
- with gr.Column():
438
- gpus6 = gr.Textbox(
439
- label=i18n(
440
- "以-分隔输入使用的卡号, 例如 0-1-2 使用卡0和卡1和卡2"
441
- ),
442
- value=gpus,
443
- interactive=True,
444
- visible=F0GPUVisible,
445
- )
446
- gpu_info9 = gr.Textbox(
447
- label=i18n("显卡信息"), value=gpu_info, visible=F0GPUVisible
448
- )
449
- with gr.Column():
450
- f0method8 = gr.Radio(
451
- label=i18n(
452
- "选择音高提取算法:输入歌声可用pm提速,高质量语音但CPU差可用dio提速,harvest质量更好但慢,rmvpe效果最好且微吃CPU/GPU"
453
- ),
454
- choices=["pm", "harvest", "dio", "rmvpe", "rmvpe_gpu"],
455
- value="rmvpe_gpu",
456
- interactive=True,
457
- )
458
- gpus_rmvpe = gr.Textbox(
459
- label=i18n(
460
- "rmvpe卡号配置:以-分隔输入使用的不同进程卡号,例如0-0-1使用在卡0上跑2个进程并在卡1上跑1个进程"
461
- ),
462
- value="%s-%s" % (gpus, gpus),
463
- interactive=True,
464
- visible=F0GPUVisible,
465
- )
466
- but2 = gr.Button(i18n("特征提取"), variant="primary")
467
- info2 = gr.Textbox(label=i18n("输出信息"), value="", max_lines=8)
468
- f0method8.change(
469
- fn=change_f0_method,
470
- inputs=[f0method8],
471
- outputs=[gpus_rmvpe],
472
- )
473
- but2.click(
474
- extract_f0_feature,
475
- [
476
- gpus6,
477
- np7,
478
- f0method8,
479
- if_f0_3,
480
- exp_dir1,
481
- version19,
482
- gpus_rmvpe,
483
- ],
484
- [info2],
485
- api_name="train_extract_f0_feature",
486
- )
487
- with gr.Group():
488
- gr.Markdown(value=i18n("step3: 填写训练设置, 开始训练模型和索引"))
489
- with gr.Row():
490
- save_epoch10 = gr.Slider(
491
- minimum=1,
492
- maximum=50,
493
- step=1,
494
- label=i18n("保存频率save_every_epoch"),
495
- value=5,
496
- interactive=True,
497
- )
498
- total_epoch11 = gr.Slider(
499
- minimum=2,
500
- maximum=1000,
501
- step=1,
502
- label=i18n("总训练轮数total_epoch"),
503
- value=20,
504
- interactive=True,
505
- )
506
- batch_size12 = gr.Slider(
507
- minimum=1,
508
- maximum=40,
509
- step=1,
510
- label=i18n("每张显卡的batch_size"),
511
- value=default_batch_size,
512
- interactive=True,
513
- )
514
- if_save_latest13 = gr.Radio(
515
- label=i18n("是否仅保存最新的ckpt文件以节省硬盘空间"),
516
- choices=[i18n("是"), i18n("否")],
517
- value=i18n("否"),
518
- interactive=True,
519
- )
520
- if_cache_gpu17 = gr.Radio(
521
- label=i18n(
522
- "是否缓存所有训练集至显存. 10min以下小数据可缓存以加速训练, 大数据缓存会炸显存也加不了多少速"
523
- ),
524
- choices=[i18n("是"), i18n("否")],
525
- value=i18n("否"),
526
- interactive=True,
527
- )
528
- if_save_every_weights18 = gr.Radio(
529
- label=i18n(
530
- "是否在每次保存时间点将最终小模型保存至weights文件夹"
531
- ),
532
- choices=[i18n("是"), i18n("否")],
533
- value=i18n("否"),
534
- interactive=True,
535
- )
536
- with gr.Row():
537
- pretrained_G14 = gr.Textbox(
538
- label=i18n("加载预训练底模G路径"),
539
- value="assets/pretrained_v2/f0G40k.pth",
540
- interactive=True,
541
- )
542
- pretrained_D15 = gr.Textbox(
543
- label=i18n("加载预训练底模D路径"),
544
- value="assets/pretrained_v2/f0D40k.pth",
545
- interactive=True,
546
- )
547
- sr2.change(
548
- change_sr2,
549
- [sr2, if_f0_3, version19],
550
- [pretrained_G14, pretrained_D15],
551
- )
552
- version19.change(
553
- change_version19,
554
- [sr2, if_f0_3, version19],
555
- [pretrained_G14, pretrained_D15, sr2],
556
- )
557
- if_f0_3.change(
558
- change_f0,
559
- [if_f0_3, sr2, version19],
560
- [f0method8, gpus_rmvpe, pretrained_G14, pretrained_D15],
561
- )
562
- gpus16 = gr.Textbox(
563
- label=i18n(
564
- "以-分隔输入使用的卡号, 例如 0-1-2 使用卡0和卡1和卡2"
565
- ),
566
- value=gpus,
567
- interactive=True,
568
- )
569
- but3 = gr.Button(i18n("训练模型"), variant="primary")
570
- but4 = gr.Button(i18n("训练特征索引"), variant="primary")
571
- but5 = gr.Button(i18n("一键训练"), variant="primary")
572
- info3 = gr.Textbox(label=i18n("输出信息"), value="", max_lines=10)
573
- but3.click(
574
- click_train,
575
- [
576
- exp_dir1,
577
- sr2,
578
- if_f0_3,
579
- spk_id5,
580
- save_epoch10,
581
- total_epoch11,
582
- batch_size12,
583
- if_save_latest13,
584
- pretrained_G14,
585
- pretrained_D15,
586
- gpus16,
587
- if_cache_gpu17,
588
- if_save_every_weights18,
589
- version19,
590
- ],
591
- info3,
592
- api_name="train_start",
593
- )
594
- but4.click(train_index, [exp_dir1, version19], info3)
595
- but5.click(
596
- train1key,
597
- [
598
- exp_dir1,
599
- sr2,
600
- if_f0_3,
601
- trainset_dir4,
602
- spk_id5,
603
- np7,
604
- f0method8,
605
- save_epoch10,
606
- total_epoch11,
607
- batch_size12,
608
- if_save_latest13,
609
- pretrained_G14,
610
- pretrained_D15,
611
- gpus16,
612
- if_cache_gpu17,
613
- if_save_every_weights18,
614
- version19,
615
- gpus_rmvpe,
616
- ],
617
- info3,
618
- api_name="train_start_all",
619
- )
620
-
621
- with gr.TabItem(i18n("ckpt处理")):
622
- with gr.Group():
623
- gr.Markdown(value=i18n("模型���合, 可用于测试音色融合"))
624
- with gr.Row():
625
- ckpt_a = gr.Textbox(
626
- label=i18n("A模型路径"), value="", interactive=True
627
- )
628
- ckpt_b = gr.Textbox(
629
- label=i18n("B模型路径"), value="", interactive=True
630
- )
631
- alpha_a = gr.Slider(
632
- minimum=0,
633
- maximum=1,
634
- label=i18n("A模型权重"),
635
- value=0.5,
636
- interactive=True,
637
- )
638
- with gr.Row():
639
- sr_ = gr.Radio(
640
- label=i18n("目标采样率"),
641
- choices=["40k", "48k"],
642
- value="40k",
643
- interactive=True,
644
- )
645
- if_f0_ = gr.Radio(
646
- label=i18n("模型是否带音高指导"),
647
- choices=[i18n("是"), i18n("否")],
648
- value=i18n("是"),
649
- interactive=True,
650
- )
651
- info__ = gr.Textbox(
652
- label=i18n("要置入的模型信息"),
653
- value="",
654
- max_lines=8,
655
- interactive=True,
656
- )
657
- name_to_save0 = gr.Textbox(
658
- label=i18n("保存的模型名不带后缀"),
659
- value="",
660
- max_lines=1,
661
- interactive=True,
662
- )
663
- version_2 = gr.Radio(
664
- label=i18n("模型版本型号"),
665
- choices=["v1", "v2"],
666
- value="v1",
667
- interactive=True,
668
- )
669
- with gr.Row():
670
- but6 = gr.Button(i18n("融合"), variant="primary")
671
- info4 = gr.Textbox(label=i18n("输出信息"), value="", max_lines=8)
672
- but6.click(
673
- merge,
674
- [
675
- ckpt_a,
676
- ckpt_b,
677
- alpha_a,
678
- sr_,
679
- if_f0_,
680
- info__,
681
- name_to_save0,
682
- version_2,
683
- ],
684
- info4,
685
- api_name="ckpt_merge",
686
- ) # def merge(path1,path2,alpha1,sr,f0,info):
687
- with gr.Group():
688
- gr.Markdown(
689
- value=i18n("修改模型信息(仅支持weights文件夹下提取的小模型文件)")
690
- )
691
- with gr.Row():
692
- ckpt_path0 = gr.Textbox(
693
- label=i18n("模型路径"), value="", interactive=True
694
- )
695
- info_ = gr.Textbox(
696
- label=i18n("要改的模型信息"),
697
- value="",
698
- max_lines=8,
699
- interactive=True,
700
- )
701
- name_to_save1 = gr.Textbox(
702
- label=i18n("保存的文件名, 默认空为和源文件同名"),
703
- value="",
704
- max_lines=8,
705
- interactive=True,
706
- )
707
- with gr.Row():
708
- but7 = gr.Button(i18n("修改"), variant="primary")
709
- info5 = gr.Textbox(label=i18n("输出信息"), value="", max_lines=8)
710
- but7.click(
711
- change_info,
712
- [ckpt_path0, info_, name_to_save1],
713
- info5,
714
- api_name="ckpt_modify",
715
- )
716
- with gr.Group():
717
- gr.Markdown(
718
- value=i18n("查看模型信息(仅支持weights文件夹下提取的小模型文件)")
719
- )
720
- with gr.Row():
721
- ckpt_path1 = gr.Textbox(
722
- label=i18n("模型路径"), value="", interactive=True
723
- )
724
- but8 = gr.Button(i18n("查看"), variant="primary")
725
- info6 = gr.Textbox(label=i18n("输出信息"), value="", max_lines=8)
726
- but8.click(show_info, [ckpt_path1], info6, api_name="ckpt_show")
727
- with gr.Group():
728
- gr.Markdown(
729
- value=i18n(
730
- "模型提取(输入logs文件夹下大文件模型路径),适用于训一半不想训了模型没有自动提取保存小文件模型,或者想测试中间模型的情况"
731
- )
732
- )
733
- with gr.Row():
734
- ckpt_path2 = gr.Textbox(
735
- label=i18n("模型路径"),
736
- value="E:\\codes\\py39\\logs\\mi-test_f0_48k\\G_23333.pth",
737
- interactive=True,
738
- )
739
- save_name = gr.Textbox(
740
- label=i18n("保存名"), value="", interactive=True
741
- )
742
- sr__ = gr.Radio(
743
- label=i18n("目标采样率"),
744
- choices=["32k", "40k", "48k"],
745
- value="40k",
746
- interactive=True,
747
- )
748
- if_f0__ = gr.Radio(
749
- label=i18n("模型是否带音高指导,1是0否"),
750
- choices=["1", "0"],
751
- value="1",
752
- interactive=True,
753
- )
754
- version_1 = gr.Radio(
755
- label=i18n("模型版本型号"),
756
- choices=["v1", "v2"],
757
- value="v2",
758
- interactive=True,
759
- )
760
- info___ = gr.Textbox(
761
- label=i18n("要置入的模型信息"),
762
- value="",
763
- max_lines=8,
764
- interactive=True,
765
- )
766
- but9 = gr.Button(i18n("提取"), variant="primary")
767
- info7 = gr.Textbox(label=i18n("输出信息"), value="", max_lines=8)
768
- ckpt_path2.change(
769
- change_info_, [ckpt_path2], [sr__, if_f0__, version_1]
770
- )
771
- but9.click(
772
- extract_small_model,
773
- [ckpt_path2, save_name, sr__, if_f0__, info___, version_1],
774
- info7,
775
- api_name="ckpt_extract",
776
- )
777
-
778
- with gr.TabItem(i18n("Onnx导出")):
779
- with gr.Row():
780
- ckpt_dir = gr.Textbox(
781
- label=i18n("RVC模型路径"), value="", interactive=True
782
- )
783
- with gr.Row():
784
- onnx_dir = gr.Textbox(
785
- label=i18n("Onnx输出路径"), value="", interactive=True
786
- )
787
- with gr.Row():
788
- infoOnnx = gr.Label(label="info")
789
- with gr.Row():
790
- butOnnx = gr.Button(i18n("导出Onnx模型"), variant="primary")
791
- butOnnx.click(
792
- export_onnx, [ckpt_dir, onnx_dir], infoOnnx, api_name="export_onnx"
793
- )
794
-
795
- tab_faq = i18n("常见问题解答")
796
- with gr.TabItem(tab_faq):
797
- try:
798
- if tab_faq == "常见问题解答":
799
- with open("docs/cn/faq.md", "r", encoding="utf8") as f:
800
- info = f.read()
801
- else:
802
- with open("docs/en/faq_en.md", "r", encoding="utf8") as f:
803
- info = f.read()
804
- gr.Markdown(value=info)
805
- except:
806
- gr.Markdown(traceback.format_exc())
807
 
808
  if config.iscolab:
809
  app.queue().launch(share=True, max_threads=511)
 
1
  import gradio as gr
2
  from original import *
3
+ from app.tabs.models.onnx import monnx_conv
4
+ from app.tabs.infer.infer import infer_tabs
5
+ from app.tabs.infer.uvr import uvr_tabs
6
 
7
  with gr.Blocks(title="RVC UI") as app:
8
  gr.Label("RVC UI")
 
12
  )
13
  )
14
  with gr.Tabs():
15
+ infer_tabs()
16
+ uvr_tabs()
17
+ onnx_conv()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
18
 
19
  if config.iscolab:
20
  app.queue().launch(share=True, max_threads=511)