利用函数wavread对语音信号进行采样_语音信号处理相关知识

本文的初衷是为后续模型介绍和论文速览提供一个过渡,核心价值在于介绍一些较为基础的概念,以使得后文中如遇到不太理解的概念通过本文查证

一、语音的表示

语音的表示形式本质为波形,从语音到波形的理解可以想象打鼓时的鼓膜运动方式,假定我们只观察鼓膜的中心点,也就可以看到随着声音的产生鼓膜的运动过程。

在声音的产生过程中,鼓膜中心点以一定的规律进行上下运动,转化成数学二维表达,就是假定横轴为时间,纵轴为当前时间鼓膜中心点与初始点的距离。然后我们就可以画出一个中心点随时间的运动轨迹,也就是一个波形。

语音波形示例

二、 语音的存储

语音的表示形式是一个以时间为自变量的波形这一步没问题后,我们来讨论下语音怎么存储的。

首先这种波形明显是不能够直接存到电脑的,一个波不是一个数字,根本无法确定存储数据量大小。所以要转化,那么转化其实就两种办法,一种是我把这个波形用一个函数表达出来,然后存函数的参数,这样的确存储空间确定了,而且需要的空间很小,但是太麻烦了,需要函数来拟合波形,甚至有些波形不可以用函数表达怎么办(我知道你可能在想直接用大量的分段函数来表达,这其实和我后面要说的方法本质是一样的)。 另外一种就是,我间隔一定的时间存储一个点的数值(是不是类似这个时间间隔的分段函数),然后一段语音波形就可以通过一个基于时间长度的向量表达存储了。这就是语音的离散存储方式。

三、 语音的基础特征

这样可以引出很多语音的基础概念,比如离散的存储方式中,时间间隔其实就和语音的采样率(Sample Rate)相关,间隔给定的时间记录一个数值,那么一秒的语音中记录多少个点的数量就是语音采样率。也就是说16000 采样率的语音表示,一秒有16000个点被记录下来。每个点记录的数据格式(整型,浮点型)就是语音的精度(Precision)。记录的数值是否做过编码压缩以及怎么做的编码压缩,就是采样点编码(Sample Encoding)。

语音通道数(Channels)指的其实是这段语音由几个波形组成。

四、傅里叶变换

傅里叶变换只考虑使用的话其实只需要理解它的意义,而不用完全推导。

1 . 傅里叶变化意义

傅里叶变换的意义其实很简单,可以看作固定基底的因子分解,这可能越说越绕,举个贴近生活的例子就是垃圾分类。对傅里叶变换就是垃圾分类,这里有一包各种混合的垃圾(语音波形),现在要按要求将其中垃圾进行分类,我们得到的其实就是分类好后各种垃圾的数量。

好的,再用语音复述一遍上述过程,我们有一个由各种正弦波组成的波形,然后经过傅里叶变换,我们得到了各种正弦波的占比。

傅里叶变换图解(wiki)

当然这个叙述中有一个明显漏洞,那就是凭什么一个波形能够由正弦波组成,正弦波拟合波形的精度又如何确定,这的确无法通过抽象的语言讲明白,需要严格的推导,如果需要可以推导一下傅里叶变换即可。

得到各种正弦波的占比,其实也就是正弦波的能量也就能画出频域图了,频域的自变量其实是离散的,对应的就是每种正弦波,因变量则是能量了。

这里为防止疑惑再提一句,为什么会有多种正弦波,毕竟正弦波的样子都是完全一样的嘛。这里的种类其实是指的频率,频率越高的正弦波实际上会变化得越快,也就是周期越小。频率的不同决定了正弦波的不同。

当然还有相位等概念,但我会在讲述比较传统的vocoder之前一定会详细叙述这一部分。在neural vocoder部分其实不用太深入,知道傅里叶变换是在做正弦波分解即可。

2 . 帧与窗

