如何以可用于预处理和建模的格式表示音频数据?

数据挖掘 Python 深度学习 分类 监督学习 音频识别
2021-10-12 00:01:21

我有一个我目前正在做的项目。该项目是对音频数据进行分类。数据位于两个文件夹traintest. train文件夹中,有多个文件夹,如cat,这些文件夹包含多个音频文件。比如文件夹里面有多个音频文件等等文件夹也是代表音频所属的名称。音频是格式的。如何以我可以使用机器学习模型的格式表示这些数据?dogelephantdogcatclassclass.WAV

稍微解释一下我的问题:让我们拿一个.csv文件。我们有行和列。行是数据点,列是特征,在这些数据上训练机器训练模型是有意义的。

那么,我如何表示可以使用并适合 ml 模型的音频数据?

2个回答

音频 .wav 编解码器文件有一个 44 字节的标头,它将为您提供关键数据,例如位深度(CD 质量音频为每个样本 16 位)、采样率(CD 质量使用每秒 44,100 个音频样本)、通道数等。 .wav 文件中的字节余额是有效负载,它是存储为一组整数的音频曲线,这些整数定义了音频曲线在时间连续实例中的高度。.wav 的美妙之处在于它没有被压缩,因此标头之后的所有字节都只存储音频曲线。

许多音频库将允许您读取 wav 文件并返回每个通道的浮点样本数组。想象一下狗叫声,这种声音从狗身上传播并落在麦克风的膜上。类似的摆动不同的介质。随着时间的推移记录的这种摆动可以表示为时间序列曲线......随着它的数字化,它从模拟转换为数字(ADC)原始模拟音频波每秒被〜采样〜X次以生成该模拟的简化在此模数转换过程中的曲线。每个音频样本代表该音频曲线在特定时刻的高度。

如果您只使用 1 位来记录音频曲线,对于给定的样本,这将从 0 过渡到 1,因为音频曲线会在固定静音平线标记上方和下方摆动。而可以存储 2^16 个不同整数的 16 位位深度允许更大的粒度,因此更准确地模拟音频曲线的高度。

与概念上整个数据集可以在瞬间消耗掉的图像处理不同,音频具有内在的时间维度。音频是一个时间序列。音频的另一个属性是任何任意音频曲线都可以用一组纯正弦曲线表示的简单性,每条曲线都有一个幅度、频率和相移。Joseph Fourier 概述了这样的理论,即音频等时域数据可以在时域(wav 编解码器或模拟音频曲线)或频域中同样好地表示。值得注意的是,这种对称性意味着信息的守恒。

对于任意程度的精度,可以使用傅里叶变换将音频样本窗口(在时域中)转换为具有可控程度的信息丢失或缺失的频域表示。请注意,当您增加此窗口中的样本数量时,您会降低所得频谱图的时间特异性......这意味着通过使用窗口中发送到的最低数量的音频样本来确定频率何时发生的能力FFT 调用...尽管通过向 FFT 调用提供大量样本来提高频率域中的频率分辨率...没有免费的午餐

所以现在您有选择...在其本机时域中执行您的音频分析或将其发送到 FFT 调用并具有与一组频率箱相同的信息,其中每个箱具有(频率、幅度、相移)的值)

这应该会给你一些想法来梳理和深入研究——保重

传统上,频谱图已用于大多数音频 ML 任务。根据您的任务,不同类型的频谱图可能最适合(不同的频率分辨率、缩放等)。在您的情况下,我可能会尝试具有单位方差和零均值的梅尔幅度谱图。

要将此频谱图输入深度学习网络,如卷积神经网络 (CNN),您将使用固定长度的重叠窗口(您在预测时也这样做)。或者,已经使用了其他方法,如RNN或最近的 TCN 。它们都使用频谱图作为输入。要提取 mel 频谱图(或其他格式),您可以使用librosa 之类的库,特别是melspectrogram使用频谱图进行音频分类的示例是使用卷积神经网络的流派无关键分类或使用卷积神经网络进行音乐节奏估计的单步方法. 您可以在BirdCLEF2019DCASE上找到更多关于动物声音分类的信息,特别是针对鸟类的分类

对于音乐,Dieleman 在End-to-end learning for music audio (IEEE paywalled) 中展示了您也可以直接使用波形对音频信号进行分类。Pons 等人后来的工作是大规模音乐音频标记的端到端学习付费),更详细地解释了分类波形而不是频谱图是否有用以及为什么有用。

我强烈建议坚持使用频谱图开始,因为恕我直言,设置要容易得多。