30 lines
807 B
Python
30 lines
807 B
Python
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
|