另外在傅里叶变换计算过程中还需要有个“帧”的概念,这是因为傅里叶变换实际时对一个波形全实数域范围内的处理,可现实语音波形是随时间复杂多变的。所以我们只能每次取波形的一部分(然后复制粘贴到全实轴上)做傅里叶变换,这是基于语音信号的短时不变性做的妥协性操作。背后的逻辑是假设一段短时语音的正弦信号构成是稳定的,所以对于这段语音的傅里叶变换结果是可靠且唯一的。

那么我们每次取一“窗”语音做傅里叶变换的结果作为一“帧”语音的频谱,这里“窗”的概念是基于窗函数而来的,这将在后文讲频谱泄漏部分较为完整的叙述。如果将一条语音分成n个收尾相连的“窗”,那么这里窗的数量实际就是帧数。可是实际处理中大多是更少量的移动窗,而将窗移作为一帧的单位。举个例子,假设一个窗包含160个点,每隔80个点设置一个窗,那么对于一个长度为1000个点的语音,实际上是分成了11帧(有11个窗)。

五、 Mel 谱(Mel Spectragram)

上节讲述了通过傅里叶变换得到频谱,实际上傅里叶变换后的频谱为和其他谱图具有区分性,称为线性谱(linear spectragram)。

而mel 谱实际是对线性谱的自变量(频率)做了一个弯折(wrap)处理(先不考虑三角滤波器的问题)。也就是说线性谱的频率通过一个函数后再和能量一一对应的谱图就是mel谱。

那么为什么需要做这个弯折(wrap)?这是类比人耳的听觉认知做的一种类似操作。现实中人耳并非对于每个频率的敏感程度都是相同的,总体来说,人耳对于低频更加敏感,而对高频不敏感。这样处理语音时更应该关注低频部分而非平均分配注意力。

而这种不均匀分配注意力的方式,数学上是通过频率映射完成的。让低频部分频率的变化情况更为明显,那么计算对于低频的感知也就更敏感。

正常频域到Mel域的映射

当然,在mel谱的使用中,不仅需要它具有调整频段分布的作用还需要兼具频谱降维的功能。假设现在一帧语音傅里叶变换后得到512+1维(多的一维是残差)的频谱,我们得到的mel谱需要小于100维。降维的方式同样参考人耳,可以把人耳当作一个滤波器组,滤波器组中每个滤波器都可以使用一种简单的滤波器----三角滤波器。人耳对于低频敏感其实意味着在低频部分滤波器密度更高,而高频部分更为稀疏。最后滤波器的个数也就是mel谱的维数。

Mel域对应三角滤波器示例

以上初步讲解了mel谱,更为复杂的MFCC(mel倒谱系数)和MCEP等将在使用到之前更为详细的叙述。

六、 语音中噪声或扰动的必要性

大多数情况谈到噪声第一反应是累赘,是需要在模型中去掉的东西。当然这在许多场合下是合理的,可是当我们看许多vocoder 模型的时候会发现,这些模型在主动添加噪声和扰动,这内在原因如果单纯认为噪声是不好的东西是无法理解的。

主要矛盾的根源是语音中的很多发音其实就是白噪声,同时背噪也在一定程度上决定了音色。换言之,噪声是听觉系统不可分割的一部分。例如摩擦音的主体就是白噪声,所以语音生成过程中噪声的合理加入是必不可少的一部分。

同时不合理的噪声的去除也是必要的,即使看起来是规则的,周期性的,实际上在听觉系统中反而会被当作奇怪的东西。

当然这部分内容大多不会在Neural Vocoder中有什么实质性的操作,谈及噪声只是为了说明模型中大量添加随机性的合理性。而真正的噪声谱的添加将会在传统vocoder的讲解中叙述。

尾巴

这里大多讲述都是基于我的记忆来说的,所以可能用词不是很正式,也许有些讲述链条中突然出现了一些读者不知道但我没讲述过的东西,希望能够指出,非常感谢

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值