如何对整个音频文件调用librosa函数



我有一些短音频文件,我正试图使用Librosa进行分析,特别是频谱质心函数。然而,该函数输出表示音频文件内不同帧处的频谱质心的不同值的阵列。文档中说,可以通过在调用函数时指定参数n_fft来更改帧大小。如果这个函数一次分析整个音频文件,而不是在多个时间点输出结果,对我来说会更有好处。有没有一种方法可以指定我希望用整个音频文件的帧大小来调用函数,而不是默认的2048个采样时间?还有更好的方法吗?

干杯,谢谢!

FFT窗口的长度(n_fft(不仅指定需要多少样本,还指定结果的频率分辨率(n_fft越长,分辨率越好(。为了确保许多文件的结果具有可比性,您可能希望对所有文件使用相同的n_fft值。

这样一来,假设你的文件都不超过16k个样本。然后,您仍然可以实现合理的运行时间(FFT在O(N log N(中运行(。显然,随着文件大小的增加,情况会变得更糟。所以你可以调用spectral_centroid(y=y, n_fft=16384, hop_length=16384, center=False),因为hop_length被设置为与n_fft相同的值,所以你可以计算非重叠窗口的FFT。因为n_fft大于所有文件中的最大样本数(在本例中(,所以应该只得到一个值。请注意,我将center设置为False,以避免对您的场景进行不必要的调整。

除了选择长变换窗口之外,您还可以使用STFT计算重叠窗口(或帧(的许多值(这就是librosa所做的(,并简单地对结果值进行平均,如下所示:

import numpy as np
import librosa
y, sr = librosa.load(librosa.ex('trumpet'))
cent = librosa.feature.spectral_centroid(y=y, sr=sr, center=False)
avg_cent = np.mean(cent)
print(avg_cent)
2618.004809523263

后一种解决方案符合MIR中通常采用的方法和我的建议。请注意,这还允许您使用其他统计函数,如中值,这可能是您感兴趣的,也可能不是您感兴趣。换句话说,您可以确定质心的分布。这可以说具有更大的意义。

最新更新