from basics.base_pe import BasePE import numpy as np import pyworld as pw from utils.pitch_utils import interp_f0 class HarvestPE(BasePE): def get_pitch( self, waveform, samplerate, length, *, hop_size, f0_min=65, f0_max=1100, speed=1, interp_uv=False ): hop_size = int(np.round(hop_size * speed)) time_step = 1000 * hop_size / samplerate f0, _ = pw.harvest( waveform.astype(np.float64), samplerate, f0_floor=f0_min, f0_ceil=f0_max, frame_period=time_step ) f0 = f0.astype(np.float32) if f0.size < length: f0 = np.pad(f0, (0, length - f0.size)) f0 = f0[:length] uv = f0 == 0 if interp_uv: f0, uv = interp_f0(f0, uv) return f0, uv