哪个频谱图最能代表基于 CNN 的模型的音频文件的特征?

Which Spectrogram best represents features of an audio file for CNN based model?

我希望了解用于音频分析的各种频谱图。我想将一个音频文件转换为 10 秒的块,为每个块生成频谱图,并使用 CNN 模型在这些图像之上进行训练,看看它们是好是坏。

我看过线性、对数、梅尔等,并在某处读到基于梅尔的频谱图最适合用于此。但是没有适当的可验证信息。我使用以下简单代码生成梅尔频谱图。

y,sr= librosa.core.load(r'C:\Users\Tej\Desktop\NoiseWork\NoiseOnly\song.wav')
S = librosa.feature.melspectrogram(y=y, sr=sr)
librosa.display.specshow(librosa.power_to_db(S, ref=np.max))

我的问题是哪个频谱图最能代表用于 CNN 训练的音频文件的特征?我用过线性但一些音频文件的线性频谱图似乎是一样的

对数标度的梅尔频谱图是当前 "standard" 用于卷积神经网络的。它是 2015-2018 年音频事件检测和音频场景分类文献中最常用的。

为了对幅度变化更加不变,通常应用归一化。整个剪辑或 windows 被分类。 Mean/std 通常,规范化工作正常。

但是从CNN的角度来看,不同光谱仪变化之间的差异相对较小。因此,如果两个或多个频谱图基本相同,这不太可能解决您的问题。

为了补充已陈述的内容,我建议通读 Keunwoo Choi、György Fazekas、Kyunghyun Cho 和 Mark Sandler 的 A Comparison of Audio Signal Preprocessing Methods for Deep Neural Networks on Music Tagging

对于他们的数据,他们在简单的 STFT 和梅尔谱图之间实现了几乎相同的分类精度。因此,如果您不介意预处理,melspectrograms 似乎是降维的明显赢家。作者还发现,正如 jonner 提到的那样,log-scaling(本质上是将振幅转换为分贝刻度)提高了准确性。您可以像这样使用 Librosa(使用您的代码)轻松地做到这一点:

y,sr= librosa.core.load(r'C:\Users\Tej\Desktop\NoiseWork\NoiseOnly\song.wav')
S = librosa.feature.melspectrogram(y=y, sr=sr)
S_db = librosa.core.power_to_db(S)

至于 db-scaling 之后的标准化,这似乎取决于您的数据。从上面的论文中,作者发现对他们的数据使用各种归一化技术几乎没有区别。

最后应该提到的一件事是一种名为 Per-Channel 能量归一化的新方法。我推荐阅读 Vincent Lostanlen、Justin Salamon、Mark Cartwright、Brian McFee 的 Per-Channel Energy Normalization: Why and How, Andrew Farnsworth、Steve Kelling 和 Juan Pablo Bello。不幸的是,有些参数需要根据数据进行调整,但在许多情况下似乎与 logmelspectrograms 一样好或更好。您可以像这样在 Librosa 中实现它:

y,sr= librosa.core.load(r'C:\Users\Tej\Desktop\NoiseWork\NoiseOnly\song.wav')
S = librosa.feature.melspectrogram(y=y, sr=sr)
S_pcen = librosa.pcen(S)

不过,就像我提到的,pcen 中有一些参数需要调整!如果您有兴趣,这里 Librosa's documentation on PCEN 可以帮助您入门。