From ca4ea0fbcd1b99521d6931675ba27d49e2c25563 Mon Sep 17 00:00:00 2001 From: Brandon Thomas Date: Mon, 17 Jul 2023 14:31:22 -0400 Subject: [PATCH] Update rvc-v2 to f63783c34888a80db37a28c68f4b4765040b6257 https://github.com/RVC-Project/Retrieval-based-Voice-Conversion-WebUI --- .../rvc-v2-brandon/github_infer.py | 222 ------------------ voice_conversion/rvc-v2-brandon/gui_v1.py | 37 ++- .../rvc-v2-brandon/requirements.txt | 1 - 3 files changed, 29 insertions(+), 231 deletions(-) delete mode 100644 voice_conversion/rvc-v2-brandon/github_infer.py diff --git a/voice_conversion/rvc-v2-brandon/github_infer.py b/voice_conversion/rvc-v2-brandon/github_infer.py deleted file mode 100644 index a2cf376..0000000 --- a/voice_conversion/rvc-v2-brandon/github_infer.py +++ /dev/null @@ -1,222 +0,0 @@ -# From https://github.com/RVC-Project/Retrieval-based-Voice-Conversion-WebUI/issues/299#issuecomment-1562141634 -import os,sys,pdb,torch -now_dir = os.getcwd() -sys.path.append(now_dir) -import argparse -import glob -import sys -import torch -import numpy as np -from multiprocessing import cpu_count -class Config: - def __init__(self,device,is_half): - self.device = device - self.is_half = is_half - self.n_cpu = 0 - self.gpu_name = None - self.gpu_mem = None - self.x_pad, self.x_query, self.x_center, self.x_max = self.device_config() - - def device_config(self) -> tuple: - if torch.cuda.is_available(): - i_device = int(self.device.split(":")[-1]) - self.gpu_name = torch.cuda.get_device_name(i_device) - if ( - ("16" in self.gpu_name and "V100" not in self.gpu_name.upper()) - or "P40" in self.gpu_name.upper() - or "1060" in self.gpu_name - or "1070" in self.gpu_name - or "1080" in self.gpu_name - ): - print("16系/10系显卡和P40强制单精度") - self.is_half = False - for config_file in ["32k.json", "40k.json", "48k.json"]: - with open(f"configs/{config_file}", "r") as f: - strr = f.read().replace("true", "false") - with open(f"configs/{config_file}", "w") as f: - f.write(strr) - with open("trainset_preprocess_pipeline_print.py", "r") as f: - strr = f.read().replace("3.7", "3.0") - with open("trainset_preprocess_pipeline_print.py", "w") as f: - f.write(strr) - else: - self.gpu_name = None - self.gpu_mem = int( - torch.cuda.get_device_properties(i_device).total_memory - / 1024 - / 1024 - / 1024 - + 0.4 - ) - if self.gpu_mem <= 4: - with open("trainset_preprocess_pipeline_print.py", "r") as f: - strr = f.read().replace("3.7", "3.0") - with open("trainset_preprocess_pipeline_print.py", "w") as f: - f.write(strr) - elif torch.backends.mps.is_available(): - print("没有发现支持的N卡, 使用MPS进行推理") - self.device = "mps" - else: - print("没有发现支持的N卡, 使用CPU进行推理") - self.device = "cpu" - self.is_half = True - - if self.n_cpu == 0: - self.n_cpu = cpu_count() - - if self.is_half: - # 6G显存配置 - x_pad = 3 - x_query = 10 - x_center = 60 - x_max = 65 - else: - # 5G显存配置 - x_pad = 1 - x_query = 6 - x_center = 38 - x_max = 41 - - if self.gpu_mem != None and self.gpu_mem <= 4: - x_pad = 1 - x_query = 5 - x_center = 30 - x_max = 32 - - return x_pad, x_query, x_center, x_max - -f0_up_key=int(sys.argv[1]) #transpose value -input_path=sys.argv[2] -opt_path=sys.argv[3] -model_path=sys.argv[4] -device=sys.argv[5] -is_half=sys.argv[6] -f0method=sys.argv[7] #pm or harvest -file_index=sys.argv[8] #.index file -file_index2=sys.argv[9] -index_rate=float(sys.argv[10]) #search feature ratio -filter_radius=float(sys.argv[11]) #median filter -resample_sr=float(sys.argv[12]) #resample audio in post processing -rms_mix_rate=float(sys.argv[13]) #search feature -print(sys.argv) - -if(is_half.lower() == 'true'): - is_half = True -else: - is_half = False - -config=Config(device,is_half) -now_dir=os.getcwd() -sys.path.append(now_dir) -from vc_infer_pipeline import VC -from infer_pack.models import SynthesizerTrnMs256NSFsid, SynthesizerTrnMs256NSFsid_nono -from my_utils import load_audio -from fairseq import checkpoint_utils -from scipy.io import wavfile - -hubert_model=None -def load_hubert(): - global hubert_model - models, _, _ = checkpoint_utils.load_model_ensemble_and_task( - ["hubert_base.pt"], - suffix="", - ) - hubert_model = models[0] - hubert_model = hubert_model.to(config.device) - if config.is_half: - hubert_model = hubert_model.half() - else: - hubert_model = hubert_model.float() - hubert_model.eval() - -def vc_single( - sid=0, - input_audio_path=None, - f0_up_key=0, - f0_file=None, - f0_method="pm", - file_index="", #.index file - file_index2="", - # file_big_npy, - index_rate=1.0, - filter_radius=3, - resample_sr=0, - rms_mix_rate=1.0, -): - global tgt_sr, net_g, vc, hubert_model, version - if input_audio_path is None: - return "You need to upload an audio file", None - - f0_up_key = int(f0_up_key) - audio = load_audio(input_audio_path, 16000) - audio_max = np.abs(audio).max() / 0.95 - - if audio_max > 1: - audio /= audio_max - times = [0, 0, 0] - - if hubert_model == None: - load_hubert() - - if_f0 = cpt.get("f0", 1) - - file_index = ( - ( - file_index.strip(" ") - .strip('"') - .strip("\n") - .strip('"') - .strip(" ") - .replace("trained", "added") - ) - if file_index != "" - else file_index2 - ) - - audio_opt = vc.pipeline( - hubert_model, - net_g, - sid, - audio, - input_audio_path, - times, - f0_up_key, - f0_method, - file_index, - # file_big_npy, - index_rate, - if_f0, - filter_radius, - tgt_sr, - resample_sr, - rms_mix_rate, - version, - f0_file=f0_file, - ) - return audio_opt - - -def get_vc(model_path): - global n_spk,tgt_sr,net_g,vc,cpt,device,is_half, version - print("loading pth %s"%model_path) - cpt = torch.load(model_path, map_location="cpu") - tgt_sr = cpt["config"][-1] - cpt["config"][-3]=cpt["weight"]["emb_g.weight"].shape[0]#n_spk - if_f0=cpt.get("f0",1) - version = cpt.get("version", "v1") - if(if_f0==1): - net_g = SynthesizerTrnMs256NSFsid(*cpt["config"], is_half=is_half) - else: - net_g = SynthesizerTrnMs256NSFsid_nono(*cpt["config"]) - del net_g.enc_q - print(net_g.load_state_dict(cpt["weight"], strict=False)) - net_g.eval().to(device) - if (is_half):net_g = net_g.half() - else:net_g = net_g.float() - vc = VC(tgt_sr, config) - n_spk=cpt["config"][-3] - # return {"visible": True,"maximum": n_spk, "__type__": "update"} - -get_vc(model_path) -wav_opt=vc_single(0,input_path,f0_up_key,None,f0method,file_index,file_index2,index_rate,filter_radius,resample_sr,rms_mix_rate) -wavfile.write(opt_path, tgt_sr, wav_opt) diff --git a/voice_conversion/rvc-v2-brandon/gui_v1.py b/voice_conversion/rvc-v2-brandon/gui_v1.py index 8aa999e..07ff3c9 100644 --- a/voice_conversion/rvc-v2-brandon/gui_v1.py +++ b/voice_conversion/rvc-v2-brandon/gui_v1.py @@ -1,5 +1,8 @@ import os, sys +if sys.platform == "darwin": + os.environ["PYTORCH_ENABLE_MPS_FALLBACK"] = "1" + now_dir = os.getcwd() sys.path.append(now_dir) import multiprocessing @@ -45,7 +48,11 @@ if __name__ == "__main__": from i18n import I18nAuto i18n = I18nAuto() - device = torch.device("cuda" if torch.cuda.is_available() else "cpu") + device = torch.device( + "cuda" + if torch.cuda.is_available() + else ("mps" if torch.backends.mps.is_available() else "cpu") + ) current_dir = os.getcwd() inp_q = Queue() opt_q = Queue() @@ -441,8 +448,9 @@ if __name__ == "__main__": """ 接受音频输入 """ + channels = 1 if sys.platform == "darwin" else 2 with sd.Stream( - channels=2, + channels=channels, callback=self.audio_callback, blocksize=self.block_frame, samplerate=self.config.samplerate, @@ -524,6 +532,9 @@ if __name__ == "__main__": ) + 1e-8 ) + if sys.platform == "darwin": + cor_nom = cor_nom.cpu() + cor_den = cor_den.cpu() sola_offset = torch.argmax(cor_nom[0, 0] / cor_den[0, 0]) print("sola offset: " + str(int(sola_offset))) self.output_wav[:] = infer_wav[sola_offset : sola_offset + self.block_frame] @@ -545,14 +556,24 @@ if __name__ == "__main__": infer_wav[-self.crossfade_frame :] * self.fade_out_window ) if self.config.O_noise_reduce: - outdata[:] = np.tile( - nr.reduce_noise( + if sys.platform == "darwin": + noise_reduced_signal = nr.reduce_noise( y=self.output_wav[:].cpu().numpy(), sr=self.config.samplerate - ), - (2, 1), - ).T + ) + outdata[:] = noise_reduced_signal[:, np.newaxis] + else: + outdata[:] = np.tile( + nr.reduce_noise( + y=self.output_wav[:].cpu().numpy(), + sr=self.config.samplerate, + ), + (2, 1), + ).T else: - outdata[:] = self.output_wav[:].repeat(2, 1).t().cpu().numpy() + if sys.platform == "darwin": + outdata[:] = self.output_wav[:].cpu().numpy()[:, np.newaxis] + else: + outdata[:] = self.output_wav[:].repeat(2, 1).t().cpu().numpy() total_time = time.perf_counter() - start_time self.window["infer_time"].update(int(total_time * 1000)) print("infer time:" + str(total_time)) diff --git a/voice_conversion/rvc-v2-brandon/requirements.txt b/voice_conversion/rvc-v2-brandon/requirements.txt index a0e34cd..92bbe60 100644 --- a/voice_conversion/rvc-v2-brandon/requirements.txt +++ b/voice_conversion/rvc-v2-brandon/requirements.txt @@ -21,7 +21,6 @@ praat-parselmouth>=0.4.2 Pillow>=9.1.1 resampy>=0.4.2 scikit-learn -#starlette>=0.25.0 tensorboard tqdm>=4.63.1 tornado>=6.1