谈谈音频开发

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  85 随笔 :: 8 文章 :: 134 评论 :: 32万 阅读
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

卷积神经网络(CNN)是深度学习中常用的网络架构,在智能语音中也不例外,比如语音识别。语音中是按帧来处理的,每一帧处理完就得到了相对应的特征向量,常用的特征向量有MFCC等,通常处理完一帧得到的是一个39维的MFCC特征向量。假设一段语音有N帧,处理完这段语音后得到的是一个39行N列(行表示特征维度,列表示帧数)的矩阵,这个矩阵是一个平面,是CNN的输入。应用在图像问题上的CNN通常是二维卷积(因为图像有RGB三个通道),而语音问题上的CNN输入是一个矩阵平面,可以用一维卷积。本文就讲讲一维卷积是怎么处理的。

 

所谓一维卷积是指卷积核只在一个方向上移动。具体到语音上,假设一段语音提取特征后是一个M行N列(M表示特征维度,N表示帧数)的矩阵平面,卷积核要在帧的方向上从小到大移动,下图给出了示意。

 

卷积核也是一个矩阵(J行K列)。由于卷积核只在一个方向上移动,要把所有的特征值都覆盖到,必须卷积核的行数要等于特征值矩阵的行数,即J = M,所以描述卷积核时只需要知道kernel size(即多少列)和 kernel count(即多少个kernel)。

 

知道kernel size和kernel count后,再来看一维卷积的计算过程,看一个输入矩阵经过一维卷积后得到的是什么。设定padding模式为same(卷积处理后的输出矩阵与输入矩阵有相同的列数),stride为1(kernel一次只移动一格)。假定输入矩阵为3x5的矩阵,kernel个数为2,kernel size为3,所以kernel是一个3x3的矩阵。输入矩阵和两个kernel矩阵的具体值如下图,两个kernel的bias分别是2和3。

 

先看第一个卷积核与输入矩阵的计算。由于padding模式是same,输入矩阵左右都要pad。Kernel size是3,所以输入矩阵左右都要补充1列(用0填充),补充后输入矩阵变成了下图。

做卷积时先从左边的padding处开始,具体如下图,相对应的位置相乘再相加后,再加上bias就可以了,计算出值为10(0 x 1 + 1 x 0 + 4 x 0 + 0 x 0 + 2 x 1 + 5 x 0 + 0 x 0 + 3 x 0 + 6 x 1 + 2 = 10)。

把卷积核向帧增大方向(即向右)移动一格,如下图:

同样方法计算出值为17(1 x 1 + 4 x 0 + 7 x 0 + 2 x 0 + 5 x 1 + 8 x 0 + 3 x 0 + 6 x 0 + 9 x 1 + 2 = 17)。

经过4次移动后就到了右边的padding处,同样方法计算。最终得到的是一个1行5列的矩阵,如下图:

第二个kernel的卷积计算与第一个kernel计算一样,得到的也是一个1行5列的矩阵。如下图:

最终一个3x5的输入矩阵与kernel count为2、kernel size为3的卷积后得到的是一个2行5列的矩阵,如下图。

可以看出卷积后输入矩阵的列数不变,行数变为了kernel的个数(这是在padding模式为same、stride为1的case下,其他case行数依旧是kernel的个数,列数会变化,比如stride > 1 或者用上maxpooling后列数会减少,但卷积计算过程是一样的)。

 

以上就是一维卷积的处理过程,很简单的吧。

posted on   davidtym  阅读(24653)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· 展开说说关于C#中ORM框架的用法!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
点击右上角即可分享
微信分享提示