diegotg343's picture
better app version
18f8e1a
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