基于梅尔频谱的音频信号分类识别(Pytorch)
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.
基于梅尔频谱的音频信号分类识别(Pytorch)
本项目将使用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. 环境配置
使用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
-
40
本文首发于'模态空间'公众号,未经授权,严禁转载!齿轮传动结构的频谱复杂,包含啮合频率及其谐频、以啮合频率谐频为载波频率,轴转频为调制频率的边频带、追逐齿频率、鬼线分量以及箱体的固有频率等等,因此,弄…
-
30
声音精灵 - 声音精灵,分析声音频谱频率,帮你提高唱功,练声,唱得更好 - NEXT
-
50
12月6日晚间消息,据人民邮电报报道,三大运营商已经获得全国范围5G中低频段试验频率使用许可。 具体频谱划分如下: 中国电信获得3400MHz-3500MHz共100MHz带宽的5G试验频率资源; 中国移...
-
50
原标题 三大运营商5G频谱划分方案确定记者刘灿邦作为5G商用的关键一环,5G频谱如何分配一直是市场关注的焦点,市场传闻的频谱下发的时间也从今年9月一再推迟到今年底。12月6日,三大运营商5G频谱划分终于落定,5G商用进程又进一步。
-
59
法国财长勒梅尔表示欢迎华为在法投资韩冰/新华社法国经济与财政部长勒梅尔7日在巴黎举行的新闻发布会上表示,对法国来说,华为是一家重要的企业,欢迎中国电信企业华为在法国投资。勒梅尔还表示,法国乐于和中国在对等原则基础上共同维护多边主义。第六次中
-
11
我们在前一天晚上到达卡梅尔小镇之后,就住在一户幽静溪流的旁边,一个在airbnb上预定的蒙古包里面。 屋主住在主屋里面,主屋后面有一个两百平左右的院子,这个蒙古包就坐落在院子一角,溪流旁边。 Day 5:卡梅尔 早上起床之后,...
-
7
做空GameStop大战的主角:梅尔文资本2021年Q1平仓了所有公开空头头寸 | GPLP犀牛财经 Connect with us ...
-
3
梅尔罗斯剧情简介 2018年上映,由爱德华·贝尔格执导,本尼迪克特·康伯巴奇,詹妮弗·杰森·李,塞巴斯蒂安·马尔茨,杰西卡·雷恩,雨果·维文,Pr...
-
6
音频处理库性能对比:计算mel频谱的速度哪个更快? ...
-
5
Epic平台免费领取《梅尔沃放置》, 至12月23日0点截止
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK