【发布时间】:2020-06-14 23:06:04
【问题描述】:
我正在尝试从音频(.wav 文件)中提取 MFCC 特征,我尝试过 python_speech_features 和 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)
以下是地块:
我是否为这两种方法传递了错误的参数?为什么这里有这么大的差异?
更新:我也尝试过 tensorflow.signal 实现,结果如下:
情节本身更接近 librosa 的情节,但比例更接近 python_speech_features。 (请注意,这里我计算了 80 个 mel 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 的实际样子?
【问题讨论】:
-
有趣。将采样率作为 kwarg 传递给 psf 版本,即
samplerate=sr,有什么不同吗?或者更改 librosa 版本中的dct_type? -
@Hendrik psf 版本已经有
sr作为输入。就dct_type而言,当我设置为 3 时会有一些变化,但与 psf 输出仍然相差甚远(1 和 2 几乎相同)。 -
@Hendrik 也尝试过 tensorflow,它更接近 librosa 但规模如此不同。
-
"将采样率作为 kwarg 传递给 psf 版本,即
samplerate=sr,有什么不同吗?" -> 我的意思是,你将它作为位置参数传递,但它是一个关键字参数。不确定,如果将它作为 kwarg 参数传递在这里会有所不同,但我会坚持(显式)API。 -
@Hendrik 不,没有区别。
标签: python tensorflow audio librosa mfcc