声音分类是音频深度学习中应用最广泛的方法之一。它包括学习对声音进行分类并预测声音的类别。这类问题可以应用到许多实际场景中,例如,对音乐片段进行分类以识别音乐类型,或通过一组扬声器对短话语进行分类以根据声音识别说话人。
在本文中,我们将介绍一个简单的演示应用程序,以便理解用于解决此类音频分类问题的方法。我的目标不仅仅是理解事物是如何运作的,还有它为什么会这样运作。
音频分类
就像使用MNIST数据集对手写数字进行分类被认为是计算机视觉的“Hello World”类型的问题一样,我们可以将此应用视为音频深度学习的入门问题。
我们将从声音文件开始,将它们转换为声谱图,将它们输入到CNN加线性分类器模型中,并产生关于声音所属类别的预测。
有许多合适的数据集可以用于不同类型的声音。这些数据集包含大量音频样本,以及每个样本的类标签,根据你试图解决的问题来识别声音的类型。
这些类标签通常可以从音频样本文件名的某些部分或文件所在的子文件夹名中获得。另外,类标签在单独的元数据文件中指定,通常为TXT、JSON或CSV格式。
演示-对普通城市声音进行分类
对于我们的演示,我们将使用Urban Sound 8K数据集,该数据集包含从日常城市生活中录制的普通声音的语料库。这些声音来自于10个分类,如工程噪音、狗叫声和汽笛声。每个声音样本都标有它所属的类。
下载数据集后,我们看到它由两部分组成:
“Audio”文件夹中的音频文件:它有10个子文件夹,命名为“fold1”到“fold10”。每个子文件夹包含许多。wav的音频样本。例如“fold1/103074 - 7 - 1 - 0. - wav”
“Metadata”文件夹中的元数据:它有一个文件“UrbanSound8K”。它包含关于数据集中每个音频样本的信息,如文件名、类标签、“fold”子文件夹位置等。类标签是10个类中的每个类从0到9的数字类ID。如。数字0表示空调,1表示汽车喇叭,以此类推。
一般音频的长度约为4秒。下面是其中一个例子:
数据集创建者的建议是使用10折的交叉验证,以便计算指标并评估模型的性能。但是,由于本文的目标主要是作为音频深度学习示例的演示,而不是获得最佳指标,因此,我们将忽略分折并将所有样本简单地视为一个大型数据集。
准备训练数据
对于大多数深度学习问题,我们将遵循以下步骤:
这个数据集的数据整理很简单:
特性(X)是音频文件路径
目标标签(y)是类名
由于数据集已经有一个包含此信息的元数据文件,所以我们可以直接使用它。元数据包含关于每个音频文件的信息。
由于它是一个CSV文件,我们可以使用Pandas来读取它。我们可以从元数据中准备特性和标签数据。
#----------------------------#PreparetrainingdatafromMetadatafile#----------------------------importpandasaspdfrompathlibimportPathdownload_path=Path.cwd()/'UrbanSound8K'#Readmetadatafilemetadata_file=download_path/'metadata'/'UrbanSound8K.csv'df=pd.read_csv(metadata_file) df.head() #Constructfilepathbyconcatenatingfoldandfilenamedf['relative_path'] ='/fold'+df['fold'].astype(str) +'/'+df['slice_file_name'].astype(str) #Takerelevantcolumnsdf=df[['relative_path', 'classID']] df.head()
我们训练的需要的信息如下:
当元数据不可用时,扫描音频文件目录
有了元数据文件,事情就简单多了。我们如何为不包含元数据文件的数据集准备数据呢?
许多数据集仅包含安排在文件夹结构中的音频文件,类标签可以通过目录进行派生。为了以这种格式准备我们的培训数据,我们将做以下工作:
扫描该目录并生成所有音频文件路径的列表。
从每个文件名或父子文件夹的名称中提取类标签
将每个类名从文本映射到一个数字类ID
不管有没有元数据,结果都是一样的——由音频文件名列表组成的特性和由类id组成的目标标签。
音频预处理:定义变换
这种带有音频文件路径的训练数据不能直接输入到模型中。我们必须从文件中加载音频数据并对其进行处理,使其符合模型所期望的格式。
当我们读取并加载音频文件时,所有音频预处理将在运行时动态完成。这种方法也类似于我们将要处理的图像文件。由于音频数据(或图像数据)可能非常大且占用大量内存,因此我们不希望提前一次将整个数据集全部读取到内存中。因此,我们在训练数据中仅保留音频文件名(或图像文件名)。。
然后在运行时,当我们一次训练一批数据时,我们将加载该批次的音频数据,并通过对音频进行一系列转换来对其进行处理。这样,我们一次只将一批音频数据保存在内存中。
对于图像数据,我们可能会有一个转换管道,在该转换过程中,我们首先将图像文件读取为像素并将其加载。然后,我们可以应用一些图像处理步骤来调整数据的形状和大小,将其裁剪为固定大小,然后将其从RGB转换为灰度(如果需要)。我们可能还会应用一些图像增强步骤,例如旋转,翻转等。
音频数据的处理非常相似。现在我们只定义函数,当我们在训练期间向模型提供数据时,它们将在稍后运行。
读取文件中的音频
我们需要做的第一件事是以“ .wav”格式读取和加载音频文件。由于我们在此示例中使用的是Pytorch,因此下面的实现使用torchaudio进行音频处理,但是librosa也可以正常工作。
importmath, randomimporttorchimporttorchaudiofromtorchaudioimporttransformsfromIPython.displayimportAudioclassAudioUtil(): #----------------------------#Loadanaudiofile. Returnthesignalasatensorandthesamplerate#----------------------------defopen(audio_file): sig, sr=torchaudio.load(audio_file) return (sig, sr)