15

基于梅尔频谱的音频信号分类识别(Pytorch)

 2 years ago
source link: https://blog.csdn.net/guyuealian/article/details/120601437
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

基于梅尔频谱的音频信号分类识别(Pytorch)

专栏收录该内容
2 篇文章 2 订阅

本项目将使用Pytorch,实现一个简单的的音频信号分类器,可应用于机械信号分类识别,鸟叫声信号识别等应用场景。 

项目使用librosa进行音频信号处理,backbone使用mobilenet_v2,在Urbansound8K数据上,最终收敛的准确率在训练集99%,测试集82%,如果想进一步提高识别准确率可以使用更重的backbone和更多的数据增强方法。

完整的项目代码:https://download.csdn.net/download/guyuealian/30306697

尊重原创,转载请注明出处:https://panjinquan.blog.csdn.net/article/details/120601437


目录

1. 项目结构

2. 环境配置

3.音频识别基础知识

(1) STFT和声谱图(spectrogram)    

(2) 梅尔频谱

(3) 梅尔频率倒谱MFCC

(4) MFCC特征的过程

4.数据处理

(1)数据集Urbansound8K 

(2)自定义数据集

(3)音频特征提取: 

5.训练Pipeline

6.预测demo.py


1. 项目结构


2. 环境配置

使用pip命令安装libsora和pyaudio,pydub等库

3.音频识别基础知识

(1) STFT和声谱图(spectrogram)    

声音信号是一维信号,直观上只能看到时域信息,不能看到频域信息。通过傅里叶变换(FT)可以变换到频域,但是丢失了时域信息,无法看到时频关系。为了解决这个问题,产生了很多方法,短时傅里叶变换,小波等都是很常用的时频分析方法。  

短时傅里叶变换(STFT),就是对短时的信号做傅里叶变换。原理如下:对一段长语音信号,分帧、加窗,再对每一帧做傅里叶变换,之后把每一帧的结果沿另一维度堆叠,得到一张图(类似于二维信号),这张图就是声谱图。

(2) 梅尔频谱

人耳能听到的频率范围是20-20000HZ,但是人耳对HZ单位不是线性敏感,而是对低HZ敏感,对高HZ不敏感,将HZ频率转化为梅尔频率,则人耳对频率的感知度就变为线性。    

例如如果我们适应了1000Hz的音调,如果把音调频率提高到2000Hz,我们的耳朵只能觉察到频率提高了一点点,根本察觉不到频率提高了一倍 。

将普通频率转化到Mel频率的公式是

在Mel频域内,人对音调的感知度为线性关系。举例来说,如果两段语音的Mel频率相差两倍,则人耳听起来两者的音调也相差两倍。

上图是HZ到Mel的映射关系图,由于二者为log关系,在频率较低时,Mel随HZ变化较快;当频率较高时,曲线斜率小,变化缓慢。

(3) 梅尔频率倒谱MFCC

:梅尔频率倒谱系数,简称MFCC,Mel-frequency cepstral coefficients)

  • 梅尔频谱就是一般的频谱图加上梅尔滤波函数,这一步是为了模拟人耳听觉对实际频率的敏感程度
  • 梅尔倒谱就是再对梅尔频谱进行一次频谱分析,具体就是对梅尔频谱取对数,然后做DCT变换,目的是抽取频谱图的轮廓信息,这个比较能代表语音的特征。
  • 如果取低频的13位,就是最经典的语音特征mfcc了

(4) MFCC特征的过程

  • 先对语音进行预加重、分帧和加窗;
  • 对每一个短时分析窗,通过FFT得到对应的频谱;
  • 将上面的频谱通过Mel滤波器组得到Mel频谱;
  • 在Mel频谱上面进行倒谱分析(取对数,做逆变换,实际逆变换一般是通过DCT离散余弦变换来实现,
  • 取DCT后的第2个到第13个系数作为MFCC系数),获得Mel频率倒谱系数MFCC,这个MFCC就是这帧语音的特征了

4.数据处理


(1)数据集Urbansound8K 

 Urbansound8K是目前应用较为广泛的用于自动城市环境声分类研究的公共数据集,
包含10个分类:空调声、汽车鸣笛声、儿童玩耍声、狗叫声、钻孔声、引擎空转声、枪声、手提钻、警笛声和街道音乐声

数据集下载https://zenodo.org/record/1203745/files/UrbanSound8K.tar.gz

(2)自定义数据集

可以自己录制音频信号,制作自己的数据集,参考[audio/dataloader/record_audio.py]
每个文件夹存放一个类别的音频数据,每条音频数据长度在3秒左右,建议每类的音频数据均衡
生产train和test数据列表:参考[audio/dataloader/create_data.py]

(3)音频特征提取: 

音频信号是一维的语音信号,不能直接用于模型训练,需要使用librosa将音频转为梅尔频谱(Mel Spectrogram)

librosa提供python接口,在音频、乐音信号的分析中经常用到

librosa.feature.mfcc实现MFCC源码如下:

可以看到,librosa库中,梅尔倒谱就是再对梅尔频谱取对数,然后做DCT变换

关于librosa的使用方法,请参考:

5.训练Pipeline

(1)构建训练和测试数据

由于librosa.load加载音频数据特别慢,建议使用cache先进行缓存,方便加速

(2)构建backbone模型

backbone是一个基于CNN+FC的网络结构,与图像CNN分类模型不同的是,图像CNN分类模型的输入维度(batch,3,H,W)输入数据depth=3,而音频信号的梅尔频谱图是深度为depth=1,可以认为是灰度图,输入维度(batch,1,H,W),因此实际使用中,只需要将传统的CNN图像分类的backbone的第一层卷积层的in_channels=1即可。需要注意的是,由于维度不一致,导致不能使用imagenet的pretrained模型。

当然可以将梅尔频谱图(灰度图)是转为3通道RGB图,这样就跟普通的RGB图像没有什么区别了,也可以imagenet的pretrained模型,如

# 将梅尔频谱图(灰度图)是转为为3通道RGB图
spec_image = cv2.cvtColor(spec_image, cv2.COLOR_GRAY2RGB)

(3)训练参数配置

相关的命令行参数,可参考:

配置好数据路径,其他参数默认设置,即可以开始训练了:

python train.py

训练完成,使用mobilenet_v2,最终训练集准确率99%左右,测试集81%左右,看起来有点过拟合了。

如果想进一步提高识别准确率可以使用更重的backbone,如resnet34,采用更多的数据增强方法,提高模型的泛发性。

完整的训练代码train.py:

6.预测demo.py

完整的项目代码:https://download.csdn.net/download/guyuealian/30306697


更多AI博客,请参考:

人体关键点检测需要用到人体检测,请查看鄙人另一篇博客:2D Pose人体关键点实时检测(Python/Android /C++ Demo)_pan_jinquan的博客-CSDN博客


Recommend

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK