使用深度学习进行音频分类的端到端示例和解释(二)

简介: 使用深度学习进行音频分类的端到端示例和解释

转换成立体声

一些声音文件是单声道(即1个音频通道),而大多数则是立体声(即2个音频通道)。由于我们的模型期望所有项目都具有相同的尺寸,因此我们将第一个通道复制到第二个通道,从而将单声道文件转换为立体声。

#----------------------------#Convertthegivenaudiotothedesirednumberofchannels#----------------------------@staticmethoddefrechannel(aud, new_channel):
sig, sr=audif (sig.shape[0] ==new_channel):
#Nothingtodoreturnaudif (new_channel==1):
#Convertfromstereotomonobyselectingonlythefirstchannelresig=sig[:1, :]
else:
#Convertfrommonotostereobyduplicatingthefirstchannelresig=torch.cat([sig, sig])
return ((resig, sr))

标准化采样率

一些声音文件以48000Hz的采样率采样,而大多数声音文件以44100Hz的采样率采样。这意味着对于某些声音文件,1秒音频的数组大小为48000,而对于其他声音文件,其数组大小为44100。,我们必须将所有音频标准化并将其转换为相同的采样率,以使所有阵列具有相同的尺寸。

#----------------------------#SinceResampleappliestoasinglechannel, weresampleonechannelatatime#----------------------------@staticmethoddefresample(aud, newsr):
sig, sr=audif (sr==newsr):
#Nothingtodoreturnaudnum_channels=sig.shape[0]
#Resamplefirstchannelresig=torchaudio.transforms.Resample(sr, newsr)(sig[:1,:])
if (num_channels>1):
#Resamplethesecondchannelandmergebothchannelsretwo=torchaudio.transforms.Resample(sr, newsr)(sig[1:,:])
resig=torch.cat([resig, retwo])
return ((resig, newsr))

调整为相同长度

然后,我们将所有音频样本的大小调整为具有相同的长度,方法是通过使用静默填充或通过截断其长度来延长其持续时间。我们将该方法添加到AudioUtil类中。

#----------------------------#Pad (ortruncate) thesignaltoafixedlength'max_ms'inmilliseconds#----------------------------@staticmethoddefpad_trunc(aud, max_ms):
sig, sr=audnum_rows, sig_len=sig.shapemax_len=sr//1000 * max_msif (sig_len>max_len):
#Truncatethesignaltothegivenlengthsig=sig[:,:max_len]
elif (sig_len<max_len):
#Lengthofpaddingtoaddatthebeginningandendofthesignalpad_begin_len=random.randint(0, max_len-sig_len)
pad_end_len=max_len-sig_len-pad_begin_len#Padwith0spad_begin=torch.zeros((num_rows, pad_begin_len))
pad_end=torch.zeros((num_rows, pad_end_len))
sig=torch.cat((pad_begin, sig, pad_end), 1)
return (sig, sr)

数据扩充增广:时移

接下来,我们可以通过应用时间偏移将音频向左或向右移动随机量来对原始音频信号进行数据增广。在本文中,我将详细介绍此技术和其他数据增广技术。

640.png

#----------------------------#Shiftsthesignaltotheleftorrightbysomepercent. Valuesattheend#are'wrapped around'tothestartofthetransformedsignal.
#----------------------------@staticmethoddeftime_shift(aud, shift_limit):
sig,sr=aud_, sig_len=sig.shapeshift_amt=int(random.random() *shift_limit*sig_len)
return (sig.roll(shift_amt), sr)

梅尔谱图

我们将增广后的音频转换为梅尔频谱图。它们捕获了音频的基本特征,并且通常是将音频数据输入到深度学习模型中的最合适方法。

#----------------------------#GenerateaSpectrogram#----------------------------@staticmethoddefspectro_gram(aud, n_mels=64, n_fft=1024, hop_len=None):
sig,sr=audtop_db=80#spechasshape [channel, n_mels, time], wherechannelismono, stereoetcspec=transforms.MelSpectrogram(sr, n_fft=n_fft, hop_length=hop_len, n_mels=n_mels)(sig)
#Converttodecibelsspec=transforms.AmplitudeToDB(top_db=top_db)(spec)
return (spec)

640.png

数据扩充:时间和频率屏蔽

现在我们可以进行另一轮扩充,这次是在Mel频谱图上,而不是在原始音频上。我们将使用一种称为SpecAugment的技术,该技术使用以下两种方法:

频率屏蔽-通过在频谱图上添加水平条来随机屏蔽一系列连续频率。

时间掩码-与频率掩码类似,不同之处在于,我们使用竖线从频谱图中随机地遮挡了时间范围。

#----------------------------#AugmenttheSpectrogrambymaskingoutsomesectionsofitinboththefrequency#dimension (ie. horizontalbars) andthetimedimension (verticalbars) toprevent#overfittingandtohelpthemodelgeneralisebetter. Themaskedsectionsare#replacedwiththemeanvalue.
#----------------------------@staticmethoddefspectro_augment(spec, max_mask_pct=0.1, n_freq_masks=1, n_time_masks=1):
_, n_mels, n_steps=spec.shapemask_value=spec.mean()
aug_spec=specfreq_mask_param=max_mask_pct*n_melsfor_inrange(n_freq_masks):
aug_spec=transforms.FrequencyMasking(freq_mask_param)(aug_spec, mask_value)
time_mask_param=max_mask_pct*n_stepsfor_inrange(n_time_masks):
aug_spec=transforms.TimeMasking(time_mask_param)(aug_spec, mask_value)
returnaug_spec

640.png

自定义数据加载器

现在,我们已经定义了所有预处理转换函数,我们将定义一个自定义的Pytorch Dataset对象。

要将数据提供给使用Pytorch的模型,我们需要两个对象:

一个自定义Dataset对象,该对象使用所有音频转换来预处理音频文件并一次准备一个数据项。

内置的DataLoader对象,该对象使用Dataset对象来获取单个数据项并将其打包为一批数据。

fromtorch.utils.dataimportDataLoader, Dataset, random_splitimporttorchaudio#----------------------------#SoundDataset#----------------------------classSoundDS(Dataset):
def__init__(self, df, data_path):
self.df=dfself.data_path=str(data_path)
self.duration=4000self.sr=44100self.channel=2self.shift_pct=0.4#----------------------------#Numberofitemsindataset#----------------------------def__len__(self):
returnlen(self.df)    
#----------------------------#Geti'th item in dataset# ----------------------------def __getitem__(self, idx):# Absolute file path of the audio file - concatenate the audio directory with# the relative pathaudio_file = self.data_path + self.df.loc[idx, 'relative_path']# Get the Class IDclass_id = self.df.loc[idx, 'classID']aud = AudioUtil.open(audio_file)# Some sounds have a higher sample rate, or fewer channels compared to the# majority. So make all sounds have the same number of channels and same# sample rate. Unless the sample rate is the same, the pad_trunc will still# result in arrays of different lengths, even though the sound duration is# the same.reaud = AudioUtil.resample(aud, self.sr)rechan = AudioUtil.rechannel(reaud, self.channel)dur_aud = AudioUtil.pad_trunc(rechan, self.duration)shift_aud = AudioUtil.time_shift(dur_aud, self.shift_pct)sgram = AudioUtil.spectro_gram(shift_aud, n_mels=64, n_fft=1024, hop_len=None)aug_sgram = AudioUtil.spectro_augment(sgram, max_mask_pct=0.1, n_freq_masks=2, n_time_masks=2)return aug_sgram, class_id
目录
相关文章
|
7天前
|
机器学习/深度学习 人工智能 算法
基于深度学习的地面垃圾识别分类技术
AI垃圾分类系统结合深度学习和计算机视觉技术,实现高效、精准的垃圾识别与自动分类。系统集成高精度图像识别、多模态数据分析和实时处理技术,适用于市政环卫、垃圾处理厂和智能回收设备,显著提升管理效率,降低人工成本。
基于深度学习的地面垃圾识别分类技术
|
1月前
|
机器学习/深度学习 数据处理 数据库
基于Django的深度学习视频分类Web系统
基于Django的深度学习视频分类Web系统
52 4
基于Django的深度学习视频分类Web系统
|
2月前
|
机器学习/深度学习 人工智能 算法
【新闻文本分类识别系统】Python+卷积神经网络算法+人工智能+深度学习+计算机毕设项目+Django网页界面平台
文本分类识别系统。本系统使用Python作为主要开发语言,首先收集了10种中文文本数据集("体育类", "财经类", "房产类", "家居类", "教育类", "科技类", "时尚类", "时政类", "游戏类", "娱乐类"),然后基于TensorFlow搭建CNN卷积神经网络算法模型。通过对数据集进行多轮迭代训练,最后得到一个识别精度较高的模型,并保存为本地的h5格式。然后使用Django开发Web网页端操作界面,实现用户上传一段文本识别其所属的类别。
87 1
【新闻文本分类识别系统】Python+卷积神经网络算法+人工智能+深度学习+计算机毕设项目+Django网页界面平台
|
1月前
|
机器学习/深度学习 PyTorch 算法框架/工具
深度学习入门案例:运用神经网络实现价格分类
深度学习入门案例:运用神经网络实现价格分类
|
1月前
|
机器学习/深度学习 算法 算法框架/工具
深度学习在图像识别中的应用及代码示例
【9月更文挑战第32天】本文将深入探讨深度学习在图像识别领域的应用,包括其原理、技术、优势以及挑战。我们将通过一个简单的代码示例,展示如何使用深度学习技术进行图像识别。无论你是初学者还是有经验的开发者,都可以从中获得启发和帮助。让我们一起探索这个充满无限可能的领域吧!
66 8
|
1月前
|
机器学习/深度学习 传感器 监控
深度学习之动作识别与分类
基于深度学习的动作识别与分类是指通过深度学习模型从视频或传感器数据中自动识别和分类人类动作的过程。这项技术广泛应用于视频监控、安全监控、体育分析、医疗康复、虚拟现实(VR)和增强现实(AR)等领域。
57 1
|
3月前
|
机器学习/深度学习 人工智能 自然语言处理
【深度学习】Python之人工智能应用篇——音频生成技术
音频生成是指根据所输入的数据合成对应的声音波形的过程,主要包括根据文本合成语音(text-to-speech)、进行不同语言之间的语音转换、根据视觉内容(图像或视频)进行语音描述,以及生成旋律、音乐等。它涵盖了声音结构中的音素、音节、音位、语素等基本单位的预测和组合,通过频谱逼近或波形逼近的合成策略来实现音频的生成。 音频生成技术的发展主要依赖于深度学习模型,如循环神经网络(RNN)、长短时记忆网络(LSTM)、Transformer等。这些模型通过学习大量的音频数据,能够自动生成与人类发音相似甚至超越人类水平的音频内容。近年来,随着大规模预训练模型的流行,如GPT系列模型、BERT、T5等,
77 7
【深度学习】Python之人工智能应用篇——音频生成技术
|
2月前
|
机器学习/深度学习 数据采集 数据可视化
深度学习实践:构建并训练卷积神经网络(CNN)对CIFAR-10数据集进行分类
本文详细介绍如何使用PyTorch构建并训练卷积神经网络(CNN)对CIFAR-10数据集进行图像分类。从数据预处理、模型定义到训练过程及结果可视化,文章全面展示了深度学习项目的全流程。通过实际操作,读者可以深入了解CNN在图像分类任务中的应用,并掌握PyTorch的基本使用方法。希望本文为您的深度学习项目提供有价值的参考与启示。
|
3月前
|
机器学习/深度学习 人工智能 算法框架/工具
深入浅出:使用深度学习进行图像分类
【8月更文挑战第31天】在本文中,我们将一起探索如何利用深度学习技术对图像进行分类。通过简明的语言和直观的代码示例,我们将了解构建和训练一个简单卷积神经网络(CNN)模型的过程。无论你是初学者还是有一定基础的开发者,这篇文章都将为你提供清晰的指导和启发性的见解,帮助你理解并应用深度学习解决实际问题。
|
3月前
|
机器学习/深度学习 人工智能 自然语言处理
【深度学习】深度学习的概述及应用,附带代码示例
深度学习(Deep Learning,简称DL)是机器学习领域中的一个重要分支,其目标是通过模拟人脑神经网络的工作机制,构建多层次的抽象特征表示,使机器能够自动从原始数据中提取关键信息,从而实现高精度的任务执行。深度学习通过多层神经网络结构及其训练方式,实现了从低级像素级别到高级概念级别的递进式知识层次。 深度学习的主要组件包括输入层、隐藏层和输出层。隐藏层的数量和层数决定了模型的复杂度和表达能力。在训练过程中,权重更新和梯度下降法是关键步骤,目的是最小化损失函数,提高预测精度。深度学习主要基于反向传播算法(BP Algorithm)来优化模型参数,通过正向传播、损失计算、反向传播和梯度下降等
157 8
下一篇
无影云桌面