使用YIN算法提取音频的F0 Contours的代码实现
简介
F0 Contours, 全称为Fundamental Frequency Contours, 它与Pitch Contours所指相同。
基频提取(pitch estimation, pitch tracking)在声音处理中有广泛的应用。它最直接的应用,是用来识别音乐的旋律。它也可以用于语音处理,比如辅助带声调语言(如汉语)的语音识别,以及识别语音中的情感。
YIN算法是基频提取的算法之一。其名称取自「阴阳」之「阴」,它表明算法的核心思想是在差函数上寻找「谷值」,而不是在自相关函数上寻找「峰值」。关于YIN算法的具体描述可见基频提取算法综述。
代码实现
我们可以通过使用python中的librosa库的yin函数来进行YIN算法提取音频。关于yin函数详细信息可见:https://librosa.org/doc/latest/generated/librosa.yin.html?highlight=yin
下面给一个提取F0 Contours的代码示例:
import matplotlib.pyplot as plt
import librosa
import numpy as np
for i in range(1, 11):
filename = "Flowtron_sigma1.0/times" + str(i) + "_sid0_sigma1.0.wav"
y, sr = librosa.load(filename, sr=None)
f0 = librosa.yin(y, fmin=80, fmax=400)
f0[np.isnan(f0)] = 0
times = librosa.times_like(f0)
plt.plot(times, f0, "_", linewidth=1)
plt.xlabel("Time(s)")
plt.ylabel("F0")
效果图: