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

How do I call a librosa function on the entire audio file?

我有一些简短的音频文件,我正在尝试使用 Librosa 进行分析,尤其是频谱质心函数。但是,此函数输出一个不同值的数组,表示音频文件中不同帧的频谱质心。 The documentation表示调用函数时指定参数n_fft可以改变帧大小。如果此功能一次分析整个音频文件而不是在多个时间点输出结果,对我来说会更有用。有没有办法让我指定我希望使用 整个 音频文件的帧大小而不是默认时间 2048 个样本来调用函数?还有其他更好的方法吗?

干杯,谢谢!

FFT的长度window(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 相同的值,您将计算非重叠 windows 的 FFT。并且因为 n_fft 大于所有文件中的最大样本数(在本例中),您应该只获得一个值。请注意,我将 center 设置为 False 以避免对您的情况进行不必要的调整。

除了选择长变换 window,您还可以使用 STFT 计算重叠 windows(或帧)的许多值(这正是 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中通常的做法和我的建议。请注意,这还允许您使用其他统计函数,例如 中位数 ,这可能是您感兴趣的,也可能不是您感兴趣的。换句话说,您可以确定 质心的分布,这可以说具有更多的意义。