Skip to content

Commit 71e2733

Browse files
sciencejihoTps-F
andauthored
docs(README.ko): add Korean Translation of README.md (#157)
* docs(README.ko): add Korean Translation of README.md * docs(Faiss): add Korean tips for Faiss * docs(README): add hyperlinks for Korean translation on all README * docs(training_tips): add Korean translation for training tips --------- Co-authored-by: Ftps <[email protected]>
1 parent 964a85f commit 71e2733

File tree

6 files changed

+293
-3
lines changed

6 files changed

+293
-3
lines changed

README.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,8 @@
1919

2020
[**更新日志**](https://github.com/liujing04/Retrieval-based-Voice-Conversion-WebUI/blob/main/Changelog_CN.md)
2121

22-
[**English**](./docs/README.en.md) | [**中文简体**](./README.md) | [**日本語**](./docs/README.ja.md)
22+
[**English**](./docs/README.en.md) | [**中文简体**](./README.md) | [**日本語**](./docs/README.ja.md) | [**한국어**](./docs/README.ko.md)
23+
2324

2425
> 点此查看我们的[演示视频](https://www.bilibili.com/video/BV1pm4y1z7Gm/) !
2526

docs/README.en.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ An easy-to-use SVC framework based on VITS.<br><br>
1818
------
1919
[**Changelog**](https://github.com/liujing04/Retrieval-based-Voice-Conversion-WebUI/blob/main/Changelog_CN.md)
2020

21-
[**English**](./README.en.md) | [**中文简体**](../README.md) | [**日本語**](./README.ja.md)
21+
[**English**](./README.en.md) | [**中文简体**](../README.md) | [**日本語**](./README.ja.md) | [**한국어**](./README.ko.md)
2222

2323
> Check our [Demo Video](https://www.bilibili.com/video/BV1pm4y1z7Gm/) here!
2424

docs/README.ja.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ VITSに基づく使いやすい音声変換(voice changer)framework<br><br>
1919

2020
[**更新日誌**](https://github.com/liujing04/Retrieval-based-Voice-Conversion-WebUI/blob/main/Changelog_CN.md)
2121

22-
[**English**](./README.en.md) | [**中文简体**](../README.md) | [**日本語**](./README.ja.md)
22+
[**English**](./README.en.md) | [**中文简体**](../README.md) | [**日本語**](./README.ja.md) | [**한국어**](./README.ko.md)
2323

2424
> デモ動画は[こちら](https://www.bilibili.com/video/BV1pm4y1z7Gm/)でご覧ください。
2525

docs/README.ko.md

Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
<div align="center">
2+
3+
<h1>Retrieval-based-Voice-Conversion-WebUI</h1>
4+
VITS 기반의 간단하고 사용하기 쉬운 음성 변환 프레임워크.<br><br>
5+
6+
[![madewithlove](https://forthebadge.com/images/badges/built-with-love.svg)](https://github.com/liujing04/Retrieval-based-Voice-Conversion-WebUI)
7+
8+
<img src="https://counter.seku.su/cmoe?name=rvc&theme=r34" /><br>
9+
10+
[![Open In Colab](https://img.shields.io/badge/Colab-F9AB00?style=for-the-badge&logo=googlecolab&color=525252)](https://colab.research.google.com/github/liujing04/Retrieval-based-Voice-Conversion-WebUI/blob/main/Retrieval_based_Voice_Conversion_WebUI.ipynb)
11+
[![Licence](https://img.shields.io/github/license/liujing04/Retrieval-based-Voice-Conversion-WebUI?style=for-the-badge)](https://github.com/liujing04/Retrieval-based-Voice-Conversion-WebUI/blob/main/%E4%BD%BF%E7%94%A8%E9%9C%80%E9%81%B5%E5%AE%88%E7%9A%84%E5%8D%8F%E8%AE%AE-LICENSE.txt)
12+
[![Huggingface](https://img.shields.io/badge/🤗%20-Spaces-yellow.svg?style=for-the-badge)](https://huggingface.co/lj1995/VoiceConversionWebUI/tree/main/)
13+
14+
[![Discord](https://img.shields.io/badge/RVC%20Developers-Discord-7289DA?style=for-the-badge&logo=discord&logoColor=white)](https://discord.gg/HcsmBBGyVk)
15+
16+
</div>
17+
18+
------
19+
[**업데이트 로그**](https://github.com/liujing04/Retrieval-based-Voice-Conversion-WebUI/blob/main/Changelog_CN.md)
20+
21+
[**English**](./README.en.md) | [**中文简体**](../README.md) | [**日本語**](./README.ja.md) | [**한국어**](./README.ko.md)
22+
23+
> [데모 영상](https://www.bilibili.com/video/BV1pm4y1z7Gm/)을 확인해 보세요!
24+
25+
> RVC를 활용한 실시간 음성변환: [w-okada/voice-changer](https://github.com/w-okada/voice-changer)
26+
27+
> 기본 모델은 50시간 가량의 고퀄리티 오픈 소스 VCTK 데이터셋을 사용하였으므로, 저작권상의 염려가 없으니 안심하고 사용하시기 바랍니다.
28+
29+
> 저작권 문제가 없는 고퀄리티의 노래를 이후에도 계속해서 훈련할 예정입니다.
30+
31+
## 소개
32+
본 Repo는 다음과 같은 특징을 가지고 있습니다:
33+
+ top1 검색을 이용하여 입력 소스 기능을 훈련 세트 기능으로 대체하여 음색의 누출을 방지;
34+
+ 상대적으로 낮은 성능의 GPU에서도 빠른 훈련 가능;
35+
+ 적은 양의 데이터로 훈련해도 좋은 결과를 얻을 수 있음 (최소 10분 이상의 저잡음 음성 데이터를 사용하는 것을 권장);
36+
+ 모델 융합을 통한 음색의 변조 가능 (ckpt 처리 탭->ckpt 병합 선택);
37+
+ 사용하기 쉬운 WebUI (웹 인터페이스);
38+
+ UVR5 모델을 이용하여 목소리와 배경음악의 빠른 분리;
39+
40+
## 환경의 준비
41+
poetry를 통해 dependecies를 설치하는 것을 권장합니다.
42+
43+
다음 명령은 Python 버전 3.8 이상의 환경에서 실행되어야 합니다:
44+
```bash
45+
# PyTorch 관련 주요 dependencies 설치, 이미 설치되어 있는 경우 건너뛰기 가능
46+
# 참조: https://pytorch.org/get-started/locally/
47+
pip install torch torchvision torchaudio
48+
49+
# Windows + Nvidia Ampere Architecture(RTX30xx)를 사용하고 있다면, https://github.com/liujing04/Retrieval-based-Voice-Conversion-WebUI/issues/21 에서 명시된 것과 같이 PyTorch에 맞는 CUDA 버전을 지정해야 합니다.
50+
#pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu117
51+
52+
# Poetry 설치, 이미 설치되어 있는 경우 건너뛰기 가능
53+
# Reference: https://python-poetry.org/docs/#installation
54+
curl -sSL https://install.python-poetry.org | python3 -
55+
56+
# Dependecies 설치
57+
poetry install
58+
```
59+
pip를 활용하여 dependencies를 설치하여도 무방합니다.
60+
61+
**공지**: `MacOS`에서 `faiss 1.7.2`를 사용하면 Segmentation Fault: 11 오류가 발생할 수 있습니다. 수동으로 pip를 사용하여 설치하는 경우 `pip install faiss-cpu==1.7.0`을 사용해야 합니다.
62+
63+
```bash
64+
pip install -r requirements.txt
65+
```
66+
67+
## 기타 사전 모델 준비
68+
RVC 모델은 추론과 훈련을 위하여 다른 사전 모델이 필요합니다.
69+
70+
[Huggingface space](https://huggingface.co/lj1995/VoiceConversionWebUI/tree/main/)를 통해서 다운로드 할 수 있습니다.
71+
72+
다음은 RVC에 필요한 사전 모델 및 기타 파일 목록입니다:
73+
```bash
74+
hubert_base.pt
75+
76+
./pretrained
77+
78+
./uvr5_weights
79+
80+
# Windows를 사용하는 경우 이 사전도 필요할 수 있습니다. FFmpeg가 설치되어 있으면 건너뛰어도 됩니다.
81+
ffmpeg.exe
82+
```
83+
그 후 이하의 명령을 사용하여 WebUI를 시작할 수 있습니다:
84+
```bash
85+
python infer-web.py
86+
```
87+
Windows를 사용하는 경우 `RVC-beta.7z`를 다운로드 및 압축 해제하여 RVC를 직접 사용하거나 `go-web.bat`을 사용하여 WebUi를 시작할 수 있습니다.
88+
89+
중국어로 된 RVC에 대한 튜토리얼도 있으니 필요하다면 확인할 수 있습니다.
90+
91+
## 크레딧
92+
+ [ContentVec](https://github.com/auspicious3000/contentvec/)
93+
+ [VITS](https://github.com/jaywalnut310/vits)
94+
+ [HIFIGAN](https://github.com/jik876/hifi-gan)
95+
+ [Gradio](https://github.com/gradio-app/gradio)
96+
+ [FFmpeg](https://github.com/FFmpeg/FFmpeg)
97+
+ [Ultimate Vocal Remover](https://github.com/Anjok07/ultimatevocalremovergui)
98+
+ [audio-slicer](https://github.com/openvpi/audio-slicer)
99+
## 모든 기여자 분들의 노력에 감사드립니다.
100+
101+
<a href="https://github.com/liujing04/Retrieval-based-Voice-Conversion-WebUI/graphs/contributors" target="_blank">
102+
<img src="https://contrib.rocks/image?repo=liujing04/Retrieval-based-Voice-Conversion-WebUI" />
103+
</a>
104+

docs/faiss_tips_ko.md

Lines changed: 132 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,132 @@
1+
Facebook AI Similarity Search (Faiss) 팁
2+
==================
3+
# Faiss에 대하여
4+
Faiss 는 Facebook Research가 개발하는, 고밀도 벡터 이웃 검색 라이브러리입니다. 근사 근접 탐색법 (Approximate Neigbor Search)은 약간의 정확성을 희생하여 유사 벡터를 고속으로 찾습니다.
5+
6+
## RVC에 있어서 Faiss
7+
RVC에서는 HuBERT로 변환한 feature의 embedding을 위해 훈련 데이터에서 생성된 embedding과 유사한 embadding을 검색하고 혼합하여 원래의 음성에 더욱 가까운 변환을 달성합니다. 그러나, 이 탐색법은 단순히 수행하면 시간이 다소 소모되므로, 근사 근접 탐색법을 통해 고속 변환을 가능케 하고 있습니다.
8+
9+
# 구현 개요
10+
모델이 위치한 `/logs/your-experiment/3_feature256`에는 각 음성 데이터에서 HuBERT가 추출한 feature들이 있습니다. 여기에서 파일 이름별로 정렬된 npy 파일을 읽고, 벡터를 연결하여 big_npy ([N, 256] 모양의 벡터) 를 만듭니다. big_npy를 `/logs/your-experiment/total_fea.npy`로 저장한 후, Faiss로 학습시킵니다.
11+
12+
2023/04/18 기준으로, Faiss의 Index Factory 기능을 이용해, L2 거리에 근거하는 IVF를 이용하고 있습니다. IVF의 분할수(n_ivf)는 N//39로, n_probe는 int(np.power(n_ivf, 0.3))가 사용되고 있습니다. (infer-web.py의 train_index 주위를 찾으십시오.)
13+
14+
이 팁에서는 먼저 이러한 매개 변수의 의미를 설명하고, 개발자가 추후 더 나은 index를 작성할 수 있도록 하는 조언을 작성합니다.
15+
16+
# 방법의 설명
17+
## Index factory
18+
index factory는 여러 근사 근접 탐색법을 문자열로 연결하는 pipeline을 문자열로 표기하는 Faiss만의 독자적인 기법입니다. 이를 통해 index factory의 문자열을 변경하는 것만으로 다양한 근사 근접 탐색을 시도해 볼 수 있습니다. RVC에서는 다음과 같이 사용됩니다:
19+
20+
```python
21+
index = Faiss.index_factory(256, "IVF%s,Flat" % n_ivf)
22+
```
23+
`index_factory`의 인수들 중 첫 번째는 벡터의 차원 수이고, 두번째는 index factory 문자열이며, 세번째에는 사용할 거리를 지정할 수 있습니다.
24+
25+
기법의 보다 자세한 설명은 https://github.com/facebookresearch/Faiss/wiki/The-index-factory 를 확인해 주십시오.
26+
27+
## 거리에 대한 index
28+
embedding의 유사도로서 사용되는 대표적인 지표로서 이하의 2개가 있습니다.
29+
30+
- 유클리드 거리 (METRIC_L2)
31+
- 내적(内積) (METRIC_INNER_PRODUCT)
32+
33+
유클리드 거리에서는 각 차원에서 제곱의 차를 구하고, 각 차원에서 구한 차를 모두 더한 후 제곱근을 취합니다. 이것은 일상적으로 사용되는 2차원, 3차원에서의 거리의 연산법과 같습니다. 내적은 그 값을 그대로 유사도 지표로 사용하지 않고, L2 정규화를 한 이후 내적을 취하는 코사인 유사도를 사용합니다.
34+
35+
어느 쪽이 더 좋은지는 경우에 따라 다르지만, word2vec에서 얻은 embedding 및 ArcFace를 활용한 이미지 검색 모델은 코사인 유사성이 이용되는 경우가 많습니다. numpy를 사용하여 벡터 X에 대해 L2 정규화를 하고자 하는 경우, 0 division을 피하기 위해 충분히 작은 값을 eps로 한 뒤 이하에 코드를 활용하면 됩니다.
36+
37+
```python
38+
X_normed = X / np.maximum(eps, np.linalg.norm(X, ord=2, axis=-1, keepdims=True))
39+
```
40+
41+
또한, `index factory`의 3번째 인수에 건네주는 값을 선택하는 것을 통해 계산에 사용하는 거리 index를 변경할 수 있습니다.
42+
43+
```python
44+
index = Faiss.index_factory(dimention, text, Faiss.METRIC_INNER_PRODUCT)
45+
```
46+
47+
## IVF
48+
IVF (Inverted file indexes)는 역색인 탐색법과 유사한 알고리즘입니다. 학습시에는 검색 대상에 대해 k-평균 군집법을 실시하고 클러스터 중심을 이용해 보로노이 분할을 실시합니다. 각 데이터 포인트에는 클러스터가 할당되므로, 클러스터에서 데이터 포인트를 조회하는 dictionary를 만듭니다.
49+
50+
예를 들어, 클러스터가 다음과 같이 할당된 경우
51+
|index|Cluster|
52+
|-----|-------|
53+
|1|A|
54+
|2|B|
55+
|3|A|
56+
|4|C|
57+
|5|B|
58+
59+
IVF 이후의 결과는 다음과 같습니다:
60+
61+
|cluster|index|
62+
|-------|-----|
63+
|A|1, 3|
64+
|B|2, 5|
65+
|C|4|
66+
67+
탐색 시, 우선 클러스터에서 `n_probe`개의 클러스터를 탐색한 다음, 각 클러스터에 속한 데이터 포인트의 거리를 계산합니다.
68+
69+
# 권장 매개변수
70+
index의 선택 방법에 대해서는 공식적으로 가이드 라인이 있으므로, 거기에 준해 설명합니다.
71+
https://github.com/facebookresearch/Faiss/wiki/Guidelines-to-choose-an-index
72+
73+
1M 이하의 데이터 세트에 있어서는 4bit-PQ가 2023년 4월 시점에서는 Faiss로 이용할 수 있는 가장 효율적인 수법입니다. 이것을 IVF와 조합해, 4bit-PQ로 후보를 추려내고, 마지막으로 이하의 index factory를 이용하여 정확한 지표로 거리를 재계산하면 됩니다.
74+
75+
```python
76+
index = Faiss.index_factory(256, "IVF1024,PQ128x4fs,RFlat")
77+
```
78+
79+
## IVF 권장 매개변수
80+
IVF의 수가 너무 많으면, 가령 데이터 수의 수만큼 IVF로 양자화(Quantization)를 수행하면, 이것은 완전탐색과 같아져 효율이 나빠지게 됩니다. 1M 이하의 경우 IVF 값은 데이터 포인트 수 N에 대해 4sqrt(N) ~ 16sqrt(N)를 사용하는 것을 권장합니다.
81+
82+
n_probe는 n_probe의 수에 비례하여 계산 시간이 늘어나므로 정확도와 시간을 적절히 균형을 맞추어 주십시오. 개인적으로 RVC에 있어서 그렇게까지 정확도는 필요 없다고 생각하기 때문에 n_probe = 1이면 된다고 생각합니다.
83+
84+
## FastScan
85+
FastScan은 직적 양자화를 레지스터에서 수행함으로써 거리의 고속 근사를 가능하게 하는 방법입니다.직적 양자화는 학습시에 d차원마다(보통 d=2)에 독립적으로 클러스터링을 실시해, 클러스터끼리의 거리를 사전 계산해 lookup table를 작성합니다. 예측시는 lookup table을 보면 각 차원의 거리를 O(1)로 계산할 수 있습니다. 따라서 PQ 다음에 지정하는 숫자는 일반적으로 벡터의 절반 차원을 지정합니다.
86+
87+
FastScan에 대한 자세한 설명은 공식 문서를 참조하십시오.
88+
https://github.com/facebookresearch/Faiss/wiki/Fast-accumulation-of-PQ-and-AQ-codes-(FastScan)
89+
90+
## RFlat
91+
RFlat은 FastScan이 계산한 대략적인 거리를 index factory의 3번째 인수로 지정한 정확한 거리로 다시 계산하라는 인스트럭션입니다. k개의 근접 변수를 가져올 때 k*k_factor개의 점에 대해 재계산이 이루어집니다.
92+
93+
# Embedding 테크닉
94+
## Alpha 쿼리 확장
95+
퀴리 확장이란 탐색에서 사용되는 기술로, 예를 들어 전문 탐색 시, 입력된 검색문에 단어를 몇 개를 추가함으로써 검색 정확도를 올리는 방법입니다. 백터 탐색을 위해서도 몇가지 방법이 제안되었는데, 그 중 α-쿼리 확장은 추가 학습이 필요 없는 매우 효과적인 방법으로 알려져 있습니다. [Attention-Based Query Expansion Learning](https://arxiv.org/abs/2007.08019)[2nd place solution of kaggle shopee competition](https://www.kaggle.com/code/lyakaap/2nd-place-solution/notebook) 논문에서 소개된 바 있습니다..
96+
97+
α-쿼리 확장은 한 벡터에 인접한 벡터를 유사도의 α곱한 가중치로 더해주면 됩니다. 코드로 예시를 들어 보겠습니다. big_npy를 α query expansion로 대체합니다.
98+
99+
```python
100+
alpha = 3.
101+
index = Faiss.index_factory(256, "IVF512,PQ128x4fs,RFlat")
102+
original_norm = np.maximum(np.linalg.norm(big_npy, ord=2, axis=1, keepdims=True), 1e-9)
103+
big_npy /= original_norm
104+
index.train(big_npy)
105+
index.add(big_npy)
106+
dist, neighbor = index.search(big_npy, num_expand)
107+
108+
expand_arrays = []
109+
ixs = np.arange(big_npy.shape[0])
110+
for i in range(-(-big_npy.shape[0]//batch_size)):
111+
ix = ixs[i*batch_size:(i+1)*batch_size]
112+
weight = np.power(np.einsum("nd,nmd->nm", big_npy[ix], big_npy[neighbor[ix]]), alpha)
113+
expand_arrays.append(np.sum(big_npy[neighbor[ix]] * np.expand_dims(weight, axis=2),axis=1))
114+
big_npy = np.concatenate(expand_arrays, axis=0)
115+
116+
# index version 정규화
117+
big_npy = big_npy / np.maximum(np.linalg.norm(big_npy, ord=2, axis=1, keepdims=True), 1e-9)
118+
```
119+
120+
위 테크닉은 탐색을 수행하는 쿼리에도, 탐색 대상 DB에도 적응 가능한 테크닉입니다.
121+
122+
## MiniBatch KMeans에 의한 embedding 압축
123+
124+
total_fea.npy가 너무 클 경우 K-means를 이용하여 벡터를 작게 만드는 것이 가능합니다. 이하 코드로 embedding의 압축이 가능합니다. n_clusters에 압축하고자 하는 크기를 지정하고 batch_size에 256 * CPU의 코어 수를 지정함으로써 CPU 병렬화의 혜택을 충분히 얻을 수 있습니다.
125+
126+
```python
127+
import multiprocessing
128+
from sklearn.cluster import MiniBatchKMeans
129+
kmeans = MiniBatchKMeans(n_clusters=10000, batch_size=256 * multiprocessing.cpu_count(), init="random")
130+
kmeans.fit(big_npy)
131+
sample_npy = kmeans.cluster_centers_
132+
```

0 commit comments

Comments
 (0)