File: README.md
底模使用接近50小时的开源高质量VCTK训练集训练,无版权方面的顾虑,请大家放心使用
请期待RVCv3的底模,参数更大,数据更大,效果更好,基本持平的推理速度,需要训练数据量更少。
| 训练推理界面 | 实时变声界面 |
|---|---|
| go-webui.bat | go-realtime_gui.bat |
| 可以自由选择想要执行的操作。 | 我们已经实现端到端170ms延迟。如使用ASIO输入输出设备,已能实现端到端90ms延迟,但非常依赖硬件驱动支持。 |
简介
本仓库具有以下特点
- 使用top1检索替换输入源特征为训练集特征来杜绝音色泄漏
- 即便在相对较差的显卡上也能快速训练
- 使用少量数据进行训练也能得到较好结果(推荐至少收集10分钟低底噪语音数据)
- 可以通过模型融合来改变音色(借助ckpt处理选项卡中的ckpt-merge)
- 简单易用的网页界面
- 可调用pymss/MSST模型来快速分离人声和伴奏
- 使用最先进的人声音高提取算法InterSpeech2023-RMVPE根绝哑音问题,速度快、资源占用小
- A卡/I卡使用 CPU 依赖方案;Windows 可使用 DirectML,Linux 使用 CPU
点此查看我们的演示视频 !
环境配置
本分支面向 Python 3.12 x64,请先进入仓库根目录。Ubuntu 推荐使用 Ubuntu 24.04 x86_64。
Ubuntu 24.04
sudo apt update
sudo apt install -y python3.12 python3.12-venv python3.12-dev ffmpeg unzip libsndfile1 libportaudio2
python3.12 -m venv .venv
source .venv/bin/activate
python -m pip install --upgrade pip setuptools wheelWindows
安装 Python 3.12 x64 后创建虚拟环境:
py -3.12 -m venv .venv
.venv\Scripts\activate
python -m pip install --upgrade pip setuptools wheel按硬件选择依赖
| 硬件 | 安装方式 |
|---|---|
| CPU、AMD、Intel | 使用 requirments_cpu_py312.txt;Windows 可使用 DirectML,Linux 使用 CPU |
| NVIDIA RTX 50 系 | 先安装 CUDA 12.8 版 Torch,再安装 requirments_cu128_py312.txt |
| NVIDIA RTX 50 系以前 | 先安装 CUDA 11.8 版 Torch,再安装 requirments_cu118_py312.txt |
CPU、AMD、Intel
python -m pip install -r requirments_cpu_py312.txtNVIDIA RTX 50 系:两阶段安装
python -m pip install torch==2.7.1+cu128 torchaudio==2.7.1+cu128 \
--index-url https://download.pytorch.org/whl/cu128 \
--extra-index-url https://pypi.org/simple
python -m pip install -r requirments_cu128_py312.txtNVIDIA RTX 50 系以前:两阶段安装
python -m pip install torch==2.7.1+cu118 torchaudio==2.7.1+cu118 \
--index-url https://download.pytorch.org/whl/cu118 \
--extra-index-url https://pypi.org/simple
python -m pip install -r requirments_cu118_py312.txt检查 Torch 与 CUDA 状态:
python -c "import torch; print('torch:', torch.__version__); print('cuda:', torch.version.cuda); print('cuda available:', torch.cuda.is_available())"修改下载源
三个 requirments_*.txt 顶部已经包含下载源。中国大陆用户可保留默认镜像;需要使用官方源时,只替换 --index-url 和 --extra-index-url,保留包版本、CUDA 后缀和两阶段顺序。
| Default mirror | Official source |
|---|---|
https://mirrors.pku.edu.cn/pypi/simple |
https://pypi.org/simple |
https://mirrors.nju.edu.cn/pytorch/whl/cpu |
https://download.pytorch.org/whl/cpu |
https://mirrors.nju.edu.cn/pytorch/whl/cu118 |
https://download.pytorch.org/whl/cu118 |
https://mirrors.nju.edu.cn/pytorch/whl/cu128 |
https://download.pytorch.org/whl/cu128 |
模型与运行目录
WebUI 会自动创建运行目录。模型请从 Hugging Face 模型仓库 下载,并保持以下路径:
assets/
├── hubert_base/
│ ├── config.json
│ ├── preprocessor_config.json
│ └── pytorch_model.bin
├── rmvpe/rmvpe.pt
├── pretrained/
├── pretrained_v2/
├── pymss_weights/
├── weights/ # user RVC .pth models
└── indices/ # user .index files
logs/
└── mute/ # training silence samples
# Exact paths used by the code
assets/hubert_base/config.json
assets/hubert_base/preprocessor_config.json
assets/hubert_base/pytorch_model.bin
assets/rmvpe/rmvpe.pt
assets/pretrained/*.pth
assets/pretrained_v2/*.pth
assets/pymss_weights/*
assets/weights/*.pth
assets/indices/*.index
logs/mute/*下载模型
python -m pip install --upgrade huggingface_hub
# Required for inference and feature extraction
hf download lj1995/VoiceConversionWebUI --revision main \
--include "hubert_base/*" --local-dir assets
hf download lj1995/VoiceConversionWebUI rmvpe.pt --revision main \
--local-dir assets/rmvpe
# Required for v1/v2 training
hf download lj1995/VoiceConversionWebUI --revision main \
--include "pretrained/*" "pretrained_v2/*" --local-dir assets
hf download lj1995/VoiceConversionWebUI mute.zip --revision main \
--local-dir .model-downloads
python -m zipfile -e .model-downloads/mute.zip logs
# Required only for pymss/MSST vocal separation
hf download lj1995/VoiceConversionWebUI --revision main \
--include "pymss_weights/*" --local-dir assets仅 Windows AMD/Intel DirectML 环境还需要:
hf download lj1995/VoiceConversionWebUI rmvpe.onnx --revision main \
--local-dir assets/rmvpeFFmpeg
Ubuntu 已在前面的系统依赖命令中安装 FFmpeg。Windows 用户可把下面两个文件放到项目根目录:
开始使用
启动 WebUI:
python webui.py无桌面的 Ubuntu 服务器:
python webui.py --noautoopen默认服务监听端口为 7865。用户自己的 .pth 模型放入 assets/weights/,.index 文件放入 assets/indices/。
参考项目
- ContentVec
- VITS
- HIFIGAN
- Gradio
- FFmpeg
- Ultimate Vocal Remover
- pymss-project/pymss
- audio-slicer
- Vocal pitch extraction:RMVPE
感谢所有贡献者作出的努力
File: docs/tr/faiss_tips_tr.md
faiss Ayar İpuçları
==================
faiss Hakkında
faiss, yoğun vektörler için komşuluk aramalarının bir kütüphanesidir ve birçok yaklaşık komşuluk arama yöntemini verimli bir şekilde uygular. Facebook araştırma tarafından geliştirilen faiss, benzer vektörleri hızlı bir şekilde bulurken bazı doğruluğu feda eder.
RVC'de faiss Kullanımı
RVC'de, HuBERT tarafından dönüştürülen özelliklerin gömülmesi için eğitim verisinden oluşturulan gömme ile benzer gömlemeleri ararız ve bunları karıştırarak orijinal konuşmaya daha yakın bir dönüşüm elde ederiz. Ancak bu arama basitçe yapıldığında zaman alır, bu nedenle yaklaşık komşuluk araması kullanarak yüksek hızlı dönüşüm sağlanır.
Uygulama Genel Bakış
Modelin bulunduğu '/logs/your-experiment/3_feature256' dizininde, her ses verisinden HuBERT tarafından çıkarılan özellikler bulunur.
Buradan, dosya adına göre sıralanmış npy dosyalarını okuyarak vektörleri birleştirip büyük_npy'yi oluştururuz. (Bu vektörün şekli [N, 256] şeklindedir.)
Büyük_npy'yi /logs/your-experiment/total_fea.npy olarak kaydettikten sonra, onu faiss ile eğitiriz.
Bu makalede, bu parametrelerin anlamını açıklayacağım.
Yöntemin Açıklaması
İndeks Fabrikası
Bir indeks fabrikası, birden fazla yaklaşık komşuluk arama yöntemini bir dizi olarak bağlayan benzersiz bir faiss gösterimidir. Bu, indeks fabrikası dizesini değiştirerek basitçe çeşitli yaklaşık komşuluk arama yöntemlerini denemenizi sağlar.
RVC'de bunu şu şekilde kullanırız:
index = faiss.index_factory(256, "IVF%s,Flat" % n_ivf)index_factory'nin argümanları arasında ilk vektör boyutu, ikinci indeks fabrikası dizesi ve üçüncü kullanılacak mesafe yer alır.
Daha ayrıntılı gösterim için
https://github.com/facebookresearch/faiss/wiki/The-index-factory
Mesafe İçin İndeks
Aşağıdaki gibi gömme benzerliği olarak kullanılan iki tipik indeks bulunur.
- Öklidyen mesafe (METRIC_L2)
- iç çarpım (METRIC_INNER_PRODUCT)
Öklidyen mesafe, her boyutta karesel farkı alır, tüm boyutlardaki farkları toplar ve ardından karekök alır. Bu, günlük hayatta kullandığımız 2D ve 3D'deki mesafeye benzer.
İç çarpım, çoğunlukla L2 norm ile normalize edildikten sonra iç çarpımı alan ve genellikle kosinüs benzerliği olarak kullanılan bir benzerlik göstergesi olarak kullanılır.
Hangisinin daha iyi olduğu duruma bağlıdır, ancak kosinüs benzerliği genellikle word2vec tarafından elde edilen gömme ve ArcFace tarafından öğrenilen benzer görüntü alım modellerinde kullanılır. Vektör X'i numpy ile l2 normalize yapmak isterseniz, 0 bölme hatasından kaçınmak için yeterince küçük bir eps ile şu kodu kullanabilirsiniz:
X_normed = X / np.maximum(eps, np.linalg.norm(X, ord=2, axis=-1, keepdims=True))Ayrıca, indeks fabrikası için üçüncü argüman olarak geçirilecek değeri seçerek hesaplamada kullanılan mesafe indeksini değiştirebilirsiniz.
index = faiss.index_factory(dimention, text, faiss.METRIC_INNER_PRODUCT)IVF
IVF (Ters dosya indeksleri), tam metin aramasındaki ters indeksle benzer bir algoritmadır.
Öğrenme sırasında, arama hedefi kmeans ile kümelendirilir ve küme merkezi kullanılarak Voronoi bölütleme gerçekleştirilir. Her veri noktasına bir küme atanır, bu nedenle veri noktalarını kümeden arayan bir sözlük oluştururuz.
Örneğin, kümelere aşağıdaki gibi atanmışsa
| index | Cluster |
|---|---|
| 1 | A |
| 2 | B |
| 3 | A |
| 4 | C |
| 5 | B |
Elde edilen ters indeks şu şekildedir:
| cluster | index |
|---|---|
| A | 1, 3 |
| B | 2, 5 |
| C | 4 |
Arama yaparken, önce kümeden n_probe küme ararız ve ardından her küme için ait veri noktalarının mesafelerini hesaplarız.
Tavsiye Edilen Parametreler
Resmi olarak nasıl bir indeks seçileceği konusunda rehberler bulunmaktadır, bu nedenle buna uygun olarak açıklayacağım.
https://github.com/facebookresearch/faiss/wiki/Guidelines-to-choose-an-index
1M'den düşük veri kümeleri için, N sayısı için 4bit-PQ, Nisan 2023 itibariyle faiss'de mevcut en verimli yöntemdir.
Bunu IVF ile birleştirerek adayları 4bit-PQ ile daraltmak ve nihayet doğru bir indeksle mesafeyi yeniden hesaplamak, aşağıdaki indeks fabrikas
ını kullanarak açıklanabilir.
index = faiss.index_factory(256, "IVF1024,PQ128x4fs,RFlat")IVF İçin Tavsiye Edilen Parametreler
Çok sayıda IVF durumunu düşünün. Örneğin, veri sayısı için IVF tarafından kabaca nicelleme yapılırsa, bu basit bir tükenmez arama ile aynıdır ve verimsizdir.
1M veya daha az için IVF değerleri, N veri noktaları için 4sqrt(N) ~ 16sqrt(N) arasında tavsiye edilir.
Hesaplama süresi n_probes sayısına orantılı olarak arttığından, doğrulukla danışmanlık yapın ve uygun şekilde seçin. Kişisel olarak, RVC'nin bu kadar doğruluk gerektirmediğini düşünüyorum, bu nedenle n_probe = 1 uygundur.
FastScan
FastScan, bunları kaydedicilerde gerçekleştirerek onları Kartez ürünü nicelleme ile hızlı yaklaşık mesafe sağlayan bir yöntemdir.
Kartez ürünü nicelleme öğrenme sırasında her d boyut için (genellikle d = 2) kümeleme yapar, küme merkezlerini önceden hesaplar ve küme merkezleri arasındaki mesafeyi hesaplar ve bir arama tablosu oluşturur. Tahmin yaparken, her boyutun mesafesi arama tablosuna bakarak O(1) hesaplanabilir.
PQ sonrası belirttiğiniz sayı genellikle vektörün yarısı olan boyutu belirtir.
FastScan hakkında daha ayrıntılı açıklama için lütfen resmi belgelere başvurun.
https://github.com/facebookresearch/faiss/wiki/Fast-accumulation-of-PQ-and-AQ-codes-(FastScan)
RFlat
RFlat, FastScan ile hesaplanan kesirli mesafeyi indeks fabrikasının üçüncü argümanı tarafından belirtilen doğru mesafe ile yeniden hesaplamak için bir talimattır.
k komşuları alırken, k*k_factor nokta yeniden hesaplanır.
File: docs/tr/faq_tr.md
Q1: FFmpeg Hatası/UTF8 Hatası
Büyük olasılıkla bu bir FFmpeg sorunu değil, daha çok ses dosyası yolunda bir sorun;
FFmpeg, boşluklar ve () gibi özel karakterler içeren yolları okurken bir hata ile karşılaşabilir; ve eğitim setinin ses dosyaları Çin karakterleri içeriyorsa, bunlar filelist.txt'ye yazıldığında utf8 hatasına neden olabilir.
Q2: "Tek Tıklamayla Eğitim" Sonrası İndeks Dosyası Bulunamıyor
Eğer "Eğitim tamamlandı. Program kapatıldı." mesajını görüyorsa, model başarıyla eğitilmiş demektir ve sonraki hatalar sahte;
"Added" dizini oluşturulduğu halde "Tek Tıklamayla Eğitim" sonrası indeks dosyası bulunamıyorsa, bu genellikle eğitim setinin çok büyük olmasından kaynaklanabilir ve indeksin eklenmesi sıkışabilir. Bu sorun indeks eklerken bellek yükünü azaltmak için toplu işlem yaparak çözülmüştür. Geçici bir çözüm olarak, "Eğitim İndeksini Eğit" düğmesine tekrar tıklamayı deneyin.
Q3: Eğitim Sonrası "Tonlama İnceleniyor" Bölümünde Model Bulunamıyor
"Lanetleme İstemi Listesini Yenile" düğmesine tıklayarak tekrar kontrol edin; hala görünmüyorsa, eğitim sırasında herhangi bir hata olup olmadığını kontrol edin ve geliştiricilere daha fazla analiz için konsol, web arayüzü ve logs/experiment_name/*.log ekran görüntülerini gönderin.
Q4: Bir Model Nasıl Paylaşılır/Başkalarının Modelleri Nasıl Kullanılır?
rvc_root/logs/experiment_name dizininde saklanan pth dosyaları paylaşım veya çıkarım için değildir, bunlar deney checkpoint'larıdır ve çoğaltılabilirlik ve daha fazla eğitim için saklanır. Paylaşılacak olan model, weights klasöründeki 60+MB'lık pth dosyası olmalıdır;
Gelecekte, weights/exp_name.pth ve logs/exp_name/added_xxx.index birleştirilerek tek bir weights/exp_name.zip dosyasına dönüştürülecek ve manuel indeks girişi gereksinimini ortadan kaldıracaktır; bu nedenle pth dosyasını değil, farklı bir makinede eğitime devam etmek istemezseniz zip dosyasını paylaşın;
Çıkarılmış modelleri zorlama çıkarım için logs klasöründen weights klasörüne birkaç yüz MB'lık pth dosyalarını kopyalamak/paylaşmak, eksik f0, tgt_sr veya diğer anahtarlar gibi hatalara neden olabilir. Smaller modeli manuel veya otomatik olarak çıkarmak için alttaki ckpt sekmesini kullanmanız gerekmektedir (eğer bilgi logs/exp_name içinde bulunuyorsa), pitch bilgisini ve hedef ses örnekleme oranı seçeneklerini seçmeli ve ardından daha küçük modele çıkarmalısınız. Çıkardıktan sonra weights klasöründe 60+ MB'lık bir pth dosyası olacaktır ve sesleri yeniden güncelleyebilirsiniz.
Q5: Bağlantı Hatası
Büyük ihtimalle konsolu (siyah komut satırı penceresi) kapatmış olabilirsiniz.
Q6: Web Arayüzünde 'Beklenen Değer: Satır 1 Sütun 1 (Karakter 0)' Hatası
Lütfen sistem LAN proxy/global proxy'sini devre dışı bırakın ve ardından sayfayı yenileyin.
Q7: WebUI Olmadan Nasıl Eğitim Yapılır ve Tahmin Yapılır?
Eğitim komut dosyası:
Önce WebUI'de eğitimi çalıştırabilirsiniz, ardından veri seti önişleme ve eğitiminin komut satırı sürümleri mesaj penceresinde görüntülenecektir.
Tahmin komut dosyası:
https://huggingface.co/lj1995/VoiceConversionWebUI/blob/main/myinfer.py
örn:
runtime\python.exe myinfer.py 0 "E:\codes\py39\RVC-beta\todo-songs\1111.wav" "E:\codes\py39\logs\mi-test\added_IVF677_Flat_nprobe_7.index" harvest "test.wav" "weights/mi-test.pth" 0.6 cuda:0 True
f0up_key=sys.argv[1]
input_path=sys.argv[2]
index_path=sys.argv[3]
f0method=sys.argv[4]#harvest or pm
opt_path=sys.argv[5]
model_path=sys.argv[6]
index_rate=float(sys.argv[7])
device=sys.argv[8]
is_half=bool(sys.argv[9])
Q8: Cuda Hatası/Cuda Bellek Yetersizliği
Küçük bir ihtimalle CUDA konfigürasyonunda bir problem olabilir veya cihaz desteklenmiyor olabilir; daha muhtemel olarak yetersiz bellek olabilir (bellek yetersizliği).
Eğitim için toplu işlem boyutunu azaltın (1'e indirgemek yeterli değilse, grafik kartını değiştirmeniz gerekebilir); çıkarım için ise config.py dosyasındaki x_pad, x_query, x_center ve x_max ayarlarını ihtiyaca göre düzenleyin. 4GB veya daha düşük bellekli kartlar (örneğin 1060(3G) ve çeşit
li 2GB kartlar) terk edilebilir, 4GB bellekli kartlar hala bir şansı vardır.
Q9: Optimal Olarak Kaç total_epoch Gerekli?
Eğitim veri setinin ses kalitesi düşük ve gürültü seviyesi yüksekse, 20-30 dönem yeterlidir. Fazla yüksek bir değer belirlemek, düşük kaliteli eğitim setinizin ses kalitesini artırmaz.
Eğitim setinin ses kalitesi yüksek, gürültü seviyesi düşük ve yeterli süre varsa, bu değeri artırabilirsiniz. 200 kabul edilebilir bir değerdir (çünkü eğitim hızlıdır ve yüksek kaliteli bir eğitim seti hazırlayabiliyorsanız, GPU'nuz muhtemelen uzun bir eğitim süresini sorunsuz bir şekilde yönetebilir).
Q10: Kaç Dakika Eğitim Verisi Süresi Gerekli?
10 ila 50 dakika arası bir veri seti önerilir.
Garantili yüksek ses kalitesi ve düşük arka plan gürültüsü varsa, veri setinin tonlaması homojen ise daha fazlası eklenebilir.
Yüksek seviyede bir eğitim seti (zarif ve belirgin tonlama), 5 ila 10 dakika arası uygundur.
1 ila 2 dakika veri ile başarılı bir şekilde eğitim yapan bazı insanlar olsa da, başarı diğerleri tarafından tekrarlanabilir değil ve çok bilgilendirici değil. Bu, eğitim setinin çok belirgin bir tonlamaya sahip olmasını (örneğin yüksek frekansta havadar bir anime kız sesi gibi) ve ses kalitesinin yüksek olmasını gerektirir; 1 dakikadan daha kısa süreli veri denenmemiştir ve önerilmez.
Q11: İndeks Oranı Nedir ve Nasıl Ayarlanır?
Eğer önceden eğitilmiş model ve tahmin kaynağının ton kalitesi, eğitim setinden daha yüksekse, tahmin sonucunun ton kalitesini yükseltebilirler, ancak altta yatan modelin/tahmin kaynağının tonu yerine eğitim setinin tonuna yönelik olası bir ton önyargısıyla sonuçlanır, bu genellikle "ton sızıntısı" olarak adlandırılır.
İndeks oranı, ton sızıntı sorununu azaltmak/çözmek için kullanılır. İndeks oranı 1 olarak ayarlandığında, teorik olarak tahmin kaynağından ton sızıntısı olmaz ve ton kalitesi daha çok eğitim setine yönelik olur. Eğer eğitim seti, tahmin kaynağından daha düşük ses kalitesine sahipse, daha yüksek bir indeks oranı ses kalitesini azaltabilir. Oranı 0'a düşürmek, eğitim seti tonlarını korumak için getirme karıştırmasını kullanmanın etkisine sahip değildir.
Eğer eğitim seti iyi ses kalitesine ve uzun süreye sahipse, total_epoch'u artırın. Model, tahmin kaynağına ve önceden eğitilmiş alt modeline daha az başvurduğunda ve "ton sızıntısı" daha az olduğunda, indeks oranı önemli değil ve hatta indeks dosyası oluşturmak/paylaşmak gerekli değildir.
Q12: Tahmin Yaparken Hangi GPU'yu Seçmeli?
config.py dosyasında "device cuda:" ardından kart numarasını seçin.
Kart numarası ile grafik kartı arasındaki eşleme, eğitim sekmesinin grafik kartı bilgileri bölümünde görülebilir.
Q13: Eğitimin Ortasında Kaydedilen Model Nasıl Kullanılır?
Kaydetme işlemini ckpt işleme sekmesinin altında yer alan model çıkarımı ile yapabilirsiniz.
Q14: Dosya/Bellek Hatası (Eğitim Sırasında)?
Çok fazla işlem ve yetersiz bellek olabilir. Bu sorunu düzeltebilirsiniz:
"CPU İş Parçacıkları" alanındaki girişi azaltarak.
Eğitim verisini daha kısa ses dosyalarına önceden keserek.
Q15: Daha Fazla Veri Kullanarak Eğitime Nasıl Devam Edilir?
Adım 1: Tüm wav verilerini path2 dizinine yerleştirin.
Adım 2: exp_name2+path2 -> veri setini önişleme ve özellik çıkarma.
Adım 3: exp_name1 (önceki deneyinizin) en son G ve D dosyalarını exp_name2 klasörüne kopyalayın.
Adım 4: "modeli eğit" düğmesine tıklayın ve önceki deneyinizin model döneminden başlayarak eğitime devam edecektir.
File: docs/tr/README.tr.md
Değişiklik Geçmişi | SSS (Sıkça Sorulan Sorular)
İngilizce | 中文简体 | 日本語 | 한국어 (韓國語) | Français | Türkçe | Português
Burada Demo Video'muzu izleyebilirsiniz!
RVC Kullanarak Gerçek Zamanlı Ses Dönüşüm Yazılımı: w-okada/voice-changer
Ön eğitim modeli için veri kümesi neredeyse 50 saatlik yüksek kaliteli VCTK açık kaynak veri kümesini kullanır.
Yüksek kaliteli lisanslı şarkı veri setleri telif hakkı ihlali olmadan kullanımınız için eklenecektir.
Lütfen daha büyük parametrelere, daha fazla eğitim verisine sahip RVCv3'ün ön eğitimli temel modeline göz atın; daha iyi sonuçlar, değişmeyen çıkarsama hızı ve daha az eğitim verisi gerektirir.
Özet
Bu depo aşağıdaki özelliklere sahiptir:
- Ton sızıntısını en aza indirmek için kaynak özelliğini en iyi çıkarımı kullanarak eğitim kümesi özelliği ile değiştirme;
- Kolay ve hızlı eğitim, hatta nispeten zayıf grafik kartlarında bile;
- Az miktarda veriyle bile nispeten iyi sonuçlar alın (>=10 dakika düşük gürültülü konuşma önerilir);
- Timbraları değiştirmek için model birleştirmeyi destekleme (ckpt işleme sekmesi-> ckpt birleştir);
- Kullanımı kolay Web arayüzü;
- pymss/MSST modelini kullanarak hızla vokalleri ve enstrümanları ayırma.
- En güçlü Yüksek tiz Ses Çıkarma Algoritması InterSpeech2023-RMVPE sessiz ses sorununu önlemek için kullanılır. En iyi sonuçları (önemli ölçüde) sağlar ve Crepe_full'den daha hızlı çalışır, hatta daha düşük kaynak tüketimi sağlar.
- AMD/Intel sistemleri CPU bağımlılıklarını kullanır; Windows DirectML, Linux CPU kullanabilir.
Ortamın Hazırlanması
Bu dal Python 3.12 x64 için hazırlanmıştır. Tüm komutları depo kökünde çalıştırın. Ubuntu 24.04 x86_64 önerilir.
Ubuntu 24.04
sudo apt update
sudo apt install -y python3.12 python3.12-venv python3.12-dev ffmpeg unzip libsndfile1 libportaudio2
python3.12 -m venv .venv
source .venv/bin/activate
python -m pip install --upgrade pip setuptools wheelWindows
Python 3.12 x64 kurduktan sonra sanal ortam oluşturun:
py -3.12 -m venv .venv
.venv\Scripts\activate
python -m pip install --upgrade pip setuptools wheelDonanıma göre bağımlılık seçimi
| Donanım | Kurulum |
|---|---|
| CPU, AMD, Intel | requirments_cpu_py312.txt kullanın; Windows DirectML, Linux CPU kullanabilir |
| NVIDIA RTX 50 serisi | Önce CUDA 12.8 Torch, ardından requirments_cu128_py312.txt |
| RTX 50 serisinden önceki NVIDIA | Önce CUDA 11.8 Torch, ardından requirments_cu118_py312.txt |
CPU, AMD, Intel
python -m pip install -r requirments_cpu_py312.txtNVIDIA RTX 50 serisi: iki aşama
python -m pip install torch==2.7.1+cu128 torchaudio==2.7.1+cu128 \
--index-url https://download.pytorch.org/whl/cu128 \
--extra-index-url https://pypi.org/simple
python -m pip install -r requirments_cu128_py312.txtRTX 50 serisinden önceki NVIDIA: iki aşama
python -m pip install torch==2.7.1+cu118 torchaudio==2.7.1+cu118 \
--index-url https://download.pytorch.org/whl/cu118 \
--extra-index-url https://pypi.org/simple
python -m pip install -r requirments_cu118_py312.txtTorch ve CUDA durumunu doğrulayın:
python -c "import torch; print('torch:', torch.__version__); print('cuda:', torch.version.cuda); print('cuda available:', torch.cuda.is_available())"Paket kaynakları
Üç requirments_*.txt dosyasının başında paket kaynakları yer alır. Resmî kaynakları kullanmak için yalnızca --index-url ve --extra-index-url satırlarını değiştirin; sürümleri, CUDA eklerini ve iki aşamalı sırayı koruyun.
| Default mirror | Official source |
|---|---|
https://mirrors.pku.edu.cn/pypi/simple |
https://pypi.org/simple |
https://mirrors.nju.edu.cn/pytorch/whl/cpu |
https://download.pytorch.org/whl/cpu |
https://mirrors.nju.edu.cn/pytorch/whl/cu118 |
https://download.pytorch.org/whl/cu118 |
https://mirrors.nju.edu.cn/pytorch/whl/cu128 |
https://download.pytorch.org/whl/cu128 |
Modeller ve çalışma dizinleri
WebUI çalışma dizinlerini otomatik oluşturur. Modelleri Hugging Face model deposundan indirin ve şu yapıyı koruyun:
assets/
├── hubert_base/
│ ├── config.json
│ ├── preprocessor_config.json
│ └── pytorch_model.bin
├── rmvpe/rmvpe.pt
├── pretrained/
├── pretrained_v2/
├── pymss_weights/
├── weights/ # user RVC .pth models
└── indices/ # user .index files
logs/
└── mute/ # training silence samples
# Exact paths used by the code
assets/hubert_base/config.json
assets/hubert_base/preprocessor_config.json
assets/hubert_base/pytorch_model.bin
assets/rmvpe/rmvpe.pt
assets/pretrained/*.pth
assets/pretrained_v2/*.pth
assets/pymss_weights/*
assets/weights/*.pth
assets/indices/*.index
logs/mute/*Modelleri indirme
python -m pip install --upgrade huggingface_hub
# Required for inference and feature extraction
hf download lj1995/VoiceConversionWebUI --revision main \
--include "hubert_base/*" --local-dir assets
hf download lj1995/VoiceConversionWebUI rmvpe.pt --revision main \
--local-dir assets/rmvpe
# Required for v1/v2 training
hf download lj1995/VoiceConversionWebUI --revision main \
--include "pretrained/*" "pretrained_v2/*" --local-dir assets
hf download lj1995/VoiceConversionWebUI mute.zip --revision main \
--local-dir .model-downloads
python -m zipfile -e .model-downloads/mute.zip logs
# Required only for pymss/MSST vocal separation
hf download lj1995/VoiceConversionWebUI --revision main \
--include "pymss_weights/*" --local-dir assetsWindows AMD/Intel DirectML ortamlarında ayrıca şu dosya gerekir:
hf download lj1995/VoiceConversionWebUI rmvpe.onnx --revision main \
--local-dir assets/rmvpeFFmpeg
Yukarıdaki Ubuntu komutu FFmpeg'i kurar. Windows'ta şu dosyaları depo köküne yerleştirin:
WebUI'yi başlatma
python webui.pyGrafik arayüzü olmayan Ubuntu sunucusu:
python webui.py --noautoopenVarsayılan bağlantı noktası 7865'tir. .pth modellerini assets/weights/, .index dosyalarını assets/indices/ içine yerleştirin.
Krediler
- ContentVec
- VITS
- HIFIGAN
- Gradio
- FFmpeg
- Ultimate Vocal Remover
- pymss-project/pymss
- audio-slicer
- Vokal ton çıkarma:RMVPE
Katkıda Bulunan Herkese Teşekkürler
File: docs/tr/training_tips_tr.md
RVC Eğitimi için Talimatlar ve İpuçları
======================================
Bu TALİMAT, veri eğitiminin nasıl yapıldığını açıklamaktadır.
Eğitim Akışı
Eğitim sekmesindeki adımları takip ederek açıklayacağım.
Adım 1
Deney adını burada belirleyin.
Ayrıca burada modelin pitch'i dikkate alıp almayacağını da belirleyebilirsiniz.
Eğer model pitch'i dikkate almazsa, model daha hafif olacak, ancak şarkı söyleme için uygun olmayacaktır.
Her deney için veriler /logs/your-experiment-name/ dizinine yerleştirilir.
Adım 2a
Ses yüklenir ve ön işleme yapılır.
Ses Yükleme
Ses içeren bir klasör belirtirseniz, bu klasördeki ses dosyaları otomatik olarak okunur.
Örneğin, C:Users\hoge\voices belirtirseniz, C:Users\hoge\voices\voice.mp3 yüklenecek, ancak C:Users\hoge\voices\dir\voice.mp3 yüklenmeyecektir.
Ses okumak için dahili olarak ffmpeg kullanıldığından, uzantı ffmpeg tarafından destekleniyorsa otomatik olarak okunacaktır.
ffmpeg ile int16'ya dönüştürüldükten sonra float32'ye dönüştürülüp -1 ile 1 arasında normalize edilir.
Gürültü Temizleme
Ses scipy'nin filtfilt işlevi ile yumuşatılır.
Ses Ayırma
İlk olarak, giriş sesi belirli bir süreden (max_sil_kept=5 saniye?) daha uzun süren sessiz kısımları tespit ederek böler. Sessizlik üzerinde ses bölündükten sonra sesi 4 saniyede bir 0.3 saniyelik bir örtüşme ile böler. 4 saniye içinde ayrılan sesler için ses normalleştirildikten sonra wav dosyası olarak /logs/your-experiment-name/0_gt_wavs'a, ardından 16 kHz örnekleme hızına dönüştürülerek /logs/your-experiment-name/1_16k_wavs olarak kaydedilir.
Adım 2b
Pitch Çıkarımı
Wav dosyalarından pitch bilgisi çıkarılır. ParSelMouth veya PyWorld'e dahili olarak yerleştirilmiş yöntemi kullanarak pitch bilgisi (=f0) çıkarılır ve /logs/your-experiment-name/2a_f0 dizinine kaydedilir. Ardından pitch bilgisi logaritmik olarak 1 ile 255 arasında bir tamsayıya dönüştürülüp /logs/your-experiment-name/2b-f0nsf dizinine kaydedilir.
Özellik Çıkarımı
HuBERT'i kullanarak önceden gömme olarak wav dosyasını çıkarır. /logs/your-experiment-name/1_16k_wavs'a kaydedilen wav dosyasını okuyarak, wav dosyasını 256 boyutlu HuBERT özelliklerine dönüştürür ve npy formatında /logs/your-experiment-name/3_feature256 dizinine kaydeder.
Adım 3
Modeli eğit.
Başlangıç Seviyesi Sözlüğü
Derin öğrenmede, veri kümesi bölmeye ve öğrenmeye adım adım devam eder. Bir model güncellemesinde (adım), batch_size veri alınır ve tahminler ve hata düzeltmeleri yapılır. Bunun bir defa bir veri kümesi için yapılması bir dönem olarak sayılır.
Bu nedenle, öğrenme zamanı adım başına öğrenme zamanı x (veri kümesindeki veri sayısı / batch boyutu) x dönem sayısıdır. Genel olarak, batch boyutu ne kadar büyükse, öğrenme daha istikrarlı hale gelir (adım başına öğrenme süresi ÷ batch boyutu) küçülür, ancak daha fazla GPU belleği kullanır. GPU RAM'ı nvidia-smi komutu ile kontrol edilebilir. Çalışma ortamının makinesine göre batch boyutunu mümkün olduğunca artırarak öğrenme süresini kısa sürede yapabilirsiniz.
Önceden Eğitilmiş Modeli Belirtme
RVC, modeli 0'dan değil önceden eğitilmiş ağırlıklardan başlatarak eğitir, bu nedenle küçük bir veri kümesi ile eğitilebilir.
Varsayılan olarak
- Eğer pitch'i dikkate alıyorsanız,
rvc-location/pretrained/f0G40k.pthvervc-location/pretrained/f0D40k.pthyüklenir. - Eğer pitch'i dikkate almıyorsanız, yine
rvc-location/pretrained/f0G40k.pthvervc-location/pretrained/f0D40k.pthyüklenir.
Öğrenirken model parametreleri her save_every_epoch için logs/your-experiment-name/G_{}.pth ve logs/your-experiment-name/D_{}.pth olarak kaydedilir, ancak bu yolu belirterek öğrenmeye başlayabilirsiniz. Farklı bir deneyde öğrenilen model ağırlıklarından öğrenmeye yeniden başlayabilir veya eğitimi başlatabilirsiniz.
Öğrenme İndeksi
RVC, eğitim sırasında kullanılan HuBERT özellik değerlerini kaydeder ve çıkarım sırasında, öğrenme sırasında kullanılan özellik değerlerine benzer özellik değerlerini arayarak çıkarım yapar. Bu aramayı yüksek hızda gerçekleştirebilmek için indeks öğrenilir.
İndeks öğrenimi için yaklaş
ık komşuluk arama kütüphanesi faiss kullanılır. /logs/your-experiment-name/3_feature256'daki özellik değerini okur ve indeksi öğrenmek için kullanır, logs/your-experiment-name/add_XXX.index olarak kaydedilir.
(20230428 güncelleme sürümünden itibaren indeks okunur ve kaydetmek/belirtmek artık gerekli değildir.)
Düğme Açıklaması
- Modeli Eğit: Adım 2b'yi çalıştırdıktan sonra, modeli eğitmek için bu düğmeye basın.
- Özellik İndeksini Eğit: Modeli eğittikten sonra, indeks öğrenme işlemi yapın.
- Tek Tıklamayla Eğitim: Adım 2b, model eğitimi ve özellik indeks eğitimini bir arada yapar.
File: docs/pt/faiss_tips_pt.md
pONTAS de afinação FAISS
sobre faiss
faiss é uma biblioteca de pesquisas de vetores densos na área, desenvolvida pela pesquisa do facebook, que implementa com eficiência muitos métodos de pesquisa de área aproximada.
A Pesquisa Aproximada de área encontra vetores semelhantes rapidamente, sacrificando alguma precisão.
faiss em RVC
No RVC, para a incorporação de recursos convertidos pelo HuBERT, buscamos incorporações semelhantes à incorporação gerada a partir dos dados de treinamento e as misturamos para obter uma conversão mais próxima do discurso original. No entanto, como essa pesquisa leva tempo se realizada de forma ingênua, a conversão de alta velocidade é realizada usando a pesquisa aproximada de área.
visão geral da implementação
Em '/logs/nome-do-seu-modelo/3_feature256', onde o modelo está localizado, os recursos extraídos pelo HuBERT de cada dado de voz estão localizados.
A partir daqui, lemos os arquivos npy ordenados por nome de arquivo e concatenamos os vetores para criar big_npy. (Este vetor tem a forma [N, 256].)
Depois de salvar big_npy as /logs/nome-do-seu-modelo/total_fea.npy, treine-o com faiss.
Neste artigo, explicarei o significado desses parâmetros.
Explicação do método
Fábrica de Index
Uma fábrica de Index é uma notação faiss exclusiva que expressa um pipeline que conecta vários métodos de pesquisa de área aproximados como uma string.
Isso permite que você experimente vários métodos aproximados de pesquisa de área simplesmente alterando a cadeia de caracteres de fábrica do Index.
No RVC é usado assim:
index = faiss.index_factory(256, "IVF%s,Flat" % n_ivf)Entre os argumentos de index_factory, o primeiro é o número de dimensões do vetor, o segundo é a string de fábrica do Index e o terceiro é a distância a ser usada.
Para uma notação mais detalhada
https://github.com/facebookresearch/faiss/wiki/The-index-factory
Construção de Index
Existem dois Indexs típicos usados como similaridade de incorporação da seguinte forma.
- Distância euclidiana (MÉTRICA_L2)
- Produto interno (METRIC_INNER_PRODUCT)
A distância euclidiana toma a diferença quadrática em cada dimensão, soma as diferenças em todas as dimensões e, em seguida, toma a raiz quadrada. Isso é o mesmo que a distância em 2D e 3D que usamos diariamente.
O produto interno não é usado como um Index de similaridade como é, e a similaridade de cosseno que leva o produto interno depois de ser normalizado pela norma L2 é geralmente usada.
O que é melhor depende do caso, mas a similaridade de cosseno é frequentemente usada na incorporação obtida pelo word2vec e modelos de recuperação de imagem semelhantes aprendidos pelo ArcFace. Se você quiser fazer a normalização l2 no vetor X com numpy, você pode fazê-lo com o seguinte código com eps pequeno o suficiente para evitar a divisão 0.
X_normed = X / np.maximum(eps, np.linalg.norm(X, ord=2, axis=-1, keepdims=True))Além disso, para a Construção de Index, você pode alterar o Index de distância usado para cálculo escolhendo o valor a ser passado como o terceiro argumento.
index = faiss.index_factory(dimention, text, faiss.METRIC_INNER_PRODUCT)FI
IVF (Inverted file indexes) é um algoritmo semelhante ao Index invertido na pesquisa de texto completo.
Durante o aprendizado, o destino da pesquisa é agrupado com kmeans e o particionamento Voronoi é realizado usando o centro de cluster. A cada ponto de dados é atribuído um cluster, por isso criamos um dicionário que procura os pontos de dados dos clusters.
Por exemplo, se os clusters forem atribuídos da seguinte forma
| index | Cluster |
|---|---|
| 1 | A |
| 2 | B |
| 3 | A |
| 4 | C |
| 5 | B |
O Index invertido resultante se parece com isso:
| cluster | Index |
|---|---|
| A | 1, 3 |
| B | 2 5 |
| C | 4 |
Ao pesquisar, primeiro pesquisamos n_probe clusters dos clusters e, em seguida, calculamos as distâncias para os pontos de dados pertencentes a cada cluster.
Parâmetro de recomendação
Existem diretrizes oficiais sobre como escolher um Index, então vou explicar de
acordo. https://github.com/facebookresearch/faiss/wiki/Guidelines-to-choose-an-index
Para conjuntos de dados abaixo de 1M, o 4bit-PQ é o método mais eficiente disponível no faiss em abril de 2023.
Combinando isso com a fertilização in vitro, estreitando os candidatos com 4bit-PQ e, finalmente, recalcular a distância com um Index preciso pode ser descrito usando a seguinte fábrica de Indexs.
index = faiss.index_factory(256, "IVF1024,PQ128x4fs,RFlat")Parâmetros recomendados para FIV
Considere o caso de muitas FIVs. Por exemplo, se a quantização grosseira por FIV for realizada para o número de dados, isso é o mesmo que uma pesquisa exaustiva ingênua e é ineficiente.
Para 1M ou menos, os valores de FIV são recomendados entre 4sqrt(N) ~ 16sqrt(N) para N número de pontos de dados.
Como o tempo de cálculo aumenta proporcionalmente ao número de n_sondas, consulte a precisão e escolha adequadamente. Pessoalmente, não acho que o RVC precise de tanta precisão, então n_probe = 1 está bem.
FastScan
O FastScan é um método que permite a aproximação de alta velocidade de distâncias por quantização de produto cartesiano, realizando-as em registros.
A quantização cartesiana do produto executa o agrupamento independentemente para cada dimensão d (geralmente d = 2) durante o aprendizado, calcula a distância entre os agrupamentos com antecedência e cria uma tabela de pesquisa. No momento da previsão, a distância de cada dimensão pode ser calculada em O(1) olhando para a tabela de pesquisa.
Portanto, o número que você especifica após PQ geralmente especifica metade da dimensão do vetor.
Para uma descrição mais detalhada do FastScan, consulte a documentação oficial.
https://github.com/facebookresearch/faiss/wiki/Fast-accumulation-of-PQ-and-AQ-codes-(FastScan)
RFlat
RFlat é uma instrução para recalcular a distância aproximada calculada pelo FastScan com a distância exata especificada pelo terceiro argumento da Construção de Index.
Ao obter áreas k, os pontos k*k_factor são recalculados.
File: docs/pt/faq_pt.md
**FAQ AI HUB BRASIL**
O que é epoch, quantos utilizar, quanto de dataset utilizar e qual à configuração interessante?
Epochs basicamente quantas vezes o seu dataset foi treinado.
Recomendado ler Q8 e Q9 no final dessa página pra entender mais sobre dataset e epochs
Não é uma regra, mas opinião:
**Mangio-Crepe Hop Length**
- 64 pra cantores e dubladores
- 128(padrão) para os demais (editado)
**Epochs e dataset**
600epoch para cantores - --dataset entre 10 e 50 min desnecessario mais que 50 minutos--
300epoch para os demais - --dataset entre 10 e 50 min desnecessario mais que 50 minutos--
**Tom**
magio-crepe se for audios extraído de alguma musica
harvest se for de estúdio
O que é index?
Basicamente o que define o sotaque. Quanto maior o numero, mas próximo o sotaque fica do original. Porém, quando o modelo é bem, não é necessário um index.
O que significa cada sigla (pm, harvest, crepe, magio-crepe, RMVPE)?
- pm = extração mais rápida, mas discurso de qualidade inferior;
- harvest = graves melhores, mas extremamente lentos;
- dio = conversão rápida mas pitch ruim;
- crepe = melhor qualidade, mas intensivo em GPU;
- crepe-tiny = mesma coisa que o crepe, só que com a qualidade um pouco inferior;
- mangio-crepe = melhor qualidade, mais otimizado; (MELHOR OPÇÃO)
- mangio-crepe-tiny = mesma coisa que o mangio-crepe, só que com a qualidade um pouco inferior;
- RMVPE: um modelo robusto para estimativa de afinação vocal em música polifônica;
Pra rodar localmente, quais os requisitos minimos?
Já tivemos relatos de pessoas com GTX 1050 rodando inferencia, se for treinar numa 1050 vai demorar muito mesmo e inferior a isso, normalmente da tela azul
O mais importante é placa de vídeo, vram na verdade
Se você tiver 4GB ou mais, você tem uma chance.
NOS DOIS CASOS NÃO É RECOMENDADO UTILIZAR O PC ENQUANTO ESTÁ UTILIZNDO, CHANCE DE TELA AZUL É ALTA
Inference
Não é algo oficial para requisitos minimos
- Placa de vídeo: nvidia de 4gb
- Memoria ram: 8gb
- CPU: ?
- Armanezamento: 20gb (sem modelos)
Treinamento de voz
Não é algo oficial para requisitos minimos
- Placa de vídeo: nvidia de 6gb
- Memoria ram: 16gb
- CPU: ?
- Armanezamento: 20gb (sem modelos)
Limite de GPU no Google Colab excedido, apenas CPU o que fazer?
Recomendamos esperar outro dia pra liberar mais 15gb ou 12 horas pra você. Ou você pode contribuir com o Google pagando algum dos planos, ai aumenta seu limite.
Utilizar apenas CPU no Google Colab demora DEMAIS.
Google Colab desconectando com muita frequencia, o que fazer?
Neste caso realmente não tem muito o que fazer. Apenas aguardar o proprietário do código corrigir ou a gente do AI HUB Brasil achar alguma solução. Isso acontece por diversos motivos, um incluindo a Google barrando o treinamento de voz.
O que é Batch Size/Tamanho de lote e qual numero utilizar?
Batch Size/Tamanho do lote é basicamente quantos epoch faz ao mesmo tempo. Se por 20, ele fazer 20 epoch ao mesmo tempo e isso faz pesar mais na máquina e etc.
No Google Colab você pode utilizar até 20 de boa.
Se rodando localmente, depende da sua placa de vídeo, começa por baixo (6) e vai testando.
Sobre backup na hora do treinamento
Backup vai de cada um. Eu quando uso a easierGUI utilizo a cada 100 epoch (meu caso isolado).
No colab, se instavel, coloque a cada 10 epoch
Recomendo utilizarem entre 25 e 50 pra garantir.
Lembrando que cada arquivo geral é por volta de 50mb, então tenha muito cuidado quanto você coloca. Pois assim pode acabar lotando seu Google Drive ou seu PC.
Depois de finalizado, da pra apagar os epoch de backup.
Como continuar da onde parou pra fazer mais epochs?
Primeira coisa que gostaria de lembrar, não necessariamente quanto mais epochs melhor. Se fizer epochs demais vai dar overtraining o que pode ser ruim.
GUI NORMAL
- Inicie normalmente a GUI novamente.
- Na aba de treino utilize o MESMO nome que estava treinando, assim vai continuar o treino onde parou o ultimo backup.
- Ignore as opções
Processar o Conjunto de dadoseExtrair Tom - Antes de clicar pra treinar, arrume os epoch, bakcup e afins.
- Obviamente tem que ser um numero maior do qu estava em epoch.
- Backup você pode aumentar ou diminuir
- Agora você vai ver a opção
Carregue o caminho G do modelo base pré-treinado:eCarregue o caminho D do modelo base pré-treinado:
-Aqui você vai por o caminho dos modelos que estão em./logs/minha-voz
- Vai ficar algo parecido com issoe:/RVC/logs/minha-voz/G_0000.pthee:/RVC/logs/minha-voz/D_0000.pth
-Coloque pra treinar
Lembrando que a pasta logs tem que ter todos os arquivos e não somente o arquivo G e D
EasierGUI
- Inicie normalmente a easierGUI novamente.
- Na aba de treino utilize o MESMO nome que estava treinando, assim vai continuar o treino onde parou o ultimo backup.
- Selecione 'Treinar modelo', pode pular os 2 primeiros passos já que vamos continuar o treino.
**FAQ Original traduzido**
**Q1: erro ffmpeg/erro utf8.**
Provavelmente não é um problema do FFmpeg, mas sim um problema de caminho de áudio;
O FFmpeg pode encontrar um erro ao ler caminhos contendo caracteres especiais como spaces e (), o que pode causar um erro FFmpeg; e quando o áudio do conjunto de treinamento contém caminhos chineses, gravá-lo em filelist.txt pode causar um erro utf8.
**Q2:Não é possível encontrar o arquivo de Index após "Treinamento com um clique".**
Se exibir "O treinamento está concluído. O programa é fechado ", então o modelo foi treinado com sucesso e os erros subsequentes são falsos;
A falta de um arquivo de index 'adicionado' após o treinamento com um clique pode ser devido ao conjunto de treinamento ser muito grande, fazendo com que a adição do index fique presa; isso foi resolvido usando o processamento em lote para adicionar o index, o que resolve o problema de sobrecarga de memória ao adicionar o index. Como solução temporária, tente clicar no botão "Treinar Index" novamente.
**Q3:Não é possível encontrar o modelo em “Modelo de voz” após o treinamento**
Clique em "Atualizar lista de voz" ou "Atualizar na EasyGUI e verifique novamente; se ainda não estiver visível, verifique se há erros durante o treinamento e envie capturas de tela do console, da interface do usuário da Web e dos logs/experiment_name/*.log para os desenvolvedores para análise posterior.
**Q4:Como compartilhar um modelo/Como usar os modelos dos outros?**
Os arquivos .pth armazenados em */logs/minha-voz não são destinados para compartilhamento ou inference, mas para armazenar os checkpoits do experimento para reprodutibilidade e treinamento adicional. O modelo a ser compartilhado deve ser o arquivo .pth de 60+MB na pasta weights;
No futuro, weights/minha-voz.pth e logs/minha-voz/added_xxx.index serão mesclados em um único arquivo de weights/minha-voz.zip para eliminar a necessidade de entrada manual de index; portanto, compartilhe o arquivo zip, não somente o arquivo .pth, a menos que você queira continuar treinando em uma máquina diferente;
Copiar/compartilhar os vários arquivos .pth de centenas de MB da pasta de logs para a pasta de weights para inference forçada pode resultar em erros como falta de f0, tgt_sr ou outras chaves. Você precisa usar a guia ckpt na parte inferior para manualmente ou automaticamente (se as informações forem encontradas nos logs/minha-voz), selecione se deseja incluir informações de tom e opções de taxa de amostragem de áudio de destino e, em seguida, extrair o modelo menor. Após a extração, haverá um arquivo pth de 60+ MB na pasta de weights, e você pode atualizar as vozes para usá-lo.
**Q5 Erro de conexão:**
Para sermos otimistas, aperte F5/recarregue a página, pode ter sido apenas um bug da GUI
Se não...
Você pode ter fechado o console (janela de linha de comando preta).
Ou o Google Colab, no caso do Colab, as vezes pode simplesmente fechar
**Q6: Pop-up WebUI 'Valor esperado: linha 1 coluna 1 (caractere 0)'.**
Desative o proxy LAN do sistema/proxy global e atualize.
**Q7:Como treinar e inferir sem a WebUI?**
Script de treinamento:
Você pode executar o treinamento em WebUI primeiro, e as versões de linha de comando do pré-processamento e treinamento do conjunto de dados serão exibidas na janela de mensagens.
Script de inference:
https://huggingface.co/lj1995/VoiceConversionWebUI/blob/main/myinfer.py
por exemplo
runtime\python.exe myinfer.py 0 "E:\audios\1111.wav" "E:\RVC\logs\minha-voz\added_IVF677_Flat_nprobe_7.index" harvest "test.wav" "weights/mi-test.pth" 0.6 cuda:0 True
f0up_key=sys.argv[1]
input_path=sys.argv[2]
index_path=sys.argv[3]
f0method=sys.argv[4]#harvest or pm
opt_path=sys.argv[5]
model_path=sys.argv[6]
index_rate=float(sys.argv[7])
device=sys.argv[8]
is_half=bool(sys.argv[9])
**Q8: Erro Cuda/Cuda sem memória.**
Há uma pequena chance de que haja um problema com a configuração do CUDA ou o dispositivo não seja suportado; mais provavelmente, não há memória suficiente (falta de memória).
Para treinamento, reduza o (batch size) tamanho do lote (se reduzir para 1 ainda não for suficiente, talvez seja necessário alterar a placa gráfica); para inference, ajuste as configurações x_pad, x_query, x_center e x_max no arquivo config.py conforme necessário. Cartões de memória 4G ou inferiores (por exemplo, 1060(3G) e várias placas 2G) podem ser abandonados, enquanto os placas de vídeo com memória 4G ainda têm uma chance.
**Q9:Quantos total_epoch são ótimos?**
Se a qualidade de áudio do conjunto de dados de treinamento for ruim e o nível de ruído for alto, 20-30 epochs são suficientes. Defini-lo muito alto não melhorará a qualidade de áudio do seu conjunto de treinamento de baixa qualidade.
Se a qualidade de áudio do conjunto de treinamento for alta, o nível de ruído for baixo e houver duração suficiente, você poderá aumentá-lo. 200 é aceitável (uma vez que o treinamento é rápido e, se você puder preparar um conjunto de treinamento de alta qualidade, sua GPU provavelmente poderá lidar com uma duração de treinamento mais longa sem problemas).
**Q10:Quanto tempo de treinamento é necessário?**
Recomenda-se um conjunto de dados de cerca de 10 min a 50 min.
Com garantia de alta qualidade de som e baixo ruído de fundo, mais pode ser adicionado se o timbre do conjunto de dados for uniforme.
Para um conjunto de treinamento de alto nível (limpo + distintivo), 5min a 10min é bom.
Há algumas pessoas que treinaram com sucesso com dados de 1 a 2 minutos, mas o sucesso não é reproduzível por outros e não é muito informativo. Isso requer que o conjunto de treinamento tenha um timbre muito distinto (por exemplo, um som de menina de anime arejado de alta frequência) e a qualidade do áudio seja alta;
Dados com menos de 1 minuto, já obtivemo sucesso. Mas não é recomendado.
**Q11:Qual é a taxa do index e como ajustá-la?**
Se a qualidade do tom do modelo pré-treinado e da fonte de inference for maior do que a do conjunto de treinamento, eles podem trazer a qualidade do tom do resultado do inference, mas ao custo de um possível viés de tom em direção ao tom do modelo subjacente/fonte de inference, em vez do tom do conjunto de treinamento, que é geralmente referido como "vazamento de tom".
A taxa de index é usada para reduzir/resolver o problema de vazamento de timbre. Se a taxa do index for definida como 1, teoricamente não há vazamento de timbre da fonte de inference e a qualidade do timbre é mais tendenciosa em relação ao conjunto de treinamento. Se o conjunto de treinamento tiver uma qualidade de som mais baixa do que a fonte de inference, uma taxa de index mais alta poderá reduzir a qualidade do som. Reduzi-lo a 0 não tem o efeito de usar a mistura de recuperação para proteger os tons definidos de treinamento.
Se o conjunto de treinamento tiver boa qualidade de áudio e longa duração, aumente o total_epoch, quando o modelo em si é menos propenso a se referir à fonte inferida e ao modelo subjacente pré-treinado, e há pouco "vazamento de tom", o index_rate não é importante e você pode até não criar/compartilhar o arquivo de index.
**Q12:Como escolher o GPU ao inferir?**
No arquivo config.py, selecione o número da placa em "device cuda:".
O mapeamento entre o número da placa e a placa gráfica pode ser visto na seção de informações da placa gráfica da guia de treinamento.
**Q13:Como usar o modelo salvo no meio do treinamento?**
Salvar via extração de modelo na parte inferior da guia de processamento do ckpt.
**Q14: Erro de arquivo/memória (durante o treinamento)?**
Muitos processos e sua memória não é suficiente. Você pode corrigi-lo por:
- Diminuir a entrada no campo "Threads da CPU".
- Diminuir o tamanho do conjunto de dados.
Q15: Como continuar treinando usando mais dados
passo 1: coloque todos os dados wav no path2.
etapa 2: exp_name2 + path2 -> processar conjunto de dados e extrair recurso.
passo 3: copie o arquivo G e D mais recente de exp_name1 (seu experimento anterior) para a pasta exp_name2.
passo 4: clique em "treinar o modelo" e ele continuará treinando desde o início da época anterior do modelo exp.
Q16: erro sobre llvmlite.dll
OSError: Não foi possível carregar o arquivo de objeto compartilhado: llvmlite.dll
FileNotFoundError: Não foi possível encontrar o módulo lib\site-packages\llvmlite\binding\llvmlite.dll (ou uma de suas dependências). Tente usar o caminho completo com sintaxe de construtor.
O problema acontecerá no Windows, instale https://aka.ms/vs/17/release/vc_redist.x64.exe e será corrigido.
Q17: RuntimeError: O tamanho expandido do tensor (17280) deve corresponder ao tamanho existente (0) na dimensão 1 não singleton. Tamanhos de destino: [1, 17280]. Tamanhos de tensor: [0]
Exclua os arquivos wav cujo tamanho seja significativamente menor que outros e isso não acontecerá novamente. Em seguida, clique em "treinar o modelo" e "treinar o índice".
Q18: RuntimeError: O tamanho do tensor a (24) deve corresponder ao tamanho do tensor b (16) na dimensão não singleton 2
Não altere a taxa de amostragem e continue o treinamento. Caso seja necessário alterar, o nome do exp deverá ser alterado e o modelo será treinado do zero. Você também pode copiar o pitch e os recursos (pastas 0/1/2/2b) extraídos da última vez para acelerar o processo de treinamento.
File: docs/pt/README.pt.md
Changelog | FAQ (Frequently Asked Questions)
English | 中文简体 | 日本語 | 한국어 (韓國語) | Français | Türkçe | Português
Confira nosso Vídeo de demonstração aqui!
Treinamento/Inferência WebUI:go-webui.bat
GUI de conversão de voz em tempo real:go-realtime_gui.bat
O dataset para o modelo de pré-treinamento usa quase 50 horas de conjunto de dados de código aberto VCTK de alta qualidade.
Dataset de músicas licenciadas de alta qualidade serão adicionados ao conjunto de treinamento, um após o outro, para seu uso, sem se preocupar com violação de direitos autorais.
Aguarde o modelo básico pré-treinado do RVCv3, que possui parâmetros maiores, mais dados de treinamento, melhores resultados, velocidade de inferência inalterada e requer menos dados de treinamento para treinamento.
Resumo
Este repositório possui os seguintes recursos:
- Reduza o vazamento de tom substituindo o recurso de origem pelo recurso de conjunto de treinamento usando a recuperação top1;
- Treinamento fácil e rápido, mesmo em placas gráficas relativamente ruins;
- Treinar com uma pequena quantidade de dados também obtém resultados relativamente bons (>=10min de áudio com baixo ruído recomendado);
- Suporta fusão de modelos para alterar timbres (usando guia de processamento ckpt-> mesclagem ckpt);
- Interface Webui fácil de usar;
- Use o modelo pymss/MSST para separar rapidamente vocais e instrumentos.
- Use o mais poderoso algoritmo de extração de voz de alta frequência InterSpeech2023-RMVPE para evitar o problema de som mudo. Fornece os melhores resultados (significativamente) e é mais rápido, com consumo de recursos ainda menor que o Crepe_full.
- Sistemas AMD/Intel usam as dependências de CPU; Windows pode usar DirectML e Linux usa CPU.
Preparando o ambiente
Esta branch é destinada a Python 3.12 x64. Execute todos os comandos na raiz do repositório. Ubuntu 24.04 x86_64 é recomendado.
Ubuntu 24.04
sudo apt update
sudo apt install -y python3.12 python3.12-venv python3.12-dev ffmpeg unzip libsndfile1 libportaudio2
python3.12 -m venv .venv
source .venv/bin/activate
python -m pip install --upgrade pip setuptools wheelWindows
Instale o Python 3.12 x64 e crie um ambiente virtual:
py -3.12 -m venv .venv
.venv\Scripts\activate
python -m pip install --upgrade pip setuptools wheelEscolha de dependências por hardware
| Hardware | Instalação |
|---|---|
| CPU, AMD, Intel | Use requirments_cpu_py312.txt; Windows pode usar DirectML, Linux usa CPU |
| NVIDIA RTX série 50 | Instale primeiro o Torch CUDA 12.8 e depois requirments_cu128_py312.txt |
| NVIDIA anterior à série RTX 50 | Instale primeiro o Torch CUDA 11.8 e depois requirments_cu118_py312.txt |
CPU, AMD, Intel
python -m pip install -r requirments_cpu_py312.txtNVIDIA RTX série 50: duas etapas
python -m pip install torch==2.7.1+cu128 torchaudio==2.7.1+cu128 \
--index-url https://download.pytorch.org/whl/cu128 \
--extra-index-url https://pypi.org/simple
python -m pip install -r requirments_cu128_py312.txtNVIDIA anterior à série RTX 50: duas etapas
python -m pip install torch==2.7.1+cu118 torchaudio==2.7.1+cu118 \
--index-url https://download.pytorch.org/whl/cu118 \
--extra-index-url https://pypi.org/simple
python -m pip install -r requirments_cu118_py312.txtVerifique Torch e CUDA:
python -c "import torch; print('torch:', torch.__version__); print('cuda:', torch.version.cuda); print('cuda available:', torch.cuda.is_available())"Fontes de pacotes
Os três arquivos requirments_*.txt definem suas fontes no topo. Para usar fontes oficiais, substitua somente --index-url e --extra-index-url, mantendo versões, sufixos CUDA e a ordem das duas etapas.
| Default mirror | Official source |
|---|---|
https://mirrors.pku.edu.cn/pypi/simple |
https://pypi.org/simple |
https://mirrors.nju.edu.cn/pytorch/whl/cpu |
https://download.pytorch.org/whl/cpu |
https://mirrors.nju.edu.cn/pytorch/whl/cu118 |
https://download.pytorch.org/whl/cu118 |
https://mirrors.nju.edu.cn/pytorch/whl/cu128 |
https://download.pytorch.org/whl/cu128 |
Modelos e diretórios de execução
O WebUI cria os diretórios de execução automaticamente. Baixe os modelos do repositório de modelos Hugging Face e mantenha esta estrutura:
assets/
├── hubert_base/
│ ├── config.json
│ ├── preprocessor_config.json
│ └── pytorch_model.bin
├── rmvpe/rmvpe.pt
├── pretrained/
├── pretrained_v2/
├── pymss_weights/
├── weights/ # user RVC .pth models
└── indices/ # user .index files
logs/
└── mute/ # training silence samples
# Exact paths used by the code
assets/hubert_base/config.json
assets/hubert_base/preprocessor_config.json
assets/hubert_base/pytorch_model.bin
assets/rmvpe/rmvpe.pt
assets/pretrained/*.pth
assets/pretrained_v2/*.pth
assets/pymss_weights/*
assets/weights/*.pth
assets/indices/*.index
logs/mute/*Baixar modelos
python -m pip install --upgrade huggingface_hub
# Required for inference and feature extraction
hf download lj1995/VoiceConversionWebUI --revision main \
--include "hubert_base/*" --local-dir assets
hf download lj1995/VoiceConversionWebUI rmvpe.pt --revision main \
--local-dir assets/rmvpe
# Required for v1/v2 training
hf download lj1995/VoiceConversionWebUI --revision main \
--include "pretrained/*" "pretrained_v2/*" --local-dir assets
hf download lj1995/VoiceConversionWebUI mute.zip --revision main \
--local-dir .model-downloads
python -m zipfile -e .model-downloads/mute.zip logs
# Required only for pymss/MSST vocal separation
hf download lj1995/VoiceConversionWebUI --revision main \
--include "pymss_weights/*" --local-dir assetsAmbientes Windows AMD/Intel DirectML também precisam de:
hf download lj1995/VoiceConversionWebUI rmvpe.onnx --revision main \
--local-dir assets/rmvpeFFmpeg
O comando Ubuntu acima instala o FFmpeg. No Windows, coloque estes arquivos na raiz do repositório:
Iniciar o WebUI
python webui.pyServidor Ubuntu sem interface gráfica:
python webui.py --noautoopenA porta padrão é 7865. Coloque modelos .pth em assets/weights/ e arquivos .index em assets/indices/.
Credits
- ContentVec
- VITS
- HIFIGAN
- Gradio
- FFmpeg
- Ultimate Vocal Remover
- pymss-project/pymss
- audio-slicer
- Vocal pitch extraction:RMVPE
Thanks to all contributors for their efforts
File: docs/pt/training_tips_pt.md
Instruções e dicas para treinamento RVC
Estas DICAS explicam como o treinamento de dados é feito.
Fluxo de treinamento
Explicarei ao longo das etapas na guia de treinamento da GUI.
Passo 1
Defina o nome do experimento aqui.
Você também pode definir aqui se o modelo deve levar em consideração o pitch.
Se o modelo não considerar o tom, o modelo será mais leve, mas não será adequado para cantar.
Os dados de cada experimento são colocados em /logs/nome-do-seu-modelo/.
Passo 2a
Carrega e pré-processa áudio.
Carregar áudio
Se você especificar uma pasta com áudio, os arquivos de áudio dessa pasta serão lidos automaticamente.
Por exemplo, se você especificar C:Users\hoge\voices, C:Users\hoge\voices\voice.mp3 será carregado, mas C:Users\hoge\voices\dir\voice.mp3 será Não carregado.
Como o ffmpeg é usado internamente para leitura de áudio, se a extensão for suportada pelo ffmpeg, ela será lida automaticamente.
Após converter para int16 com ffmpeg, converta para float32 e normalize entre -1 e 1.
Eliminar ruído
O áudio é suavizado pelo filtfilt do scipy.
Divisão de áudio
Primeiro, o áudio de entrada é dividido pela detecção de partes de silêncio que duram mais que um determinado período (max_sil_kept=5 segundos?). Após dividir o áudio no silêncio, divida o áudio a cada 4 segundos com uma sobreposição de 0,3 segundos. Para áudio separado em 4 segundos, após normalizar o volume, converta o arquivo wav para /logs/nome-do-seu-modelo/0_gt_wavs e, em seguida, converta-o para taxa de amostragem de 16k para /logs/nome-do-seu-modelo/1_16k_wavs como um arquivo wav.
Passo 2b
Extrair pitch
Extraia informações de pitch de arquivos wav. Extraia as informações de pitch (=f0) usando o método incorporado em Parselmouth ou pyworld e salve-as em /logs/nome-do-seu-modelo/2a_f0. Em seguida, converta logaritmicamente as informações de pitch para um número inteiro entre 1 e 255 e salve-as em /logs/nome-do-seu-modelo/2b-f0nsf.
Extrair feature_print
Converta o arquivo wav para incorporação antecipadamente usando HuBERT. Leia o arquivo wav salvo em /logs/nome-do-seu-modelo/1_16k_wavs, converta o arquivo wav em recursos de 256 dimensões com HuBERT e salve no formato npy em /logs/nome-do-seu-modelo/3_feature256.
Passo 3
treinar o modelo.
Glossário para iniciantes
No aprendizado profundo, o conjunto de dados é dividido e o aprendizado avança aos poucos. Em uma atualização do modelo (etapa), os dados batch_size são recuperados e previsões e correções de erros são realizadas. Fazer isso uma vez para um conjunto de dados conta como um epoch.
Portanto, o tempo de aprendizagem é o tempo de aprendizagem por etapa x (o número de dados no conjunto de dados/tamanho do lote) x o número de epoch. Em geral, quanto maior o tamanho do lote, mais estável se torna o aprendizado (tempo de aprendizado por etapa ÷ tamanho do lote) fica menor, mas usa mais memória GPU. A RAM da GPU pode ser verificada com o comando nvidia-smi. O aprendizado pode ser feito em pouco tempo aumentando o tamanho do lote tanto quanto possível de acordo com a máquina do ambiente de execução.
Especifique o modelo pré-treinado
O RVC começa a treinar o modelo a partir de pesos pré-treinados em vez de 0, para que possa ser treinado com um pequeno conjunto de dados.
Por padrão
- Se você considerar o pitch, ele carrega
rvc-location/pretrained/f0G40k.pthervc-location/pretrained/f0D40k.pth. - Se você não considerar o pitch, ele carrega
rvc-location/pretrained/f0G40k.pthervc-location/pretrained/f0D40k.pth.
Ao aprender, os parâmetros do modelo são salvos em logs/nome-do-seu-modelo/G_{}.pth e logs/nome-do-seu-modelo/D_{}.pth para cada save_every_epoch, mas especificando nesse caminho, você pode começar a aprender. Você pode reiniciar ou iniciar o treinamento a partir de weights de modelo aprendidos em um experimento diferente.
Index de aprendizado
O RVC salva os valores de recursos do HuBERT usados durante o treinamento e, durante a inferência, procura valores de recursos que sejam semelhantes aos valores de recursos usados durante o aprendizado para realizar a inferência. Para realizar esta busca em alta velocidade, o index é aprendido previamente.
Para aprendizagem de index, usamos a biblioteca de pesquisa de associação de áreas aproximadas faiss. Leia o valor do recurso logs/nome-do-seu-modelo/3_feature256 e use-o para aprender o index, e salve-o como logs/nome-do-seu-modelo/add_XXX.index.
(A partir da versão 20230428update, ele é lido do index e não é mais necessário salvar/especificar.)
Descrição do botão
- Treinar modelo: Após executar o passo 2b, pressione este botão para treinar o modelo.
- Treinar índice de recursos: após treinar o modelo, execute o aprendizado do index.
- Treinamento com um clique: etapa 2b, treinamento de modelo e treinamento de index de recursos, tudo de uma vez.
File: docs/kr/faiss_tips_ko.md
Facebook AI Similarity Search (Faiss) 팁
Faiss에 대하여
Faiss 는 Facebook Research가 개발하는, 고밀도 벡터 이웃 검색 라이브러리입니다. 근사 근접 탐색법 (Approximate Neigbor Search)은 약간의 정확성을 희생하여 유사 벡터를 고속으로 찾습니다.
RVC에 있어서 Faiss
RVC에서는 HuBERT로 변환한 feature의 embedding을 위해 훈련 데이터에서 생성된 embedding과 유사한 embadding을 검색하고 혼합하여 원래의 음성에 더욱 가까운 변환을 달성합니다. 그러나, 이 탐색법은 단순히 수행하면 시간이 다소 소모되므로, 근사 근접 탐색법을 통해 고속 변환을 가능케 하고 있습니다.
구현 개요
모델이 위치한 /logs/your-experiment/3_feature256에는 각 음성 데이터에서 HuBERT가 추출한 feature들이 있습니다. 여기에서 파일 이름별로 정렬된 npy 파일을 읽고, 벡터를 연결하여 big_npy ([N, 256] 모양의 벡터) 를 만듭니다. big_npy를 /logs/your-experiment/total_fea.npy로 저장한 후, Faiss로 학습시킵니다.
2023/04/18 기준으로, Faiss의 Index Factory 기능을 이용해, L2 거리에 근거하는 IVF를 이용하고 있습니다. IVF의 분할수(n_ivf)는 N//39로, n_probe는 int(np.power(n_ivf, 0.3))가 사용되고 있습니다. (webui.py의 train_index 주위를 찾으십시오.)
이 팁에서는 먼저 이러한 매개 변수의 의미를 설명하고, 개발자가 추후 더 나은 index를 작성할 수 있도록 하는 조언을 작성합니다.
방법의 설명
Index factory
index factory는 여러 근사 근접 탐색법을 문자열로 연결하는 pipeline을 문자열로 표기하는 Faiss만의 독자적인 기법입니다. 이를 통해 index factory의 문자열을 변경하는 것만으로 다양한 근사 근접 탐색을 시도해 볼 수 있습니다. RVC에서는 다음과 같이 사용됩니다:
index = Faiss.index_factory(256, "IVF%s,Flat" % n_ivf)index_factory의 인수들 중 첫 번째는 벡터의 차원 수이고, 두번째는 index factory 문자열이며, 세번째에는 사용할 거리를 지정할 수 있습니다.
기법의 보다 자세한 설명은 https://github.com/facebookresearch/Faiss/wiki/The-index-factory 를 확인해 주십시오.
거리에 대한 index
embedding의 유사도로서 사용되는 대표적인 지표로서 이하의 2개가 있습니다.
- 유클리드 거리 (METRIC_L2)
- 내적(内積) (METRIC_INNER_PRODUCT)
유클리드 거리에서는 각 차원에서 제곱의 차를 구하고, 각 차원에서 구한 차를 모두 더한 후 제곱근을 취합니다. 이것은 일상적으로 사용되는 2차원, 3차원에서의 거리의 연산법과 같습니다. 내적은 그 값을 그대로 유사도 지표로 사용하지 않고, L2 정규화를 한 이후 내적을 취하는 코사인 유사도를 사용합니다.
어느 쪽이 더 좋은지는 경우에 따라 다르지만, word2vec에서 얻은 embedding 및 ArcFace를 활용한 이미지 검색 모델은 코사인 유사성이 이용되는 경우가 많습니다. numpy를 사용하여 벡터 X에 대해 L2 정규화를 하고자 하는 경우, 0 division을 피하기 위해 충분히 작은 값을 eps로 한 뒤 이하에 코드를 활용하면 됩니다.
X_normed = X / np.maximum(eps, np.linalg.norm(X, ord=2, axis=-1, keepdims=True))또한, index factory의 3번째 인수에 건네주는 값을 선택하는 것을 통해 계산에 사용하는 거리 index를 변경할 수 있습니다.
index = Faiss.index_factory(dimention, text, Faiss.METRIC_INNER_PRODUCT)IVF
IVF (Inverted file indexes)는 역색인 탐색법과 유사한 알고리즘입니다. 학습시에는 검색 대상에 대해 k-평균 군집법을 실시하고 클러스터 중심을 이용해 보로노이 분할을 실시합니다. 각 데이터 포인트에는 클러스터가 할당되므로, 클러스터에서 데이터 포인트를 조회하는 dictionary를 만듭니다.
예를 들어, 클러스터가 다음과 같이 할당된 경우
| index | Cluster |
|---|---|
| 1 | A |
| 2 | B |
| 3 | A |
| 4 | C |
| 5 | B |
IVF 이후의 결과는 다음과 같습니다:
| cluster | index |
|---|---|
| A | 1, 3 |
| B | 2, 5 |
| C | 4 |
탐색 시, 우선 클러스터에서 n_probe개의 클러스터를 탐색한 다음, 각 클러스터에 속한 데이터 포인트의 거리를 계산합니다.
권장 매개변수
index의 선택 방법에 대해서는 공식적으로 가이드 라인이 있으므로, 거기에 준해 설명합니다.
https://github.com/facebookresearch/Faiss/wiki/Guidelines-to-choose-an-index
1M 이하의 데이터 세트에 있어서는 4bit-PQ가 2023년 4월 시점에서는 Faiss로 이용할 수 있는 가장 효율적인 수법입니다. 이것을 IVF와 조합해, 4bit-PQ로 후보를 추려내고, 마지막으로 이하의 index factory를 이용하여 정확한 지표로 거리를 재계산하면 됩니다.
index = Faiss.index_factory(256, "IVF1024,PQ128x4fs,RFlat")IVF 권장 매개변수
IVF의 수가 너무 많으면, 가령 데이터 수의 수만큼 IVF로 양자화(Quantization)를 수행하면, 이것은 완전탐색과 같아져 효율이 나빠지게 됩니다. 1M 이하의 경우 IVF 값은 데이터 포인트 수 N에 대해 4sqrt(N) ~ 16sqrt(N)를 사용하는 것을 권장합니다.
n_probe는 n_probe의 수에 비례하여 계산 시간이 늘어나므로 정확도와 시간을 적절히 균형을 맞추어 주십시오. 개인적으로 RVC에 있어서 그렇게까지 정확도는 필요 없다고 생각하기 때문에 n_probe = 1이면 된다고 생각합니다.
FastScan
FastScan은 직적 양자화를 레지스터에서 수행함으로써 거리의 고속 근사를 가능하게 하는 방법입니다.직적 양자화는 학습시에 d차원마다(보통 d=2)에 독립적으로 클러스터링을 실시해, 클러스터끼리의 거리를 사전 계산해 lookup table를 작성합니다. 예측시는 lookup table을 보면 각 차원의 거리를 O(1)로 계산할 수 있습니다. 따라서 PQ 다음에 지정하는 숫자는 일반적으로 벡터의 절반 차원을 지정합니다.
FastScan에 대한 자세한 설명은 공식 문서를 참조하십시오.
https://github.com/facebookresearch/Faiss/wiki/Fast-accumulation-of-PQ-and-AQ-codes-(FastScan)
RFlat
RFlat은 FastScan이 계산한 대략적인 거리를 index factory의 3번째 인수로 지정한 정확한 거리로 다시 계산하라는 인스트럭션입니다. k개의 근접 변수를 가져올 때 k*k_factor개의 점에 대해 재계산이 이루어집니다.
Embedding 테크닉
Alpha 쿼리 확장
퀴리 확장이란 탐색에서 사용되는 기술로, 예를 들어 전문 탐색 시, 입력된 검색문에 단어를 몇 개를 추가함으로써 검색 정확도를 올리는 방법입니다. 백터 탐색을 위해서도 몇가지 방법이 제안되었는데, 그 중 α-쿼리 확장은 추가 학습이 필요 없는 매우 효과적인 방법으로 알려져 있습니다. Attention-Based Query Expansion Learning와 2nd place solution of kaggle shopee competition 논문에서 소개된 바 있습니다..
α-쿼리 확장은 한 벡터에 인접한 벡터를 유사도의 α곱한 가중치로 더해주면 됩니다. 코드로 예시를 들어 보겠습니다. big_npy를 α query expansion로 대체합니다.
alpha = 3.
index = Faiss.index_factory(256, "IVF512,PQ128x4fs,RFlat")
original_norm = np.maximum(np.linalg.norm(big_npy, ord=2, axis=1, keepdims=True), 1e-9)
big_npy /= original_norm
index.train(big_npy)
index.add(big_npy)
dist, neighbor = index.search(big_npy, num_expand)
expand_arrays = []
ixs = np.arange(big_npy.shape[0])
for i in range(-(-big_npy.shape[0]//batch_size)):
ix = ixs[i*batch_size:(i+1)*batch_size]
weight = np.power(np.einsum("nd,nmd->nm", big_npy[ix], big_npy[neighbor[ix]]), alpha)
expand_arrays.append(np.sum(big_npy[neighbor[ix]] * np.expand_dims(weight, axis=2),axis=1))
big_npy = np.concatenate(expand_arrays, axis=0)
# index version 정규화
big_npy = big_npy / np.maximum(np.linalg.norm(big_npy, ord=2, axis=1, keepdims=True), 1e-9)위 테크닉은 탐색을 수행하는 쿼리에도, 탐색 대상 DB에도 적응 가능한 테크닉입니다.
MiniBatch KMeans에 의한 embedding 압축
total_fea.npy가 너무 클 경우 K-means를 이용하여 벡터를 작게 만드는 것이 가능합니다. 이하 코드로 embedding의 압축이 가능합니다. n_clusters에 압축하고자 하는 크기를 지정하고 batch_size에 256 * CPU의 코어 수를 지정함으로써 CPU 병렬화의 혜택을 충분히 얻을 수 있습니다.
import multiprocessing
from sklearn.cluster import MiniBatchKMeans
kmeans = MiniBatchKMeans(n_clusters=10000, batch_size=256 * multiprocessing.cpu_count(), init="random")
kmeans.fit(big_npy)
sample_npy = kmeans.cluster_centers_