我正在尝试从音频(.wav 文件)中提取 MFCC 特征,并且我已经尝试过python_speech_features
and librosa
但他们给出了完全不同的结果:
audio, sr = librosa.load(file, sr=None)
# librosa
hop_length = int(sr/100)
n_fft = int(sr/40)
features_librosa = librosa.feature.mfcc(audio, sr, n_mfcc=13, hop_length=hop_length, n_fft=n_fft)
# psf
features_psf = mfcc(audio, sr, numcep=13, winlen=0.025, winstep=0.01)
下面是图:
librosa:
python_speech_features:
我是否为这两种方法传递了错误的参数?为什么这里会有这么大的差异呢?
Update:我也尝试过tensorflow.signal实现,结果如下:
该图本身更接近 librosa 中的图,但比例更接近 python_speech_features。 (请注意,这里我计算了 80 个梅尔 bin,并取了前 13 个;如果我仅使用 13 个 bin 进行计算,结果看起来也完全不同)。代码如下:
stfts = tf.signal.stft(audio, frame_length=n_fft, frame_step=hop_length, fft_length=512)
spectrograms = tf.abs(stfts)
num_spectrogram_bins = stfts.shape[-1]
lower_edge_hertz, upper_edge_hertz, num_mel_bins = 80.0, 7600.0, 80
linear_to_mel_weight_matrix = tf.signal.linear_to_mel_weight_matrix(
num_mel_bins, num_spectrogram_bins, sr, lower_edge_hertz, upper_edge_hertz)
mel_spectrograms = tf.tensordot(spectrograms, linear_to_mel_weight_matrix, 1)
mel_spectrograms.set_shape(spectrograms.shape[:-1].concatenate(linear_to_mel_weight_matrix.shape[-1:]))
log_mel_spectrograms = tf.math.log(mel_spectrograms + 1e-6)
features_tf = tf.signal.mfccs_from_log_mel_spectrograms(log_mel_spectrograms)[..., :13]
features_tf = np.array(features_tf).T
我想我的问题是:哪个输出更接近 MFCC 的实际情况?