import glob, os, random from concurrent.futures import ProcessPoolExecutor import numpy as np import soundfile as sf SR = 16000 NOISES = sorted(glob.glob("/scratch/noise/*.flac")) os.makedirs("/scratch/rehearsal_deg/audio", exist_ok=True) def degrade(src): rng = random.Random(hash(os.path.basename(src)) & 0xffffffff) dst = "/scratch/rehearsal_deg/audio/" + os.path.basename(src) if os.path.exists(dst): return wav, _ = sf.read(src, dtype="float32") if rng.random() < 0.7 and NOISES: n, _ = sf.read(NOISES[rng.randrange(len(NOISES))], dtype="float32") if len(n) < len(wav): n = np.tile(n, len(wav) // len(n) + 1) s = rng.randrange(max(len(n) - len(wav), 1)) n = n[s:s + len(wav)] snr = rng.uniform(3.0, 15.0) pw, pn = float((wav ** 2).mean()) + 1e-9, float((n ** 2).mean()) + 1e-9 wav = wav + n * np.sqrt(pw / (pn * 10 ** (snr / 10))) if rng.random() < 0.5: f = rng.uniform(0.9, 1.1) idx = np.arange(0, len(wav) - 1, f) wav = np.interp(idx, np.arange(len(wav)), wav).astype(np.float32) if rng.random() < 0.5: idx8 = np.arange(0, len(wav) - 1, 2.0) down = np.interp(idx8, np.arange(len(wav)), wav) idx16 = np.arange(0, len(down) - 1, 0.5) wav = np.interp(idx16, np.arange(len(down)), down).astype(np.float32) wav = np.clip(wav * (10 ** (rng.uniform(-6, 3) / 20)), -1, 1).astype(np.float32) sf.write(dst, wav, SR) files = sorted(glob.glob("/scratch/rehearsal/audio/*.flac")) with ProcessPoolExecutor(max_workers=8) as ex: list(ex.map(degrade, files, chunksize=64)) print("DEGRADE_DONE", len(files))