From b5bd047d815123a7ff36c3cb1baf9758fd2781b6 Mon Sep 17 00:00:00 2001 From: alexlnkp Date: Sun, 30 Jul 2023 22:51:07 +0700 Subject: [PATCH] Revert "slicer fix" This reverts commit 9b521a3c8cc2d0bbb20fb71e225136376670dea5. --- slicer2.py | 6 +- trainset_preprocess_pipeline_print.py | 143 ++++++++++++++------------ 2 files changed, 82 insertions(+), 67 deletions(-) diff --git a/slicer2.py b/slicer2.py index 03f3258..7d9d16d 100644 --- a/slicer2.py +++ b/slicer2.py @@ -172,8 +172,10 @@ class Slicer: chunks.append( self._apply_slice(waveform, sil_tags[i][1], sil_tags[i + 1][0]) ) - if sil_tags[-1][1] < total_frames and (total_frames - sil_tags[-1][1] * self.hop_size) >= self.min_length: - chunks.append(self._apply_slice(waveform, sil_tags[-1][1], total_frames)) + if sil_tags[-1][1] < total_frames: + chunks.append( + self._apply_slice(waveform, sil_tags[-1][1], total_frames) + ) return chunks diff --git a/trainset_preprocess_pipeline_print.py b/trainset_preprocess_pipeline_print.py index 98c82d0..376888a 100644 --- a/trainset_preprocess_pipeline_print.py +++ b/trainset_preprocess_pipeline_print.py @@ -1,39 +1,36 @@ -import sys -import os -import multiprocessing -import traceback -import tqdm -import logging +import sys, os, multiprocessing from scipy import signal -from scipy.io import wavfile -import numpy as np -import librosa now_dir = os.getcwd() sys.path.append(now_dir) -from my_utils import load_audio -from slicer2 import Slicer - -# Constants -DO_FORMANT = False -QUEFRENCY = 1.0 -TIMBRE = 1.0 -TARGET_SR = 16000 - inp_root = sys.argv[1] sr = int(sys.argv[2]) n_p = int(sys.argv[3]) exp_dir = sys.argv[4] noparallel = sys.argv[5] == "True" +import numpy as np, os, traceback +from slicer2 import Slicer +import librosa, traceback +from scipy.io import wavfile +import multiprocessing +from my_utils import load_audio +import tqdm -# Logging -logging.basicConfig( - filename=f"{exp_dir}/preprocess.log", - level=logging.INFO, - format="%(message)s" -) -logger = logging.getLogger(__name__) +DoFormant = False +Quefrency = 1.0 +Timbre = 1.0 + +mutex = multiprocessing.Lock() +f = open("%s/preprocess.log" % exp_dir, "a+") + + +def println(strr): + mutex.acquire() + print(strr) + f.write("%s\n" % strr) + f.flush() + mutex.release() class PreProcess: @@ -54,8 +51,8 @@ class PreProcess: self.max = 0.9 self.alpha = 0.75 self.exp_dir = exp_dir - self.gt_wavs_dir = f"{exp_dir}/0_gt_wavs" - self.wavs16k_dir = f"{exp_dir}/1_16k_wavs" + self.gt_wavs_dir = "%s/0_gt_wavs" % exp_dir + self.wavs16k_dir = "%s/1_16k_wavs" % exp_dir os.makedirs(self.exp_dir, exist_ok=True) os.makedirs(self.gt_wavs_dir, exist_ok=True) os.makedirs(self.wavs16k_dir, exist_ok=True) @@ -63,42 +60,50 @@ class PreProcess: def norm_write(self, tmp_audio, idx0, idx1): tmp_max = np.abs(tmp_audio).max() if tmp_max > 2.5: - logger.warning(f"{idx0}-{idx1}-{tmp_max}-filtered") + print("%s-%s-%s-filtered" % (idx0, idx1, tmp_max)) return tmp_audio = (tmp_audio / tmp_max * (self.max * self.alpha)) + ( 1 - self.alpha ) * tmp_audio - try: - wavfile.write(f"{self.gt_wavs_dir}/{idx0}_{idx1}.wav", - self.sr, - tmp_audio.astype(np.float32)) - except Exception as e: - logger.error(f"Error writing file {self.gt_wavs_dir}/{idx0}_{idx1}.wav - {str(e)}") - - try: - tmp_audio = librosa.resample(tmp_audio, orig_sr=self.sr, target_sr=TARGET_SR) - wavfile.write(f"{self.wavs16k_dir}/{idx0}_{idx1}.wav", - TARGET_SR, - tmp_audio.astype(np.float32)) - except Exception as e: - logger.error(f"Error writing file {self.wavs16k_dir}/{idx0}_{idx1}.wav - {str(e)}") + wavfile.write( + "%s/%s_%s.wav" % (self.gt_wavs_dir, idx0, idx1), + self.sr, + tmp_audio.astype(np.float32), + ) + tmp_audio = librosa.resample( + tmp_audio, orig_sr=self.sr, target_sr=16000 + ) # , res_type="soxr_vhq" + wavfile.write( + "%s/%s_%s.wav" % (self.wavs16k_dir, idx0, idx1), + 16000, + tmp_audio.astype(np.float32), + ) def pipeline(self, path, idx0): try: - audio = load_audio(path, self.sr, DO_FORMANT, QUEFRENCY, TIMBRE) + audio = load_audio(path, self.sr, DoFormant, Quefrency, Timbre) + # zero phased digital filter cause pre-ringing noise... + # audio = signal.filtfilt(self.bh, self.ah, audio) audio = signal.lfilter(self.bh, self.ah, audio) idx1 = 0 for audio in self.slicer.slice(audio): i = 0 - while len(audio[int(self.sr * (self.per - self.overlap) * i):]) > self.tail * self.sr: + while 1: start = int(self.sr * (self.per - self.overlap) * i) - tmp_audio = audio[start : start + int(self.per * self.sr)] - tmp_audio = audio[start:] + i += 1 + if len(audio[start:]) > self.tail * self.sr: + tmp_audio = audio[start : start + int(self.per * self.sr)] + self.norm_write(tmp_audio, idx0, idx1) + idx1 += 1 + else: + tmp_audio = audio[start:] + idx1 += 1 + break self.norm_write(tmp_audio, idx0, idx1) - idx1 += 1 + # println("%s->Suc." % path) except: - logger.error(f"{path}->{traceback.format_exc()}") + println("%s->%s" % (path, traceback.format_exc())) def pipeline_mp(self, infos, thread_n): for path, idx0 in tqdm.tqdm( @@ -108,26 +113,34 @@ class PreProcess: def pipeline_mp_inp_dir(self, inp_root, n_p): try: - infos = [(f"{inp_root}/{name}", idx) for idx, name in enumerate(sorted(list(os.listdir(inp_root))))] - + infos = [ + ("%s/%s" % (inp_root, name), idx) + for idx, name in enumerate(sorted(list(os.listdir(inp_root)))) + ] if noparallel: for i in range(n_p): - self.pipeline_mp(infos[i::n_p], i) + self.pipeline_mp(infos[i::n_p]) else: - processes = [ - multiprocessing.Process(target=self.pipeline_mp, args=(infos[i::n_p], i)) - for i in range(n_p) - ] - for process in processes: - process.start() - for process in processes: - process.join() + ps = [] + for i in range(n_p): + p = multiprocessing.Process( + target=self.pipeline_mp, args=(infos[i::n_p], i) + ) + ps.append(p) + p.start() + for i in range(n_p): + ps[i].join() except: - logger.error(f"Failed to process. {traceback.format_exc()}") + println("Fail. %s" % traceback.format_exc()) + + +def preprocess_trainset(inp_root, sr, n_p, exp_dir): + pp = PreProcess(sr, exp_dir) + println("start preprocess") + println(sys.argv) + pp.pipeline_mp_inp_dir(inp_root, n_p) + println("end preprocess") + if __name__ == "__main__": - process = PreProcess(sr, exp_dir) - logger.info("Starting preprocess") - logger.info(sys.argv) - process.pipeline_mp_inp_dir(inp_root, n_p) - logger.info("End preprocess") \ No newline at end of file + preprocess_trainset(inp_root, sr, n_p, exp_dir)