shithub: opus

ref: 4f3761b0199df7024b6e6b2004fc5eb7a6dbb28b
dir: /dnn/torch/testsuite/utils/pitch.py/

View raw version
import numpy as np
from scipy.io import wavfile
import amfm_decompy.pYAAPT as pYAAPT
import amfm_decompy.basic_tools as basic

def get_voicing_info(x, sr=16000):

    signal = basic.SignalObj(x, sr)
    pitch = pYAAPT.yaapt(signal, **{'frame_length' : 20.0, 'tda_frame_length' : 20.0})

    pitch_values = pitch.samp_values
    voiced_flags = pitch.vuv.astype('float')

    return pitch_values, voiced_flags

def compute_pitch_error(ref_path, test_path, fs=16000):
    fs_orig, x_orig = wavfile.read(ref_path)
    fs_test, x_test = wavfile.read(test_path)

    min_length = min(len(x_orig), len(x_test))
    x_orig = x_orig[:min_length]
    x_test = x_test[:min_length]

    assert fs_orig == fs_test == fs

    pitch_contour_orig, voicing_orig = get_voicing_info(x_orig.astype(np.float32))
    pitch_contour_test, voicing_test = get_voicing_info(x_test.astype(np.float32))

    return {
        'pitch_error' : np.mean(np.abs(pitch_contour_orig - pitch_contour_test)).item(),
        'voicing_error' : np.sum(np.abs(voicing_orig - voicing_test)).item() / len(voicing_orig)
        }