Spaces:
Running
Running
| import numpy as np, pyworld as pw | |
| from .config import TARGET_SR, WORLD_FRAME_PERIOD_MS | |
| def hop_seconds() -> float: | |
| return WORLD_FRAME_PERIOD_MS / 1000.0 | |
| def frame_times(n_frames: int) -> np.ndarray: | |
| return np.arange(n_frames) * hop_seconds() | |
| def get_f0_world(y: np.ndarray, sr: int = TARGET_SR) -> np.ndarray: | |
| y64 = y.astype(np.float64) | |
| _f0, t = pw.harvest(y64, fs=sr, frame_period=WORLD_FRAME_PERIOD_MS, f0_floor=20) | |
| f0 = pw.stonemask(y64, _f0, t, fs=sr) | |
| return f0 # Hz, 0 for unvoiced | |
| def f0_to_logf0(f0_hz: np.ndarray) -> np.ndarray: | |
| out = np.zeros_like(f0_hz, dtype=np.float32); v = f0_hz > 0; out[v] = np.log2(f0_hz[v]); return out | |
| def logf0_to_f0(logf0: np.ndarray) -> np.ndarray: | |
| out = np.zeros_like(logf0, dtype=np.float32); v = logf0 != 0; out[v] = 2.0 ** logf0[v]; return out | |
| def guess_y_range(f0_gt: np.ndarray): | |
| v = f0_gt[f0_gt > 0] | |
| if v.size == 0: return 60.0, 400.0 | |
| lo = float(np.percentile(v, 5)); hi = float(np.percentile(v, 95)) | |
| if hi - lo < 40: lo = max(40.0, lo - 20); hi += 20 | |
| return lo, hi | |