ChazzyG/Retrieval-based-Voice-Conversion-WebUI
0
1import sys, os, multiprocessing2from scipy import signal3 4now_dir = os.getcwd()5sys.path.append(now_dir)6 7inp_root = sys.argv[1]8sr = int(sys.argv[2])9n_p = int(sys.argv[3])10exp_dir = sys.argv[4]11noparallel = sys.argv[5] == "True"12import numpy as np, os, traceback13from slicer2 import Slicer14import librosa, traceback15from scipy.io import wavfile16import multiprocessing17from my_utils import load_audio18 19mutex = multiprocessing.Lock()20f = open("%s/preprocess.log" % exp_dir, "a+")21 22 23def println(strr):24 mutex.acquire()25 print(strr)26 f.write("%s\n" % strr)27 f.flush()28 mutex.release()29 30 31class PreProcess:32 def __init__(self, sr, exp_dir):33 self.slicer = Slicer(34 sr=sr,35 threshold=-40,36 min_length=800,37 min_interval=400,38 hop_size=15,39 max_sil_kept=150,40 )41 self.sr = sr42 self.bh, self.ah = signal.butter(N=5, Wn=48, btype="high", fs=self.sr)43 self.per = 3.744 self.overlap = 0.345 self.tail = self.per + self.overlap46 self.max = 0.9547 self.alpha = 0.848 self.exp_dir = exp_dir49 self.gt_wavs_dir = "%s/0_gt_wavs" % exp_dir50 self.wavs16k_dir = "%s/1_16k_wavs" % exp_dir51 os.makedirs(self.exp_dir, exist_ok=True)52 os.makedirs(self.gt_wavs_dir, exist_ok=True)53 os.makedirs(self.wavs16k_dir, exist_ok=True)54 55 def norm_write(self, tmp_audio, idx0, idx1):56 tmp_audio = (tmp_audio / np.abs(tmp_audio).max() * (self.max * self.alpha)) + (57 1 - self.alpha58 ) * tmp_audio59 wavfile.write(60 "%s/%s_%s.wav" % (self.gt_wavs_dir, idx0, idx1),61 self.sr,62 tmp_audio.astype(np.float32),63 )64 tmp_audio = librosa.resample(65 tmp_audio, orig_sr=self.sr, target_sr=1600066 ) # , res_type="soxr_vhq"67 wavfile.write(68 "%s/%s_%s.wav" % (self.wavs16k_dir, idx0, idx1),69 16000,70 tmp_audio.astype(np.float32),71 )72 73 def pipeline(self, path, idx0):74 try:75 audio = load_audio(path, self.sr)76 # zero phased digital filter cause pre-ringing noise...77 # audio = signal.filtfilt(self.bh, self.ah, audio)78 audio = signal.lfilter(self.bh, self.ah, audio)79 80 idx1 = 081 for audio in self.slicer.slice(audio):82 i = 083 while 1:84 start = int(self.sr * (self.per - self.overlap) * i)85 i += 186 if len(audio[start:]) > self.tail * self.sr:87 tmp_audio = audio[start : start + int(self.per * self.sr)]88 self.norm_write(tmp_audio, idx0, idx1)89 idx1 += 190 else:91 tmp_audio = audio[start:]92 idx1 += 193 break94 self.norm_write(tmp_audio, idx0, idx1)95 println("%s->Suc." % path)96 except:97 println("%s->%s" % (path, traceback.format_exc()))98 99 def pipeline_mp(self, infos):100 for path, idx0 in infos:101 self.pipeline(path, idx0)102 103 def pipeline_mp_inp_dir(self, inp_root, n_p):104 try:105 infos = [106 ("%s/%s" % (inp_root, name), idx)107 for idx, name in enumerate(sorted(list(os.listdir(inp_root))))108 ]109 if noparallel:110 for i in range(n_p):111 self.pipeline_mp(infos[i::n_p])112 else:113 ps = []114 for i in range(n_p):115 p = multiprocessing.Process(116 target=self.pipeline_mp, args=(infos[i::n_p],)117 )118 p.start()119 ps.append(p)120 for p in ps:121 p.join()122 except:123 println("Fail. %s" % traceback.format_exc())124 125 126def preprocess_trainset(inp_root, sr, n_p, exp_dir):127 pp = PreProcess(sr, exp_dir)128 println("start preprocess")129 println(sys.argv)130 pp.pipeline_mp_inp_dir(inp_root, n_p)131 println("end preprocess")132 133 134if __name__ == "__main__":135 preprocess_trainset(inp_root, sr, n_p, exp_dir)136 