Upload 170 files
Browse filesThis view is limited to 50 files because it contains too many changes.
See raw diff
- LICENSE +21 -0
- README.md +470 -0
- assets/binary/decrypt.bin +3 -0
- assets/binary/world.bin +3 -0
- assets/f0/.gitattributes +0 -0
- assets/ico.png +3 -0
- assets/languages/en-US.json +663 -0
- assets/languages/vi-VN.json +663 -0
- assets/logs/mute/energy/mute.wav.npy +3 -0
- assets/logs/mute/f0/mute.wav.npy +3 -0
- assets/logs/mute/f0_voiced/mute.wav.npy +3 -0
- assets/logs/mute/sliced_audios/mute32000.wav +3 -0
- assets/logs/mute/sliced_audios/mute40000.wav +3 -0
- assets/logs/mute/sliced_audios/mute48000.wav +3 -0
- assets/logs/mute/sliced_audios_16k/mute.wav +0 -0
- assets/logs/mute/v1_extracted/mute.npy +3 -0
- assets/logs/mute/v1_extracted/mute_chinese.npy +3 -0
- assets/logs/mute/v1_extracted/mute_japanese.npy +3 -0
- assets/logs/mute/v1_extracted/mute_korean.npy +3 -0
- assets/logs/mute/v1_extracted/mute_portuguese.npy +3 -0
- assets/logs/mute/v1_extracted/mute_spin.npy +3 -0
- assets/logs/mute/v1_extracted/mute_vietnamese.npy +3 -0
- assets/logs/mute/v2_extracted/mute.npy +3 -0
- assets/logs/mute/v2_extracted/mute_chinese.npy +3 -0
- assets/logs/mute/v2_extracted/mute_japanese.npy +3 -0
- assets/logs/mute/v2_extracted/mute_korean.npy +3 -0
- assets/logs/mute/v2_extracted/mute_portuguese.npy +3 -0
- assets/logs/mute/v2_extracted/mute_spin.npy +3 -0
- assets/logs/mute/v2_extracted/mute_vietnamese.npy +3 -0
- assets/models/embedders/.gitattributes +0 -0
- assets/models/predictors/.gitattributes +0 -0
- assets/models/pretrained_custom/.gitattributes +0 -0
- assets/models/pretrained_v1/.gitattributes +0 -0
- assets/models/pretrained_v2/.gitattributes +0 -0
- assets/models/speaker_diarization/assets/gpt2.tiktoken +0 -0
- assets/models/speaker_diarization/assets/mel_filters.npz +3 -0
- assets/models/speaker_diarization/assets/multilingual.tiktoken +0 -0
- assets/models/speaker_diarization/models/.gitattributes +0 -0
- assets/models/uvr5/.gitattributes +0 -0
- assets/presets/.gitattributes +0 -0
- assets/weights/.gitattributes +0 -0
- audios/.gitattributes +0 -0
- dataset/.gitattributes +0 -0
- main/app/app.py +87 -0
- main/app/core/downloads.py +187 -0
- main/app/core/editing.py +96 -0
- main/app/core/f0_extract.py +54 -0
- main/app/core/inference.py +387 -0
- main/app/core/model_utils.py +162 -0
- main/app/core/presets.py +165 -0
LICENSE
ADDED
@@ -0,0 +1,21 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
MIT License
|
2 |
+
|
3 |
+
Copyright (c) 2025 Phạm Huỳnh Anh
|
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.
|
README.md
ADDED
@@ -0,0 +1,470 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<div align="center">
|
2 |
+
<img alt="LOGO" src="assets/ico.png" width="300" height="300" />
|
3 |
+
|
4 |
+
# Vietnamese RVC BY ANH
|
5 |
+
Công cụ chuyển đổi giọng nói chất lượng và hiệu suất cao đơn giản.
|
6 |
+
|
7 |
+
[](https://github.com/PhamHuynhAnh16/Vietnamese-RVC)
|
8 |
+
[](https://colab.research.google.com/github/PhamHuynhAnh16/Vietnamese-RVC-ipynb/blob/main/Vietnamese-RVC.ipynb)
|
9 |
+
[](https://github.com/PhamHuynhAnh16/Vietnamese-RVC/blob/main/LICENSE)
|
10 |
+
|
11 |
+
</div>
|
12 |
+
|
13 |
+
<div align="center">
|
14 |
+
|
15 |
+
[](https://huggingface.co/spaces/AnhP/RVC-GUI)
|
16 |
+
[](https://huggingface.co/AnhP/Vietnamese-RVC-Project)
|
17 |
+
|
18 |
+
</div>
|
19 |
+
|
20 |
+
# Mô tả
|
21 |
+
|
22 |
+
Dự án này là một công cụ chuyển đổi giọng nói đơn giản, dễ sử dụng. Với mục tiêu tạo ra các sản phẩm chuyển đổi giọng nói chất lượng cao và hiệu suất tối ưu, dự án cho phép người dùng thay đổi giọng nói một cách mượt mà, tự nhiên.
|
23 |
+
|
24 |
+
# Các tính năng của dự án
|
25 |
+
|
26 |
+
- Tách nhạc (MDX-Net/Demucs)
|
27 |
+
|
28 |
+
- Chuyển đổi giọng nói (Chuyển đổi tệp / Chuyển đổi hàng loạt / Chuyển đổi với Whisper / Chuyển đổi văn bản)
|
29 |
+
|
30 |
+
- Áp dụng hiệu ứng cho âm thanh
|
31 |
+
|
32 |
+
- Tạo dữ liệu huấn luyện (Từ đường dẫn liên kết)
|
33 |
+
|
34 |
+
- Huấn luyện mô hình (v1/v2, bộ mã hóa chất lượng cao, huấn luyện năng lượng)
|
35 |
+
|
36 |
+
- Dung hợp mô hình
|
37 |
+
|
38 |
+
- Đọc thông tin mô hình
|
39 |
+
|
40 |
+
- Xuất mô hình sang ONNX
|
41 |
+
|
42 |
+
- Tải xuống từ kho mô hình có sẳn
|
43 |
+
|
44 |
+
- Tìm kiếm mô hình từ web
|
45 |
+
|
46 |
+
- Trích xuất cao độ
|
47 |
+
|
48 |
+
- Hỗ trợ suy luận chuyển đổi âm thanh bằng mô hình ONNX
|
49 |
+
|
50 |
+
- Mô hình ONNX RVC cũng sẽ hỗ trợ chỉ mục để suy luận
|
51 |
+
|
52 |
+
**Phương thức trích xuất cao độ: `pm-ac, pm-cc, pm-shs, dio, mangio-crepe-tiny, mangio-crepe-small, mangio-crepe-medium, mangio-crepe-large, mangio-crepe-full, crepe-tiny, crepe-small, crepe-medium, crepe-large, crepe-full, fcpe, fcpe-legacy, rmvpe, rmvpe-legacy, harvest, yin, pyin, swipe, piptrack, fcn`**
|
53 |
+
|
54 |
+
**Các mô hình trích xuất nhúng: `contentvec_base, hubert_base, vietnamese_hubert_base, japanese_hubert_base, korean_hubert_base, chinese_hubert_base, portuguese_hubert_base, spin`**
|
55 |
+
|
56 |
+
- **Các mô hình trích xuất cao độ đều có phiên bản tăng tốc ONNX trừ các phương thức hoạt động bằng trình bao bọc.**
|
57 |
+
- **Các mô hình trích xuất đều có thể kết hợp với nhau để tạo ra cảm giác mới mẻ, ví dụ: `hybrid[rmvpe+harvest]`.**
|
58 |
+
- **Các mô hình trích xuất nhúng có sẳn các chế độ nhúng như: fairseq, onnx, transformers, spin.**
|
59 |
+
|
60 |
+
# Hướng dẫn sử dụng
|
61 |
+
|
62 |
+
**Sẽ có nếu tôi thực sự rảnh...**
|
63 |
+
|
64 |
+
# Cài đặt
|
65 |
+
|
66 |
+
Bước 1: Cài đặt các phần phụ trợ cần thiết
|
67 |
+
|
68 |
+
- Cài đặt Python từ trang chủ: **[PYTHON](https://www.python.org/ftp/python/3.11.8/python-3.11.8-amd64.exe)** (Dự án đã được kiểm tra trên Python 3.10.x và 3.11.x)
|
69 |
+
- Cài đặt FFmpeg từ nguồn và thêm vào PATH hệ thống: **[FFMPEG](https://github.com/BtbN/FFmpeg-Builds/releases)**
|
70 |
+
|
71 |
+
Bước 2: Cài đặt dự án (Dùng Git hoặc đơn giản là tải trên github)
|
72 |
+
|
73 |
+
Sử dụng đối với Git:
|
74 |
+
- git clone https://github.com/PhamHuynhAnh16/Vietnamese-RVC.git
|
75 |
+
- cd Vietnamese-RVC
|
76 |
+
|
77 |
+
Cài đặt bằng github:
|
78 |
+
- Vào https://github.com/PhamHuynhAnh16/Vietnamese-RVC
|
79 |
+
- Nhấn vào `<> Code` màu xanh lá chọn `Download ZIP`
|
80 |
+
- Giải nén `Vietnamese-RVC-main.zip`
|
81 |
+
- Vào thư mục Vietnamese-RVC-main chọn vào thanh Path nhập `cmd` và nhấn Enter
|
82 |
+
|
83 |
+
Bước 3: Cài đặt thư viện cần thiết:
|
84 |
+
|
85 |
+
Nhập lệnh:
|
86 |
+
```
|
87 |
+
python -m venv env
|
88 |
+
env\\Scripts\\activate
|
89 |
+
```
|
90 |
+
|
91 |
+
Đối với CPU:
|
92 |
+
```
|
93 |
+
python -m pip install -r requirements.txt
|
94 |
+
```
|
95 |
+
|
96 |
+
Đối với CUDA (Có thể thay cu118 thành bản cu128 mới hơn nếu GPU hỗ trợ):
|
97 |
+
```
|
98 |
+
python -m pip install torch torchaudio torchvision --index-url https://download.pytorch.org/whl/cu118
|
99 |
+
python -m pip install -r requirements.txt
|
100 |
+
```
|
101 |
+
|
102 |
+
Đối với AMD:
|
103 |
+
```
|
104 |
+
python -m pip install torch==2.6.0 torchaudio==2.6.0 torchvision
|
105 |
+
python -m pip install https://github.com/artyom-beilis/pytorch_dlprim/releases/download/0.2.0/pytorch_ocl-0.2.0+torch2.6-cp311-none-win_amd64.whl
|
106 |
+
python -m pip install onnxruntime-directml
|
107 |
+
python -m pip install -r requirements.txt
|
108 |
+
```
|
109 |
+
|
110 |
+
Lưu ý đối với AMD:
|
111 |
+
- Chỉ cài đặt AMD trên python 3.11 vì DLPRIM không có bản cho python 3.10.
|
112 |
+
- Demucs có thể gây quá tải và tràn bộ nhớ đối với GPU (nếu cần sử dụng demucs hãy mở tệp config.json trong main\configs sửa đối số demucs_cpu_mode thành true).
|
113 |
+
- DDP không hỗ trợ huấn luyện đa GPU đối với OPENCL (AMD).
|
114 |
+
- Một số thuật toán khác phải chạy trên cpu nên có thể hiệu suất của GPU có thể không sử dụng hết.
|
115 |
+
|
116 |
+
# Sử dụng
|
117 |
+
|
118 |
+
**Sử dụng với Google Colab**
|
119 |
+
- Mở Google Colab: [Vietnamese-RVC](https://colab.research.google.com/github/PhamHuynhAnh16/Vietnamese-RVC-ipynb/blob/main/Vietnamese-RVC.ipynb)
|
120 |
+
- Bước 1: Chạy ô Cài đặt và đợi nó hoàn tất.
|
121 |
+
- Bước 2: Chạy ô Mở giao diện sử dụng (Khi này giao diện sẽ in ra 2 đường dẫn 1 là 0.0.0.0.7680 và 1 đường dẫn gradio có thể nhấp được, bạn chọn vào đường dẫn nhấp được và nó sẽ đưa bạn đến giao diện).
|
122 |
+
|
123 |
+
**Chạy tệp run_app để mở giao diện sử dụng, chạy tệp tensorboard để mở biểu đồ kiểm tra huấn luyện. (Lưu ý: không tắt Command Prompt hoặc Terminal)**
|
124 |
+
```
|
125 |
+
run_app.bat / tensorboard.bat
|
126 |
+
```
|
127 |
+
|
128 |
+
**Khởi động giao diện sử dụng. (Thêm `--allow_all_disk` vào lệnh để cho phép gradio truy cập tệp ngoài)**
|
129 |
+
```
|
130 |
+
env\\Scripts\\python.exe main\\app\\app.py --open
|
131 |
+
```
|
132 |
+
|
133 |
+
**Với trường hợp bạn sử dụng Tensorboard để kiểm tra huấn luyện**
|
134 |
+
```
|
135 |
+
env\\Scripts\\python.exe main/app/run_tensorboard.py
|
136 |
+
```
|
137 |
+
|
138 |
+
**Sử dụng bằng cú pháp**
|
139 |
+
```
|
140 |
+
python main\\app\\parser.py --help
|
141 |
+
```
|
142 |
+
|
143 |
+
# Cài đặt, sử dụng đơn giản
|
144 |
+
|
145 |
+
**Cài đặt phiên bản releases từ [Vietnamese_RVC](https://github.com/PhamHuynhAnh16/Vietnamese-RVC/releases)**
|
146 |
+
- Chọn bản đúng với bạn và tải về máy.
|
147 |
+
- Giải nén dự án.
|
148 |
+
- Chạy tệp run_app.bat để mở giao diện hoạt động.
|
149 |
+
|
150 |
+
# Cấu trúc chính của mã nguồn:
|
151 |
+
|
152 |
+
<pre>
|
153 |
+
Vietnamese-RVC-main
|
154 |
+
├── assets
|
155 |
+
│ ├── binary
|
156 |
+
│ │ ├── decrypt.bin
|
157 |
+
│ │ └── world.bin
|
158 |
+
│ ├── f0
|
159 |
+
│ ├── languages
|
160 |
+
│ │ ├── en-US.json
|
161 |
+
│ │ └── vi-VN.json
|
162 |
+
│ ├── logs
|
163 |
+
│ │ └── mute
|
164 |
+
│ │ ├── energy
|
165 |
+
│ │ │ └── mute.wav.npy
|
166 |
+
│ │ ├── f0
|
167 |
+
│ │ │ └── mute.wav.npy
|
168 |
+
│ │ ├── f0_voiced
|
169 |
+
│ │ │ └── mute.wav.npy
|
170 |
+
│ │ ├── sliced_audios
|
171 |
+
│ │ │ ├── mute32000.wav
|
172 |
+
│ │ │ ├── mute40000.wav
|
173 |
+
│ │ │ └── mute48000.wav
|
174 |
+
│ │ ├── sliced_audios_16k
|
175 |
+
│ │ │ └── mute.wav
|
176 |
+
│ │ ├── v1_extracted
|
177 |
+
│ │ │ ├── mute.npy
|
178 |
+
│ │ │ ├── mute_chinese.npy
|
179 |
+
│ │ │ ├── mute_japanese.npy
|
180 |
+
│ │ │ ├── mute_korean.npy
|
181 |
+
│ │ │ ├── mute_portuguese.npy
|
182 |
+
│ │ │ ├── mute_vietnamese.npy
|
183 |
+
│ │ │ └── mute_spin.npy
|
184 |
+
│ │ └── v2_extracted
|
185 |
+
│ │ ├── mute.npy
|
186 |
+
│ │ ├── mute_chinese.npy
|
187 |
+
│ │ ├── mute_japanese.npy
|
188 |
+
│ │ ├── mute_korean.npy
|
189 |
+
│ │ ├── mute_portuguese.npy
|
190 |
+
│ │ ├── mute_vietnamese.npy
|
191 |
+
│ │ └── mute_spin.npy
|
192 |
+
│ ├── models
|
193 |
+
│ │ ├── embedders
|
194 |
+
│ │ ├── predictors
|
195 |
+
│ │ ├── pretrained_custom
|
196 |
+
│ │ ├── pretrained_v1
|
197 |
+
│ │ ├── pretrained_v2
|
198 |
+
│ │ ├── speaker_diarization
|
199 |
+
│ │ │ ├── assets
|
200 |
+
│ │ │ │ ├── gpt2.tiktoken
|
201 |
+
│ │ │ │ ├── mel_filters.npz
|
202 |
+
│ │ │ │ └── multilingual.tiktoken
|
203 |
+
│ │ │ └── models
|
204 |
+
│ │ └── uvr5
|
205 |
+
│ ├── presets
|
206 |
+
│ ├── weights
|
207 |
+
│ └── ico.png
|
208 |
+
├── audios
|
209 |
+
├── dataset
|
210 |
+
├── main
|
211 |
+
│ ├── app
|
212 |
+
│ │ ├── core
|
213 |
+
│ │ │ ├── downloads.py
|
214 |
+
│ │ │ ├── editing.py
|
215 |
+
│ │ │ ├── f0_extract.py
|
216 |
+
│ │ │ ├── inference.py
|
217 |
+
│ │ │ ├── model_utils.py
|
218 |
+
│ │ │ ├── presets.py
|
219 |
+
│ │ │ ├── process.py
|
220 |
+
│ │ │ ├── restart.py
|
221 |
+
│ │ │ ├── separate.py
|
222 |
+
│ │ │ ├── training.py
|
223 |
+
│ │ │ ├── tts.py
|
224 |
+
│ │ │ ├── ui.py
|
225 |
+
│ │ │ └── utils.py
|
226 |
+
│ │ ├── tabs
|
227 |
+
│ │ │ ├── downloads
|
228 |
+
│ │ │ │ └── downloads.py
|
229 |
+
│ │ │ ├── editing
|
230 |
+
│ │ │ │ ├── editing.py
|
231 |
+
│ │ │ │ └── child
|
232 |
+
│ │ ��� │ ├── audio_effects.py
|
233 |
+
│ │ │ │ └── quirk.py
|
234 |
+
│ │ │ ├── extra
|
235 |
+
│ │ │ │ ├── extra.py
|
236 |
+
│ │ │ │ └── child
|
237 |
+
│ │ │ │ ├── convert_model.py
|
238 |
+
│ │ │ │ ├── f0_extract.py
|
239 |
+
│ │ │ │ ├── fushion.py
|
240 |
+
│ │ │ │ ├── read_model.py
|
241 |
+
│ │ │ │ ├── report_bugs.py
|
242 |
+
│ │ │ │ └── settings.py
|
243 |
+
│ │ │ ├── inference
|
244 |
+
│ │ │ │ ├── inference.py
|
245 |
+
│ │ │ │ └── child
|
246 |
+
│ │ │ │ ├── convert.py
|
247 |
+
│ │ │ │ ├── convert_tts.py
|
248 |
+
│ │ │ │ ├── convert_with_whisper.py
|
249 |
+
│ │ │ │ └── separate.py
|
250 |
+
│ │ │ └── training
|
251 |
+
│ │ │ ├── training.py
|
252 |
+
│ │ │ └── child
|
253 |
+
│ │ │ ├── create_dataset.py
|
254 |
+
│ │ │ └── training.py
|
255 |
+
│ │ ├── app.py
|
256 |
+
│ │ ├── parser.py
|
257 |
+
│ │ ├── run_tensorboard.py
|
258 |
+
│ │ └── variables.py
|
259 |
+
│ ├── configs
|
260 |
+
│ │ ├── config.json
|
261 |
+
│ │ ├── config.py
|
262 |
+
│ │ ├── v1
|
263 |
+
│ │ │ ├── 32000.json
|
264 |
+
│ │ │ ├── 40000.json
|
265 |
+
│ │ │ └── 48000.json
|
266 |
+
│ │ └── v2
|
267 |
+
│ │ ├── 32000.json
|
268 |
+
│ │ ├── 40000.json
|
269 |
+
│ │ └── 48000.json
|
270 |
+
│ ├── inference
|
271 |
+
│ │ ├── audio_effects.py
|
272 |
+
│ │ ├── create_dataset.py
|
273 |
+
│ │ ├── create_index.py
|
274 |
+
│ │ ├── separator_music.py
|
275 |
+
│ │ ├── extracting
|
276 |
+
│ │ │ ├── embedding.py
|
277 |
+
│ │ │ ├── extract.py
|
278 |
+
│ │ │ ├── feature.py
|
279 |
+
│ │ │ ├── preparing_files.py
|
280 |
+
│ │ │ ├── rms.py
|
281 |
+
│ │ │ └── setup_path.py
|
282 |
+
│ │ ├── training
|
283 |
+
│ │ │ ├── train.py
|
284 |
+
│ │ │ ├── data_utils.py
|
285 |
+
│ │ │ ├── losses.py
|
286 |
+
│ │ │ ├── mel_processing.py
|
287 |
+
│ │ │ └── utils.py
|
288 |
+
│ │ ├── conversion
|
289 |
+
│ │ │ ├── convert.py
|
290 |
+
│ │ │ ├── pipeline.py
|
291 |
+
│ │ │ └── utils.py
|
292 |
+
│ │ └── preprocess
|
293 |
+
│ │ ├── preprocess.py
|
294 |
+
│ │ └── slicer2.py
|
295 |
+
│ ├── library
|
296 |
+
│ │ ├── utils.py
|
297 |
+
│ │ ├── opencl.py
|
298 |
+
│ │ ├── algorithm
|
299 |
+
│ │ │ ├── attentions.py
|
300 |
+
│ │ │ ├── commons.py
|
301 |
+
│ │ │ ├── discriminators.py
|
302 |
+
│ │ │ ├── encoders.py
|
303 |
+
│ │ │ ├── modules.py
|
304 |
+
│ │ │ ├── normalization.py
|
305 |
+
│ │ │ ├── onnx_export.py
|
306 |
+
│ │ │ ├── residuals.py
|
307 |
+
│ │ │ ├── stftpitchshift.py
|
308 |
+
│ │ │ └── synthesizers.py
|
309 |
+
│ │ ├── architectures
|
310 |
+
│ │ │ ├── demucs_separator.py
|
311 |
+
│ │ │ ├── fairseq.py
|
312 |
+
│ │ │ └── mdx_separator.py
|
313 |
+
│ │ ├── generators
|
314 |
+
│ │ │ ├── hifigan.py
|
315 |
+
│ │ │ ├── mrf_hifigan.py
|
316 |
+
│ │ │ ├── nsf_hifigan.py
|
317 |
+
│ │ │ └── refinegan.py
|
318 |
+
│ │ ├── predictors
|
319 |
+
│ │ │ ├── CREPE
|
320 |
+
│ │ │ │ ├── CREPE.py
|
321 |
+
│ │ │ │ ├── filter.py
|
322 |
+
│ │ │ │ └── model.py
|
323 |
+
│ │ │ ├── FCN
|
324 |
+
│ │ │ │ ├── FCN.py
|
325 |
+
│ │ │ │ ├── convert.py
|
326 |
+
│ │ │ │ └── model.py
|
327 |
+
│ │ │ ├── FCPE
|
328 |
+
│ │ │ │ ├── attentions.py
|
329 |
+
│ │ │ │ ├── encoder.py
|
330 |
+
│ │ │ │ ├── FCPE.py
|
331 |
+
│ │ │ │ ├── stft.py
|
332 |
+
│ │ │ │ ├── utils.py
|
333 |
+
│ │ │ │ └── wav2mel.py
|
334 |
+
│ │ │ ├── RMVPE
|
335 |
+
│ │ │ │ ├── RMVPE.py
|
336 |
+
│ │ │ │ ├── deepunet.py
|
337 |
+
│ │ │ │ ├── e2e.py
|
338 |
+
│ │ │ │ └── mel.py
|
339 |
+
│ │ │ ├── WORLD
|
340 |
+
│ │ │ │ ├── WORLD.py
|
341 |
+
│ │ │ │ └── SWIPE.py
|
342 |
+
│ │ │ └── Generator.py
|
343 |
+
│ │ ├── speaker_diarization
|
344 |
+
│ │ │ ├── audio.py
|
345 |
+
│ │ │ ├── ECAPA_TDNN.py
|
346 |
+
│ │ │ ├── embedding.py
|
347 |
+
│ │ │ ├── encoder.py
|
348 |
+
│ │ │ ├── features.py
|
349 |
+
│ │ │ ├── parameter_transfer.py
|
350 |
+
│ │ │ ├── segment.py
|
351 |
+
│ │ │ ├── speechbrain.py
|
352 |
+
│ │ │ └── whisper.py
|
353 |
+
��� │ └── uvr5_lib
|
354 |
+
│ │ ├── common_separator.py
|
355 |
+
│ │ ├── separator.py
|
356 |
+
│ │ ├── spec_utils.py
|
357 |
+
│ │ └── demucs
|
358 |
+
│ │ ├── apply.py
|
359 |
+
│ │ ├── demucs.py
|
360 |
+
│ │ ├── hdemucs.py
|
361 |
+
│ │ ├── htdemucs.py
|
362 |
+
│ │ ├── states.py
|
363 |
+
│ │ └── utils.py
|
364 |
+
│ └── tools
|
365 |
+
│ ├── gdown.py
|
366 |
+
│ ├── huggingface.py
|
367 |
+
│ ├── mediafire.py
|
368 |
+
│ ├── meganz.py
|
369 |
+
│ ├── noisereduce.py
|
370 |
+
│ └── pixeldrain.py
|
371 |
+
├── docker-compose-amd.yaml
|
372 |
+
├── docker-compose-cpu.yaml
|
373 |
+
├── docker-compose-cuda118.yaml
|
374 |
+
├── docker-compose-cuda128.yaml
|
375 |
+
├── Dockerfile
|
376 |
+
├── Dockerfile.amd
|
377 |
+
├── Dockerfile.cuda118
|
378 |
+
├── Dockerfile.cuda128
|
379 |
+
├── LICENSE
|
380 |
+
├── README.md
|
381 |
+
├── requirements.txt
|
382 |
+
├── run_app.bat
|
383 |
+
└── tensorboard.bat
|
384 |
+
</pre>
|
385 |
+
|
386 |
+
# LƯU Ý
|
387 |
+
|
388 |
+
- **Hiện tại các bộ mã hóa mới như MRF HIFIGAN vẫn chưa đầy đủ các bộ huấn luyện trước**
|
389 |
+
- **Bộ mã hóa MRF HIFIGAN và REFINEGAN không hỗ trợ huấn luyện khi không không huấn luyện cao độ**
|
390 |
+
- **Các mô hình trong kho lưu trữ Vietnamese-RVC được thu thập rải rác trên AI Hub, HuggingFace và các các kho lưu trữ khác. Có thể mang các giấy phép bản quyền khác nhau**
|
391 |
+
|
392 |
+
# Tuyên bố miễn trừ trách nhiệm
|
393 |
+
|
394 |
+
- **Dự án Vietnamese-RVC được phát triển với mục đích nghiên cứu, học tập và giải trí cá nhân. Tôi không khuyến khích cũng như không chịu trách nhiệm đối với bất kỳ hành vi lạm dụng công nghệ chuyển đổi giọng nói vì mục đích lừa đảo, giả mạo danh tính, hoặc vi phạm quyền riêng tư, bản quyền của bất kỳ cá nhân hay tổ chức nào.**
|
395 |
+
|
396 |
+
- **Người dùng cần tự chịu trách nhiệm với hành vi sử dụng phần mềm này và cam kết tuân thủ pháp luật hiện hành tại quốc gia nơi họ sinh sống hoặc hoạt động.**
|
397 |
+
|
398 |
+
- **Việc sử dụng giọng nói của người nổi tiếng, người thật hoặc nhân vật công chúng phải có sự cho phép hoặc đảm bảo không vi phạm pháp luật, đạo đức và quyền lợi của các bên liên quan.**
|
399 |
+
|
400 |
+
- **Tác giả của dự án không chịu trách nhiệm pháp lý đối với bất kỳ hậu quả nào phát sinh từ việc sử dụng phần mềm này.**
|
401 |
+
|
402 |
+
# Điều khoản sử dụng
|
403 |
+
|
404 |
+
- Bạn phải đảm bảo rằng các nội dung âm thanh bạn tải lên và chuyển đổi qua dự án này không vi phạm quyền sở hữu trí tuệ của bên thứ ba.
|
405 |
+
|
406 |
+
- Không được phép sử dụng dự án này cho bất kỳ hoạt động nào bất hợp pháp, bao gồm nhưng không giới hạn ở việc sử dụng để lừa đảo, quấy rối, hay gây tổn hại đến người khác.
|
407 |
+
|
408 |
+
- Bạn chịu trách nhiệm hoàn toàn đối với bất kỳ thiệt hại nào phát sinh từ việc sử dụng sản phẩm không đúng cách.
|
409 |
+
|
410 |
+
- Tôi sẽ không chịu trách nhiệm với bất kỳ thiệt hại trực tiếp hoặc gián tiếp nào phát sinh từ việc sử dụng dự án này.
|
411 |
+
|
412 |
+
# Dự án này được xây dựng dựa trên các dự án như sau
|
413 |
+
|
414 |
+
| Tác Phẩm | Tác Giả | Giấy Phép |
|
415 |
+
|--------------------------------------------------------------------------------------------------------------------------------|-------------------------|-------------|
|
416 |
+
| **[Applio](https://github.com/IAHispano/Applio/tree/main)** | IAHispano | MIT License |
|
417 |
+
| **[Python-audio-separator](https://github.com/nomadkaraoke/python-audio-separator/tree/main)** | Nomad Karaoke | MIT License |
|
418 |
+
| **[Retrieval-based-Voice-Conversion-WebUI](https://github.com/RVC-Project/Retrieval-based-Voice-Conversion-WebUI/tree/main)** | RVC Project | MIT License |
|
419 |
+
| **[RVC-ONNX-INFER-BY-Anh](https://github.com/PhamHuynhAnh16/RVC_Onnx_Infer)** | Phạm Huỳnh Anh | MIT License |
|
420 |
+
| **[Torch-Onnx-Crepe-By-Anh](https://github.com/PhamHuynhAnh16/TORCH-ONNX-CREPE)** | Phạm Huỳnh Anh | MIT License |
|
421 |
+
| **[Hubert-No-Fairseq](https://github.com/PhamHuynhAnh16/hubert-no-fairseq)** | Phạm Huỳnh Anh | MIT License |
|
422 |
+
| **[Local-attention](https://github.com/lucidrains/local-attention)** | Phil Wang | MIT License |
|
423 |
+
| **[TorchFcpe](https://github.com/CNChTu/FCPE/tree/main)** | CN_ChiTu | MIT License |
|
424 |
+
| **[FcpeONNX](https://github.com/deiteris/voice-changer/blob/master-custom/server/utils/fcpe_onnx.py)** | Yury | MIT License |
|
425 |
+
| **[ContentVec](https://github.com/auspicious3000/contentvec)** | Kaizhi Qian | MIT License |
|
426 |
+
| **[Mediafiredl](https://github.com/Gann4Life/mediafiredl)** | Santiago Ariel Mansilla | MIT License |
|
427 |
+
| **[Noisereduce](https://github.com/timsainb/noisereduce)** | Tim Sainburg | MIT License |
|
428 |
+
| **[World.py-By-Anh](https://github.com/PhamHuynhAnh16/world.py)** | Phạm Huỳnh Anh | MIT License |
|
429 |
+
| **[Mega.py](https://github.com/3v1n0/mega.py)** | Marco Trevisan | No License |
|
430 |
+
| **[Gdown](https://github.com/wkentaro/gdown)** | Kentaro Wada | MIT License |
|
431 |
+
| **[Whisper](https://github.com/openai/whisper)** | OpenAI | MIT License |
|
432 |
+
| **[PyannoteAudio](https://github.com/pyannote/pyannote-audio)** | pyannote | MIT License |
|
433 |
+
| **[AudioEditingCode](https://github.com/HilaManor/AudioEditingCode)** | Hila Manor | MIT License |
|
434 |
+
| **[StftPitchShift](https://github.com/jurihock/stftPitchShift)** | Jürgen Hock | MIT License |
|
435 |
+
| **[Codename-RVC-Fork-3](https://github.com/codename0og/codename-rvc-fork-3)** | Codename;0 | MIT License |
|
436 |
+
| **[Penn](https://github.com/interactiveaudiolab/penn)** | Interactive Audio Lab | MIT License |
|
437 |
+
|
438 |
+
# Kho mô hình của công cụ tìm kiếm mô hình
|
439 |
+
|
440 |
+
- **[VOICE-MODELS.COM](https://voice-models.com/)**
|
441 |
+
|
442 |
+
# Các phương pháp trích xuất F0 trong RVC
|
443 |
+
|
444 |
+
Tài liệu này trình bày chi tiết các phương pháp trích xuất cao độ được sử dụng, thông tin về ưu, nhược điểm, sức mạnh và độ tin cậy của từng phương pháp theo trải nghiệm cá nhân.
|
445 |
+
|
446 |
+
| Phương pháp | Loại | Ưu điểm | Hạn chế | Sức mạnh | Độ tin cậy |
|
447 |
+
|--------------------|----------------|---------------------------|------------------------------|--------------------|--------------------|
|
448 |
+
| pm | Praat | Nhanh | Kém chính xác | Thấp | Thấp |
|
449 |
+
| dio | PYWORLD | Thích hợp với Rap | Kém chính xác với tần số cao | Trung bình | Trung bình |
|
450 |
+
| harvest | PYWORLD | Chính xác hơn DIO | Xử lý chậm hơn | Cao | Rất cao |
|
451 |
+
| crepe | Deep Learning | Chính xác cao | Yêu cầu GPU | Rất cao | Rất cao |
|
452 |
+
| mangio-crepe | crepe nofilter | Tối ưu hóa cho RVC | Đôi khi kém crepe gốc | Trung bình đến cao | Trung bình đến cao |
|
453 |
+
| fcpe | Deep Learning | Chính xác, thời gian thực | Cần GPU mạnh | Khá | Trung bình |
|
454 |
+
| fcpe-legacy | Old | Chính xác, thời gian thực | Cũ hơn | Khá | Trung bình |
|
455 |
+
| rmvpe | Deep Learning | Hiệu quả với giọng hát | Tốn tài nguyên | Rất cao | Xuất sắc |
|
456 |
+
| rmvpe-legacy | Old | Tính toán với Fmin-max | Cũ hơn | Cao | Khá |
|
457 |
+
| yin | Librosa | Đơn giản, hiệu quả | Dễ lỗi bội | Trung bình | Thấp |
|
458 |
+
| pyin | Librosa | Ổn định hơn YIN | Tính toán phức tạp hơn | Khá | Khá |
|
459 |
+
| swipe | WORLD | Độ chính xác cao | Nhạy cảm với nhiễu | Cao | Khá |
|
460 |
+
| piptrack | Librosa | Nhanh | Kém chính xác | Thấp | Thấp |
|
461 |
+
| fcn | Deep Learning | Không Rõ | F0 Thấp | Không Rõ | Không Rõ |
|
462 |
+
|
463 |
+
# Báo cáo lỗi
|
464 |
+
|
465 |
+
- **Với trường hợp gặp lỗi khi sử dụng mã nguồn này tôi thực sự xin lỗi bạn vì trải nghiệm không tốt này, bạn có thể gửi báo cáo lỗi thông qua cách phía dưới**
|
466 |
+
- **Bạn có thể báo cáo lỗi cho tôi thông qua hệ thống báo cáo lỗi webhook trong giao diện sử dụng**
|
467 |
+
- **Với trường hợp hệ thống báo cáo lỗi không hoạt động bạn có thể báo cáo lỗi cho tôi thông qua Discord `pham_huynh_anh` Hoặc [ISSUE](https://github.com/PhamHuynhAnh16/Vietnamese-RVC/issues)**
|
468 |
+
|
469 |
+
# ☎️ Liên hệ tôi
|
470 |
+
- Discord: **pham_huynh_anh**
|
assets/binary/decrypt.bin
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:330268cbf6b9317a76510b533e1640ef48ed074a07c013e5b1abc4d48cfd9dce
|
3 |
+
size 32
|
assets/binary/world.bin
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:49520c26e725e1d71a4ee4361fd1e41a12ec67b59912821f5123dce6eb572c16
|
3 |
+
size 3481870
|
assets/f0/.gitattributes
ADDED
File without changes
|
assets/ico.png
ADDED
![]() |
Git LFS Details
|
assets/languages/en-US.json
ADDED
@@ -0,0 +1,663 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
{
|
2 |
+
"set_lang": "Display language set to {lang}.",
|
3 |
+
"no_support_gpu": "Unfortunately, no compatible GPU is available to support your training.",
|
4 |
+
"text": "text",
|
5 |
+
"upload_success": "File {name} uploaded successfully.",
|
6 |
+
"download_url": "Download from the link",
|
7 |
+
"download_from_csv": "Download from the CSV model repository",
|
8 |
+
"search_models": "Search models",
|
9 |
+
"upload": "Upload",
|
10 |
+
"option_not_valid": "Invalid option!",
|
11 |
+
"list_model": "Model list",
|
12 |
+
"success": "Completed!",
|
13 |
+
"index": "index",
|
14 |
+
"model": "model",
|
15 |
+
"zip": "compress",
|
16 |
+
"search": "search",
|
17 |
+
"provide_file": "Please provide a valid {filename} file!",
|
18 |
+
"start": "Starting {start}...",
|
19 |
+
"not_found": "Not found {name}.",
|
20 |
+
"found": "Found {results} results!",
|
21 |
+
"download_music": "download music",
|
22 |
+
"download": "download",
|
23 |
+
"provide_url": "Please provide a url.",
|
24 |
+
"provide_name_is_save": "Please provide a model name to save.",
|
25 |
+
"not_support_url": "Your model url is not supported.",
|
26 |
+
"error_occurred": "An error occurred: {e}.",
|
27 |
+
"unable_analyze_model": "Unable to analyze the model!",
|
28 |
+
"download_pretrain": "Downloading pre-trained model...",
|
29 |
+
"provide_pretrain": "Please provide a pre-trained model url {dg}.",
|
30 |
+
"sr_not_same": "The sample rates of the two models are not the same.",
|
31 |
+
"architectures_not_same": "Cannot merge models. The architectures are not the same.",
|
32 |
+
"fushion_model": "model fusion",
|
33 |
+
"model_fushion_info": "The model {name} is fused from {pth_1} and {pth_2} with a ratio of {ratio}.",
|
34 |
+
"not_found_create_time": "Creation time not found.",
|
35 |
+
"format_not_valid": "Invalid format.",
|
36 |
+
"read_info": "Models trained on different applications may produce different information or may not be readable!",
|
37 |
+
"epoch": "epoch.",
|
38 |
+
"step": "step",
|
39 |
+
"sr": "Sample rate",
|
40 |
+
"f0": "pitch training",
|
41 |
+
"version": "version.",
|
42 |
+
"not_f0": "Pitch training not performed",
|
43 |
+
"trained_f0": "Pitch training performed",
|
44 |
+
"model_info": "Model Name: {model_name}\n\n Model Creator: {model_author}\n\nEpoch: {epochs}\n\nSteps: {steps}\n\nVersion: {version}\n\nSample Rate: {sr}\n\nPitch Training: {pitch_guidance}\n\nHash (ID): {model_hash}\n\nCreation Time: {creation_date_str}\n\nVocoder: {vocoder}\n\nEnergy: {rms_extract}\n",
|
45 |
+
"input_not_valid": "Please provide valid input!",
|
46 |
+
"output_not_valid": "Please provide valid output!",
|
47 |
+
"apply_effect": "apply effect",
|
48 |
+
"enter_the_text": "Please enter the text to speech!",
|
49 |
+
"choose_voice": "Please choose a voice!",
|
50 |
+
"convert": "Converting {name}...",
|
51 |
+
"separator_music": "music separation",
|
52 |
+
"notfound": "Not found",
|
53 |
+
"turn_on_use_audio": "Please enable using separated audio to proceed",
|
54 |
+
"turn_off_convert_backup": "Disable backup voice conversion to use the original voice",
|
55 |
+
"turn_off_merge_backup": "Disable merging backup voice to use the original voice",
|
56 |
+
"not_found_original_vocal": "Original vocal not found!",
|
57 |
+
"convert_vocal": "Converting voice...",
|
58 |
+
"convert_success": "Voice conversion completed!",
|
59 |
+
"convert_backup": "Converting backup voice...",
|
60 |
+
"convert_backup_success": "Backup voice conversion completed!",
|
61 |
+
"merge_backup": "Merging main voice with backup voice...",
|
62 |
+
"merge_success": "Merge completed.",
|
63 |
+
"is_folder": "Input is a folder: Converting all audio files in the folder...",
|
64 |
+
"not_found_in_folder": "No audio files found in the folder!",
|
65 |
+
"batch_convert": "Batch conversion in progress...",
|
66 |
+
"batch_convert_success": "Batch conversion successful!",
|
67 |
+
"create": "create",
|
68 |
+
"provide_name": "Please provide a model name.",
|
69 |
+
"not_found_data": "Data not found",
|
70 |
+
"not_found_data_preprocess": "Processed audio data not found, please reprocess.",
|
71 |
+
"not_found_data_extract": "Extracted audio data not found, please re-extract.",
|
72 |
+
"provide_pretrained": "Please provide pre-trained {dg}.",
|
73 |
+
"download_pretrained": "Download pre-trained {dg}{rvc_version} original",
|
74 |
+
"not_found_pretrain": "Pre-trained {dg} not found",
|
75 |
+
"not_use_pretrain": "No pre-trained model will be used",
|
76 |
+
"training": "training",
|
77 |
+
"rick_roll": "Click here if you want to be Rick Roll :) ---> [RickRoll]({rickroll})",
|
78 |
+
"terms_of_use": "**Please do not use the project for any unethical, illegal, or harmful purposes to individuals or organizations...**",
|
79 |
+
"exemption": "**In cases where users do not comply with the terms or violate them, I will not be responsible for any claims, damages, or liabilities, whether in contract, negligence, or other causes arising from, outside of, or related to the software, its use, or other transactions associated with it.**",
|
80 |
+
"separator_tab": "Music Separation",
|
81 |
+
"4_part": "A simple music separation system can separate into 4 parts: Instruments, Vocals, Main vocals, Backup vocals",
|
82 |
+
"clear_audio": "Clean audio",
|
83 |
+
"separator_backing": "Separate backup vocals",
|
84 |
+
"denoise_mdx": "Denoise MDX separation",
|
85 |
+
"use_mdx": "Use MDX",
|
86 |
+
"dereveb_audio": "Remove vocal reverb",
|
87 |
+
"dereveb_backing": "Remove backup reverb",
|
88 |
+
"separator_model": "Music separation model",
|
89 |
+
"separator_backing_model": "Backup separation model",
|
90 |
+
"shift": "Shift",
|
91 |
+
"shift_info": "Higher is better quality but slower and uses more resources",
|
92 |
+
"segments_size": "Segments Size",
|
93 |
+
"segments_size_info": "Higher is better quality but uses more resources",
|
94 |
+
"batch_size": "Batch size",
|
95 |
+
"batch_size_info": "Number of samples processed simultaneously in one training cycle. Higher can cause memory overflow",
|
96 |
+
"mdx_batch_size_info": "Number of samples processed at a time. Batch processing optimizes calculations. Large batches can cause memory overflow; small batches reduce resource efficiency",
|
97 |
+
"overlap": "Overlap",
|
98 |
+
"overlap_info": "Overlap amount between prediction windows",
|
99 |
+
"export_format": "Export format",
|
100 |
+
"export_info": "The export format to export the audio file in",
|
101 |
+
"output_separator": "Separated output",
|
102 |
+
"hop_length_info": "Analyzing the time transfer window when performing transformations is allowed. The detailed value is compact but requires more calculation",
|
103 |
+
"drop_audio": "Drop audio here",
|
104 |
+
"drop_text": "Drop text file here",
|
105 |
+
"use_url": "YouTube link",
|
106 |
+
"url_audio": "Link audio",
|
107 |
+
"downloads": "Downloads",
|
108 |
+
"clean_strength": "Audio cleaning strength",
|
109 |
+
"clean_strength_info": "Strength of the audio cleaner for filtering vocals during export",
|
110 |
+
"input_output": "Audio input, output",
|
111 |
+
"audio_path": "Input audio path",
|
112 |
+
"refresh": "Refresh",
|
113 |
+
"output_folder": "Output audio folder path",
|
114 |
+
"output_folder_info": "Enter the folder path where the audio will be exported",
|
115 |
+
"input_audio": "Audio input",
|
116 |
+
"instruments": "Instruments",
|
117 |
+
"original_vocal": "Original vocal",
|
118 |
+
"main_vocal": "Main vocal",
|
119 |
+
"backing_vocal": "Backup vocal",
|
120 |
+
"convert_audio": "Convert Audio",
|
121 |
+
"convert_info": "Convert audio using a trained voice model",
|
122 |
+
"autotune": "Auto-tune",
|
123 |
+
"use_audio": "Use separated audio",
|
124 |
+
"convert_original": "Convert original voice",
|
125 |
+
"convert_backing": "Convert backup voice",
|
126 |
+
"not_merge_backing": "Do not merge backup voice",
|
127 |
+
"merge_instruments": "Merge instruments",
|
128 |
+
"pitch": "Pitch",
|
129 |
+
"pitch_info": "Recommendation: set to 12 to change male voice to female and vice versa",
|
130 |
+
"model_accordion": "Model and index",
|
131 |
+
"model_name": "Model file",
|
132 |
+
"index_path": "Index file",
|
133 |
+
"index_strength": "Index strength",
|
134 |
+
"index_strength_info": "Higher values increase strength. However, lower values may reduce artificial effects in the audio",
|
135 |
+
"output_path": "Audio output path",
|
136 |
+
"output_path_info": "Enter the output path (leave it as .wav format; it will auto-correct during conversion)",
|
137 |
+
"setting": "General settings",
|
138 |
+
"f0_method": "Extraction method",
|
139 |
+
"f0_method_info": "Method used for data extraction",
|
140 |
+
"f0_method_hybrid": "HYBRID extraction method",
|
141 |
+
"f0_method_hybrid_info": "Combination of two or more different types of extracts",
|
142 |
+
"hubert_model": "Embedding model",
|
143 |
+
"hubert_info": "Pre-trained model to assist embedding",
|
144 |
+
"modelname": "Model name",
|
145 |
+
"modelname_info": "If you have your own model, just upload it and input the name here",
|
146 |
+
"split_audio": "Split audio",
|
147 |
+
"autotune_rate": "Auto-tune rate",
|
148 |
+
"autotune_rate_info": "Level of auto-tuning adjustment",
|
149 |
+
"resample": "Resample",
|
150 |
+
"resample_info": "Resample post-processing to the final sample rate; 0 means no resampling, NOTE: SOME FORMATS DO NOT SUPPORT SPEEDS OVER 48000",
|
151 |
+
"filter_radius": "Filter radius",
|
152 |
+
"filter_radius_info": "If greater than three, median filtering is applied. The value represents the filter radius and can reduce breathiness or noise.",
|
153 |
+
"rms_mix_rate": "RMS Mix Rate",
|
154 |
+
"rms_mix_rate_info": "Determines the blend ratio between the RMS energy of the original voice and the converted voice",
|
155 |
+
"protect": "Consonant protection",
|
156 |
+
"protect_info": "Protect distinct consonants and breathing sounds to prevent audio tearing and other artifacts. Increasing this value provides comprehensive protection. Reducing it may reduce protection but also minimize indexing effects",
|
157 |
+
"output_convert": "Converted audio",
|
158 |
+
"main_convert": "Convert main voice",
|
159 |
+
"main_or_backing": "Main voice + Backup voice",
|
160 |
+
"voice_or_instruments": "Voice + Instruments",
|
161 |
+
"convert_text": "Convert Text",
|
162 |
+
"convert_text_markdown": "## Convert Text to Speech",
|
163 |
+
"convert_text_markdown_2": "Convert text to speech and read aloud using the trained voice model",
|
164 |
+
"input_txt": "Input data from a text file (.txt)",
|
165 |
+
"text_to_speech": "Text to read",
|
166 |
+
"voice_speed": "Reading speed",
|
167 |
+
"voice_speed_info": "Speed of the voice",
|
168 |
+
"tts_1": "1. Convert Text to Speech",
|
169 |
+
"tts_2": "2. Convert Speech",
|
170 |
+
"voice": "Voices by country",
|
171 |
+
"output_tts": "Output speech path",
|
172 |
+
"output_tts_convert": "Converted speech output path",
|
173 |
+
"tts_output": "Enter the output path",
|
174 |
+
"output_tts_markdown": "Unconverted and converted audio",
|
175 |
+
"output_text_to_speech": "Generated speech from text-to-speech conversion",
|
176 |
+
"output_file_tts_convert": "Speech converted using the model",
|
177 |
+
"output_audio": "Audio output",
|
178 |
+
"provide_output": "Enter the output path",
|
179 |
+
"audio_effects": "Audio Effects",
|
180 |
+
"apply_audio_effects": "## Add Additional Audio Effects",
|
181 |
+
"audio_effects_edit": "Add effects to audio",
|
182 |
+
"reverb": "Reverb effect",
|
183 |
+
"chorus": "Chorus effect",
|
184 |
+
"delay": "Delay effect",
|
185 |
+
"more_option": "Additional options",
|
186 |
+
"phaser": "Phaser effect",
|
187 |
+
"compressor": "Compressor effect",
|
188 |
+
"apply": "Apply",
|
189 |
+
"reverb_freeze": "Freeze mode",
|
190 |
+
"reverb_freeze_info": "Create a continuous echo effect when this mode is enabled",
|
191 |
+
"room_size": "Room size",
|
192 |
+
"room_size_info": "Adjust the room space to create reverberation",
|
193 |
+
"damping": "Damping",
|
194 |
+
"damping_info": "Adjust the level of absorption to control the amount of reverberation",
|
195 |
+
"wet_level": "Reverb signal level",
|
196 |
+
"wet_level_info": "Adjust the level of the reverb signal effect",
|
197 |
+
"dry_level": "Original signal level",
|
198 |
+
"dry_level_info": "Adjust the level of the signal without effects",
|
199 |
+
"width": "Audio width",
|
200 |
+
"width_info": "Adjust the width of the audio space",
|
201 |
+
"chorus_depth": "Chorus depth",
|
202 |
+
"chorus_depth_info": "Adjust the intensity of the chorus to create a wider sound",
|
203 |
+
"chorus_rate_hz": "Frequency",
|
204 |
+
"chorus_rate_hz_info": "Adjust the oscillation speed of the chorus effect",
|
205 |
+
"chorus_mix": "Mix signals",
|
206 |
+
"chorus_mix_info": "Adjust the mix level between the original and the processed signal",
|
207 |
+
"chorus_centre_delay_ms": "Center delay (ms)",
|
208 |
+
"chorus_centre_delay_ms_info": "The delay time between stereo channels to create the chorus effect",
|
209 |
+
"chorus_feedback": "Feedback",
|
210 |
+
"chorus_feedback_info": "Adjust the amount of the effect signal fed back into the original signal",
|
211 |
+
"delay_seconds": "Delay time",
|
212 |
+
"delay_seconds_info": "Adjust the delay time between the original and the processed signal",
|
213 |
+
"delay_feedback": "Delay feedback",
|
214 |
+
"delay_feedback_info": "Adjust the amount of feedback signal, creating a repeating effect",
|
215 |
+
"delay_mix": "Delay signal mix",
|
216 |
+
"delay_mix_info": "Adjust the mix level between the original and delayed signal",
|
217 |
+
"fade": "Fade effect",
|
218 |
+
"bass_or_treble": "Bass and treble",
|
219 |
+
"limiter": "Threshold limiter",
|
220 |
+
"distortion": "Distortion effect",
|
221 |
+
"gain": "Audio gain",
|
222 |
+
"bitcrush": "Bit reduction effect",
|
223 |
+
"clipping": "Clipping effect",
|
224 |
+
"fade_in": "Fade-in effect (ms)",
|
225 |
+
"fade_in_info": "Time for the audio to gradually increase from 0 to normal level",
|
226 |
+
"fade_out": "Fade-out effect (ms)",
|
227 |
+
"fade_out_info": "the time it takes for the sound to fade from normal to zero",
|
228 |
+
"bass_boost": "Bass boost level (dB)",
|
229 |
+
"bass_boost_info": "amount of bass boost in audio track",
|
230 |
+
"bass_frequency": "Low-pass filter cutoff frequency (Hz)",
|
231 |
+
"bass_frequency_info": "frequencies are reduced. Low frequencies make the bass clearer",
|
232 |
+
"treble_boost": "Treble boost level (dB)",
|
233 |
+
"treble_boost_info": "high level of sound reinforcement in the audio track",
|
234 |
+
"treble_frequency": "High-pass filter cutoff frequency (Hz)",
|
235 |
+
"treble_frequency_info": "The frequency will be filtered out. The higher the frequency, the higher the sound will be retained.",
|
236 |
+
"limiter_threshold_db": "Limiter threshold",
|
237 |
+
"limiter_threshold_db_info": "Limit the maximum audio level to prevent it from exceeding the threshold",
|
238 |
+
"limiter_release_ms": "Release time",
|
239 |
+
"limiter_release_ms_info": "Time for the audio to return after being limited (Mili Seconds)",
|
240 |
+
"distortion_info": "Adjust the level of distortion to create a noisy effect",
|
241 |
+
"gain_info": "Adjust the volume level of the signal",
|
242 |
+
"clipping_threshold_db": "Clipping threshold",
|
243 |
+
"clipping_threshold_db_info": "Trim signals exceeding the threshold, creating a distorted sound",
|
244 |
+
"bitcrush_bit_depth": "Bit depth",
|
245 |
+
"bitcrush_bit_depth_info": "Reduce audio quality by decreasing bit depth, creating a distorted effect",
|
246 |
+
"phaser_depth": "Phaser depth",
|
247 |
+
"phaser_depth_info": "Adjust the depth of the effect, impacting its intensity",
|
248 |
+
"phaser_rate_hz": "Frequency",
|
249 |
+
"phaser_rate_hz_info": "Adjust the frequency of the phaser effect",
|
250 |
+
"phaser_mix": "Mix signal",
|
251 |
+
"phaser_mix_info": "Adjust the mix level between the original and processed signals",
|
252 |
+
"phaser_centre_frequency_hz": "Center frequency",
|
253 |
+
"phaser_centre_frequency_hz_info": "The center frequency of the phaser effect, affecting the adjusted frequencies",
|
254 |
+
"phaser_feedback": "Feedback",
|
255 |
+
"phaser_feedback_info": "Adjust the feedback level of the effect, creating a stronger or lighter phaser feel",
|
256 |
+
"compressor_threshold_db": "Compressor threshold",
|
257 |
+
"compressor_threshold_db_info": "The threshold level above which the audio will be compressed",
|
258 |
+
"compressor_ratio": "Compression ratio",
|
259 |
+
"compressor_ratio_info": "Adjust the level of audio compression when exceeding the threshold",
|
260 |
+
"compressor_attack_ms": "Attack time (ms)",
|
261 |
+
"compressor_attack_ms_info": "Time for compression to start taking effect after the audio exceeds the threshold",
|
262 |
+
"compressor_release_ms": "Release time",
|
263 |
+
"compressor_release_ms_info": "Time for the audio to return to normal after being compressed",
|
264 |
+
"create_dataset_url": "Link to audio (use commas for multiple links)",
|
265 |
+
"createdataset": "Create dataset",
|
266 |
+
"create_dataset_markdown": "## Create Dataset training from YouTube",
|
267 |
+
"create_dataset_markdown_2": "Process and create training datasets using YouTube links",
|
268 |
+
"denoise": "Denoise",
|
269 |
+
"skip": "Skip",
|
270 |
+
"model_ver": "Voice separation version",
|
271 |
+
"model_ver_info": "The model version for separating vocals",
|
272 |
+
"create_dataset_info": "Dataset creation information",
|
273 |
+
"output_data": "Dataset output",
|
274 |
+
"output_data_info": "Output data after creation",
|
275 |
+
"skip_start": "Skip beginning",
|
276 |
+
"skip_start_info": "Skip the initial seconds of the audio; use commas for multiple audios",
|
277 |
+
"skip_end": "Skip end",
|
278 |
+
"skip_end_info": "Skip the final seconds of the audio; use commas for multiple audios",
|
279 |
+
"training_model": "Train Model",
|
280 |
+
"training_markdown": "Train and build a voice model with a set of voice data",
|
281 |
+
"training_model_name": "Name of the model during training (avoid special characters or spaces)",
|
282 |
+
"sample_rate": "Sample rate",
|
283 |
+
"sample_rate_info": "Sample rate of the model",
|
284 |
+
"training_version": "Model version",
|
285 |
+
"training_version_info": "Version of the model during training",
|
286 |
+
"training_pitch": "Pitch Guidance",
|
287 |
+
"upload_dataset": "Upload dataset",
|
288 |
+
"preprocess_effect": "Post processing",
|
289 |
+
"clear_dataset": "Clean dataset",
|
290 |
+
"preprocess_info": "Preprocessing information",
|
291 |
+
"preprocess_button": "1. Processing",
|
292 |
+
"extract_button": "2. Extract",
|
293 |
+
"extract_info": "Data extraction information",
|
294 |
+
"total_epoch": "Total epochs",
|
295 |
+
"total_epoch_info": "Total training epochs",
|
296 |
+
"save_epoch": "Save frequency",
|
297 |
+
"save_epoch_info": "Frequency of saving the model during training to allow retraining",
|
298 |
+
"create_index": "Create index",
|
299 |
+
"index_algorithm": "Index algorithm",
|
300 |
+
"index_algorithm_info": "Algorithm for creating the index",
|
301 |
+
"custom_dataset": "Custom dataset folder",
|
302 |
+
"custom_dataset_info": "Custom dataset folder for training data",
|
303 |
+
"overtraining_detector": "Overtraining detector",
|
304 |
+
"overtraining_detector_info": "Check for overtraining during model training",
|
305 |
+
"cleanup_training": "Clean Up",
|
306 |
+
"cleanup_training_info": "Clean up and retrain from scratch",
|
307 |
+
"cache_in_gpu": "Cache in GPU",
|
308 |
+
"cache_in_gpu_info": "Store the model in GPU cache memory",
|
309 |
+
"dataset_folder": "Folder containing dataset",
|
310 |
+
"threshold": "Overtraining threshold",
|
311 |
+
"setting_cpu_gpu": "CPU/GPU settings",
|
312 |
+
"gpu_number": "Number of GPUs used",
|
313 |
+
"gpu_number_info": "The order number of GPUs used in training. (Note: AMD GPUs do not support multi-GPU training)",
|
314 |
+
"save_only_latest": "Save only the latest",
|
315 |
+
"save_only_latest_info": "Save only the latest D and G models",
|
316 |
+
"save_every_weights": "Save all models",
|
317 |
+
"save_every_weights_info": "Save all models after each epoch",
|
318 |
+
"gpu_info": "GPU information",
|
319 |
+
"gpu_info_2": "Information about the GPU used during training",
|
320 |
+
"cpu_core": "Number of CPU cores available",
|
321 |
+
"cpu_core_info": "Number of CPU cores used during training",
|
322 |
+
"not_use_pretrain_2": "Do not use pretraining",
|
323 |
+
"not_use_pretrain_info": "Do not use pre-trained models",
|
324 |
+
"custom_pretrain": "Custom pretraining",
|
325 |
+
"custom_pretrain_info": "Customize pre-training settings",
|
326 |
+
"pretrain_file": "Pre-trained model file {dg}",
|
327 |
+
"train_info": "Training information",
|
328 |
+
"export_model": "5. Export Model",
|
329 |
+
"zip_model": "2. Compress model",
|
330 |
+
"output_zip": "Output file after compression",
|
331 |
+
"model_path": "Model path",
|
332 |
+
"model_ratio": "Model ratio",
|
333 |
+
"model_ratio_info": "Adjusting towards one side will make the model more like that side",
|
334 |
+
"output_model_path": "Model output path",
|
335 |
+
"fushion": "Model Fusion",
|
336 |
+
"fushion_markdown": "## Fushion Two Models",
|
337 |
+
"fushion_markdown_2": "Combine two voice models into a single model",
|
338 |
+
"read_model": "Read Information",
|
339 |
+
"read_model_markdown": "## Read Model Information",
|
340 |
+
"read_model_markdown_2": "Retrieve recorded information within the model",
|
341 |
+
"drop_model": "Drop model here",
|
342 |
+
"readmodel": "Read model",
|
343 |
+
"model_path_info": "Enter the path to the model file",
|
344 |
+
"modelinfo": "Model Information",
|
345 |
+
"download_markdown": "## Download Model",
|
346 |
+
"download_markdown_2": "Download voice models, pre-trained models, and embedding models",
|
347 |
+
"model_download": "Download voice model",
|
348 |
+
"model_url": "Link to the model",
|
349 |
+
"30s": "Please wait about 30 seconds. The system will restart automatically!",
|
350 |
+
"model_download_select": "Choose a model download method",
|
351 |
+
"model_warehouse": "Model repository",
|
352 |
+
"get_model": "Retrieve model",
|
353 |
+
"name_to_search": "Name to search",
|
354 |
+
"search_2": "Search",
|
355 |
+
"select_download_model": "Choose a searched model (Click to select)",
|
356 |
+
"download_pretrained_2": "Download pre-trained model",
|
357 |
+
"pretrained_url": "Pre-trained model link {dg}",
|
358 |
+
"select_pretrain": "Choose pre-trained model",
|
359 |
+
"select_pretrain_info": "Choose a pre-trained model to download",
|
360 |
+
"pretrain_sr": "Model sample rate",
|
361 |
+
"drop_pretrain": "Drop pre-trained model {dg} here",
|
362 |
+
"settings": "Settings",
|
363 |
+
"settings_markdown": "## Additional Settings",
|
364 |
+
"settings_markdown_2": "Customize additional features of the project",
|
365 |
+
"lang": "Language",
|
366 |
+
"lang_restart": "The display language in the project (When changing the language, the system will automatically restart after 30 seconds to update)",
|
367 |
+
"change_lang": "Change Language",
|
368 |
+
"theme": "Theme",
|
369 |
+
"theme_restart": "Theme type displayed in the interface (When changing the theme, the system will automatically restart after 30 seconds to update)",
|
370 |
+
"theme_button": "Change Theme",
|
371 |
+
"change_light_dark": "Switch Light/Dark Mode",
|
372 |
+
"tensorboard_url": "Tensorboard URL",
|
373 |
+
"errors_loading_audio": "Error loading audio",
|
374 |
+
"apply_error": "An error occurred while applying effects: {e}",
|
375 |
+
"indexpath": "Index path",
|
376 |
+
"split_total": "Total parts split",
|
377 |
+
"process_audio_error": "An error occurred while processing the audio",
|
378 |
+
"merge_error": "An error occurred while merging audio",
|
379 |
+
"not_found_convert_file": "Processed file not found",
|
380 |
+
"convert_batch": "Batch conversion...",
|
381 |
+
"found_audio": "Found {audio_files} audio files for conversion.",
|
382 |
+
"not_found_audio": "No audio files found!",
|
383 |
+
"error_convert": "An error occurred during audio conversion: {e}",
|
384 |
+
"convert_batch_success": "Batch conversion completed successfully in {elapsed_time} seconds. Output {output_path}",
|
385 |
+
"convert_audio_success": "File {input_path} converted successfully in {elapsed_time} seconds. Output {output_path}",
|
386 |
+
"read_faiss_index_error": "An error occurred while reading the FAISS index: {e}",
|
387 |
+
"read_model_error": "Failed to load model: {e}",
|
388 |
+
"starting_download": "Starting download",
|
389 |
+
"version_not_valid": "Invalid vocal separation version",
|
390 |
+
"skip<audio": "Cannot skip as skip time is less than audio file length",
|
391 |
+
"skip>audio": "Cannot skip as skip time is greater than audio file length",
|
392 |
+
"=<0": "Skip time is less than or equal to 0 and has been skipped",
|
393 |
+
"skip_warning": "Skip duration ({seconds} seconds) exceeds audio length ({total_duration} seconds). Skipping.",
|
394 |
+
"download_success": "Download completed successfully",
|
395 |
+
"create_dataset_error": "An error occurred while creating the training dataset",
|
396 |
+
"create_dataset_success": "Training dataset creation completed in {elapsed_time} seconds",
|
397 |
+
"skip_start_audio": "Successfully skipped start of audio: {input_file}",
|
398 |
+
"skip_end_audio": "Successfully skipped end of audio: {input_file}",
|
399 |
+
"merge_audio": "Merged all parts containing audio",
|
400 |
+
"separator_process": "Separating vocals: {input}...",
|
401 |
+
"not_found_main_vocal": "Main vocal not found!",
|
402 |
+
"not_found_backing_vocal": "Backup vocal not found!",
|
403 |
+
"not_found_instruments": "Instruments not found",
|
404 |
+
"merge_instruments_process": "Merging vocals with instruments...",
|
405 |
+
"dereverb": "Removing vocal reverb",
|
406 |
+
"dereverb_success": "Successfully removed vocal reverb",
|
407 |
+
"save_index": "Index file saved",
|
408 |
+
"create_index_error": "An error occurred while creating the index",
|
409 |
+
"sr_not_16000": "Sample rate must be 16000",
|
410 |
+
"extract_file_error": "An error occurred while extracting the file",
|
411 |
+
"extract_f0_method": "Starting pitch extraction using {num_processes} cores with method {f0_method}...",
|
412 |
+
"extract_f0": "Pitch Extraction",
|
413 |
+
"extract_f0_success": "Pitch extraction completed in {elapsed_time} seconds.",
|
414 |
+
"NaN": "contains NaN values and will be ignored.",
|
415 |
+
"start_extract_hubert": "Starting Embedding extraction...",
|
416 |
+
"process_error": "An error occurred during processing",
|
417 |
+
"extract_hubert_success": "Embedding extraction completed in {elapsed_time} seconds.",
|
418 |
+
"export_process": "Model path",
|
419 |
+
"extract_error": "An error occurred during data extraction",
|
420 |
+
"extract_success": "Data extraction successful",
|
421 |
+
"start_preprocess": "Starting data preprocessing with {num_processes} cores...",
|
422 |
+
"not_integer": "Voice ID folder must be an integer; instead got",
|
423 |
+
"preprocess_success": "Preprocessing completed in {elapsed_time} seconds.",
|
424 |
+
"preprocess_model_success": "Preprocessing data for the model completed successfully",
|
425 |
+
"turn_on_dereverb": "Reverb removal for backup vocals requires enabling reverb removal",
|
426 |
+
"turn_on_separator_backing": "Backup vocal separation requires enabling vocal separation",
|
427 |
+
"backing_model_ver": "Backup vocal separation model version",
|
428 |
+
"clean_audio_success": "Audio cleaned successfully!",
|
429 |
+
"separator_error": "An error occurred during music separation",
|
430 |
+
"separator_success": "Music separation completed in {elapsed_time} seconds",
|
431 |
+
"separator_process_2": "Processing music separation",
|
432 |
+
"separator_success_2": "Music separation successful!",
|
433 |
+
"separator_process_backing": "Processing backup vocal separation",
|
434 |
+
"separator_process_backing_success": "Backup vocal separation successful!",
|
435 |
+
"process_original": "Processing original vocal reverb removal...",
|
436 |
+
"process_original_success": "Original vocal reverb removal successful!",
|
437 |
+
"process_main": "Processing main vocal reverb removal...",
|
438 |
+
"process_main_success": "Main vocal reverb removal successful!",
|
439 |
+
"process_backing": "Processing backup vocal reverb removal...",
|
440 |
+
"process_backing_success": "Backup vocal reverb removal successful!",
|
441 |
+
"save_every_epoch": "Save model after: ",
|
442 |
+
"total_e": "Total epochs: ",
|
443 |
+
"dorg": "Pre-trained G: {pretrainG} | Pre-trained D: {pretrainD}",
|
444 |
+
"training_f0": "Pitch Guidance",
|
445 |
+
"not_gpu": "No GPU detected, reverting to CPU (not recommended)",
|
446 |
+
"not_found_checkpoint": "Checkpoint file not found: {checkpoint_path}",
|
447 |
+
"save_checkpoint": "Reloaded checkpoint '{checkpoint_path}' (epoch {checkpoint_dict})",
|
448 |
+
"save_model": "Saved model '{checkpoint_path}' (epoch {iteration})",
|
449 |
+
"sr_does_not_match": "{sample_rate} Sample rate does not match target {sample_rate2} Sample rate",
|
450 |
+
"time_or_speed_training": "time={current_time} | training speed={elapsed_time_str}",
|
451 |
+
"savemodel": "Saved model '{model_dir}' (epoch {epoch} and step {step})",
|
452 |
+
"model_author": "Credit model to {model_author}",
|
453 |
+
"unregistered": "Model unregistered",
|
454 |
+
"not_author": "Model not credited",
|
455 |
+
"training_author": "Model creator name",
|
456 |
+
"training_author_info": "To credit the model, enter your name here",
|
457 |
+
"extract_model_error": "An error occurred while extracting the model",
|
458 |
+
"start_training": "Starting training",
|
459 |
+
"import_pretrain": "Loaded pre-trained model ({dg}) '{pretrain}'",
|
460 |
+
"not_using_pretrain": "No pre-trained model ({dg}) will be used",
|
461 |
+
"overtraining_find": "Overtraining detected at epoch {epoch} with smoothed generator loss {smoothed_value_gen} and smoothed discriminator loss {smoothed_value_disc}",
|
462 |
+
"best_epoch": "New best epoch {epoch} with smoothed generator loss {smoothed_value_gen} and smoothed discriminator loss {smoothed_value_disc}",
|
463 |
+
"success_training": "Training completed with {epoch} epochs, {global_step} steps, and {loss_gen_all} total generator loss.",
|
464 |
+
"training_info": "Lowest generator loss: {lowest_value_rounded} at epoch {lowest_value_epoch}, step {lowest_value_step}",
|
465 |
+
"model_training_info": "{model_name} | epoch={epoch} | step={global_step} | {epoch_recorder} | lowest value={lowest_value_rounded} (epoch {lowest_value_epoch} and step {lowest_value_step}) | remaining epochs for overtraining: g/total: {remaining_epochs_gen} d/total: {remaining_epochs_disc} | smoothed generator loss={smoothed_value_gen} | smoothed discriminator loss={smoothed_value_disc}",
|
466 |
+
"model_training_info_2": "{model_name} | epoch={epoch} | step={global_step} | {epoch_recorder} | lowest value={lowest_value_rounded} (epoch {lowest_value_epoch} and step {lowest_value_step})",
|
467 |
+
"model_training_info_3": "{model_name} | epoch={epoch} | step={global_step} | {epoch_recorder}",
|
468 |
+
"training_error": "An error occurred while training the model:",
|
469 |
+
"separator_info": "Initializing with output path: {output_dir}, output format: {output_format}",
|
470 |
+
"none_ffmpeg": "FFmpeg is not installed. Please install FFmpeg to use this package.",
|
471 |
+
"running_in_cpu": "Unable to configure hardware acceleration, running in CPU mode",
|
472 |
+
"running_in_cuda": "CUDA available in Torch, setting Torch device to CUDA",
|
473 |
+
"running_in_amd": "AMD available in Torch, setting Torch device to AMD",
|
474 |
+
"onnx_have": "ONNXruntime available {have}, enabling acceleration",
|
475 |
+
"onnx_not_have": "{have} not available in ONNXruntime; acceleration will NOT be enabled",
|
476 |
+
"download_error": "Failed to download file from {url}, response code: {status_code}",
|
477 |
+
"vip_print": "Hey there, if you haven't subscribed, please consider supporting UVR's developer, Anjok07, by subscribing here: https://patreon.com/uvr",
|
478 |
+
"loading_model": "Loading model {model_filename}...",
|
479 |
+
"model_type_not_support": "Unsupported model type: {model_type}",
|
480 |
+
"starting_separator": "Starting separation process for audio file path",
|
481 |
+
"separator_success_3": "Separation process completed.",
|
482 |
+
"separator_duration": "Separation duration",
|
483 |
+
"dims": "Cannot use sin/cos position encoding with odd dimensions (dim={dims})",
|
484 |
+
"activation": "activation must be relu/gelu, not {activation}",
|
485 |
+
"length_or_training_length": "Provided length {length} exceeds training duration {training_length}",
|
486 |
+
"type_not_valid": "Invalid type for",
|
487 |
+
"del_parameter": "Removing non-existent parameter ",
|
488 |
+
"convert_shape": "Converted mix shape: {shape}",
|
489 |
+
"not_success": "Process was not successful: ",
|
490 |
+
"resample_error": "Error during resampling",
|
491 |
+
"shapes": "Shapes",
|
492 |
+
"wav_resolution": "Resolution type",
|
493 |
+
"warnings": "Warning: Extremely aggressive values detected",
|
494 |
+
"warnings_2": "Warning: NaN or infinite values detected in wave input. Shape",
|
495 |
+
"process_file": "Processing file... \n",
|
496 |
+
"save_instruments": "Saving reverse track...",
|
497 |
+
"assert": "Audio files must have the same shape - Mix: {mixshape}, Inst: {instrumentalshape}",
|
498 |
+
"rubberband": "Rubberband CLI cannot be executed. Please ensure Rubberband-CLI is installed.",
|
499 |
+
"rate": "Rate must be strictly positive",
|
500 |
+
"gdown_error": "Could not retrieve the public link for the file. You may need to change its permissions to 'Anyone with the link' or there may already be excessive access permissions.",
|
501 |
+
"gdown_value_error": "A path or ID must be specified",
|
502 |
+
"missing_url": "URL is missing",
|
503 |
+
"mac_not_match": "MAC does not match",
|
504 |
+
"file_not_access": "File is not accessible",
|
505 |
+
"int_resp==-3": "Request failed, retrying",
|
506 |
+
"search_separate": "Search for separate files...",
|
507 |
+
"found_choice": "Found {choice}",
|
508 |
+
"separator==0": "No separate files found!",
|
509 |
+
"select_separate": "Select separate files",
|
510 |
+
"start_app": "Starting interface...",
|
511 |
+
"provide_audio": "Enter the path to the audio file",
|
512 |
+
"set_torch_mps": "Set Torch device to MPS",
|
513 |
+
"googletts": "Convert text using Google",
|
514 |
+
"pitch_info_2": "Pitch adjustment for text-to-speech converter",
|
515 |
+
"waveform": "Waveform must have the shape (# frames, # channels)",
|
516 |
+
"freq_mask_smooth_hz": "freq_mask_smooth_hz must be at least {hz}Hz",
|
517 |
+
"time_mask_smooth_ms": "time_mask_smooth_ms must be at least {ms}ms",
|
518 |
+
"x": "x must be greater",
|
519 |
+
"xn": "xn must be greater",
|
520 |
+
"not_found_pid": "No processes found!",
|
521 |
+
"end_pid": "Process terminated!",
|
522 |
+
"not_found_separate_model": "No separation model files found!",
|
523 |
+
"not_found_pretrained": "No pretrained model files found!",
|
524 |
+
"not_found_log": "No log files found!",
|
525 |
+
"not_found_predictors": "No predictor model files found!",
|
526 |
+
"not_found_embedders": "No embedder model files found!",
|
527 |
+
"provide_folder": "Please provide a valid folder!",
|
528 |
+
"empty_folder": "The data folder is empty!",
|
529 |
+
"vocoder": "Vocoder",
|
530 |
+
"vocoder_info": "A vocoder analyzes and synthesizes human speech signals for voice transformation.\n\nDefault: This option is HiFi-GAN-NSF, compatible with all RVCs\n\nMRF-HiFi-GAN: Higher fidelity.\n\nRefineGAN: Superior sound quality.",
|
531 |
+
"code_error": "Error: Received status code",
|
532 |
+
"json_error": "Error: Unable to parse response.",
|
533 |
+
"requests_error": "Request failed: {e}",
|
534 |
+
"memory_efficient_training": "Using memory-efficient training",
|
535 |
+
"not_use_pretrain_error_download": "Will not use pretrained models due to missing files",
|
536 |
+
"provide_file_settings": "Please provide a preset settings file!",
|
537 |
+
"load_presets": "Loaded preset file {presets}",
|
538 |
+
"provide_filename_settings": "Please provide a preset file name!",
|
539 |
+
"choose1": "Please select one to export!",
|
540 |
+
"export_settings": "Exported preset file {name}",
|
541 |
+
"use_presets": "Using preset file",
|
542 |
+
"file_preset": "Preset file",
|
543 |
+
"load_file": "Load file",
|
544 |
+
"export_file": "Export preset file",
|
545 |
+
"save_clean": "Save cleanup",
|
546 |
+
"save_autotune": "Save autotune",
|
547 |
+
"save_pitch": "Save pitch",
|
548 |
+
"save_index_2": "Save index impact",
|
549 |
+
"save_resample": "Save resampling",
|
550 |
+
"save_filter": "Save median filter",
|
551 |
+
"save_envelope": "Save sound envelope",
|
552 |
+
"save_protect": "Save sound protection",
|
553 |
+
"save_split": "Save sound split",
|
554 |
+
"filename_to_save": "File name to save",
|
555 |
+
"upload_presets": "Upload preset file",
|
556 |
+
"stop": "Stop process",
|
557 |
+
"stop_separate": "Stop Music Separation",
|
558 |
+
"stop_convert": "Stop Conversion",
|
559 |
+
"stop_create_dataset": "Stop Dataset Creation",
|
560 |
+
"stop_training": "Stop Training",
|
561 |
+
"stop_preprocess": "Stop Data Processing",
|
562 |
+
"stop_extract": "Stop Data Extraction",
|
563 |
+
"not_found_presets": "No preset files found in the folder!",
|
564 |
+
"port": "Port {port} is unavailable! Lowering port by one...",
|
565 |
+
"empty_json": "{file}: Corrupted or empty",
|
566 |
+
"thank": "Thank you for reporting the issue, and apologies for any inconvenience caused!",
|
567 |
+
"error_read_log": "An error occurred while reading log files!",
|
568 |
+
"error_send": "An error occurred while sending the report! Please contact me on Discord: pham_huynh_anh!",
|
569 |
+
"report_bugs": "Report Bugs",
|
570 |
+
"agree_log": "Agree to provide all log files",
|
571 |
+
"error_info": "Error description",
|
572 |
+
"error_info_2": "Provide more information about the error",
|
573 |
+
"report_bug_info": "Report bugs encountered during program usage",
|
574 |
+
"sr_info": "NOTE: SOME FORMATS DO NOT SUPPORT RATES ABOVE 48000",
|
575 |
+
"report_info": "If possible, agree to provide log files to help with debugging.\n\nIf log files are not provided, please describe the error in detail, including when and where it occurred.\n\nIf this reporting system also fails, you can reach out via [ISSUE]({github}) or Discord: `pham_huynh_anh`",
|
576 |
+
"default_setting": "An error occurred during separation, resetting all settings to default...",
|
577 |
+
"dataset_folder1": "Please enter the data folder name",
|
578 |
+
"checkpointing_err": "Pretrained model parameters such as sample rate or architecture do not match the selected model.",
|
579 |
+
"start_onnx_export": "Start converting model to onnx...",
|
580 |
+
"convert_model": "Convert Model",
|
581 |
+
"pytorch2onnx": "Converting PYTORCH Model to ONNX Model",
|
582 |
+
"pytorch2onnx_markdown": "Convert RVC model from pytorch to onnx to optimize audio conversion",
|
583 |
+
"error_readfile": "An error occurred while reading the file!",
|
584 |
+
"f0_onnx_mode": "F0 ONNX Mode",
|
585 |
+
"f0_onnx_mode_info": "Extracting pitch using the ONNX model can help improve speed",
|
586 |
+
"formantshift": "Pitch and Formant Shift",
|
587 |
+
"formant_qfrency": "Frequency for Formant Shift",
|
588 |
+
"formant_timbre": "Timbre for Formant Transformation",
|
589 |
+
"time_frames": "Time (Frames)",
|
590 |
+
"Frequency": "Frequency (Hz)",
|
591 |
+
"f0_extractor_tab": "F0 Extraction",
|
592 |
+
"f0_extractor_markdown": "## Pitch Extraction",
|
593 |
+
"f0_extractor_markdown_2": "F0 pitch extraction is intended for use in audio conversion inference",
|
594 |
+
"start_extract": "Starting extraction process...",
|
595 |
+
"extract_done": "Extraction process completed!",
|
596 |
+
"f0_file": "Use pre-extracted F0 file",
|
597 |
+
"upload_f0": "Upload F0 file",
|
598 |
+
"f0_file_2": "F0 File",
|
599 |
+
"clean_f0_file": "Clean up F0 file",
|
600 |
+
"embed_mode": "Embedders Mode",
|
601 |
+
"embed_mode_info": "Extracting embeddings using different models",
|
602 |
+
"close": "The application is shutting down...",
|
603 |
+
"start_whisper": "Starting voice recognition with Whisper...",
|
604 |
+
"whisper_done": "Voice recognition complete!",
|
605 |
+
"process_audio": "Preprocessing audio...",
|
606 |
+
"process_done_start_convert": "Audio processing complete! proceeding with audio conversion...",
|
607 |
+
"convert_with_whisper": "Convert Audio With Whisper",
|
608 |
+
"convert_with_whisper_info": "Convert audio using a trained speech model with a Whisper model for speech recognition\n\nWhisper will recognize different voices then cut the individual voices and use the RVC model to convert those segments\n\nThe Whisper model may not work properly which may cause strange output",
|
609 |
+
"num_spk": "Number of voices",
|
610 |
+
"num_spk_info": "Number of voices in the audio",
|
611 |
+
"model_size": "Whisper model size",
|
612 |
+
"model_size_info": "Whisper model size\n\nLarge models can produce strange outputs",
|
613 |
+
"title": "Simple high-quality and high-performance voice and instrument conversion and training tool for Vietnamese people",
|
614 |
+
"fp16_not_support": "CPU, MPS and OCL does not support fp16 well, convert fp16 -> fp32",
|
615 |
+
"precision": "Precision",
|
616 |
+
"precision_info": "Precision of inference and model training\n\nNote: CPU Does not support fp16",
|
617 |
+
"update_precision": "Update Precision",
|
618 |
+
"start_update_precision": "Start updating precision",
|
619 |
+
"deterministic": "Deterministic algorithm",
|
620 |
+
"deterministic_info": "When enabled, highly deterministic algorithms are used, ensuring that each run of the same input data will yield the same results.\n\nWhen disabled, more optimal algorithms may be selected but may not be fully deterministic, resulting in different training results between runs.",
|
621 |
+
"benchmark": "Benchmark algorithm",
|
622 |
+
"benchmark_info": "When enabled, it will test and select the most optimized algorithm for the specific hardware and size. This can help speed up training.\n\nWhen disabled, it will not perform this algorithm optimization, which can reduce speed but ensures that each run uses the same algorithm, which is useful if you want to reproduce exactly.",
|
623 |
+
"font": "Font",
|
624 |
+
"font_info": "Interface font\n\nVisit [Google Font](https://fonts.google.com) to choose your favorite font.",
|
625 |
+
"change_font": "Change Font",
|
626 |
+
"f0_unlock": "Unlock all",
|
627 |
+
"f0_unlock_info": "Unlock all pitch extraction methods",
|
628 |
+
"srt": "SRT file is empty or corrupt!",
|
629 |
+
"optimizer": "Optimizer",
|
630 |
+
"optimizer_info": "Optimizer in training, AdamW is default, RAdam is another optimizer",
|
631 |
+
"main_volume": "Main audio file volume",
|
632 |
+
"main_volume_info": "Main audio file volume. Should be between -4 and 0.",
|
633 |
+
"combination_volume": "Combination audio file volume",
|
634 |
+
"combination_volume_info": "Combination audio file volume. Should keep the volume of the combination file lower than the main audio.",
|
635 |
+
"inference": "Inference",
|
636 |
+
"extra": "Extra",
|
637 |
+
"running_local_url": "Running Interface On Local Url",
|
638 |
+
"running_share_url": "Running Interface On Public Url",
|
639 |
+
"translate": "Translate",
|
640 |
+
"source_lang": "Input language",
|
641 |
+
"target_lang": "Output language",
|
642 |
+
"prompt_warning": "Please enter text to start translating!",
|
643 |
+
"read_error": "An error occurred while reading the text file!",
|
644 |
+
"quirk": "Quirk Effects",
|
645 |
+
"quirk_info": "## Weird Effects for Audio",
|
646 |
+
"quirk_label": "Quirk effects",
|
647 |
+
"quirk_label_info": "Quirk effects that can be used to apply to audio",
|
648 |
+
"quirk_markdown": "Apply quirky effects to your audio to make it weird and weird.",
|
649 |
+
"gradio_start": "Interface loaded successfully after",
|
650 |
+
"quirk_choice": {"Random": 0, "Voice Crack": 1, "Horror": 2, "Robot": 3, "Baby": 4, "Depression": 5, "Voice Jerking": 6, "Oldster": 7, "Echo": 8, "Devil": 9, "Distorted Voice": 10, "Online Sales": 11, "Drag": 12, "Uncomfortable": 13, "Noise": 14, "Connectivity Issue": 15, "Disorder": 16},
|
651 |
+
"proposal_pitch": "Automatically propose pitch",
|
652 |
+
"hybrid_calc": "Hybrid calculation for method: {f0_method}...",
|
653 |
+
"proposal_f0": "Proposed pitch: {up_key}",
|
654 |
+
"startautotune": "Start autotune pitch...",
|
655 |
+
"proposal_pitch_threshold": "Proposal Pitch Threshold",
|
656 |
+
"proposal_pitch_threshold_info": "Proposal Pitch Threshold, for male models use 155.0 and female models use 255.0",
|
657 |
+
"rms_start_extract": "Starting audio energy extraction with {num_processes} cores...",
|
658 |
+
"rms_success_extract": "Energy extraction completed in {elapsed_time} seconds.",
|
659 |
+
"train&energy": "Training with energy",
|
660 |
+
"train&energy_info": "Training model with RMS energy",
|
661 |
+
"editing": "Editing",
|
662 |
+
"check_assets_error": "Downloading assets failed {count} times in a row! Please download manually and place in the assets folder: https://huggingface.co/AnhP/Vietnamese-RVC-Project"
|
663 |
+
}
|
assets/languages/vi-VN.json
ADDED
@@ -0,0 +1,663 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
{
|
2 |
+
"set_lang": "Đã đặt ngôn ngữ hiển thị là {lang}",
|
3 |
+
"no_support_gpu": "Thật không may, không có GPU tương thích để hỗ trợ việc đào tạo của bạn.",
|
4 |
+
"text": "văn bản",
|
5 |
+
"upload_success": "Đã tải lên tệp {name} hoàn tất.",
|
6 |
+
"download_url": "Tải từ đường dẫn liên kết",
|
7 |
+
"download_from_csv": "Tải từ kho mô hình csv",
|
8 |
+
"search_models": "Tìm kiếm mô hình",
|
9 |
+
"upload": "Tải lên",
|
10 |
+
"option_not_valid": "Tùy chọn không hợp lệ!",
|
11 |
+
"list_model": "Danh sách mô hình",
|
12 |
+
"success": "Hoàn tất!",
|
13 |
+
"index": "chỉ mục",
|
14 |
+
"model": "mô hình",
|
15 |
+
"zip": "nén",
|
16 |
+
"search": "tìm kiếm",
|
17 |
+
"provide_file": "Vui lòng cung cấp tệp {filename} hợp lệ!",
|
18 |
+
"start": "Bắt đầu {start}...",
|
19 |
+
"not_found": "Không tìm thấy {name}",
|
20 |
+
"found": "Đã tìm thấy {results} kết quả!",
|
21 |
+
"download_music": "tải nhạc",
|
22 |
+
"download": "tải xuống",
|
23 |
+
"provide_url": "Vui lòng cung cấp đường dẫn liên kết.",
|
24 |
+
"provide_name_is_save": "Vui lòng cung cấp tên mô hình để lưu.",
|
25 |
+
"not_support_url": "Liên kết mô hình của bạn không được hỗ trợ.",
|
26 |
+
"error_occurred": "Đã xảy ra lỗi: {e}",
|
27 |
+
"unable_analyze_model": "Không phân tích được mô hình!",
|
28 |
+
"download_pretrain": "Tải xuống huấn luyện trước...",
|
29 |
+
"provide_pretrain": "Vui lòng cung cấp đường dẫn mô hình huấn luyện trước {dg}.",
|
30 |
+
"sr_not_same": "Tốc độ lấy mẫu của hai mô hình không giống nhau",
|
31 |
+
"architectures_not_same": "Không thể hợp nhất các mô hình. Các kiến trúc mô hình không giống nhau.",
|
32 |
+
"fushion_model": "dung hợp mô hình",
|
33 |
+
"model_fushion_info": "Mô hình được {name} được dung hợp từ {pth_1} và {pth_2} với ratio {ratio}.",
|
34 |
+
"not_found_create_time": "Không tìm thấy thời gian tạo.",
|
35 |
+
"format_not_valid": "Định dạng không hợp lệ.",
|
36 |
+
"read_info": "Các mô hình được huấn luyện trên các ứng dụng khác nhau có thể đem lại các thông tin khác nhau hoặc không thể đọc!",
|
37 |
+
"epoch": "kỷ nguyên.",
|
38 |
+
"step": "bước",
|
39 |
+
"sr": "Tốc độ lấy mẫu",
|
40 |
+
"f0": "huấn luyện cao độ",
|
41 |
+
"version": "phiên bản.",
|
42 |
+
"not_f0": "Không được huấn luyện cao độ",
|
43 |
+
"trained_f0": "Được huấn luyện cao độ",
|
44 |
+
"model_info": "Tên mô hình: {model_name}\n\n Người tạo mô hình: {model_author}\n\nKỷ nguyên: {epochs}\n\nSố bước: {steps}\n\nPhiên bản của mô hình: {version}\n\nTốc độ lấy mẫu: {sr}\n\nHuấn luyện cao độ: {pitch_guidance}\n\nHash (ID): {model_hash}\n\nThời gian tạo: {creation_date_str}\n\nBộ mã hóa: {vocoder}\n\nNăng lượng: {rms_extract}\n",
|
45 |
+
"input_not_valid": "Vui lòng nhập đầu vào hợp lệ!",
|
46 |
+
"output_not_valid": "Vui lòng nhập đầu ra hợp lệ!",
|
47 |
+
"apply_effect": "áp dụng hiệu ứng",
|
48 |
+
"enter_the_text": "Vui lòng nhập văn bản để chuyển!",
|
49 |
+
"choose_voice": "Vui lòng chọn giọng!",
|
50 |
+
"convert": "Chuyển đổi {name}...",
|
51 |
+
"separator_music": "tách nhạc",
|
52 |
+
"notfound": "Không tìm thấy",
|
53 |
+
"turn_on_use_audio": "Vui lòng bật sử dụng âm thanh vừa tách để sử dụng",
|
54 |
+
"turn_off_convert_backup": "Tắt chuyển đổi giọng bè để có thể sử dụng giọng gốc",
|
55 |
+
"turn_off_merge_backup": "Tắt không kết hợp giọng bè để có thể sử dụng giọng gốc",
|
56 |
+
"not_found_original_vocal": "Không tìm thấy giọng gốc!",
|
57 |
+
"convert_vocal": "Đang chuyển đổi giọng nói...",
|
58 |
+
"convert_success": "Đã hoàn tất chuyển đổi giọng nói!",
|
59 |
+
"convert_backup": "Đang chuyển đổi giọng bè...",
|
60 |
+
"convert_backup_success": "Đã Hoàn tất chuyển đổi giọng bè!",
|
61 |
+
"merge_backup": "Kết hợp giọng với giọng bè...",
|
62 |
+
"merge_success": "Kết hợp Hoàn tất.",
|
63 |
+
"is_folder": "Đầu vào là một thư mục: Chuyển đổi tất cả tệp âm thanh trong thư mục...",
|
64 |
+
"not_found_in_folder": "Không tìm thấy tệp âm thanh trong thư mục!",
|
65 |
+
"batch_convert": "Đang chuyển đổi hàng loạt...",
|
66 |
+
"batch_convert_success": "Chuyển đổi hàng loạt hoàn tất!",
|
67 |
+
"create": "tạo",
|
68 |
+
"provide_name": "Vui lòng cung cấp tên mô hình.",
|
69 |
+
"not_found_data": "Không tìm thấy dữ liệu",
|
70 |
+
"not_found_data_preprocess": "Không tìm thấy dữ liệu được xử lý, vui lòng xử lý lại âm thanh",
|
71 |
+
"not_found_data_extract": "Không tìm thấy dữ liệu được trích xuất, vui lòng trích xuất lại âm thanh",
|
72 |
+
"provide_pretrained": "Vui lòng nhập huấn luyện {dg}",
|
73 |
+
"download_pretrained": "Tải xuống huấn luyện trước {dg}{rvc_version} gốc",
|
74 |
+
"not_found_pretrain": "Không tìm thấy huấn luyện trước {dg}",
|
75 |
+
"not_use_pretrain": "Sẽ không có huấn luyện trước được sử dụng",
|
76 |
+
"training": "huấn luyện",
|
77 |
+
"rick_roll": "Bấm vào đây nếu bạn muốn bị Rick Roll:) ---> [RickRoll]({rickroll})",
|
78 |
+
"terms_of_use": "**Vui lòng không sử dụng Dự án với bất kỳ mục đích nào vi phạm đạo đức, pháp luật, hoặc gây tổn hại đến cá nhân, tổ chức...**",
|
79 |
+
"exemption": "**Trong trường hợp người sử dụng không tuân thủ các điều khoản hoặc vi phạm, tôi sẽ không chịu trách nhiệm về bất kỳ khiếu nại, thiệt hại, hay trách nhiệm pháp lý nào, dù là trong hợp đồng, do sơ suất, hay các lý do khác, phát sinh từ, ngoài, hoặc liên quan đến phần mềm, việc sử dụng phần mềm hoặc các giao dịch khác liên quan đến phần mềm.**",
|
80 |
+
"separator_tab": "Tách Nhạc",
|
81 |
+
"4_part": "Một hệ thống tách nhạc đơn giản có thể tách được 4 phần: Nhạc, giọng, giọng chính, giọng bè",
|
82 |
+
"clear_audio": "Làm sạch âm thanh",
|
83 |
+
"separator_backing": "Tách giọng bè",
|
84 |
+
"denoise_mdx": "Khữ tách MDX",
|
85 |
+
"use_mdx": "Sử dụng MDX",
|
86 |
+
"dereveb_audio": "Tách vang",
|
87 |
+
"dereveb_backing": "Tách vang bè",
|
88 |
+
"separator_model": "Mô hình tách nhạc",
|
89 |
+
"separator_backing_model": "Mô hình tách bè",
|
90 |
+
"shift": "Số lượng dự đoán",
|
91 |
+
"shift_info": "Càng cao chất lượng càng tốt nhưng lâu nhưng tốn tài nguyên",
|
92 |
+
"segments_size": "Kích Thước Phân Đoạn",
|
93 |
+
"segments_size_info": "Càng cao chất lượng càng tốt nhưng tốn tài nguyên",
|
94 |
+
"batch_size": "Kích thước lô",
|
95 |
+
"batch_size_info": "Số lượng mẫu xử lý đồng thời trong một lần huấn luyện. Cao có thể gây tràn bộ nhớ",
|
96 |
+
"mdx_batch_size_info": "Số lượng mẫu được xử lý cùng một lúc. Việc chia thành các lô giúp tối ưu hóa quá trình tính toán. Lô quá lớn có thể làm tràn bộ nhớ, khi lô quá nhỏ sẽ làm giảm hiệu quả dùng tài nguyên",
|
97 |
+
"overlap": "Chồng chéo",
|
98 |
+
"overlap_info": "Số lượng chồng chéo giữa các cửa sổ dự đoán",
|
99 |
+
"export_format": "Định dạng âm thanh",
|
100 |
+
"export_info": "Định dạng âm thanh khi xuất tệp âm thanh ra",
|
101 |
+
"output_separator": "Âm thanh đã được tách",
|
102 |
+
"hop_length_info": "Khoảng thời gian chuyển cửa sổ phân tích khi thực hiện phép biến đổi. Giá trị nhỏ độ chi tiết cao nhưng cần tính toán nhiều hơn",
|
103 |
+
"drop_audio": "Thả âm thanh vào đây",
|
104 |
+
"drop_text": "Thả tệp văn bản vào đây",
|
105 |
+
"use_url": "Sử dụng đường dẫn youtube",
|
106 |
+
"url_audio": "Đường dẫn liên kết đến âm thanh",
|
107 |
+
"downloads": "Tải Xuống",
|
108 |
+
"clean_strength": "Mức độ làm sạch âm thanh",
|
109 |
+
"clean_strength_info": "Mức độ của bộ làm sạch âm thanh để lọc giọng hát khi xuất",
|
110 |
+
"input_output": "Đầu vào, đầu ra âm thanh",
|
111 |
+
"audio_path": "Đường dẫn đầu vào âm thanh",
|
112 |
+
"refresh": "Tải lại",
|
113 |
+
"output_folder": "Đường dẫn thư mục đầu ra âm thanh",
|
114 |
+
"output_folder_info": "Nhập đường dẫn thư mục âm thanh sẽ xuất ra ở đó",
|
115 |
+
"input_audio": "Đầu vào âm thanh",
|
116 |
+
"instruments": "Nhạc nền",
|
117 |
+
"original_vocal": "Giọng gốc",
|
118 |
+
"main_vocal": "Giọng chính",
|
119 |
+
"backing_vocal": "Giọng bè",
|
120 |
+
"convert_audio": "Chuyển Đổi Âm Thanh",
|
121 |
+
"convert_info": "Chuyển đổi âm thanh bằng mô hình giọng nói đã được huấn luyện",
|
122 |
+
"autotune": "Tự động điều chỉnh",
|
123 |
+
"use_audio": "Sử dụng âm thanh vừa tách",
|
124 |
+
"convert_original": "Chuyển đổi giọng gốc",
|
125 |
+
"convert_backing": "Chuyển đổi giọng bè",
|
126 |
+
"not_merge_backing": "Không kết hợp giọng bè",
|
127 |
+
"merge_instruments": "Kết hợp nhạc nền",
|
128 |
+
"pitch": "Cao độ",
|
129 |
+
"pitch_info": "Khuyến cáo: chỉnh lên 12 để chuyển giọng nam thành nữ và ngược lại",
|
130 |
+
"model_accordion": "Mô hình và chỉ mục",
|
131 |
+
"model_name": "Tệp mô hình",
|
132 |
+
"index_path": "Tệp chỉ mục",
|
133 |
+
"index_strength": "Ảnh hưởng của chỉ mục",
|
134 |
+
"index_strength_info": "Càng cao ảnh hưởng càng lớn. Tuy nhiên, việc chọn giá trị thấp hơn có thể giảm hiện tượng giả trong âm thanh",
|
135 |
+
"output_path": "Đường dẫn đầu ra âm thanh",
|
136 |
+
"output_path_info": "Nhập đường dẫn đầu ra(cứ để định dạng .wav khi chuyển đổi nó tự sửa)",
|
137 |
+
"setting": "Cài đặt chung",
|
138 |
+
"f0_method": "Phương pháp trích xuất",
|
139 |
+
"f0_method_info": "Phương pháp để trích xuất dữ liệu",
|
140 |
+
"f0_method_hybrid": "Phương pháp trích xuất HYBRID",
|
141 |
+
"f0_method_hybrid_info": "Sự kết hợp của hai hoặc nhiều loại trích xuất khác nhau",
|
142 |
+
"hubert_model": "Mô hình nhúng",
|
143 |
+
"hubert_info": "Mô hình được huấn luyện trước để giúp nhúng",
|
144 |
+
"modelname": "Tên của mô hình",
|
145 |
+
"modelname_info": "Nếu bạn có mô hình riêng chỉ cần tải và nhập tên của mô hình vào đây",
|
146 |
+
"split_audio": "Cắt âm thanh",
|
147 |
+
"autotune_rate": "Mức độ điều chỉnh",
|
148 |
+
"autotune_rate_info": "Mức độ điều chỉnh tự động",
|
149 |
+
"resample": "Lấy mẫu lại",
|
150 |
+
"resample_info": "Lấy mẫu lại sau xử lý đến tốc độ lấy mẫu cuối cùng, 0 có nghĩa là không lấy mẫu lại, LƯU Ý: MỘT SỐ ĐỊNH DẠNG KHÔNG HỖ TRỢ TỐC ĐỘ TRÊN 48000",
|
151 |
+
"filter_radius": "Lọc trung vị",
|
152 |
+
"filter_radius_info": "Nếu giá trị lớn hơn ba sẽ áp dụng tính năng lọc trung vị. Giá trị đại diện cho bán kính bộ lọc và có thể làm giảm hơi thở hoặc tắt thở.",
|
153 |
+
"rms_mix_rate": "Tỷ lệ trộn RMS",
|
154 |
+
"rms_mix_rate_info": "Xác định tỷ lệ pha trộn giữa năng lượng RMS của giọng gốc và giọng đã chuyển đổi",
|
155 |
+
"protect": "Bảo vệ phụ âm",
|
156 |
+
"protect_info": "Bảo vệ các phụ âm riêng biệt và âm thanh thở ngăn chặn việc rách điện âm và các hiện tượng giả khác. Việc chỉnh tối đa sẽ bảo vệ toàn diện. Việc giảm giá trị này có thể giảm độ bảo vệ, đồng thời có khả năng giảm thiểu hiệu ứng lập chỉ mục",
|
157 |
+
"output_convert": "Âm thanh đã được chuyển đổi",
|
158 |
+
"main_convert": "Chuyển đổi giọng chính",
|
159 |
+
"main_or_backing": "Giọng chính + Giọng bè",
|
160 |
+
"voice_or_instruments": "Giọng + Nhạc nền",
|
161 |
+
"convert_text": "Chuyển Đổi Văn Bản",
|
162 |
+
"convert_text_markdown": "## Chuyển Đổi Văn Bản Thành Giọng Nói",
|
163 |
+
"convert_text_markdown_2": "Chuyển văn bản thành giọng nói và đọc lại bằng mô hình giọng nói được huấn luyện",
|
164 |
+
"input_txt": "Nhập dữ liệu từ tệp văn bản txt",
|
165 |
+
"text_to_speech": "Văn bản cần đọc",
|
166 |
+
"voice_speed": "Tốc độ đọc",
|
167 |
+
"voice_speed_info": "Tốc độ đọc của giọng nói",
|
168 |
+
"tts_1": "1. Chuyển Đổi Văn Bản",
|
169 |
+
"tts_2": "2. Chuyển Đổi Giọng Nói",
|
170 |
+
"voice": "Giọng nói của các nước",
|
171 |
+
"output_tts": "Đường dẫn đầu ra giọng nói",
|
172 |
+
"output_tts_convert": "Đường dẫn đầu ra giọng chuyển đổi",
|
173 |
+
"tts_output": "Nhập đường dẫn đầu ra",
|
174 |
+
"output_tts_markdown": "Âm thanh chưa được chuyển đổi và âm thanh đã được chuyển đổi",
|
175 |
+
"output_text_to_speech": "Giọng được tạo bởi chuyển đổi văn bản thành giọng nói",
|
176 |
+
"output_file_tts_convert": "Giọng được chuyển đổi bởi mô hình",
|
177 |
+
"output_audio": "Đầu ra âm thanh",
|
178 |
+
"provide_output": "Nhập đường dẫn đầu ra",
|
179 |
+
"audio_effects": "Hiệu Ứng Âm Thanh",
|
180 |
+
"apply_audio_effects": "## Áp Dụng Thêm Hiệu Ứng Cho Âm Thanh",
|
181 |
+
"audio_effects_edit": "Chỉnh sửa thêm hiệu ứng cho âm thanh",
|
182 |
+
"reverb": "Hiệu ứng vọng âm",
|
183 |
+
"chorus": "Hiệu ứng hòa âm",
|
184 |
+
"delay": "Hiệu ứng độ trễ",
|
185 |
+
"more_option": "Tùy chọn thêm",
|
186 |
+
"phaser": "Hiệu ứng xoay pha",
|
187 |
+
"compressor": "Hiệu ứng nén",
|
188 |
+
"apply": "Áp dụng",
|
189 |
+
"reverb_freeze": "Chế độ đóng băng",
|
190 |
+
"reverb_freeze_info": "Tạo hiệu ứng vang liên tục khi bật chế độ này",
|
191 |
+
"room_size": "Kích thước phòng",
|
192 |
+
"room_size_info": "Điều chỉnh không gian của phòng để tạo độ vang",
|
193 |
+
"damping": "Giảm âm",
|
194 |
+
"damping_info": "Điều chỉnh độ hút âm, kiểm soát mức độ vang",
|
195 |
+
"wet_level": "Mức độ tín hiệu vang",
|
196 |
+
"wet_level_info": "Điều chỉnh mức độ của tín hiệu có hiệu ứng vọng âm",
|
197 |
+
"dry_level": "Mức độ tín hiệu gốc",
|
198 |
+
"dry_level_info": "Điều chỉnh mức độ của tín hiệu không có hiệu ứng",
|
199 |
+
"width": "Chiều rộng âm thanh",
|
200 |
+
"width_info": "Điều chỉnh độ rộng của không gian âm thanh",
|
201 |
+
"chorus_depth": "Giảm âm",
|
202 |
+
"chorus_depth_info": "Điều chỉnh cường độ hòa âm, tạo ra cảm giác rộng cho âm thanh",
|
203 |
+
"chorus_rate_hz": "Tần số",
|
204 |
+
"chorus_rate_hz_info": "Điều chỉnh tốc độ dao động của hòa âm",
|
205 |
+
"chorus_mix": "Trộn tín hiệu",
|
206 |
+
"chorus_mix_info": "Điều chỉnh mức độ trộn giữa âm gốc và âm có hiệu ứng",
|
207 |
+
"chorus_centre_delay_ms": "Đỗ trễ trung tâm (mili giây)",
|
208 |
+
"chorus_centre_delay_ms_info": "Khoảng thời gian trễ giữa các kênh stereo ��ể tạo hiệu ứng hòa âm",
|
209 |
+
"chorus_feedback": "Phản hồi",
|
210 |
+
"chorus_feedback_info": "Điều chỉnh lượng tín hiệu hiệu ứng được quay lại vào tín hiệu gốc",
|
211 |
+
"delay_seconds": "Thời gian trễ",
|
212 |
+
"delay_seconds_info": "Điều chỉnh khoảng thời gian trễ giữa âm gốc và âm có hiệu ứng",
|
213 |
+
"delay_feedback": "Phản hồi độ trễ",
|
214 |
+
"delay_feedback_info": "Điều chỉnh lượng tín hiệu được quay lại, tạo hiệu ứng lặp lại",
|
215 |
+
"delay_mix": "Trộn tín hiệu độ trễ",
|
216 |
+
"delay_mix_info": "Điều chỉnh mức độ trộn giữa âm gốc và âm trễ",
|
217 |
+
"fade": "Hiệu ứng mờ dần",
|
218 |
+
"bass_or_treble": "Âm trầm và âm cao",
|
219 |
+
"limiter": "Giới hạn ngưỡng",
|
220 |
+
"distortion": "Hiệu ứng nhiễu âm",
|
221 |
+
"gain": "Cường độ âm",
|
222 |
+
"bitcrush": "Hiệu ứng giảm bits",
|
223 |
+
"clipping": "Hiệu ứng méo âm",
|
224 |
+
"fade_in": "Hiệu ứng mờ dần vào (mili giây)",
|
225 |
+
"fade_in_info": "Thời gian mà âm thanh sẽ tăng dần từ mức 0 đến mức bình thường",
|
226 |
+
"fade_out": "Hiệu ứng mờ dần ra (mili giây)",
|
227 |
+
"fade_out_info": "thời gian mà âm thanh sẽ giảm dần từ bình thường xuống mức 0",
|
228 |
+
"bass_boost": "Độ khuếch đại âm trầm (db)",
|
229 |
+
"bass_boost_info": "mức độ tăng cường âm trầm trong đoạn âm thanh",
|
230 |
+
"bass_frequency": "Tần số cắt của bộ lọc thông thấp (Hz)",
|
231 |
+
"bass_frequency_info": "tần số bị giảm. Tần số thấp sẽ làm âm trầm rõ hơn",
|
232 |
+
"treble_boost": "Độ khuếch đại âm cao (db)",
|
233 |
+
"treble_boost_info": "mức độ tăng cường âm cao trong đoạn âm thanh",
|
234 |
+
"treble_frequency": "Tần số cắt của bộ lọc thông cao (Hz)",
|
235 |
+
"treble_frequency_info": "tần số sẽ lọc bỏ. Tần số càng cao thì giữ lại âm càng cao",
|
236 |
+
"limiter_threshold_db": "Ngưỡng giới hạn",
|
237 |
+
"limiter_threshold_db_info": "Giới hạn mức độ âm thanh tối đa, ngăn không cho vượt quá ngưỡng",
|
238 |
+
"limiter_release_ms": "Thời gian thả",
|
239 |
+
"limiter_release_ms_info": "Khoảng thời gian để âm thanh trở lại sau khi bị giới hạn (Mili Giây)",
|
240 |
+
"distortion_info": "Điều chỉnh mức độ nhiễu âm, tạo hiệu ứng méo tiếng",
|
241 |
+
"gain_info": "Tăng giảm âm lượng của tín hiệu",
|
242 |
+
"clipping_threshold_db": "Ngưỡng cắt",
|
243 |
+
"clipping_threshold_db_info": "Cắt bớt tín hiệu vượt quá ngưỡng, tạo âm thanh méo",
|
244 |
+
"bitcrush_bit_depth": "Độ sâu bit",
|
245 |
+
"bitcrush_bit_depth_info": "Giảm chất lượng âm thanh bằng cách giảm số bit, tạo hiệu ứng âm thanh bị méo",
|
246 |
+
"phaser_depth": "Độ sâu",
|
247 |
+
"phaser_depth_info": "Điều chỉnh độ sâu của hiệu ứng, ảnh hưởng đến cường độ của hiệu ứng xoay pha",
|
248 |
+
"phaser_rate_hz": "Tần số",
|
249 |
+
"phaser_rate_hz_info": "Điều chỉnh tốc độ của hiệu ứng hiệu ứng xoay pha",
|
250 |
+
"phaser_mix": "Trộn tín hiệu",
|
251 |
+
"phaser_mix_info": "Điều chỉnh mức độ trộn giữa tín hiệu gốc và tín hiệu đã qua xử lý",
|
252 |
+
"phaser_centre_frequency_hz": "Tần số trung tâm",
|
253 |
+
"phaser_centre_frequency_hz_info": "Tần số trung tâm của hiệu ứng xoay pha, ảnh hưởng đến tần số bị điều chỉnh",
|
254 |
+
"phaser_feedback": "Phản hồi",
|
255 |
+
"phaser_feedback_info": "Điều chỉnh lượng phản hồi tín hiệu, tạo cảm giác xoay pha mạnh hoặc nhẹ",
|
256 |
+
"compressor_threshold_db": "Ngưỡng nén",
|
257 |
+
"compressor_threshold_db_info": "Ngưỡng mức âm thanh sẽ bị nén khi vượt qua ngưỡng này",
|
258 |
+
"compressor_ratio": "Tỉ lệ nén",
|
259 |
+
"compressor_ratio_info": "Điều chỉnh mức độ nén âm thanh khi vượt qua ngưỡng",
|
260 |
+
"compressor_attack_ms": "Thời gian tấn công (mili giây)",
|
261 |
+
"compressor_attack_ms_info": "Khoảng thời gian nén bắt đầu tác dụng sau khi âm thanh vượt ngưỡng",
|
262 |
+
"compressor_release_ms": "Thời gian thả",
|
263 |
+
"compressor_release_ms_info": "Thời gian để âm thanh trở lại trạng thái bình thường sau khi bị nén",
|
264 |
+
"create_dataset_url": "Đường dẫn liên kết đến âm thanh(sử dụng dấu , để sử dụng nhiều liên kết)",
|
265 |
+
"createdataset": "Tạo dữ liệu",
|
266 |
+
"create_dataset_markdown": "## Tạo Dữ Liệu Huấn Luyện Từ Youtube",
|
267 |
+
"create_dataset_markdown_2": "Xử lý và tạo tập tin dữ liệu huấn luyện bằng đường dẫn youtube",
|
268 |
+
"denoise": "Khử tách mô hình",
|
269 |
+
"skip": "Bỏ qua giây",
|
270 |
+
"model_ver": "Phiên bản tách giọng",
|
271 |
+
"model_ver_info": "Phiên bản của mô hình tách nhạc để tách giọng",
|
272 |
+
"create_dataset_info": "Thông tin tạo dữ liệu",
|
273 |
+
"output_data": "Đầu ra dữ liệu",
|
274 |
+
"output_data_info": "Đầu ra dữ liệu sau khi tạo xong dữ liệu",
|
275 |
+
"skip_start": "Bỏ qua phần đầu",
|
276 |
+
"skip_start_info": "Bỏ qua số giây đầu của âm thanh, dùng dấu , để sử dụng cho nhiều âm thanh",
|
277 |
+
"skip_end": "Bỏ qua phần cuối",
|
278 |
+
"skip_end_info": "Bỏ qua số giây cuối của âm thanh, dùng dấu , để sử dụng cho nhiều âm thanh",
|
279 |
+
"training_model": "Huấn Luyện Mô Hình",
|
280 |
+
"training_markdown": "Huấn luyện và đào tạo mô hình giọng nói bằng một lượng dữ liệu giọng nói",
|
281 |
+
"training_model_name": "Tên của mô hình khi huấn luyện(không sử dụng ký tự đặc biệt hay dấu cách)",
|
282 |
+
"sample_rate": "Tỉ lệ lấy mẫu",
|
283 |
+
"sample_rate_info": "Tỉ lệ lấy mẫu của mô hình",
|
284 |
+
"training_version": "Phiên bản mô hình",
|
285 |
+
"training_version_info": "Phiên bản mô hình khi huấn luyện",
|
286 |
+
"training_pitch": "Huấn luyện cao độ",
|
287 |
+
"upload_dataset": "Tải lên dữ liệu huấn luyện",
|
288 |
+
"preprocess_effect": "Xử lý hậu kỳ",
|
289 |
+
"clear_dataset": "Làm sạch dữ liệu",
|
290 |
+
"preprocess_info": "Thông tin phần xử lý trước",
|
291 |
+
"preprocess_button": "1. Xử lý dữ liệu",
|
292 |
+
"extract_button": "2. Trích xuất dữ liệu",
|
293 |
+
"extract_info": "Thông tin phần trích xuất dữ liệu",
|
294 |
+
"total_epoch": "Tổng số kỷ nguyên",
|
295 |
+
"total_epoch_info": "Tổng số kỷ nguyên huấn luyện đào tạo",
|
296 |
+
"save_epoch": "Tần suất lưu",
|
297 |
+
"save_epoch_info": "Tần suất lưu mô hình khi huấn luyện, giúp việc huấn luyện lại mô hình",
|
298 |
+
"create_index": "Tạo chỉ mục",
|
299 |
+
"index_algorithm": "Thuật toán chỉ mục",
|
300 |
+
"index_algorithm_info": "Thuật toán tạo chỉ mục",
|
301 |
+
"custom_dataset": "Tùy chọn thư mục",
|
302 |
+
"custom_dataset_info": "Tùy chọn thư mục dữ liệu huấn luyện",
|
303 |
+
"overtraining_detector": "Kiểm tra quá sức",
|
304 |
+
"overtraining_detector_info": "Kiểm tra huấn luyện mô hình quá sức",
|
305 |
+
"cleanup_training": "Làm sạch huấn luyện",
|
306 |
+
"cleanup_training_info": "Dọn dẹp và huấn luyện lại từ đầu",
|
307 |
+
"cache_in_gpu": "Lưu mô hình vào đệm",
|
308 |
+
"cache_in_gpu_info": "Lưu mô hình vào bộ nhớ đệm gpu",
|
309 |
+
"dataset_folder": "Thư mục chứa dữ liệu",
|
310 |
+
"threshold": "Ngưỡng huấn luyện quá sức",
|
311 |
+
"setting_cpu_gpu": "Tùy chọn CPU/GPU",
|
312 |
+
"gpu_number": "Số gpu được sử dụng",
|
313 |
+
"gpu_number_info": "Số thứ tự của GPU được sử dụng trong huấn luyện. (Lưu ý: GPU AMD không được hỗ trợ huấn luyện đa GPU)",
|
314 |
+
"save_only_latest": "Chỉ lưu mới nhất",
|
315 |
+
"save_only_latest_info": "Chỉ lưu mô hình D và G mới nhất",
|
316 |
+
"save_every_weights": "Lưu mọi mô hình",
|
317 |
+
"save_every_weights_info": "Lưu mọi mô hình sau mỗi lượt kỷ nguyên",
|
318 |
+
"gpu_info": "Thông tin của GPU",
|
319 |
+
"gpu_info_2": "Thông tin của GPU được sử dụng trong huấn luyện",
|
320 |
+
"cpu_core": "Số lõi xử lý có thể sử dụng",
|
321 |
+
"cpu_core_info": "Số lõi được sử dụng trong việc huấn luyện",
|
322 |
+
"not_use_pretrain_2": "Không dùng huấn luyện",
|
323 |
+
"not_use_pretrain_info": "Không dùng huấn luyện trước",
|
324 |
+
"custom_pretrain": "Tùy chỉnh huấn luyện",
|
325 |
+
"custom_pretrain_info": "Tùy chỉnh huấn luyện trước",
|
326 |
+
"pretrain_file": "Tệp mô hình huấn luyện trước {dg}",
|
327 |
+
"train_info": "Thông tin phần huấn luyện",
|
328 |
+
"export_model": "5. Xuất Mô hình",
|
329 |
+
"zip_model": "2. Nén mô hình",
|
330 |
+
"output_zip": "Đầu ra tệp khi nén",
|
331 |
+
"model_path": "Đường dẫn mô hình",
|
332 |
+
"model_ratio": "Tỉ lệ mô hình",
|
333 |
+
"model_ratio_info": "Chỉnh hướng về bên nào sẽ làm cho mô hình giống với bên đó",
|
334 |
+
"output_model_path": "Đầu ra mô hình",
|
335 |
+
"fushion": "Dung Hợp Mô Hình",
|
336 |
+
"fushion_markdown": "## Dung Hợp Hai Mô Hình Với Nhau",
|
337 |
+
"fushion_markdown_2": "Dung hợp hai mô hình giọng nói lại với nhau để tạo thành một mô hình duy nhất",
|
338 |
+
"read_model": "Đọc Thông Tin",
|
339 |
+
"read_model_markdown": "## Đọc Thông Tin Của Mô Hình",
|
340 |
+
"read_model_markdown_2": "Đọc các thông tin được ghi trong mô hình",
|
341 |
+
"drop_model": "Thả mô hình vào đây",
|
342 |
+
"readmodel": "Đọc mô hình",
|
343 |
+
"model_path_info": "Nhập đường dẫn đến tệp mô hình",
|
344 |
+
"modelinfo": "Thông Tin Mô Hình",
|
345 |
+
"download_markdown": "## Tải Xuống Mô Hình",
|
346 |
+
"download_markdown_2": "Tải xuống mô hình giọng nói, mô hình huấn luyện trước, mô hình nhúng",
|
347 |
+
"model_download": "Tải xuống mô hình giọng nói",
|
348 |
+
"model_url": "Đường dẫn liên kết đến mô hình",
|
349 |
+
"30s": "Vui lòng đợi khoảng 30 giây. Hệ thống sẽ tự khởi động lại!",
|
350 |
+
"model_download_select": "Chọn cách tải mô hình",
|
351 |
+
"model_warehouse": "Kho mô hình",
|
352 |
+
"get_model": "Nhận mô hình",
|
353 |
+
"name_to_search": "Tên để tìm kiếm",
|
354 |
+
"search_2": "Tìm kiếm",
|
355 |
+
"select_download_model": "Chọn mô hình đã được tìm kiếm(Bấm vào để chọn)",
|
356 |
+
"download_pretrained_2": "Tải xuống mô hình huấn luyện trước",
|
357 |
+
"pretrained_url": "Đường dẫn liên kết đến mô hình huấn luyện trước {dg}",
|
358 |
+
"select_pretrain": "Chọn mô hình huấn luyện trước",
|
359 |
+
"select_pretrain_info": "Chọn mô hình huấn luyện trước để cài đặt về",
|
360 |
+
"pretrain_sr": "Tốc độ lấy mẫu của mô hình",
|
361 |
+
"drop_pretrain": "Thả mô hình huấn luyện trước {dg} vào đây",
|
362 |
+
"settings": "Tùy Chỉnh",
|
363 |
+
"settings_markdown": "## Tùy Chỉnh Thêm",
|
364 |
+
"settings_markdown_2": "Tùy chỉnh thêm một số tính năng của dự án",
|
365 |
+
"lang": "Ngôn ngữ",
|
366 |
+
"lang_restart": "Ngôn ngữ được hiển thị trong dự án(Khi đổi ngôn ngữ hệ thống sẽ tự khởi động lại sau 30 giây để cập nhật)",
|
367 |
+
"change_lang": "Đổi Ngôn Ngữ",
|
368 |
+
"theme": "Chủ đề",
|
369 |
+
"theme_restart": "Loại Chủ đề của giao diện được hiển thị(Khi đổi chủ đề hệ thống sẽ tự khởi động lại sau 30 giây để cập nhật)",
|
370 |
+
"theme_button": "Đổi Chủ Đề",
|
371 |
+
"change_light_dark": "Đổi Chế Độ Sáng/Tối",
|
372 |
+
"tensorboard_url": "Đường dẫn biểu đồ",
|
373 |
+
"errors_loading_audio": "Lỗi khi tải âm thanh",
|
374 |
+
"apply_error": "Đã xảy ra lỗi khi áp dụng hiệu ứng: {e}",
|
375 |
+
"indexpath": "Đường dẫn chỉ mục",
|
376 |
+
"split_total": "Tổng số phần đã cắt",
|
377 |
+
"process_audio_error": "Đã xảy ra lỗi khi xử lý âm thanh",
|
378 |
+
"merge_error": "Đã xảy ra lỗi khi ghép âm thanh",
|
379 |
+
"not_found_convert_file": "Không tìm thấy tệp đã xử lý",
|
380 |
+
"convert_batch": "Chuyển đổi hàng loạt...",
|
381 |
+
"found_audio": "Tìm thấy {audio_files} tệp âm thanh cho việc chuyển đổi.",
|
382 |
+
"not_found_audio": "Không tìm thấy tệp âm thanh!",
|
383 |
+
"error_convert": "Đã xảy ra lỗi khi chuyển đổi âm thanh: {e}",
|
384 |
+
"convert_batch_success": "Đã chuyển đổi hàng loạt hoàn tất sau {elapsed_time} giây. Đầu ra {output_path}",
|
385 |
+
"convert_audio_success": "Tệp {input_path} được chuyển đổi hoàn tất sau {elapsed_time} giây. Đầu ra {output_path}",
|
386 |
+
"read_faiss_index_error": "Đã xảy ra lỗi khi đọc chỉ mục FAISS: {e}",
|
387 |
+
"read_model_error": "Thất bại khi tải mô hình: {e}",
|
388 |
+
"starting_download": "Bắt đầu tải xuống",
|
389 |
+
"version_not_valid": "Phiên bản tách giọng không hợp lệ",
|
390 |
+
"skip<audio": "Không thể bỏ qua vì số lượng thời gian bỏ qua thấp hơn số lượng tệp âm thanh",
|
391 |
+
"skip>audio": "Không thể bỏ qua vì số lượng thời gian bỏ qua cao hơn số lượng tệp âm thanh",
|
392 |
+
"=<0": "Thời gian bỏ qua bé hơn hoặc bằng 0 nên bỏ qua",
|
393 |
+
"skip_warning": "Thời lượng bỏ qua ({seconds} giây) vượt quá thời lượng âm thanh ({total_duration} giây). Bỏ qua.",
|
394 |
+
"download_success": "Đã tải xuống hoàn tất",
|
395 |
+
"create_dataset_error": "Đã xảy ra lỗi khi tạo dữ liệu huấn luyện",
|
396 |
+
"create_dataset_success": "Quá trình tạo dữ liệu huấn huyện đã hoàn tất sau: {elapsed_time} giây",
|
397 |
+
"skip_start_audio": "Bỏ qua âm thanh đầu hoàn tất: {input_file}",
|
398 |
+
"skip_end_audio": "Bỏ qua âm thanh cuối hoàn tất: {input_file}",
|
399 |
+
"merge_audio": "Đã ghép các phần chứa âm thanh lại",
|
400 |
+
"separator_process": "Đang tách giọng: {input}...",
|
401 |
+
"not_found_main_vocal": "Không tìm thấy giọng chính!",
|
402 |
+
"not_found_backing_vocal": "Không tìm thấy giọng bè!",
|
403 |
+
"not_found_instruments": "Không tìm thấy nhạc nền",
|
404 |
+
"merge_instruments_process": "Kết hợp giọng với nhạc nền...",
|
405 |
+
"dereverb": "Đang tách âm vang",
|
406 |
+
"dereverb_success": "Đã tách âm vang hoàn tất",
|
407 |
+
"save_index": "Đã lưu tệp chỉ mục",
|
408 |
+
"create_index_error": "Đã xảy ra lỗi khi tạo chỉ mục",
|
409 |
+
"sr_not_16000": "Tỉ lệ mẫu phải là 16000",
|
410 |
+
"extract_file_error": "Đã xảy ra lỗi khi giải nén tập tin",
|
411 |
+
"extract_f0_method": "Bắt đầu trích xuất cao độ với {num_processes} lõi với phương pháp trích xuất {f0_method}...",
|
412 |
+
"extract_f0": "Trích Xuất Cao Độ",
|
413 |
+
"extract_f0_success": "Quá trình trích xuất cao độ đã hoàn tất vào {elapsed_time} giây.",
|
414 |
+
"NaN": "chứa giá trị NaN và sẽ bị bỏ qua.",
|
415 |
+
"start_extract_hubert": "Đang bắt đầu nhúng trích xuất...",
|
416 |
+
"process_error": "Đã xảy ra lỗi khi xử lý",
|
417 |
+
"extract_hubert_success": "Quá trình trích xuất nhúng đã hoàn tất trong {elapsed_time} giây.",
|
418 |
+
"export_process": "Đường dẫn của mô hình",
|
419 |
+
"extract_error": "Đã xảy ra lỗi khi trích xuất dữ liệu",
|
420 |
+
"extract_success": "Đã trích xuất hoàn tất mô hình",
|
421 |
+
"start_preprocess": "Đang bắt đầu xử lý dữ liệu với {num_processes} lõi xử lý...",
|
422 |
+
"not_integer": "Thư mục ID giọng nói phải là số nguyên, thay vào đó có",
|
423 |
+
"preprocess_success": "Quá trình xử lý hoàn tất sau {elapsed_time} giây.",
|
424 |
+
"preprocess_model_success": "Đã hoàn tất xử lý trước dữ liệu cho mô hình",
|
425 |
+
"turn_on_dereverb": "Điều kiện cần để sử dụng tách vang giọng bè là phải bật tách vang",
|
426 |
+
"turn_on_separator_backing": "Điều kiện cần để sử dụng tách vang giọng bè là phải bật tách bè",
|
427 |
+
"backing_model_ver": "Phiên bản mô hình của tách bè",
|
428 |
+
"clean_audio_success": "Đã làm sạch âm hoàn tất!",
|
429 |
+
"separator_error": "Đã xảy ra lỗi khi tách nhạc",
|
430 |
+
"separator_success": "Quá trình tách nhạc đã hoàn tất sau: {elapsed_time} giây",
|
431 |
+
"separator_process_2": "Đang xử lý tách nhạc",
|
432 |
+
"separator_success_2": "Đã tách nhạc hoàn tất!",
|
433 |
+
"separator_process_backing": "Đang xử lý tách giọng bè",
|
434 |
+
"separator_process_backing_success": "Đã tách giọng bè hoàn tất!",
|
435 |
+
"process_original": "Đang xử lý tách âm vang giọng gốc...",
|
436 |
+
"process_original_success": "Đã tách âm vang giọng gốc hoàn tất!",
|
437 |
+
"process_main": "Đang xử lý tách âm vang giọng chính...",
|
438 |
+
"process_main_success": "Đã tách âm vang giọng chính hoàn tất!",
|
439 |
+
"process_backing": "Đang xử lý tách âm vang giọng bè...",
|
440 |
+
"process_backing_success": "Đã tách âm vang giọng bè hoàn tất!",
|
441 |
+
"save_every_epoch": "Lưu mô hình sau: ",
|
442 |
+
"total_e": "Tổng số kỷ nguyên huấn luyện: ",
|
443 |
+
"dorg": "Huấn luyện trước G: {pretrainG} | Huấn luyện trước D: {pretrainD}",
|
444 |
+
"training_f0": "Huấn luyện cao độ",
|
445 |
+
"not_gpu": "Không phát hiện thấy GPU, hoàn nguyên về CPU (không khuyến nghị)",
|
446 |
+
"not_found_checkpoint": "Không tìm thấy tệp điểm đã lưu: {checkpoint_path}",
|
447 |
+
"save_checkpoint": "Đã tải lại điểm đã lưu '{checkpoint_path}' (kỷ nguyên {checkpoint_dict})",
|
448 |
+
"save_model": "Đã lưu mô hình '{checkpoint_path}' (kỷ nguyên {iteration})",
|
449 |
+
"sr_does_not_match": "{sample_rate} Tỉ lệ mẫu không khớp với mục tiêu {sample_rate2} Tỉ lệ mẫu",
|
450 |
+
"time_or_speed_training": "thời gian={current_time} | tốc độ huấn luyện={elapsed_time_str}",
|
451 |
+
"savemodel": "Đã lưu mô hình '{model_dir}' (kỷ nguyên {epoch} và bước {step})",
|
452 |
+
"model_author": "Ghi công mô hình cho {model_author}",
|
453 |
+
"unregistered": "Mô hình không được ghi chép",
|
454 |
+
"not_author": "Mô hình không được ghi chép",
|
455 |
+
"training_author": "Tên chủ mô hình",
|
456 |
+
"training_author_info": "Nếu bạn muốn ghi công mô hình hãy nhập tên của bạn vào đây",
|
457 |
+
"extract_model_error": "Đã xảy ra lỗi khi trích xuất mô hình",
|
458 |
+
"start_training": "Bắt đầu huấn luyện",
|
459 |
+
"import_pretrain": "Đã nạp huấn luyện trước ({dg}) '{pretrain}'",
|
460 |
+
"not_using_pretrain": "Sẽ không có huấn luyện trước ({dg}) được sử dụng",
|
461 |
+
"overtraining_find": "Tập luyện quá sức được phát hiện ở kỷ nguyên {epoch} với mất mát g được làm mịn {smoothed_value_gen} và mất mát d được làm mịn {smoothed_value_disc}",
|
462 |
+
"best_epoch": "Kỷ nguyên mới tốt nhất {epoch} với mất mát g được làm mịn {smoothed_value_gen} và mất mát d được làm mịn {smoothed_value_disc}",
|
463 |
+
"success_training": "Đã đào tạo hoàn tất với {epoch} kỷ nguyên, {global_step} các bước và {loss_gen_all} mất mát gen.",
|
464 |
+
"training_info": "Tổn thất gen thấp nhất: {lowest_value_rounded} ở ký nguyên {lowest_value_epoch}, bước {lowest_value_step}",
|
465 |
+
"model_training_info": "{model_name} | kỷ nguyên={epoch} | bước={global_step} | {epoch_recorder} | giá trị thấp nhất={lowest_value_rounded} (kỷ nguyên {lowest_value_epoch} và bước {lowest_value_step}) | Số kỷ nguyên còn lại để tập luyện quá sức: g/total: {remaining_epochs_gen} d/total: {remaining_epochs_disc} | làm mịn mất mát gen={smoothed_value_gen} | làm mịn mất mát disc={smoothed_value_disc}",
|
466 |
+
"model_training_info_2": "{model_name} | kỷ nguyên={epoch} | bước={global_step} | {epoch_recorder} | giá trị thấp nhất={lowest_value_rounded} (kỷ nguyên {lowest_value_epoch} và bước {lowest_value_step})",
|
467 |
+
"model_training_info_3": "{model_name} | kỷ nguyên={epoch} | bước={global_step} | {epoch_recorder}",
|
468 |
+
"training_error": "Đã xảy ra lỗi khi huấn luyện mô hình:",
|
469 |
+
"separator_info": "Đang khởi tạo với đường dẫn đầu ra: {output_dir}, định dạng đầu ra: {output_format}",
|
470 |
+
"none_ffmpeg": "FFmpeg chưa được cài đặt. Vui lòng cài đặt FFmpeg để sử dụng gói này.",
|
471 |
+
"running_in_cpu": "Không thể cấu hình khả năng tăng tốc phần cứng, chạy ở chế độ CPU",
|
472 |
+
"running_in_cuda": "CUDA có sẵn trong Torch, cài đặt thiết bị Torch thành CUDA",
|
473 |
+
"running_in_amd": "AMD có sẵn trong Torch, cài đặt thiết bị Torch thành AMD",
|
474 |
+
"onnx_have": "ONNXruntime có sẵn {have}, cho phép tăng tốc",
|
475 |
+
"onnx_not_have": "{have} không có sẵn trong ONNXruntime, do đó khả năng tăng tốc sẽ KHÔNG được bật",
|
476 |
+
"download_error": "Không tải được tệp xuống từ {url}, mã phản hồi: {status_code}",
|
477 |
+
"vip_print": "Này bạn, nếu bạn chưa đăng ký, vui lòng cân nhắc việc hỗ trợ cho nhà phát triển của UVR, Anjok07 bằng cách đăng ký tại đây: https://patreon.com/uvr",
|
478 |
+
"loading_model": "Đang tải mô hình {model_filename}...",
|
479 |
+
"model_type_not_support": "Loại mô hình không được hỗ trợ: {model_type}",
|
480 |
+
"starting_separator": "Bắt đầu quá trình tách cho đường dẫn tập tin âm thanh",
|
481 |
+
"separator_success_3": "Quá trình tách hoàn tất.",
|
482 |
+
"separator_duration": "Thời gian tách",
|
483 |
+
"dims": "Không thể sử dụng mã hóa vị trí sin/cos với thứ nguyên lẻ (có dim={dims})",
|
484 |
+
"activation": "kích hoạt phải là relu/gelu, không phải {activation}",
|
485 |
+
"length_or_training_length": "Độ dài cho trước {length} dài hơn thời lượng huấn luyện {training_length}",
|
486 |
+
"type_not_valid": "Loại không hợp lệ cho",
|
487 |
+
"del_parameter": "Bỏ tham số không tồn tại ",
|
488 |
+
"convert_shape": "Hình dạng hỗn hợp chuyển đổi: {shape}",
|
489 |
+
"not_success": "Quá trình đăng không hoàn tất: ",
|
490 |
+
"resample_error": "Lỗi trong quá trình lấy mẫu lại",
|
491 |
+
"shapes": "Hình dạng",
|
492 |
+
"wav_resolution": "Loại độ phân giải",
|
493 |
+
"warnings": "Cảnh báo: Đã phát hiện các giá trị cực kỳ hung hãn",
|
494 |
+
"warnings_2": "Cảnh báo: Đã phát hiện NaN hoặc giá trị vô hạn trong đầu vào sóng. Hình dạng",
|
495 |
+
"process_file": "Đang xử lý tập tin... \n",
|
496 |
+
"save_instruments": "Lưu bản nhạc ngược...",
|
497 |
+
"assert": "Các tệp âm thanh phải có hình dạng giống nhau - Mix: {mixshape}, Inst: {instrumentalshape}",
|
498 |
+
"rubberband": "Không thể thực Rubberband. Vui lòng xác minh rằng Rubberband-cli đã được cài đặt.",
|
499 |
+
"rate": "Tỉ lệ phải hoàn toàn tích cực",
|
500 |
+
"gdown_error": "Không thể truy xuất liên kết công khai của tệp. Bạn có thể cần phải thay đổi quyền thành bất kỳ ai có liên kết hoặc đã có nhiều quyền truy cập.",
|
501 |
+
"gdown_value_error": "Phải chỉ định đường dẫn hoặc id",
|
502 |
+
"missing_url": "Thiếu đường dẫn",
|
503 |
+
"mac_not_match": "MAC không khớp",
|
504 |
+
"file_not_access": "Tệp tin không thể truy cập",
|
505 |
+
"int_resp==-3": "Yêu cầu không hoàn tất, đang thử lại",
|
506 |
+
"search_separate": "Tìm bản tách...",
|
507 |
+
"found_choice": "Tìm thấy {choice}",
|
508 |
+
"separator==0": "Không tìm thấy bản tách nào!",
|
509 |
+
"select_separate": "Chọn bản tách",
|
510 |
+
"start_app": "Khởi động giao diện...",
|
511 |
+
"provide_audio": "Nhập đường dẫn đến tệp âm thanh",
|
512 |
+
"set_torch_mps": "Cài đặt thiết bị Torch thành MPS",
|
513 |
+
"googletts": "Chuyển đổi văn bản bằng google",
|
514 |
+
"pitch_info_2": "Cao độ giọng nói của bộ chuyển đổi văn bản",
|
515 |
+
"waveform": "Dạng sóng phải có hình dạng (# khung, # kênh)",
|
516 |
+
"freq_mask_smooth_hz": "freq_mask_smooth_hz cần ít nhất là {hz}Hz",
|
517 |
+
"time_mask_smooth_ms": "time_mask_smooth_ms cần ít nhất là {ms}ms",
|
518 |
+
"x": "x phải lớn hơn",
|
519 |
+
"xn": "xn phải lớn hơn",
|
520 |
+
"not_found_pid": "Không thấy tiến trình nào!",
|
521 |
+
"end_pid": "Đã kết thúc tiến trình!",
|
522 |
+
"not_found_separate_model": "Không tìm thấy tệp mô hình tách nhạc nào!",
|
523 |
+
"not_found_pretrained": "Không tìm thấy tệp mô hình huấn luyện trước nào!",
|
524 |
+
"not_found_log": "Không tìm thấy tệp nhật ký nào!",
|
525 |
+
"not_found_predictors": "Không tìm thấy tệp mô hình dự đoán nào!",
|
526 |
+
"not_found_embedders": "Không tìm thấy tệp mô hình nhúng nào!",
|
527 |
+
"provide_folder": "Vui lòng cung cấp thư mục hợp lệ!",
|
528 |
+
"empty_folder": "Thư mục dữ liệu trống!",
|
529 |
+
"vocoder": "Bộ mã hóa",
|
530 |
+
"vocoder_info": "Bộ mã hóa giọng nói dùng để phân tích và tổng hợp tín hiệu giọng nói của con người để chuyển đổi giọng nói.\n\nDefault: Tùy chọn này là HiFi-GAN-NSF, tương thích với tất cả các RVC\n\nMRF-HiFi-GAN: Độ trung thực cao hơn.\n\nRefineGAN: Chất lượng âm thanh vượt trội.",
|
531 |
+
"code_error": "Lỗi: Nhận mã trạng thái",
|
532 |
+
"json_error": "Lỗi: Không thể phân tích từ phản hồi.",
|
533 |
+
"requests_error": "Yêu cầu thất bại: {e}",
|
534 |
+
"memory_efficient_training": "Sử dụng hiệu quả bộ nhớ",
|
535 |
+
"not_use_pretrain_error_download": "Sẽ không dùng huấn luyện trước vì không có mô hình",
|
536 |
+
"provide_file_settings": "Vui lòng cung cấp tệp cài đặt trước!",
|
537 |
+
"load_presets": "Đã tải tệp cài đặt trước {presets}",
|
538 |
+
"provide_filename_settings": "Vui lòng cung cấp tên tệp cài đặt trước!",
|
539 |
+
"choose1": "Vui lòng chọn 1 để xuất!",
|
540 |
+
"export_settings": "Đã xuất tệp cài đặt trước {name}",
|
541 |
+
"use_presets": "Sử dụng tệp cài đặt trước",
|
542 |
+
"file_preset": "Tệp cài đặt trước",
|
543 |
+
"load_file": "Tải tệp",
|
544 |
+
"export_file": "Xuất tệp cài đặt trước",
|
545 |
+
"save_clean": "Lưu làm sạch",
|
546 |
+
"save_autotune": "Lưu tự điều chỉnh",
|
547 |
+
"save_pitch": "Lưu cao độ",
|
548 |
+
"save_index_2": "Lưu ảnh hưởng chỉ mục",
|
549 |
+
"save_resample": "Lưu lấy mẫu lại",
|
550 |
+
"save_filter": "Lưu trung vị",
|
551 |
+
"save_envelope": "Lưu đường bao âm",
|
552 |
+
"save_protect": "Lưu bảo vệ âm",
|
553 |
+
"save_split": "Lưu cắt âm",
|
554 |
+
"filename_to_save": "Tên khi lưu tệp",
|
555 |
+
"upload_presets": "Tải lên tệp cài đặt",
|
556 |
+
"stop": "Dừng tiến trình",
|
557 |
+
"stop_separate": "Dừng Tách Nhạc",
|
558 |
+
"stop_convert": "Dừng Chuyển Đổi",
|
559 |
+
"stop_create_dataset": "Dừng Tạo Dữ Liệu",
|
560 |
+
"stop_training": "Dừng Huấn Luyện",
|
561 |
+
"stop_preprocess": "Dừng Xử Lí Dữ Liệu",
|
562 |
+
"stop_extract": "Dừng Trích Xuất Dữ Liệu",
|
563 |
+
"not_found_presets": "Không tìm thấy tệp cài đặt sẳn nào trong thư mục!",
|
564 |
+
"port": "Cổng {port} không thể dùng! Giảm cổng xuống một...",
|
565 |
+
"empty_json": "{file}: Bị lỗi hoặc trống",
|
566 |
+
"thank": "Cảm ơn bạn đã báo cáo lỗi và cũng xin lỗi bạn vì sự bất tiện do lỗi gây ra này!",
|
567 |
+
"error_read_log": "Đã xảy ra lỗi khi đọc các tệp nhật ký!",
|
568 |
+
"error_send": "Đã xảy ra lỗi khi gửi báo cáo! Hãy liên hệ tôi qua Discord: pham_huynh_anh!",
|
569 |
+
"report_bugs": "Báo Cáo Lỗi",
|
570 |
+
"agree_log": "Đồng ý cung cấp tất cả tệp nhật ký",
|
571 |
+
"error_info": "Mô tả lỗi",
|
572 |
+
"error_info_2": "Cung cấp thêm thông tin về lỗi",
|
573 |
+
"report_bug_info": "Báo cáo các lỗi xảy ra khi sử dụng chương trình",
|
574 |
+
"sr_info": "LƯU Ý: MỘT SỐ ĐỊNH DẠNG KHÔNG HỖ TRỢ TRÊN 48000",
|
575 |
+
"report_info": "Nếu được bạn hãy đồng ý cung cấp các tệp nhật ký để hỗ trợ quá trình sửa lỗi\n\nNếu không cung cấp các tệp nhật ký bạn hãy mô tả chi tiết lỗi, lỗi xảy ra khi nào ở đâu\n\nNếu hệ thống báo cáo này bị lỗi nốt thì bạn có thể liên hệ qua [ISSUE]({github}) hoặc discord: `pham_huynh_anh`",
|
576 |
+
"default_setting": "Đã xảy ra lỗi khi sử dụng tách, đặt tất cả cài đặt về mặc định...",
|
577 |
+
"dataset_folder1": "Vui lòng nhập tên thư mục dữ liệu",
|
578 |
+
"checkpointing_err": "Các tham số của mô hình đào tạo trước như tốc độ mẫu hoặc kiến trúc không khớp với mô hình đã chọn.",
|
579 |
+
"start_onnx_export": "Bắt đầu chuyển đổi mô hình sang dạng onnx...",
|
580 |
+
"convert_model": "Chuyển Đổi Mô Hình",
|
581 |
+
"pytorch2onnx": "Chuyển Đổi Mô Hình PYTORCH Sang ONNX",
|
582 |
+
"pytorch2onnx_markdown": "Chuyển đổi mô hình RVC từ dạng pytorch sang onnx để tối ưu cho việc chuyển đổi âm thanh",
|
583 |
+
"error_readfile": "Đã xảy ra lỗi khi đọc tệp!",
|
584 |
+
"f0_onnx_mode": "Chế độ F0 ONNX",
|
585 |
+
"f0_onnx_mode_info": "Trích xuất cao độ bằng mô hình ONNX có thể giúp tăng tốc độ",
|
586 |
+
"formantshift": "Dịch chuyển cao độ và âm sắc",
|
587 |
+
"formant_qfrency": "Tần số cho dịch chuyển định dạng",
|
588 |
+
"formant_timbre": "Âm sắc để chuyển đổi định dạng",
|
589 |
+
"time_frames": "Thời Gian (Khung)",
|
590 |
+
"Frequency": "Tần Số (Hz)",
|
591 |
+
"f0_extractor_tab": "Trích xuất F0",
|
592 |
+
"f0_extractor_markdown": "## Trích Xuất Cao Độ",
|
593 |
+
"f0_extractor_markdown_2": "Trích xuất cao độ F0 nhằm mục đích sử dụng cho suy luận chuyển đổi âm thanh",
|
594 |
+
"start_extract": "Bắt đầu quá trình trích xuất...",
|
595 |
+
"extract_done": "Hoàn tất quá trình trích xuất!",
|
596 |
+
"f0_file": "Sử dụng tệp F0 trích xuất trước",
|
597 |
+
"upload_f0": "Tải lên tệp F0",
|
598 |
+
"f0_file_2": "Tệp F0",
|
599 |
+
"clean_f0_file": "Dọp dẹp tệp F0",
|
600 |
+
"embed_mode": "Chế độ nhúng",
|
601 |
+
"embed_mode_info": "Trích xuất nhúng bằng các mô hình khác nhau",
|
602 |
+
"close": "Ứng dụng đang tắt...",
|
603 |
+
"start_whisper": "Bắt đầu nhận dạng giọng nói bằng Whisper...",
|
604 |
+
"whisper_done": "Đã nhận dạng giọng nói hoàn tất!",
|
605 |
+
"process_audio": "Xử lí trước âm thanh...",
|
606 |
+
"process_done_start_convert": "Hoàn tất xử lí âm thanh! tiến hành chuyển đổi âm thanh...",
|
607 |
+
"convert_with_whisper": "Chuyển Đổi Âm Thanh Với Whisper",
|
608 |
+
"convert_with_whisper_info": "Chuyển đổi âm thanh bằng mô hình giọng nói đã được huấn luyện kèm với mô hình Whisper để nhận diện giọng nói\n\nWhisper sẽ nhận dạng các giọng nói khác nhau sau đó cắt các giọng riêng ra rồi dùng mô hình RVC để chuyển đổi lại các phân đoạn đó\n\nMô hình Whisper có thể hoạt động không chính xác làm cho đầu ra có thể kì lạ",
|
609 |
+
"num_spk": "Số lượng giọng",
|
610 |
+
"num_spk_info": "Số lượng giọng nói có trong âm thanh",
|
611 |
+
"model_size": "Kích thước mô hình Whisper",
|
612 |
+
"model_size_info": "Kích thước mô hình Whisper\n\nCác mô hình large có thể đưa ra các đầu ra kì lạ",
|
613 |
+
"title": "Công cụ huấn luyện, chuyển đổi nhạc cụ và giọng nói chất lượng và hiệu suất cao đơn giản dành cho người Việt",
|
614 |
+
"fp16_not_support": "CPU, MPS và OCL Không hỗ trợ tốt fp16, chuyển đổi fp16 -> fp32",
|
615 |
+
"precision": "Độ chính xác",
|
616 |
+
"precision_info": "Độ chính xác của suy luận và huấn luyện mô hình\n\nLưu ý: CPU Không hỗ trợ fp16",
|
617 |
+
"update_precision": "Cập Nhật Độ Chính Xác",
|
618 |
+
"start_update_precision": "Bắt đầu cập nhật độ chính xác",
|
619 |
+
"deterministic": "Thuật toán xác định",
|
620 |
+
"deterministic_info": "Khi bật sẽ sử dụng các thuật toán có tính xác định cao, đảm bảo rằng mỗi lần chạy cùng một dữ liệu đầu vào sẽ cho kết quả giống nhau.\n\nKhi tắt có thể chọn các thuật toán tối ưu hơn nhưng có thể không hoàn toàn xác định, dẫn đến kết quả huấn luyện có sự khác biệt giữa các lần chạy.",
|
621 |
+
"benchmark": "Thuật toán điểm chuẩn",
|
622 |
+
"benchmark_info": "Khi bật sẽ thử nghiệm và chọn thuật toán tối ưu nhất cho phần cứng và kích thước cụ thể. Điều này có thể giúp tăng tốc độ huấn luyện.\n\nKhi tắt sẽ không thực hiện tối ưu thuật toán này, có thể làm giảm tốc độ nhưng đảm bảo rằng mỗi lần chạy sử dụng cùng một thuật toán, điều này hữu ích nếu bạn muốn tái tạo chính xác.",
|
623 |
+
"font": "Phông chữ",
|
624 |
+
"font_info": "Phông chữ của giao diện\n\nTruy cập vào [Google Font](https://fonts.google.com) để lựa phông yêu thích của bạn.",
|
625 |
+
"change_font": "Đổi Phông Chữ",
|
626 |
+
"f0_unlock": "Mở khóa tất cả",
|
627 |
+
"f0_unlock_info": "Mở khóa toàn bộ phương pháp trích xuất cao độ",
|
628 |
+
"srt": "Tệp SRT trống hoặc bị lỗi!",
|
629 |
+
"optimizer": "Trình Tối Ưu Hóa",
|
630 |
+
"optimizer_info": "Trình tối ưu hóa trong huấn luyện, AdamW là mặc định, RAdam là một trình tối ưu khác",
|
631 |
+
"main_volume": "Âm lượng tệp âm thanh chính",
|
632 |
+
"main_volume_info": "Âm lượng tệp âm thanh chính. Nên để từ -4 đến 0.",
|
633 |
+
"combination_volume": "Âm lượng tệp âm thanh kết hợp",
|
634 |
+
"combination_volume_info": "Âm lượng tệp âm thanh kết hợp. Nên để âm lượng của tệp kết hợp nhỏ hơn âm thanh chính.",
|
635 |
+
"inference": "Suy Luận",
|
636 |
+
"extra": "Thêm",
|
637 |
+
"running_local_url": "Giao Diện Đang Chạy Trên Liên Kết Cục Bộ",
|
638 |
+
"running_share_url": "Giao Diện Đang Chạy Trên Liên Kết Công Khai",
|
639 |
+
"translate": "Dịch",
|
640 |
+
"source_lang": "Ngôn ngữ đầu vào",
|
641 |
+
"target_lang": "Ngôn ngữ đầu ra",
|
642 |
+
"prompt_warning": "Vui lòng nhập văn bản để tiến hành dịch!",
|
643 |
+
"read_error": "Quá trình đọc tệp văn bản xảy ra lỗi!",
|
644 |
+
"quirk": "Hiệu Ứng Kỳ Quặc",
|
645 |
+
"quirk_info": "## Những Hiệu Ứng Kỳ Quặc Dành Cho Âm Thanh",
|
646 |
+
"quirk_label": "Các hiệu ứng kỳ quặc",
|
647 |
+
"quirk_label_info": "Các hiệu ứng kỳ quặc có thể sử dụng để áp dụng vào âm thanh",
|
648 |
+
"quirk_markdown": "Áp dụng những hiệu ứng kỳ quặc cho âm thanh của bạn để chúng chở nên kỳ quặc dị dạng.",
|
649 |
+
"gradio_start": "Giao diện đã tải thành công sau",
|
650 |
+
"quirk_choice": {"Ngẫu Nhiên": 0, "Vỡ Âm": 1, "Kinh Dị": 2, "Người Máy": 3, "Em bé": 4, "Trầm": 5, "Giật Giọng": 6, "Người Già": 7, "Vọng Âm": 8, "Quỷ Dữ": 9, "Méo Giọng": 10, "Bán Hàng Trực Tuyến": 11, "Kéo Lê": 12, "Khó Chịu": 13, "Rè": 14, "Lỗi Mạng": 15, "Rối Loạn": 16},
|
651 |
+
"proposal_pitch": "Tự động đề xuất cao độ",
|
652 |
+
"hybrid_calc": "Tính toán Hybrid cho phương thức: {f0_method}...",
|
653 |
+
"proposal_f0": "Đã đề xuất cao độ: {up_key}",
|
654 |
+
"startautotune": "Bắt đầu tự động điều chỉnh cao độ...",
|
655 |
+
"proposal_pitch_threshold": "Tần số ước tính cao độ",
|
656 |
+
"proposal_pitch_threshold_info": "Tần số ước tính cao độ, đối với mô hình nam sử dụng ở mức 155.0 và mô hình nữ với mức 255.0",
|
657 |
+
"rms_start_extract": "Bắt đầu trích xuất năng lượng âm thanh với {num_processes} lõi...",
|
658 |
+
"rms_success_extract": "Quá trình trích xuất năng lượng đã hoàn tất vào {elapsed_time} giây.",
|
659 |
+
"train&energy": "Huấn luyện năng lượng",
|
660 |
+
"train&energy_info": "Huấn luyện mô hình với năng lượng RMS",
|
661 |
+
"editing": "Chỉnh Sửa",
|
662 |
+
"check_assets_error": "Tải xuống tài nguyên thất bại {count} lần liên tiếp! hãy tải xuống thủ công và đặt vào thư mục tài nguyên: https://huggingface.co/AnhP/Vietnamese-RVC-Project"
|
663 |
+
}
|
assets/logs/mute/energy/mute.wav.npy
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:9d91e585d3f05aec8ae6c3d3143501154baa77c5d540ec376b27a14397bbba13
|
3 |
+
size 1332
|
assets/logs/mute/f0/mute.wav.npy
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:9b9acf9ab7facdb032e1d687fe35182670b0b94566c4b209ae48c239d19956a6
|
3 |
+
size 1332
|
assets/logs/mute/f0_voiced/mute.wav.npy
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:30792849c8e72d67e6691754077f2888b101cb741e9c7f193c91dd9692870c87
|
3 |
+
size 2536
|
assets/logs/mute/sliced_audios/mute32000.wav
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:9edcf85ec77e88bd01edf3d887bdc418d3596d573f7ad2694da546f41dae6baf
|
3 |
+
size 192078
|
assets/logs/mute/sliced_audios/mute40000.wav
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:67a816e77b50cb9f016e49e5c01f07e080c4e3b82b7a8ac3e64bcb143f90f31b
|
3 |
+
size 240078
|
assets/logs/mute/sliced_audios/mute48000.wav
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:2f2bb4daaa106e351aebb001e5a25de985c0b472f22e8d60676bc924a79056ee
|
3 |
+
size 288078
|
assets/logs/mute/sliced_audios_16k/mute.wav
ADDED
Binary file (96.1 kB). View file
|
|
assets/logs/mute/v1_extracted/mute.npy
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:64d5abbac078e19a3f649c0d78a02cb33a71407ded3ddf2db78e6b803d0c0126
|
3 |
+
size 152704
|
assets/logs/mute/v1_extracted/mute_chinese.npy
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:2be76c020ad3e6702eeb53fff2198b52662992cf04ab0e56da1cd8a5329f701d
|
3 |
+
size 152704
|
assets/logs/mute/v1_extracted/mute_japanese.npy
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:d34ecf8faaa25f0f1fd861560b9cef42b58554839b250d4ab7ec85e94821ef80
|
3 |
+
size 152704
|
assets/logs/mute/v1_extracted/mute_korean.npy
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:cddd2e78b0f95103d411edffebcba1336e7ec9d86b80cab511724630a7dba775
|
3 |
+
size 152704
|
assets/logs/mute/v1_extracted/mute_portuguese.npy
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:47fc86ed03de0ef68ee82e37196d8aa00f8d295531f2348aa3d51456301a0f2c
|
3 |
+
size 152704
|
assets/logs/mute/v1_extracted/mute_spin.npy
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:8ec393080466213b7eaa951526d632b92b4d3f9adc3f208bee6d8364fcc0ad0b
|
3 |
+
size 152704
|
assets/logs/mute/v1_extracted/mute_vietnamese.npy
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:fd3349e8ac6a75175cda8dd47c1a22d6aaeeb3af4cf7c7508285bbfa079fbae8
|
3 |
+
size 152704
|
assets/logs/mute/v2_extracted/mute.npy
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:16ef62b957887ac9f0913aa5158f18983afff1ef5a3e4c5fd067ac20fc380d54
|
3 |
+
size 457856
|
assets/logs/mute/v2_extracted/mute_chinese.npy
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:493a057ea2d32cf9b66ec65c92d59b412084e24837900158e33ee6349285ff7f
|
3 |
+
size 457856
|
assets/logs/mute/v2_extracted/mute_japanese.npy
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:e72bd4d0a0be6a5435222d72bd754e87e53a9883c8f7e990fe903f8e1c5c3cdf
|
3 |
+
size 457856
|
assets/logs/mute/v2_extracted/mute_korean.npy
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:e5259ee6ce3732527d6b2ad206c4178d15950ae41e6690f2620cb6b0e138ff13
|
3 |
+
size 457856
|
assets/logs/mute/v2_extracted/mute_portuguese.npy
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:4f6bd1ab41558b0b15d9a15a52dccb776b4d03ccd0a934aa8c0efa1e0f14129b
|
3 |
+
size 457856
|
assets/logs/mute/v2_extracted/mute_spin.npy
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:997d1ba7055e5567344fe2dbf34be29dd5de70a66cf1cfc32ff98326f957618d
|
3 |
+
size 457856
|
assets/logs/mute/v2_extracted/mute_vietnamese.npy
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:3a2798cac1618dea9151a2620f4e6e05a0274db74889377bd3c44d27784200e7
|
3 |
+
size 457856
|
assets/models/embedders/.gitattributes
ADDED
File without changes
|
assets/models/predictors/.gitattributes
ADDED
File without changes
|
assets/models/pretrained_custom/.gitattributes
ADDED
File without changes
|
assets/models/pretrained_v1/.gitattributes
ADDED
File without changes
|
assets/models/pretrained_v2/.gitattributes
ADDED
File without changes
|
assets/models/speaker_diarization/assets/gpt2.tiktoken
ADDED
The diff for this file is too large to render.
See raw diff
|
|
assets/models/speaker_diarization/assets/mel_filters.npz
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:7450ae70723a5ef9d341e3cee628c7cb0177f36ce42c44b7ed2bf3325f0f6d4c
|
3 |
+
size 4271
|
assets/models/speaker_diarization/assets/multilingual.tiktoken
ADDED
The diff for this file is too large to render.
See raw diff
|
|
assets/models/speaker_diarization/models/.gitattributes
ADDED
File without changes
|
assets/models/uvr5/.gitattributes
ADDED
File without changes
|
assets/presets/.gitattributes
ADDED
File without changes
|
assets/weights/.gitattributes
ADDED
File without changes
|
audios/.gitattributes
ADDED
File without changes
|
dataset/.gitattributes
ADDED
File without changes
|
main/app/app.py
ADDED
@@ -0,0 +1,87 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import os
|
2 |
+
import io
|
3 |
+
import ssl
|
4 |
+
import sys
|
5 |
+
import time
|
6 |
+
import codecs
|
7 |
+
import logging
|
8 |
+
import warnings
|
9 |
+
|
10 |
+
import gradio as gr
|
11 |
+
|
12 |
+
sys.path.append(os.getcwd())
|
13 |
+
start_time = time.time()
|
14 |
+
|
15 |
+
from main.app.tabs.extra.extra import extra_tab
|
16 |
+
from main.app.tabs.editing.editing import editing_tab
|
17 |
+
from main.app.tabs.training.training import training_tab
|
18 |
+
from main.app.tabs.downloads.downloads import download_tab
|
19 |
+
from main.app.tabs.inference.inference import inference_tab
|
20 |
+
from main.app.variables import logger, config, translations, theme, font, configs, language, allow_disk
|
21 |
+
|
22 |
+
ssl._create_default_https_context = ssl._create_unverified_context
|
23 |
+
|
24 |
+
warnings.filterwarnings("ignore")
|
25 |
+
for l in ["httpx", "gradio", "uvicorn", "httpcore", "urllib3"]:
|
26 |
+
logging.getLogger(l).setLevel(logging.ERROR)
|
27 |
+
|
28 |
+
with gr.Blocks(title="📱 Vietnamese-RVC GUI BY ANH", theme=theme, css="<style> @import url('{fonts}'); * {{font-family: 'Courgette', cursive !important;}} body, html {{font-family: 'Courgette', cursive !important;}} h1, h2, h3, h4, h5, h6, p, button, input, textarea, label, span, div, select {{font-family: 'Courgette', cursive !important;}} </style>".format(fonts=font or "https://fonts.googleapis.com/css2?family=Courgette&display=swap")) as app:
|
29 |
+
gr.HTML("<h1 style='text-align: center;'>🎵VIETNAMESE RVC BY ANH🎵</h1>")
|
30 |
+
gr.HTML(f"<h3 style='text-align: center;'>{translations['title']}</h3>")
|
31 |
+
|
32 |
+
with gr.Tabs():
|
33 |
+
inference_tab()
|
34 |
+
editing_tab()
|
35 |
+
training_tab()
|
36 |
+
download_tab()
|
37 |
+
extra_tab(app)
|
38 |
+
|
39 |
+
with gr.Row():
|
40 |
+
gr.Markdown(translations["rick_roll"].format(rickroll=codecs.decode('uggcf://jjj.lbhghor.pbz/jngpu?i=qDj4j9JtKpD', 'rot13')))
|
41 |
+
|
42 |
+
with gr.Row():
|
43 |
+
gr.Markdown(translations["terms_of_use"])
|
44 |
+
|
45 |
+
with gr.Row():
|
46 |
+
gr.Markdown(translations["exemption"])
|
47 |
+
|
48 |
+
logger.info(config.device)
|
49 |
+
logger.info(translations["start_app"])
|
50 |
+
logger.info(translations["set_lang"].format(lang=language))
|
51 |
+
|
52 |
+
port = configs.get("app_port", 7860)
|
53 |
+
server_name = configs.get("server_name", "0.0.0.0")
|
54 |
+
share = "--share" in sys.argv
|
55 |
+
|
56 |
+
original_stdout = sys.stdout
|
57 |
+
sys.stdout = io.StringIO()
|
58 |
+
|
59 |
+
for i in range(configs.get("num_of_restart", 5)):
|
60 |
+
try:
|
61 |
+
_, _, share_url = app.queue().launch(
|
62 |
+
favicon_path=configs["ico_path"],
|
63 |
+
server_name=server_name,
|
64 |
+
server_port=port,
|
65 |
+
show_error=configs.get("app_show_error", False),
|
66 |
+
inbrowser="--open" in sys.argv,
|
67 |
+
share=share,
|
68 |
+
allowed_paths=allow_disk,
|
69 |
+
prevent_thread_lock=True,
|
70 |
+
quiet=True
|
71 |
+
)
|
72 |
+
break
|
73 |
+
except OSError:
|
74 |
+
logger.debug(translations["port"].format(port=port))
|
75 |
+
port -= 1
|
76 |
+
except Exception as e:
|
77 |
+
logger.error(translations["error_occurred"].format(e=e))
|
78 |
+
sys.exit(1)
|
79 |
+
|
80 |
+
sys.stdout = original_stdout
|
81 |
+
logger.info(f"{translations['running_local_url']}: {server_name}:{port}")
|
82 |
+
|
83 |
+
if share: logger.info(f"{translations['running_share_url']}: {share_url}")
|
84 |
+
logger.info(f"{translations['gradio_start']}: {(time.time() - start_time):.2f}s")
|
85 |
+
|
86 |
+
while 1:
|
87 |
+
time.sleep(5)
|
main/app/core/downloads.py
ADDED
@@ -0,0 +1,187 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import os
|
2 |
+
import re
|
3 |
+
import sys
|
4 |
+
import json
|
5 |
+
import codecs
|
6 |
+
import shutil
|
7 |
+
import yt_dlp
|
8 |
+
import warnings
|
9 |
+
import requests
|
10 |
+
|
11 |
+
from bs4 import BeautifulSoup
|
12 |
+
|
13 |
+
sys.path.append(os.getcwd())
|
14 |
+
|
15 |
+
from main.tools import huggingface, gdown, meganz, mediafire, pixeldrain
|
16 |
+
from main.app.core.ui import gr_info, gr_warning, gr_error, process_output
|
17 |
+
from main.app.variables import logger, translations, model_options, configs
|
18 |
+
from main.app.core.process import move_files_from_directory, fetch_pretrained_data, extract_name_model
|
19 |
+
|
20 |
+
def download_url(url):
|
21 |
+
if not url: return gr_warning(translations["provide_url"])
|
22 |
+
if not os.path.exists(configs["audios_path"]): os.makedirs(configs["audios_path"], exist_ok=True)
|
23 |
+
|
24 |
+
with warnings.catch_warnings():
|
25 |
+
warnings.filterwarnings("ignore")
|
26 |
+
ydl_opts = {
|
27 |
+
"format": "bestaudio/best",
|
28 |
+
"postprocessors": [{
|
29 |
+
"key": "FFmpegExtractAudio",
|
30 |
+
"preferredcodec": "wav",
|
31 |
+
"preferredquality": "192"
|
32 |
+
}],
|
33 |
+
"quiet": True,
|
34 |
+
"no_warnings": True,
|
35 |
+
"noplaylist": True,
|
36 |
+
"verbose": False
|
37 |
+
}
|
38 |
+
|
39 |
+
gr_info(translations["start"].format(start=translations["download_music"]))
|
40 |
+
|
41 |
+
with yt_dlp.YoutubeDL(ydl_opts) as ydl:
|
42 |
+
audio_output = os.path.join(configs["audios_path"], re.sub(r'\s+', '-', re.sub(r'[^\w\s\u4e00-\u9fff\uac00-\ud7af\u0400-\u04FF\u1100-\u11FF]', '', ydl.extract_info(url, download=False).get('title', 'video')).strip()))
|
43 |
+
if os.path.exists(audio_output): shutil.rmtree(audio_output, ignore_errors=True)
|
44 |
+
|
45 |
+
ydl_opts['outtmpl'] = audio_output
|
46 |
+
|
47 |
+
with yt_dlp.YoutubeDL(ydl_opts) as ydl:
|
48 |
+
audio_output = process_output(audio_output + ".wav")
|
49 |
+
|
50 |
+
ydl.download([url])
|
51 |
+
|
52 |
+
gr_info(translations["success"])
|
53 |
+
return [audio_output, audio_output, translations["success"]]
|
54 |
+
|
55 |
+
def move_file(file, download_dir, model):
|
56 |
+
weights_dir = configs["weights_path"]
|
57 |
+
logs_dir = configs["logs_path"]
|
58 |
+
|
59 |
+
if not os.path.exists(weights_dir): os.makedirs(weights_dir, exist_ok=True)
|
60 |
+
if not os.path.exists(logs_dir): os.makedirs(logs_dir, exist_ok=True)
|
61 |
+
|
62 |
+
if file.endswith(".zip"): shutil.unpack_archive(file, download_dir)
|
63 |
+
move_files_from_directory(download_dir, weights_dir, logs_dir, model)
|
64 |
+
|
65 |
+
def download_model(url=None, model=None):
|
66 |
+
if not url: return gr_warning(translations["provide_url"])
|
67 |
+
|
68 |
+
url = url.replace("/blob/", "/resolve/").replace("?download=true", "").strip()
|
69 |
+
download_dir = "download_model"
|
70 |
+
|
71 |
+
os.makedirs(download_dir, exist_ok=True)
|
72 |
+
|
73 |
+
try:
|
74 |
+
gr_info(translations["start"].format(start=translations["download"]))
|
75 |
+
|
76 |
+
if "huggingface.co" in url: file = huggingface.HF_download_file(url, download_dir)
|
77 |
+
elif "google.com" in url: file = gdown.gdown_download(url, download_dir)
|
78 |
+
elif "mediafire.com" in url: file = mediafire.Mediafire_Download(url, download_dir)
|
79 |
+
elif "pixeldrain.com" in url: file = pixeldrain.pixeldrain(url, download_dir)
|
80 |
+
elif "mega.nz" in url: file = meganz.mega_download_url(url, download_dir)
|
81 |
+
else:
|
82 |
+
gr_warning(translations["not_support_url"])
|
83 |
+
return translations["not_support_url"]
|
84 |
+
|
85 |
+
if not model:
|
86 |
+
modelname = os.path.basename(file)
|
87 |
+
model = extract_name_model(modelname) if modelname.endswith(".index") else os.path.splitext(modelname)[0]
|
88 |
+
if model is None: model = os.path.splitext(modelname)[0]
|
89 |
+
|
90 |
+
model = model.replace(".onnx", "").replace(".pth", "").replace(".index", "").replace(".zip", "").replace(" ", "_").replace("(", "").replace(")", "").replace("[", "").replace("]", "").replace("{", "").replace("}", "").replace(",", "").replace('"', "").replace("'", "").replace("|", "").strip()
|
91 |
+
|
92 |
+
move_file(file, download_dir, model)
|
93 |
+
gr_info(translations["success"])
|
94 |
+
|
95 |
+
return translations["success"]
|
96 |
+
except Exception as e:
|
97 |
+
gr_error(message=translations["error_occurred"].format(e=e))
|
98 |
+
return translations["error_occurred"].format(e=e)
|
99 |
+
finally:
|
100 |
+
shutil.rmtree(download_dir, ignore_errors=True)
|
101 |
+
|
102 |
+
def download_pretrained_model(choices, model, sample_rate):
|
103 |
+
pretraineds_custom_path = configs["pretrained_custom_path"]
|
104 |
+
|
105 |
+
if choices == translations["list_model"]:
|
106 |
+
paths = fetch_pretrained_data()[model][sample_rate]
|
107 |
+
|
108 |
+
if not os.path.exists(pretraineds_custom_path): os.makedirs(pretraineds_custom_path, exist_ok=True)
|
109 |
+
url = codecs.decode("uggcf://uhttvatsnpr.pb/NauC/Ivrganzrfr-EIP-Cebwrpg/erfbyir/znva/cergenvarq_phfgbz/", "rot13") + paths
|
110 |
+
|
111 |
+
gr_info(translations["download_pretrain"])
|
112 |
+
file = huggingface.HF_download_file(url.replace("/blob/", "/resolve/").replace("?download=true", "").strip(), os.path.join(pretraineds_custom_path, paths))
|
113 |
+
|
114 |
+
if file.endswith(".zip"):
|
115 |
+
shutil.unpack_archive(file, pretraineds_custom_path)
|
116 |
+
os.remove(file)
|
117 |
+
|
118 |
+
gr_info(translations["success"])
|
119 |
+
return translations["success"], None
|
120 |
+
elif choices == translations["download_url"]:
|
121 |
+
if not model: return gr_warning(translations["provide_pretrain"].format(dg="D"))
|
122 |
+
if not sample_rate: return gr_warning(translations["provide_pretrain"].format(dg="G"))
|
123 |
+
|
124 |
+
gr_info(translations["download_pretrain"])
|
125 |
+
|
126 |
+
for url in [model, sample_rate]:
|
127 |
+
url = url.replace("/blob/", "/resolve/").replace("?download=true", "").strip()
|
128 |
+
|
129 |
+
if "huggingface.co" in url: huggingface.HF_download_file(url, pretraineds_custom_path)
|
130 |
+
elif "google.com" in url: gdown.gdown_download(url, pretraineds_custom_path)
|
131 |
+
elif "mediafire.com" in url: mediafire.Mediafire_Download(url, pretraineds_custom_path)
|
132 |
+
elif "pixeldrain.com" in url: pixeldrain.pixeldrain(url, pretraineds_custom_path)
|
133 |
+
elif "mega.nz" in url: meganz.mega_download_url(url, pretraineds_custom_path)
|
134 |
+
else:
|
135 |
+
gr_warning(translations["not_support_url"])
|
136 |
+
return translations["not_support_url"], translations["not_support_url"]
|
137 |
+
|
138 |
+
gr_info(translations["success"])
|
139 |
+
return translations["success"], translations["success"]
|
140 |
+
|
141 |
+
def fetch_models_data(search):
|
142 |
+
all_table_data = []
|
143 |
+
page = 1
|
144 |
+
|
145 |
+
while 1:
|
146 |
+
try:
|
147 |
+
response = requests.post(url=codecs.decode("uggcf://ibvpr-zbqryf.pbz/srgpu_qngn.cuc", "rot13"), data={"page": page, "search": search})
|
148 |
+
|
149 |
+
if response.status_code == 200:
|
150 |
+
table_data = response.json().get("table", "")
|
151 |
+
if not table_data.strip(): break
|
152 |
+
|
153 |
+
all_table_data.append(table_data)
|
154 |
+
page += 1
|
155 |
+
else:
|
156 |
+
logger.debug(f"{translations['code_error']} {response.status_code}")
|
157 |
+
break
|
158 |
+
except json.JSONDecodeError:
|
159 |
+
logger.debug(translations["json_error"])
|
160 |
+
break
|
161 |
+
except requests.RequestException as e:
|
162 |
+
logger.debug(translations["requests_error"].format(e=e))
|
163 |
+
break
|
164 |
+
|
165 |
+
return all_table_data
|
166 |
+
|
167 |
+
def search_models(name):
|
168 |
+
if not name: return gr_warning(translations["provide_name"])
|
169 |
+
gr_info(translations["start"].format(start=translations["search"]))
|
170 |
+
|
171 |
+
tables = fetch_models_data(name)
|
172 |
+
|
173 |
+
if len(tables) == 0:
|
174 |
+
gr_info(translations["not_found"].format(name=name))
|
175 |
+
return [None]*2
|
176 |
+
else:
|
177 |
+
model_options.clear()
|
178 |
+
|
179 |
+
for table in tables:
|
180 |
+
for row in BeautifulSoup(table, "html.parser").select("tr"):
|
181 |
+
name_tag, url_tag = row.find("a", {"class": "fs-5"}), row.find("a", {"class": "btn btn-sm fw-bold btn-light ms-0 p-1 ps-2 pe-2"})
|
182 |
+
url = url_tag["href"].replace("https://easyaivoice.com/run?url=", "")
|
183 |
+
if "huggingface" in url:
|
184 |
+
if name_tag and url_tag: model_options[name_tag.text.replace(".onnx", "").replace(".pth", "").replace(".index", "").replace(".zip", "").replace(" ", "_").replace("(", "").replace(")", "").replace("[", "").replace("]", "").replace(",", "").replace('"', "").replace("'", "").replace("|", "_").replace("-_-", "_").replace("_-_", "_").replace("-", "_").replace("---", "_").replace("___", "_").strip()] = url
|
185 |
+
|
186 |
+
gr_info(translations["found"].format(results=len(model_options)))
|
187 |
+
return [{"value": "", "choices": model_options, "interactive": True, "visible": True, "__type__": "update"}, {"value": translations["downloads"], "visible": True, "__type__": "update"}]
|
main/app/core/editing.py
ADDED
@@ -0,0 +1,96 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import os
|
2 |
+
import sys
|
3 |
+
import random
|
4 |
+
import librosa
|
5 |
+
import subprocess
|
6 |
+
|
7 |
+
import numpy as np
|
8 |
+
import soundfile as sf
|
9 |
+
|
10 |
+
sys.path.append(os.getcwd())
|
11 |
+
|
12 |
+
from main.app.core.ui import gr_info, gr_warning, process_output
|
13 |
+
from main.app.variables import python, translations, configs, config
|
14 |
+
|
15 |
+
def audio_effects(input_path, output_path, resample, resample_sr, chorus_depth, chorus_rate, chorus_mix, chorus_delay, chorus_feedback, distortion_drive, reverb_room_size, reverb_damping, reverb_wet_level, reverb_dry_level, reverb_width, reverb_freeze_mode, pitch_shift, delay_seconds, delay_feedback, delay_mix, compressor_threshold, compressor_ratio, compressor_attack_ms, compressor_release_ms, limiter_threshold, limiter_release, gain_db, bitcrush_bit_depth, clipping_threshold, phaser_rate_hz, phaser_depth, phaser_centre_frequency_hz, phaser_feedback, phaser_mix, bass_boost_db, bass_boost_frequency, treble_boost_db, treble_boost_frequency, fade_in_duration, fade_out_duration, export_format, chorus, distortion, reverb, delay, compressor, limiter, gain, bitcrush, clipping, phaser, treble_bass_boost, fade_in_out, audio_combination, audio_combination_input, main_vol, combine_vol):
|
16 |
+
if not input_path or not os.path.exists(input_path) or os.path.isdir(input_path):
|
17 |
+
gr_warning(translations["input_not_valid"])
|
18 |
+
return None
|
19 |
+
|
20 |
+
if not output_path:
|
21 |
+
gr_warning(translations["output_not_valid"])
|
22 |
+
return None
|
23 |
+
|
24 |
+
if os.path.isdir(output_path): output_path = os.path.join(output_path, f"audio_effects.{export_format}")
|
25 |
+
output_dir = os.path.dirname(output_path) or output_path
|
26 |
+
|
27 |
+
if not os.path.exists(output_dir): os.makedirs(output_dir, exist_ok=True)
|
28 |
+
output_path = process_output(output_path)
|
29 |
+
|
30 |
+
gr_info(translations["start"].format(start=translations["apply_effect"]))
|
31 |
+
|
32 |
+
if config.debug_mode: subprocess.run([python, configs["audio_effects_path"], "--input_path", input_path, "--output_path", output_path, "--resample", str(resample), "--resample_sr", str(resample_sr), "--chorus_depth", str(chorus_depth), "--chorus_rate", str(chorus_rate), "--chorus_mix", str(chorus_mix), "--chorus_delay", str(chorus_delay), "--chorus_feedback", str(chorus_feedback), "--drive_db", str(distortion_drive), "--reverb_room_size", str(reverb_room_size), "--reverb_damping", str(reverb_damping), "--reverb_wet_level", str(reverb_wet_level), "--reverb_dry_level", str(reverb_dry_level), "--reverb_width", str(reverb_width), "--reverb_freeze_mode", str(reverb_freeze_mode), "--pitch_shift", str(pitch_shift), "--delay_seconds", str(delay_seconds), "--delay_feedback", str(delay_feedback), "--delay_mix", str(delay_mix), "--compressor_threshold", str(compressor_threshold), "--compressor_ratio", str(compressor_ratio), "--compressor_attack_ms", str(compressor_attack_ms), "--compressor_release_ms", str(compressor_release_ms), "--limiter_threshold", str(limiter_threshold), "--limiter_release", str(limiter_release), "--gain_db", str(gain_db), "--bitcrush_bit_depth", str(bitcrush_bit_depth), "--clipping_threshold", str(clipping_threshold), "--phaser_rate_hz", str(phaser_rate_hz), "--phaser_depth", str(phaser_depth), "--phaser_centre_frequency_hz", str(phaser_centre_frequency_hz), "--phaser_feedback", str(phaser_feedback), "--phaser_mix", str(phaser_mix), "--bass_boost_db", str(bass_boost_db), "--bass_boost_frequency", str(bass_boost_frequency), "--treble_boost_db", str(treble_boost_db), "--treble_boost_frequency", str(treble_boost_frequency), "--fade_in_duration", str(fade_in_duration), "--fade_out_duration", str(fade_out_duration), "--export_format", export_format, "--chorus", str(chorus), "--distortion", str(distortion), "--reverb", str(reverb), "--pitchshift", str(pitch_shift != 0), "--delay", str(delay), "--compressor", str(compressor), "--limiter", str(limiter), "--gain", str(gain), "--bitcrush", str(bitcrush), "--clipping", str(clipping), "--phaser", str(phaser), "--treble_bass_boost", str(treble_bass_boost), "--fade_in_out", str(fade_in_out), "--audio_combination", str(audio_combination), "--audio_combination_input", audio_combination_input, "--main_volume", str(main_vol), "--combination_volume", str(combine_vol)])
|
33 |
+
else:
|
34 |
+
from main.inference.audio_effects import process_audio
|
35 |
+
|
36 |
+
process_audio(input_path, output_path, resample, resample_sr, chorus_depth, chorus_rate, chorus_mix, chorus_delay, chorus_feedback, distortion_drive, reverb_room_size, reverb_damping, reverb_wet_level, reverb_dry_level, reverb_width, reverb_freeze_mode, pitch_shift, delay_seconds, delay_feedback, delay_mix, compressor_threshold, compressor_ratio, compressor_attack_ms, compressor_release_ms, limiter_threshold, limiter_release, gain_db, bitcrush_bit_depth, clipping_threshold, phaser_rate_hz, phaser_depth, phaser_centre_frequency_hz, phaser_feedback, phaser_mix, bass_boost_db, bass_boost_frequency, treble_boost_db, treble_boost_frequency, fade_in_duration, fade_out_duration, export_format, chorus, distortion, reverb, pitch_shift != 0, delay, compressor, limiter, gain, bitcrush, clipping, phaser, treble_bass_boost, fade_in_out, audio_combination, audio_combination_input, main_vol, combine_vol)
|
37 |
+
|
38 |
+
gr_info(translations["success"])
|
39 |
+
return output_path.replace("wav", export_format)
|
40 |
+
|
41 |
+
def vibrato(y, sr, freq=5, depth=0.003):
|
42 |
+
return y[np.clip((np.arange(len(y)) + (depth * np.sin(2 * np.pi * freq * (np.arange(len(y)) / sr))) * sr).astype(int), 0, len(y) - 1)]
|
43 |
+
|
44 |
+
def apply_voice_quirk(audio_path, mode, output_path, export_format):
|
45 |
+
if not audio_path or not os.path.exists(audio_path) or os.path.isdir(audio_path):
|
46 |
+
gr_warning(translations["input_not_valid"])
|
47 |
+
return None
|
48 |
+
|
49 |
+
if not output_path:
|
50 |
+
gr_warning(translations["output_not_valid"])
|
51 |
+
return None
|
52 |
+
|
53 |
+
if os.path.isdir(output_path): output_path = os.path.join(output_path, f"audio_quirk.{export_format}")
|
54 |
+
output_dir = os.path.dirname(output_path) or output_path
|
55 |
+
|
56 |
+
if not os.path.exists(output_dir): os.makedirs(output_dir, exist_ok=True)
|
57 |
+
output_path = process_output(output_path)
|
58 |
+
|
59 |
+
gr_info(translations["start"].format(start=translations["apply_effect"]))
|
60 |
+
|
61 |
+
y, sr = librosa.load(audio_path, sr=None)
|
62 |
+
output_path = output_path.replace("wav", export_format)
|
63 |
+
|
64 |
+
mode = translations["quirk_choice"][mode]
|
65 |
+
if mode == 0: mode = random.randint(1, 16)
|
66 |
+
|
67 |
+
if mode == 1: y *= np.random.uniform(0.5, 0.8, size=len(y))
|
68 |
+
elif mode == 2: y = librosa.effects.pitch_shift(y=y + np.random.normal(0, 0.01, y.shape), sr=sr, n_steps=np.random.uniform(-1.5, -3.5))
|
69 |
+
elif mode == 3: y = librosa.effects.time_stretch(librosa.effects.pitch_shift(y=y, sr=sr, n_steps=3), rate=1.2)
|
70 |
+
elif mode == 4: y = librosa.effects.time_stretch(librosa.effects.pitch_shift(y=y, sr=sr, n_steps=8), rate=1.3)
|
71 |
+
elif mode == 5: y = librosa.effects.time_stretch(librosa.effects.pitch_shift(y=y, sr=sr, n_steps=-3), rate=0.75)
|
72 |
+
elif mode == 6: y *= np.sin(np.linspace(0, np.pi * 20, len(y))) * 0.5 + 0.5
|
73 |
+
elif mode == 7: y = librosa.effects.time_stretch(vibrato(librosa.effects.pitch_shift(y=y, sr=sr, n_steps=-4), sr, freq=3, depth=0.004), rate=0.85)
|
74 |
+
elif mode == 8: y *= 0.6 + np.pad(y, (sr // 2, 0), mode='constant')[:len(y)] * 0.4
|
75 |
+
elif mode == 9: y = librosa.effects.pitch_shift(y=y, sr=sr, n_steps=2) + np.sin(np.linspace(0, np.pi * 20, len(y))) * 0.02
|
76 |
+
elif mode == 10: y = vibrato(y, sr, freq=8, depth=0.005)
|
77 |
+
elif mode == 11: y = librosa.effects.time_stretch(librosa.effects.pitch_shift(y=y, sr=sr, n_steps=4), rate=1.25)
|
78 |
+
elif mode == 12: y = np.hstack([np.pad(f, (0, int(len(f)*0.3)), mode='edge') for f in librosa.util.frame(y, frame_length=2048, hop_length=512).T])
|
79 |
+
elif mode == 13: y = np.concatenate([y, np.sin(2 * np.pi * np.linspace(0, 1, int(0.05 * sr))) * 0.02])
|
80 |
+
elif mode == 14: y += np.random.normal(0, 0.005, len(y))
|
81 |
+
elif mode == 15:
|
82 |
+
frame = int(sr * 0.2)
|
83 |
+
chunks = [y[i:i + frame] for i in range(0, len(y), frame)]
|
84 |
+
|
85 |
+
np.random.shuffle(chunks)
|
86 |
+
y = np.concatenate(chunks)
|
87 |
+
elif mode == 16:
|
88 |
+
frame = int(sr * 0.3)
|
89 |
+
|
90 |
+
for i in range(0, len(y), frame * 2):
|
91 |
+
y[i:i+frame] = y[i:i+frame][::-1]
|
92 |
+
|
93 |
+
sf.write(output_path, y, sr, format=export_format)
|
94 |
+
gr_info(translations["success"])
|
95 |
+
|
96 |
+
return output_path
|
main/app/core/f0_extract.py
ADDED
@@ -0,0 +1,54 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import os
|
2 |
+
import sys
|
3 |
+
import librosa
|
4 |
+
|
5 |
+
import numpy as np
|
6 |
+
import matplotlib.pyplot as plt
|
7 |
+
|
8 |
+
sys.path.append(os.getcwd())
|
9 |
+
|
10 |
+
from main.library.utils import check_assets
|
11 |
+
from main.app.core.ui import gr_info, gr_warning
|
12 |
+
from main.library.predictors.Generator import Generator
|
13 |
+
from main.app.variables import config, translations, configs
|
14 |
+
|
15 |
+
def f0_extract(audio, f0_method, f0_onnx):
|
16 |
+
if not audio or not os.path.exists(audio) or os.path.isdir(audio):
|
17 |
+
gr_warning(translations["input_not_valid"])
|
18 |
+
return [None]*2
|
19 |
+
|
20 |
+
check_assets(f0_method, None, f0_onnx, None)
|
21 |
+
|
22 |
+
f0_path = os.path.join(configs["f0_path"], os.path.splitext(os.path.basename(audio))[0])
|
23 |
+
image_path = os.path.join(f0_path, "f0.png")
|
24 |
+
txt_path = os.path.join(f0_path, "f0.txt")
|
25 |
+
|
26 |
+
gr_info(translations["start_extract"])
|
27 |
+
|
28 |
+
if not os.path.exists(f0_path): os.makedirs(f0_path, exist_ok=True)
|
29 |
+
|
30 |
+
y, sr = librosa.load(audio, sr=None)
|
31 |
+
|
32 |
+
f0_generator = Generator(sr, 160, 50, 1600, is_half=config.is_half, device=config.device, f0_onnx_mode=f0_onnx, del_onnx_model=f0_onnx)
|
33 |
+
_, pitchf = f0_generator.calculator(config.x_pad, f0_method, y, 0, None, 3, False, 0, None, False)
|
34 |
+
|
35 |
+
F_temp = np.array(pitchf, dtype=np.float32)
|
36 |
+
F_temp[F_temp == 0] = np.nan
|
37 |
+
|
38 |
+
f0 = 1200 * np.log2(F_temp / librosa.midi_to_hz(0))
|
39 |
+
|
40 |
+
plt.figure(figsize=(10, 4))
|
41 |
+
plt.plot(f0)
|
42 |
+
plt.title(f0_method)
|
43 |
+
plt.xlabel(translations["time_frames"])
|
44 |
+
plt.ylabel(translations["Frequency"])
|
45 |
+
plt.savefig(image_path)
|
46 |
+
plt.close()
|
47 |
+
|
48 |
+
with open(txt_path, "w") as f:
|
49 |
+
for i, f0_value in enumerate(f0):
|
50 |
+
f.write(f"{i * sr / 160},{f0_value}\n")
|
51 |
+
|
52 |
+
gr_info(translations["extract_done"])
|
53 |
+
|
54 |
+
return [txt_path, image_path]
|
main/app/core/inference.py
ADDED
@@ -0,0 +1,387 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import os
|
2 |
+
import re
|
3 |
+
import sys
|
4 |
+
import shutil
|
5 |
+
import librosa
|
6 |
+
import datetime
|
7 |
+
import subprocess
|
8 |
+
|
9 |
+
import numpy as np
|
10 |
+
|
11 |
+
sys.path.append(os.getcwd())
|
12 |
+
|
13 |
+
from main.app.core.ui import gr_info, gr_warning, gr_error, process_output
|
14 |
+
from main.app.variables import logger, config, configs, translations, python
|
15 |
+
|
16 |
+
def convert(pitch, filter_radius, index_rate, rms_mix_rate, protect, hop_length, f0_method, input_path, output_path, pth_path, index_path, f0_autotune, clean_audio, clean_strength, export_format, embedder_model, resample_sr, split_audio, f0_autotune_strength, checkpointing, f0_onnx, embedders_mode, formant_shifting, formant_qfrency, formant_timbre, f0_file, proposal_pitch, proposal_pitch_threshold):
|
17 |
+
if config.debug_mode: subprocess.run([python, configs["convert_path"], "--pitch", str(pitch), "--filter_radius", str(filter_radius), "--index_rate", str(index_rate), "--rms_mix_rate", str(rms_mix_rate), "--protect", str(protect), "--hop_length", str(hop_length), "--f0_method", f0_method, "--input_path", input_path, "--output_path", output_path, "--pth_path", pth_path, "--index_path", index_path, "--f0_autotune", str(f0_autotune), "--clean_audio", str(clean_audio), "--clean_strength", str(clean_strength), "--export_format", export_format, "--embedder_model", embedder_model, "--resample_sr", str(resample_sr), "--split_audio", str(split_audio), "--f0_autotune_strength", str(f0_autotune_strength), "--checkpointing", str(checkpointing), "--f0_onnx", str(f0_onnx), "--embedders_mode", embedders_mode, "--formant_shifting", str(formant_shifting), "--formant_qfrency", str(formant_qfrency), "--formant_timbre", str(formant_timbre), "--f0_file", f0_file, "--proposal_pitch", str(proposal_pitch), "--proposal_pitch_threshold", str(proposal_pitch_threshold)])
|
18 |
+
else:
|
19 |
+
from main.inference.conversion.convert import run_convert_script
|
20 |
+
|
21 |
+
run_convert_script(pitch, filter_radius, index_rate, rms_mix_rate, protect, hop_length, f0_method, input_path, output_path, pth_path, index_path, f0_autotune, f0_autotune_strength, clean_audio, clean_strength, export_format, embedder_model, resample_sr, split_audio, checkpointing, f0_file, f0_onnx, embedders_mode, formant_shifting, formant_qfrency, formant_timbre, proposal_pitch, proposal_pitch_threshold)
|
22 |
+
|
23 |
+
def convert_audio(clean, autotune, use_audio, use_original, convert_backing, not_merge_backing, merge_instrument, pitch, clean_strength, model, index, index_rate, input, output, format, method, hybrid_method, hop_length, embedders, custom_embedders, resample_sr, filter_radius, rms_mix_rate, protect, split_audio, f0_autotune_strength, input_audio_name, checkpointing, onnx_f0_mode, formant_shifting, formant_qfrency, formant_timbre, f0_file, embedders_mode, proposal_pitch, proposal_pitch_threshold):
|
24 |
+
model_path = os.path.join(configs["weights_path"], model) if not os.path.exists(model) else model
|
25 |
+
|
26 |
+
return_none = [None]*6
|
27 |
+
return_none[5] = {"visible": True, "__type__": "update"}
|
28 |
+
|
29 |
+
if not use_audio:
|
30 |
+
if merge_instrument or not_merge_backing or convert_backing or use_original:
|
31 |
+
gr_warning(translations["turn_on_use_audio"])
|
32 |
+
return return_none
|
33 |
+
|
34 |
+
if use_original:
|
35 |
+
if convert_backing:
|
36 |
+
gr_warning(translations["turn_off_convert_backup"])
|
37 |
+
return return_none
|
38 |
+
elif not_merge_backing:
|
39 |
+
gr_warning(translations["turn_off_merge_backup"])
|
40 |
+
return return_none
|
41 |
+
|
42 |
+
if not model or not os.path.exists(model_path) or os.path.isdir(model_path) or not model.endswith((".pth", ".onnx")):
|
43 |
+
gr_warning(translations["provide_file"].format(filename=translations["model"]))
|
44 |
+
return return_none
|
45 |
+
|
46 |
+
f0method, embedder_model = (method if method != "hybrid" else hybrid_method), (embedders if embedders != "custom" else custom_embedders)
|
47 |
+
|
48 |
+
if use_audio:
|
49 |
+
output_audio = os.path.join(configs["audios_path"], input_audio_name)
|
50 |
+
|
51 |
+
from main.library.utils import pydub_load
|
52 |
+
|
53 |
+
def get_audio_file(label):
|
54 |
+
matching_files = [f for f in os.listdir(output_audio) if label in f]
|
55 |
+
|
56 |
+
if not matching_files: return translations["notfound"]
|
57 |
+
return os.path.join(output_audio, matching_files[0])
|
58 |
+
|
59 |
+
output_path = os.path.join(output_audio, f"Convert_Vocals.{format}")
|
60 |
+
output_backing = os.path.join(output_audio, f"Convert_Backing.{format}")
|
61 |
+
output_merge_backup = os.path.join(output_audio, f"Vocals+Backing.{format}")
|
62 |
+
output_merge_instrument = os.path.join(output_audio, f"Vocals+Instruments.{format}")
|
63 |
+
|
64 |
+
if os.path.exists(output_audio): os.makedirs(output_audio, exist_ok=True)
|
65 |
+
output_path = process_output(output_path)
|
66 |
+
|
67 |
+
if use_original:
|
68 |
+
original_vocal = get_audio_file('Original_Vocals_No_Reverb.')
|
69 |
+
|
70 |
+
if original_vocal == translations["notfound"]: original_vocal = get_audio_file('Original_Vocals.')
|
71 |
+
|
72 |
+
if original_vocal == translations["notfound"]:
|
73 |
+
gr_warning(translations["not_found_original_vocal"])
|
74 |
+
return return_none
|
75 |
+
|
76 |
+
input_path = original_vocal
|
77 |
+
else:
|
78 |
+
main_vocal = get_audio_file('Main_Vocals_No_Reverb.')
|
79 |
+
backing_vocal = get_audio_file('Backing_Vocals_No_Reverb.')
|
80 |
+
|
81 |
+
if main_vocal == translations["notfound"]: main_vocal = get_audio_file('Main_Vocals.')
|
82 |
+
if not not_merge_backing and backing_vocal == translations["notfound"]: backing_vocal = get_audio_file('Backing_Vocals.')
|
83 |
+
|
84 |
+
if main_vocal == translations["notfound"]:
|
85 |
+
gr_warning(translations["not_found_main_vocal"])
|
86 |
+
return return_none
|
87 |
+
|
88 |
+
if not not_merge_backing and backing_vocal == translations["notfound"]:
|
89 |
+
gr_warning(translations["not_found_backing_vocal"])
|
90 |
+
return return_none
|
91 |
+
|
92 |
+
input_path = main_vocal
|
93 |
+
backing_path = backing_vocal
|
94 |
+
|
95 |
+
gr_info(translations["convert_vocal"])
|
96 |
+
|
97 |
+
convert(pitch, filter_radius, index_rate, rms_mix_rate, protect, hop_length, f0method, input_path, output_path, model_path, index, autotune, clean, clean_strength, format, embedder_model, resample_sr, split_audio, f0_autotune_strength, checkpointing, onnx_f0_mode, embedders_mode, formant_shifting, formant_qfrency, formant_timbre, f0_file, proposal_pitch, proposal_pitch_threshold)
|
98 |
+
|
99 |
+
gr_info(translations["convert_success"])
|
100 |
+
|
101 |
+
if convert_backing:
|
102 |
+
output_backing = process_output(output_backing)
|
103 |
+
|
104 |
+
gr_info(translations["convert_backup"])
|
105 |
+
|
106 |
+
convert(pitch, filter_radius, index_rate, rms_mix_rate, protect, hop_length, f0method, backing_path, output_backing, model_path, index, autotune, clean, clean_strength, format, embedder_model, resample_sr, split_audio, f0_autotune_strength, checkpointing, onnx_f0_mode, embedders_mode, formant_shifting, formant_qfrency, formant_timbre, f0_file, proposal_pitch, proposal_pitch_threshold)
|
107 |
+
|
108 |
+
gr_info(translations["convert_backup_success"])
|
109 |
+
|
110 |
+
try:
|
111 |
+
if not not_merge_backing and not use_original:
|
112 |
+
backing_source = output_backing if convert_backing else backing_vocal
|
113 |
+
|
114 |
+
output_merge_backup = process_output(output_merge_backup)
|
115 |
+
|
116 |
+
gr_info(translations["merge_backup"])
|
117 |
+
|
118 |
+
pydub_load(output_path, volume=-4).overlay(pydub_load(backing_source, volume=-6)).export(output_merge_backup, format=format)
|
119 |
+
|
120 |
+
gr_info(translations["merge_success"])
|
121 |
+
|
122 |
+
if merge_instrument:
|
123 |
+
vocals = output_merge_backup if not not_merge_backing and not use_original else output_path
|
124 |
+
|
125 |
+
output_merge_instrument = process_output(output_merge_instrument)
|
126 |
+
|
127 |
+
gr_info(translations["merge_instruments_process"])
|
128 |
+
|
129 |
+
instruments = get_audio_file('Instruments.')
|
130 |
+
|
131 |
+
if instruments == translations["notfound"]:
|
132 |
+
gr_warning(translations["not_found_instruments"])
|
133 |
+
output_merge_instrument = None
|
134 |
+
else: pydub_load(instruments, volume=-7).overlay(pydub_load(vocals, volume=-4 if use_original else None)).export(output_merge_instrument, format=format)
|
135 |
+
|
136 |
+
gr_info(translations["merge_success"])
|
137 |
+
except:
|
138 |
+
return return_none
|
139 |
+
|
140 |
+
return [(None if use_original else output_path), output_backing, (None if not_merge_backing and use_original else output_merge_backup), (output_path if use_original else None), (output_merge_instrument if merge_instrument else None), {"visible": True, "__type__": "update"}]
|
141 |
+
else:
|
142 |
+
if not input or not os.path.exists(input) or os.path.isdir(input):
|
143 |
+
gr_warning(translations["input_not_valid"])
|
144 |
+
return return_none
|
145 |
+
|
146 |
+
if not output:
|
147 |
+
gr_warning(translations["output_not_valid"])
|
148 |
+
return return_none
|
149 |
+
|
150 |
+
output = output.replace("wav", format)
|
151 |
+
|
152 |
+
if os.path.isdir(input):
|
153 |
+
gr_info(translations["is_folder"])
|
154 |
+
|
155 |
+
if not [f for f in os.listdir(input) if f.lower().endswith(("wav", "mp3", "flac", "ogg", "opus", "m4a", "mp4", "aac", "alac", "wma", "aiff", "webm", "ac3"))]:
|
156 |
+
gr_warning(translations["not_found_in_folder"])
|
157 |
+
return return_none
|
158 |
+
|
159 |
+
gr_info(translations["batch_convert"])
|
160 |
+
|
161 |
+
output_dir = os.path.dirname(output) or output
|
162 |
+
convert(pitch, filter_radius, index_rate, rms_mix_rate, protect, hop_length, f0method, input, output_dir, model_path, index, autotune, clean, clean_strength, format, embedder_model, resample_sr, split_audio, f0_autotune_strength, checkpointing, onnx_f0_mode, embedders_mode, formant_shifting, formant_qfrency, formant_timbre, f0_file, proposal_pitch, proposal_pitch_threshold)
|
163 |
+
|
164 |
+
gr_info(translations["batch_convert_success"])
|
165 |
+
|
166 |
+
return return_none
|
167 |
+
else:
|
168 |
+
output_dir = os.path.dirname(output) or output
|
169 |
+
|
170 |
+
if not os.path.exists(output_dir): os.makedirs(output_dir, exist_ok=True)
|
171 |
+
output = process_output(output)
|
172 |
+
|
173 |
+
gr_info(translations["convert_vocal"])
|
174 |
+
|
175 |
+
convert(pitch, filter_radius, index_rate, rms_mix_rate, protect, hop_length, f0method, input, output, model_path, index, autotune, clean, clean_strength, format, embedder_model, resample_sr, split_audio, f0_autotune_strength, checkpointing, onnx_f0_mode, embedders_mode, formant_shifting, formant_qfrency, formant_timbre, f0_file, proposal_pitch, proposal_pitch_threshold)
|
176 |
+
|
177 |
+
gr_info(translations["convert_success"])
|
178 |
+
|
179 |
+
return_none[0] = output
|
180 |
+
return return_none
|
181 |
+
|
182 |
+
def convert_selection(clean, autotune, use_audio, use_original, convert_backing, not_merge_backing, merge_instrument, pitch, clean_strength, model, index, index_rate, input, output, format, method, hybrid_method, hop_length, embedders, custom_embedders, resample_sr, filter_radius, rms_mix_rate, protect, split_audio, f0_autotune_strength, checkpointing, onnx_f0_mode, formant_shifting, formant_qfrency, formant_timbre, f0_file, embedders_mode, proposal_pitch, proposal_pitch_threshold):
|
183 |
+
if use_audio:
|
184 |
+
gr_info(translations["search_separate"])
|
185 |
+
choice = [f for f in os.listdir(configs["audios_path"]) if os.path.isdir(os.path.join(configs["audios_path"], f))] if config.debug_mode else [f for f in os.listdir(configs["audios_path"]) if os.path.isdir(os.path.join(configs["audios_path"], f)) and any(file.lower().endswith((".wav", ".mp3", ".flac", ".ogg", ".opus", ".m4a", ".mp4", ".aac", ".alac", ".wma", ".aiff", ".webm", ".ac3")) for file in os.listdir(os.path.join(configs["audios_path"], f)))]
|
186 |
+
|
187 |
+
gr_info(translations["found_choice"].format(choice=len(choice)))
|
188 |
+
|
189 |
+
if len(choice) == 0:
|
190 |
+
gr_warning(translations["separator==0"])
|
191 |
+
|
192 |
+
return [{"choices": [], "value": "", "interactive": False, "visible": False, "__type__": "update"}, None, None, None, None, None, {"visible": True, "__type__": "update"}, {"visible": False, "__type__": "update"}]
|
193 |
+
elif len(choice) == 1:
|
194 |
+
convert_output = convert_audio(clean, autotune, use_audio, use_original, convert_backing, not_merge_backing, merge_instrument, pitch, clean_strength, model, index, index_rate, None, None, format, method, hybrid_method, hop_length, embedders, custom_embedders, resample_sr, filter_radius, rms_mix_rate, protect, split_audio, f0_autotune_strength, choice[0], checkpointing, onnx_f0_mode, formant_shifting, formant_qfrency, formant_timbre, f0_file, embedders_mode, proposal_pitch, proposal_pitch_threshold)
|
195 |
+
|
196 |
+
return [{"choices": [], "value": "", "interactive": False, "visible": False, "__type__": "update"}, convert_output[0], convert_output[1], convert_output[2], convert_output[3], convert_output[4], {"visible": True, "__type__": "update"}, {"visible": False, "__type__": "update"}]
|
197 |
+
else: return [{"choices": choice, "value": choice[0], "interactive": True, "visible": True, "__type__": "update"}, None, None, None, None, None, {"visible": False, "__type__": "update"}, {"visible": True, "__type__": "update"}]
|
198 |
+
else:
|
199 |
+
main_convert = convert_audio(clean, autotune, use_audio, use_original, convert_backing, not_merge_backing, merge_instrument, pitch, clean_strength, model, index, index_rate, input, output, format, method, hybrid_method, hop_length, embedders, custom_embedders, resample_sr, filter_radius, rms_mix_rate, protect, split_audio, f0_autotune_strength, None, checkpointing, onnx_f0_mode, formant_shifting, formant_qfrency, formant_timbre, f0_file, embedders_mode, proposal_pitch, proposal_pitch_threshold)
|
200 |
+
|
201 |
+
return [{"choices": [], "value": "", "interactive": False, "visible": False, "__type__": "update"}, main_convert[0], None, None, None, None, {"visible": True, "__type__": "update"}, {"visible": False, "__type__": "update"}]
|
202 |
+
|
203 |
+
def convert_with_whisper(num_spk, model_size, cleaner, clean_strength, autotune, f0_autotune_strength, checkpointing, model_1, model_2, model_index_1, model_index_2, pitch_1, pitch_2, index_strength_1, index_strength_2, export_format, input_audio, output_audio, onnx_f0_mode, method, hybrid_method, hop_length, embed_mode, embedders, custom_embedders, resample_sr, filter_radius, rms_mix_rate, protect, formant_shifting, formant_qfrency_1, formant_timbre_1, formant_qfrency_2, formant_timbre_2, proposal_pitch, proposal_pitch_threshold):
|
204 |
+
from pydub import AudioSegment
|
205 |
+
from sklearn.cluster import AgglomerativeClustering
|
206 |
+
|
207 |
+
from main.library.speaker_diarization.audio import Audio
|
208 |
+
from main.library.speaker_diarization.segment import Segment
|
209 |
+
from main.library.speaker_diarization.whisper import load_model
|
210 |
+
from main.library.utils import check_spk_diarization, pydub_load
|
211 |
+
from main.library.speaker_diarization.embedding import SpeechBrainPretrainedSpeakerEmbedding
|
212 |
+
|
213 |
+
check_spk_diarization(model_size)
|
214 |
+
model_pth_1, model_pth_2 = os.path.join(configs["weights_path"], model_1) if not os.path.exists(model_1) else model_1, os.path.join(configs["weights_path"], model_2) if not os.path.exists(model_2) else model_2
|
215 |
+
|
216 |
+
if (not model_1 or not os.path.exists(model_pth_1) or os.path.isdir(model_pth_1) or not model_pth_1.endswith((".pth", ".onnx"))) and (not model_2 or not os.path.exists(model_pth_2) or os.path.isdir(model_pth_2) or not model_pth_2.endswith((".pth", ".onnx"))):
|
217 |
+
gr_warning(translations["provide_file"].format(filename=translations["model"]))
|
218 |
+
return None
|
219 |
+
|
220 |
+
if not model_1: model_pth_1 = model_pth_2
|
221 |
+
if not model_2: model_pth_2 = model_pth_1
|
222 |
+
|
223 |
+
if not input_audio or not os.path.exists(input_audio) or os.path.isdir(input_audio):
|
224 |
+
gr_warning(translations["input_not_valid"])
|
225 |
+
return None
|
226 |
+
|
227 |
+
if not output_audio:
|
228 |
+
gr_warning(translations["output_not_valid"])
|
229 |
+
return None
|
230 |
+
|
231 |
+
output_audio = process_output(output_audio)
|
232 |
+
gr_info(translations["start_whisper"])
|
233 |
+
|
234 |
+
try:
|
235 |
+
audio = Audio()
|
236 |
+
|
237 |
+
embedding_model = SpeechBrainPretrainedSpeakerEmbedding(embedding=os.path.join(configs["speaker_diarization_path"], "models", "speechbrain"), device=config.device)
|
238 |
+
segments = load_model(model_size, device=config.device).transcribe(input_audio, fp16=configs.get("fp16", False), word_timestamps=True)["segments"]
|
239 |
+
|
240 |
+
y, sr = librosa.load(input_audio, sr=None)
|
241 |
+
duration = len(y) / sr
|
242 |
+
|
243 |
+
def segment_embedding(segment):
|
244 |
+
waveform, _ = audio.crop(input_audio, Segment(segment["start"], min(duration, segment["end"])))
|
245 |
+
return embedding_model(waveform.mean(dim=0, keepdim=True)[None] if waveform.shape[0] == 2 else waveform[None])
|
246 |
+
|
247 |
+
def time(secs):
|
248 |
+
return datetime.timedelta(seconds=round(secs))
|
249 |
+
|
250 |
+
def merge_audio(files_list, time_stamps, original_file_path, output_path, format):
|
251 |
+
def extract_number(filename):
|
252 |
+
match = re.search(r'_(\d+)', filename)
|
253 |
+
return int(match.group(1)) if match else 0
|
254 |
+
|
255 |
+
total_duration = len(pydub_load(original_file_path))
|
256 |
+
combined = AudioSegment.empty()
|
257 |
+
current_position = 0
|
258 |
+
|
259 |
+
for file, (start_i, end_i) in zip(sorted(files_list, key=extract_number), time_stamps):
|
260 |
+
if start_i > current_position: combined += AudioSegment.silent(duration=start_i - current_position)
|
261 |
+
|
262 |
+
combined += pydub_load(file)
|
263 |
+
current_position = end_i
|
264 |
+
|
265 |
+
if current_position < total_duration: combined += AudioSegment.silent(duration=total_duration - current_position)
|
266 |
+
combined.export(output_path, format=format)
|
267 |
+
|
268 |
+
return output_path
|
269 |
+
|
270 |
+
embeddings = np.zeros(shape=(len(segments), 192))
|
271 |
+
for i, segment in enumerate(segments):
|
272 |
+
embeddings[i] = segment_embedding(segment)
|
273 |
+
|
274 |
+
labels = AgglomerativeClustering(num_spk).fit(np.nan_to_num(embeddings)).labels_
|
275 |
+
for i in range(len(segments)):
|
276 |
+
segments[i]["speaker"] = 'SPEAKER ' + str(labels[i] + 1)
|
277 |
+
|
278 |
+
merged_segments, current_text = [], []
|
279 |
+
current_speaker, current_start = None, None
|
280 |
+
|
281 |
+
for i, segment in enumerate(segments):
|
282 |
+
speaker = segment["speaker"]
|
283 |
+
start_time = segment["start"]
|
284 |
+
text = segment["text"][1:]
|
285 |
+
|
286 |
+
if speaker == current_speaker:
|
287 |
+
current_text.append(text)
|
288 |
+
end_time = segment["end"]
|
289 |
+
else:
|
290 |
+
if current_speaker is not None: merged_segments.append({"speaker": current_speaker, "start": current_start, "end": end_time, "text": " ".join(current_text)})
|
291 |
+
|
292 |
+
current_speaker = speaker
|
293 |
+
current_start = start_time
|
294 |
+
current_text = [text]
|
295 |
+
end_time = segment["end"]
|
296 |
+
|
297 |
+
if current_speaker is not None: merged_segments.append({"speaker": current_speaker, "start": current_start, "end": end_time, "text": " ".join(current_text)})
|
298 |
+
|
299 |
+
gr_info(translations["whisper_done"])
|
300 |
+
|
301 |
+
x = ""
|
302 |
+
for segment in merged_segments:
|
303 |
+
x += f"\n{segment['speaker']} {str(time(segment['start']))} - {str(time(segment['end']))}\n"
|
304 |
+
x += segment["text"] + "\n"
|
305 |
+
|
306 |
+
logger.info(x)
|
307 |
+
|
308 |
+
gr_info(translations["process_audio"])
|
309 |
+
|
310 |
+
audio = pydub_load(input_audio)
|
311 |
+
output_folder = "audios_temp"
|
312 |
+
|
313 |
+
if os.path.exists(output_folder): shutil.rmtree(output_folder, ignore_errors=True)
|
314 |
+
for f in [output_folder, os.path.join(output_folder, "1"), os.path.join(output_folder, "2")]:
|
315 |
+
os.makedirs(f, exist_ok=True)
|
316 |
+
|
317 |
+
time_stamps, processed_segments = [], []
|
318 |
+
for i, segment in enumerate(merged_segments):
|
319 |
+
start_ms = int(segment["start"] * 1000)
|
320 |
+
end_ms = int(segment["end"] * 1000)
|
321 |
+
|
322 |
+
index = i + 1
|
323 |
+
|
324 |
+
segment_filename = os.path.join(output_folder, "1" if i % 2 == 1 else "2", f"segment_{index}.wav")
|
325 |
+
audio[start_ms:end_ms].export(segment_filename, format="wav")
|
326 |
+
|
327 |
+
processed_segments.append(os.path.join(output_folder, "1" if i % 2 == 1 else "2", f"segment_{index}_output.wav"))
|
328 |
+
time_stamps.append((start_ms, end_ms))
|
329 |
+
|
330 |
+
f0method, embedder_model = (method if method != "hybrid" else hybrid_method), (embedders if embedders != "custom" else custom_embedders)
|
331 |
+
|
332 |
+
gr_info(translations["process_done_start_convert"])
|
333 |
+
|
334 |
+
convert(pitch_1, filter_radius, index_strength_1, rms_mix_rate, protect, hop_length, f0method, os.path.join(output_folder, "1"), output_folder, model_pth_1, model_index_1, autotune, cleaner, clean_strength, "wav", embedder_model, resample_sr, False, f0_autotune_strength, checkpointing, onnx_f0_mode, embed_mode, formant_shifting, formant_qfrency_1, formant_timbre_1, "", proposal_pitch, proposal_pitch_threshold)
|
335 |
+
convert(pitch_2, filter_radius, index_strength_2, rms_mix_rate, protect, hop_length, f0method, os.path.join(output_folder, "2"), output_folder, model_pth_2, model_index_2, autotune, cleaner, clean_strength, "wav", embedder_model, resample_sr, False, f0_autotune_strength, checkpointing, onnx_f0_mode, embed_mode, formant_shifting, formant_qfrency_2, formant_timbre_2, "", proposal_pitch, proposal_pitch_threshold)
|
336 |
+
|
337 |
+
gr_info(translations["convert_success"])
|
338 |
+
return merge_audio(processed_segments, time_stamps, input_audio, output_audio.replace("wav", export_format), export_format)
|
339 |
+
except Exception as e:
|
340 |
+
gr_error(translations["error_occurred"].format(e=e))
|
341 |
+
import traceback
|
342 |
+
logger.debug(traceback.format_exc())
|
343 |
+
return None
|
344 |
+
finally:
|
345 |
+
if os.path.exists("audios_temp"): shutil.rmtree("audios_temp", ignore_errors=True)
|
346 |
+
|
347 |
+
def convert_tts(clean, autotune, pitch, clean_strength, model, index, index_rate, input, output, format, method, hybrid_method, hop_length, embedders, custom_embedders, resample_sr, filter_radius, rms_mix_rate, protect, split_audio, f0_autotune_strength, checkpointing, onnx_f0_mode, formant_shifting, formant_qfrency, formant_timbre, f0_file, embedders_mode, proposal_pitch, proposal_pitch_threshold):
|
348 |
+
model_path = os.path.join(configs["weights_path"], model) if not os.path.exists(model) else model
|
349 |
+
|
350 |
+
if not model_path or not os.path.exists(model_path) or os.path.isdir(model_path) or not model.endswith((".pth", ".onnx")):
|
351 |
+
gr_warning(translations["provide_file"].format(filename=translations["model"]))
|
352 |
+
return None
|
353 |
+
|
354 |
+
if not input or not os.path.exists(input):
|
355 |
+
gr_warning(translations["input_not_valid"])
|
356 |
+
return None
|
357 |
+
|
358 |
+
if os.path.isdir(input):
|
359 |
+
input_audio = [f for f in os.listdir(input) if "tts" in f and f.lower().endswith(("wav", "mp3", "flac", "ogg", "opus", "m4a", "mp4", "aac", "alac", "wma", "aiff", "webm", "ac3"))]
|
360 |
+
|
361 |
+
if not input_audio:
|
362 |
+
gr_warning(translations["not_found_in_folder"])
|
363 |
+
return None
|
364 |
+
|
365 |
+
input = os.path.join(input, input_audio[0])
|
366 |
+
|
367 |
+
if not output:
|
368 |
+
gr_warning(translations["output_not_valid"])
|
369 |
+
return None
|
370 |
+
|
371 |
+
output = output.replace("wav", format)
|
372 |
+
if os.path.isdir(output): output = os.path.join(output, f"tts.{format}")
|
373 |
+
|
374 |
+
output_dir = os.path.dirname(output)
|
375 |
+
if not os.path.exists(output_dir): os.makedirs(output_dir, exist_ok=True)
|
376 |
+
|
377 |
+
output = process_output(output)
|
378 |
+
|
379 |
+
f0method = method if method != "hybrid" else hybrid_method
|
380 |
+
embedder_model = embedders if embedders != "custom" else custom_embedders
|
381 |
+
|
382 |
+
gr_info(translations["convert_vocal"])
|
383 |
+
|
384 |
+
convert(pitch, filter_radius, index_rate, rms_mix_rate, protect, hop_length, f0method, input, output, model_path, index, autotune, clean, clean_strength, format, embedder_model, resample_sr, split_audio, f0_autotune_strength, checkpointing, onnx_f0_mode, embedders_mode, formant_shifting, formant_qfrency, formant_timbre, f0_file, proposal_pitch, proposal_pitch_threshold)
|
385 |
+
|
386 |
+
gr_info(translations["convert_success"])
|
387 |
+
return output
|
main/app/core/model_utils.py
ADDED
@@ -0,0 +1,162 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import os
|
2 |
+
import sys
|
3 |
+
import json
|
4 |
+
import onnx
|
5 |
+
import torch
|
6 |
+
import datetime
|
7 |
+
|
8 |
+
from collections import OrderedDict
|
9 |
+
|
10 |
+
sys.path.append(os.getcwd())
|
11 |
+
|
12 |
+
from main.app.core.ui import gr_info, gr_warning, gr_error
|
13 |
+
from main.library.algorithm.onnx_export import onnx_exporter
|
14 |
+
from main.app.variables import config, logger, translations, configs
|
15 |
+
|
16 |
+
def fushion_model_pth(name, pth_1, pth_2, ratio):
|
17 |
+
if not name.endswith(".pth"): name = name + ".pth"
|
18 |
+
|
19 |
+
if not pth_1 or not os.path.exists(pth_1) or not pth_1.endswith(".pth"):
|
20 |
+
gr_warning(translations["provide_file"].format(filename=translations["model"] + " 1"))
|
21 |
+
return [translations["provide_file"].format(filename=translations["model"] + " 1"), None]
|
22 |
+
|
23 |
+
if not pth_2 or not os.path.exists(pth_2) or not pth_2.endswith(".pth"):
|
24 |
+
gr_warning(translations["provide_file"].format(filename=translations["model"] + " 2"))
|
25 |
+
return [translations["provide_file"].format(filename=translations["model"] + " 2"), None]
|
26 |
+
|
27 |
+
def extract(ckpt):
|
28 |
+
a = ckpt["model"]
|
29 |
+
opt = OrderedDict()
|
30 |
+
opt["weight"] = {}
|
31 |
+
|
32 |
+
for key in a.keys():
|
33 |
+
if "enc_q" in key: continue
|
34 |
+
|
35 |
+
opt["weight"][key] = a[key]
|
36 |
+
|
37 |
+
return opt
|
38 |
+
|
39 |
+
try:
|
40 |
+
ckpt1 = torch.load(pth_1, map_location="cpu", weights_only=True)
|
41 |
+
ckpt2 = torch.load(pth_2, map_location="cpu", weights_only=True)
|
42 |
+
|
43 |
+
if ckpt1["sr"] != ckpt2["sr"]:
|
44 |
+
gr_warning(translations["sr_not_same"])
|
45 |
+
return [translations["sr_not_same"], None]
|
46 |
+
|
47 |
+
cfg = ckpt1["config"]
|
48 |
+
cfg_f0 = ckpt1["f0"]
|
49 |
+
cfg_version = ckpt1["version"]
|
50 |
+
cfg_sr = ckpt1["sr"]
|
51 |
+
|
52 |
+
vocoder = ckpt1.get("vocoder", "Default")
|
53 |
+
rms_extract = ckpt1.get("energy", False)
|
54 |
+
|
55 |
+
ckpt1 = extract(ckpt1) if "model" in ckpt1 else ckpt1["weight"]
|
56 |
+
ckpt2 = extract(ckpt2) if "model" in ckpt2 else ckpt2["weight"]
|
57 |
+
|
58 |
+
if sorted(list(ckpt1.keys())) != sorted(list(ckpt2.keys())):
|
59 |
+
gr_warning(translations["architectures_not_same"])
|
60 |
+
return [translations["architectures_not_same"], None]
|
61 |
+
|
62 |
+
gr_info(translations["start"].format(start=translations["fushion_model"]))
|
63 |
+
|
64 |
+
opt = OrderedDict()
|
65 |
+
opt["weight"] = {}
|
66 |
+
|
67 |
+
for key in ckpt1.keys():
|
68 |
+
if key == "emb_g.weight" and ckpt1[key].shape != ckpt2[key].shape:
|
69 |
+
min_shape0 = min(ckpt1[key].shape[0], ckpt2[key].shape[0])
|
70 |
+
opt["weight"][key] = (ratio * (ckpt1[key][:min_shape0].float()) + (1 - ratio) * (ckpt2[key][:min_shape0].float())).half()
|
71 |
+
else: opt["weight"][key] = (ratio * (ckpt1[key].float()) + (1 - ratio) * (ckpt2[key].float())).half()
|
72 |
+
|
73 |
+
opt["config"] = cfg
|
74 |
+
opt["sr"] = cfg_sr
|
75 |
+
opt["f0"] = cfg_f0
|
76 |
+
opt["version"] = cfg_version
|
77 |
+
opt["infos"] = translations["model_fushion_info"].format(name=name, pth_1=pth_1, pth_2=pth_2, ratio=ratio)
|
78 |
+
opt["vocoder"] = vocoder
|
79 |
+
opt["energy"] = rms_extract
|
80 |
+
|
81 |
+
output_model = configs["weights_path"]
|
82 |
+
if not os.path.exists(output_model): os.makedirs(output_model, exist_ok=True)
|
83 |
+
|
84 |
+
torch.save(opt, os.path.join(output_model, name))
|
85 |
+
|
86 |
+
gr_info(translations["success"])
|
87 |
+
return [translations["success"], os.path.join(output_model, name)]
|
88 |
+
except Exception as e:
|
89 |
+
gr_error(message=translations["error_occurred"].format(e=e))
|
90 |
+
return [e, None]
|
91 |
+
|
92 |
+
def fushion_model(name, path_1, path_2, ratio):
|
93 |
+
if not name:
|
94 |
+
gr_warning(translations["provide_name_is_save"])
|
95 |
+
return [translations["provide_name_is_save"], None]
|
96 |
+
|
97 |
+
if path_1.endswith(".pth") and path_2.endswith(".pth"): return fushion_model_pth(name.replace(".onnx", ".pth"), path_1, path_2, ratio)
|
98 |
+
else:
|
99 |
+
gr_warning(translations["format_not_valid"])
|
100 |
+
return [None, None]
|
101 |
+
|
102 |
+
def onnx_export(model_path):
|
103 |
+
if not model_path.endswith(".pth"): model_path + ".pth"
|
104 |
+
if not model_path or not os.path.exists(model_path) or not model_path.endswith(".pth"): return gr_warning(translations["provide_file"].format(filename=translations["model"]))
|
105 |
+
|
106 |
+
try:
|
107 |
+
gr_info(translations["start_onnx_export"])
|
108 |
+
output = onnx_exporter(model_path, model_path.replace(".pth", ".onnx"), is_half=config.is_half, device=config.device)
|
109 |
+
|
110 |
+
gr_info(translations["success"])
|
111 |
+
return output
|
112 |
+
except Exception as e:
|
113 |
+
return gr_error(e)
|
114 |
+
|
115 |
+
def model_info(path):
|
116 |
+
if not path or not os.path.exists(path) or os.path.isdir(path) or not path.endswith((".pth", ".onnx")): return gr_warning(translations["provide_file"].format(filename=translations["model"]))
|
117 |
+
|
118 |
+
def prettify_date(date_str):
|
119 |
+
if date_str == translations["not_found_create_time"]: return None
|
120 |
+
|
121 |
+
try:
|
122 |
+
return datetime.datetime.strptime(date_str, "%Y-%m-%dT%H:%M:%S.%f").strftime("%Y-%m-%d %H:%M:%S")
|
123 |
+
except ValueError as e:
|
124 |
+
logger.debug(e)
|
125 |
+
return translations["format_not_valid"]
|
126 |
+
|
127 |
+
if path.endswith(".pth"): model_data = torch.load(path, map_location=torch.device("cpu"))
|
128 |
+
else:
|
129 |
+
model = onnx.load(path)
|
130 |
+
model_data = None
|
131 |
+
|
132 |
+
for prop in model.metadata_props:
|
133 |
+
if prop.key == "model_info":
|
134 |
+
model_data = json.loads(prop.value)
|
135 |
+
break
|
136 |
+
|
137 |
+
gr_info(translations["read_info"])
|
138 |
+
|
139 |
+
epochs = model_data.get("epoch", None)
|
140 |
+
if epochs is None:
|
141 |
+
epochs = model_data.get("info", None)
|
142 |
+
try:
|
143 |
+
epoch = epochs.replace("epoch", "").replace("e", "").isdigit()
|
144 |
+
if epoch and epochs is None: epochs = translations["not_found"].format(name=translations["epoch"])
|
145 |
+
except:
|
146 |
+
pass
|
147 |
+
|
148 |
+
steps = model_data.get("step", translations["not_found"].format(name=translations["step"]))
|
149 |
+
sr = model_data.get("sr", translations["not_found"].format(name=translations["sr"]))
|
150 |
+
f0 = model_data.get("f0", translations["not_found"].format(name=translations["f0"]))
|
151 |
+
version = model_data.get("version", translations["not_found"].format(name=translations["version"]))
|
152 |
+
creation_date = model_data.get("creation_date", translations["not_found_create_time"])
|
153 |
+
model_hash = model_data.get("model_hash", translations["not_found"].format(name="model_hash"))
|
154 |
+
pitch_guidance = translations["trained_f0"] if f0 else translations["not_f0"]
|
155 |
+
creation_date_str = prettify_date(creation_date) if creation_date else translations["not_found_create_time"]
|
156 |
+
model_name = model_data.get("model_name", translations["unregistered"])
|
157 |
+
model_author = model_data.get("author", translations["not_author"])
|
158 |
+
vocoder = model_data.get("vocoder", "Default")
|
159 |
+
rms_extract = model_data.get("energy", False)
|
160 |
+
|
161 |
+
gr_info(translations["success"])
|
162 |
+
return translations["model_info"].format(model_name=model_name, model_author=model_author, epochs=epochs, steps=steps, version=version, sr=sr, pitch_guidance=pitch_guidance, model_hash=model_hash, creation_date_str=creation_date_str, vocoder=vocoder, rms_extract=rms_extract)
|
main/app/core/presets.py
ADDED
@@ -0,0 +1,165 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import os
|
2 |
+
import sys
|
3 |
+
import json
|
4 |
+
|
5 |
+
sys.path.append(os.getcwd())
|
6 |
+
|
7 |
+
from main.app.variables import translations, configs
|
8 |
+
from main.app.core.ui import gr_info, gr_warning, change_preset_choices, change_effect_preset_choices
|
9 |
+
|
10 |
+
def load_presets(presets, cleaner, autotune, pitch, clean_strength, index_strength, resample_sr, filter_radius, rms_mix_rate, protect, split_audio, f0_autotune_strength, formant_shifting, formant_qfrency, formant_timbre):
|
11 |
+
if not presets: gr_warning(translations["provide_file_settings"])
|
12 |
+
|
13 |
+
file = {}
|
14 |
+
if presets:
|
15 |
+
with open(os.path.join(configs["presets_path"], presets)) as f:
|
16 |
+
file = json.load(f)
|
17 |
+
|
18 |
+
gr_info(translations["load_presets"].format(presets=presets))
|
19 |
+
return [file.get("cleaner", cleaner), file.get("autotune", autotune), file.get("pitch", pitch), file.get("clean_strength", clean_strength), file.get("index_strength", index_strength), file.get("resample_sr", resample_sr), file.get("filter_radius", filter_radius), file.get("rms_mix_rate", rms_mix_rate), file.get("protect", protect), file.get("split_audio", split_audio), file.get("f0_autotune_strength", f0_autotune_strength), file.get("formant_shifting", formant_shifting), file.get("formant_qfrency", formant_qfrency), file.get("formant_timbre", formant_timbre)]
|
20 |
+
|
21 |
+
def save_presets(name, cleaner, autotune, pitch, clean_strength, index_strength, resample_sr, filter_radius, rms_mix_rate, protect, split_audio, f0_autotune_strength, cleaner_chbox, autotune_chbox, pitch_chbox, index_strength_chbox, resample_sr_chbox, filter_radius_chbox, rms_mix_rate_chbox, protect_chbox, split_audio_chbox, formant_shifting_chbox, formant_shifting, formant_qfrency, formant_timbre):
|
22 |
+
if not name: return gr_warning(translations["provide_filename_settings"])
|
23 |
+
if not any([cleaner_chbox, autotune_chbox, pitch_chbox, index_strength_chbox, resample_sr_chbox, filter_radius_chbox, rms_mix_rate_chbox, protect_chbox, split_audio_chbox, formant_shifting_chbox]): return gr_warning(translations["choose1"])
|
24 |
+
|
25 |
+
settings = {}
|
26 |
+
|
27 |
+
for checkbox, data in [(cleaner_chbox, {"cleaner": cleaner, "clean_strength": clean_strength}), (autotune_chbox, {"autotune": autotune, "f0_autotune_strength": f0_autotune_strength}), (pitch_chbox, {"pitch": pitch}), (index_strength_chbox, {"index_strength": index_strength}), (resample_sr_chbox, {"resample_sr": resample_sr}), (filter_radius_chbox, {"filter_radius": filter_radius}), (rms_mix_rate_chbox, {"rms_mix_rate": rms_mix_rate}), (protect_chbox, {"protect": protect}), (split_audio_chbox, {"split_audio": split_audio}), (formant_shifting_chbox, {"formant_shifting": formant_shifting, "formant_qfrency": formant_qfrency, "formant_timbre": formant_timbre})]:
|
28 |
+
if checkbox: settings.update(data)
|
29 |
+
|
30 |
+
with open(os.path.join(configs["presets_path"], name + ".conversion.json"), "w") as f:
|
31 |
+
json.dump(settings, f, indent=4)
|
32 |
+
|
33 |
+
gr_info(translations["export_settings"].format(name=name))
|
34 |
+
return change_preset_choices()
|
35 |
+
|
36 |
+
def audio_effect_load_presets(presets, resample_checkbox, audio_effect_resample_sr, chorus_depth, chorus_rate_hz, chorus_mix, chorus_centre_delay_ms, chorus_feedback, distortion_drive_db, reverb_room_size, reverb_damping, reverb_wet_level, reverb_dry_level, reverb_width, reverb_freeze_mode, pitch_shift_semitones, delay_second, delay_feedback, delay_mix, compressor_threshold_db, compressor_ratio, compressor_attack_ms, compressor_release_ms, limiter_threshold_db, limiter_release_ms, gain_db, bitcrush_bit_depth, clipping_threshold_db, phaser_rate_hz, phaser_depth, phaser_centre_frequency_hz, phaser_feedback, phaser_mix, bass_boost, bass_frequency, treble_boost, treble_frequency, fade_in, fade_out, chorus_check_box, distortion_checkbox, reverb_check_box, delay_check_box, compressor_check_box, limiter, gain_checkbox, bitcrush_checkbox, clipping_checkbox, phaser_check_box, bass_or_treble, fade):
|
37 |
+
if not presets: gr_warning(translations["provide_file_settings"])
|
38 |
+
|
39 |
+
file = {}
|
40 |
+
if presets:
|
41 |
+
with open(os.path.join(configs["presets_path"], presets)) as f:
|
42 |
+
file = json.load(f)
|
43 |
+
|
44 |
+
gr_info(translations["load_presets"].format(presets=presets))
|
45 |
+
return [
|
46 |
+
file.get("resample_checkbox", resample_checkbox), file.get("audio_effect_resample_sr", audio_effect_resample_sr),
|
47 |
+
file.get("chorus_depth", chorus_depth), file.get("chorus_rate_hz", chorus_rate_hz),
|
48 |
+
file.get("chorus_mix", chorus_mix), file.get("chorus_centre_delay_ms", chorus_centre_delay_ms),
|
49 |
+
file.get("chorus_feedback", chorus_feedback), file.get("distortion_drive_db", distortion_drive_db),
|
50 |
+
file.get("reverb_room_size", reverb_room_size), file.get("reverb_damping", reverb_damping),
|
51 |
+
file.get("reverb_wet_level", reverb_wet_level), file.get("reverb_dry_level", reverb_dry_level),
|
52 |
+
file.get("reverb_width", reverb_width), file.get("reverb_freeze_mode", reverb_freeze_mode),
|
53 |
+
file.get("pitch_shift_semitones", pitch_shift_semitones), file.get("delay_second", delay_second),
|
54 |
+
file.get("delay_feedback", delay_feedback), file.get("delay_mix", delay_mix),
|
55 |
+
file.get("compressor_threshold_db", compressor_threshold_db), file.get("compressor_ratio", compressor_ratio),
|
56 |
+
file.get("compressor_attack_ms", compressor_attack_ms), file.get("compressor_release_ms", compressor_release_ms),
|
57 |
+
file.get("limiter_threshold_db", limiter_threshold_db), file.get("limiter_release_ms", limiter_release_ms),
|
58 |
+
file.get("gain_db", gain_db), file.get("bitcrush_bit_depth", bitcrush_bit_depth),
|
59 |
+
file.get("clipping_threshold_db", clipping_threshold_db), file.get("phaser_rate_hz", phaser_rate_hz),
|
60 |
+
file.get("phaser_depth", phaser_depth), file.get("phaser_centre_frequency_hz", phaser_centre_frequency_hz),
|
61 |
+
file.get("phaser_feedback", phaser_feedback), file.get("phaser_mix", phaser_mix),
|
62 |
+
file.get("bass_boost", bass_boost), file.get("bass_frequency", bass_frequency),
|
63 |
+
file.get("treble_boost", treble_boost), file.get("treble_frequency", treble_frequency),
|
64 |
+
file.get("fade_in", fade_in), file.get("fade_out", fade_out),
|
65 |
+
file.get("chorus_check_box", chorus_check_box), file.get("distortion_checkbox", distortion_checkbox),
|
66 |
+
file.get("reverb_check_box", reverb_check_box), file.get("delay_check_box", delay_check_box),
|
67 |
+
file.get("compressor_check_box", compressor_check_box), file.get("limiter", limiter),
|
68 |
+
file.get("gain_checkbox", gain_checkbox), file.get("bitcrush_checkbox", bitcrush_checkbox),
|
69 |
+
file.get("clipping_checkbox", clipping_checkbox), file.get("phaser_check_box", phaser_check_box),
|
70 |
+
file.get("bass_or_treble", bass_or_treble), file.get("fade", fade)
|
71 |
+
]
|
72 |
+
|
73 |
+
def audio_effect_save_presets(name, resample_checkbox, audio_effect_resample_sr, chorus_depth, chorus_rate_hz, chorus_mix, chorus_centre_delay_ms, chorus_feedback, distortion_drive_db, reverb_room_size, reverb_damping, reverb_wet_level, reverb_dry_level, reverb_width, reverb_freeze_mode, pitch_shift_semitones, delay_second, delay_feedback, delay_mix, compressor_threshold_db, compressor_ratio, compressor_attack_ms, compressor_release_ms, limiter_threshold_db, limiter_release_ms, gain_db, bitcrush_bit_depth, clipping_threshold_db, phaser_rate_hz, phaser_depth, phaser_centre_frequency_hz, phaser_feedback, phaser_mix, bass_boost, bass_frequency, treble_boost, treble_frequency, fade_in, fade_out, chorus_check_box, distortion_checkbox, reverb_check_box, delay_check_box, compressor_check_box, limiter, gain_checkbox, bitcrush_checkbox, clipping_checkbox, phaser_check_box, bass_or_treble, fade):
|
74 |
+
if not name: return gr_warning(translations["provide_filename_settings"])
|
75 |
+
if not any([resample_checkbox, chorus_check_box, distortion_checkbox, reverb_check_box, delay_check_box, compressor_check_box, limiter, gain_checkbox, bitcrush_checkbox, clipping_checkbox, phaser_check_box, bass_or_treble, fade, pitch_shift_semitones != 0]): return gr_warning(translations["choose1"])
|
76 |
+
|
77 |
+
settings = {}
|
78 |
+
|
79 |
+
for checkbox, data in [
|
80 |
+
(resample_checkbox, {
|
81 |
+
"resample_checkbox": resample_checkbox,
|
82 |
+
"audio_effect_resample_sr": audio_effect_resample_sr
|
83 |
+
}),
|
84 |
+
(chorus_check_box, {
|
85 |
+
"chorus_check_box": chorus_check_box,
|
86 |
+
"chorus_depth": chorus_depth,
|
87 |
+
"chorus_rate_hz": chorus_rate_hz,
|
88 |
+
"chorus_mix": chorus_mix,
|
89 |
+
"chorus_centre_delay_ms": chorus_centre_delay_ms,
|
90 |
+
"chorus_feedback": chorus_feedback
|
91 |
+
}),
|
92 |
+
(distortion_checkbox, {
|
93 |
+
"distortion_checkbox": distortion_checkbox,
|
94 |
+
"distortion_drive_db": distortion_drive_db
|
95 |
+
}),
|
96 |
+
(reverb_check_box, {
|
97 |
+
"reverb_check_box": reverb_check_box,
|
98 |
+
"reverb_room_size": reverb_room_size,
|
99 |
+
"reverb_damping": reverb_damping,
|
100 |
+
"reverb_wet_level": reverb_wet_level,
|
101 |
+
"reverb_dry_level": reverb_dry_level,
|
102 |
+
"reverb_width": reverb_width,
|
103 |
+
"reverb_freeze_mode": reverb_freeze_mode
|
104 |
+
}),
|
105 |
+
(pitch_shift_semitones != 0, {
|
106 |
+
"pitch_shift_semitones": pitch_shift_semitones
|
107 |
+
}),
|
108 |
+
(delay_check_box, {
|
109 |
+
"delay_check_box": delay_check_box,
|
110 |
+
"delay_second": delay_second,
|
111 |
+
"delay_feedback": delay_feedback,
|
112 |
+
"delay_mix": delay_mix
|
113 |
+
}),
|
114 |
+
(compressor_check_box, {
|
115 |
+
"compressor_check_box": compressor_check_box,
|
116 |
+
"compressor_threshold_db": compressor_threshold_db,
|
117 |
+
"compressor_ratio": compressor_ratio,
|
118 |
+
"compressor_attack_ms": compressor_attack_ms,
|
119 |
+
"compressor_release_ms": compressor_release_ms
|
120 |
+
}),
|
121 |
+
(limiter, {
|
122 |
+
"limiter": limiter,
|
123 |
+
"limiter_threshold_db": limiter_threshold_db,
|
124 |
+
"limiter_release_ms": limiter_release_ms
|
125 |
+
}),
|
126 |
+
(gain_checkbox, {
|
127 |
+
"gain_checkbox": gain_checkbox,
|
128 |
+
"gain_db": gain_db
|
129 |
+
}),
|
130 |
+
(bitcrush_checkbox, {
|
131 |
+
"bitcrush_checkbox": bitcrush_checkbox,
|
132 |
+
"bitcrush_bit_depth": bitcrush_bit_depth
|
133 |
+
}),
|
134 |
+
(clipping_checkbox, {
|
135 |
+
"clipping_checkbox": clipping_checkbox,
|
136 |
+
"clipping_threshold_db": clipping_threshold_db
|
137 |
+
}),
|
138 |
+
(phaser_check_box, {
|
139 |
+
"phaser_check_box": phaser_check_box,
|
140 |
+
"phaser_rate_hz": phaser_rate_hz,
|
141 |
+
"phaser_depth": phaser_depth,
|
142 |
+
"phaser_centre_frequency_hz": phaser_centre_frequency_hz,
|
143 |
+
"phaser_feedback": phaser_feedback,
|
144 |
+
"phaser_mix": phaser_mix
|
145 |
+
}),
|
146 |
+
(bass_or_treble, {
|
147 |
+
"bass_or_treble": bass_or_treble,
|
148 |
+
"bass_boost": bass_boost,
|
149 |
+
"bass_frequency": bass_frequency,
|
150 |
+
"treble_boost": treble_boost,
|
151 |
+
"treble_frequency": treble_frequency
|
152 |
+
}),
|
153 |
+
(fade, {
|
154 |
+
"fade": fade,
|
155 |
+
"fade_in": fade_in,
|
156 |
+
"fade_out": fade_out
|
157 |
+
})
|
158 |
+
]:
|
159 |
+
if checkbox: settings.update(data)
|
160 |
+
|
161 |
+
with open(os.path.join(configs["presets_path"], name + ".effect.json"), "w") as f:
|
162 |
+
json.dump(settings, f, indent=4)
|
163 |
+
|
164 |
+
gr_info(translations["export_settings"].format(name=name))
|
165 |
+
return change_effect_preset_choices()
|