欲懂声纹,先学音频
声学基础
语音的产生
声音是一种波,必须通过介质来传播,介质可以是气体、液体、固体。
当声音在空气中传播时,它是一种纵波。。 其振动方向与传播方向一致。
空气中传播的声波,可以看作空气压强随着时间变化,波峰 和 波谷则分别对应着空气的压缩 compression 和 稀疏 rarefaction 俩种状态。
最初发出振动从而产生声音的物理,被称为声源。
正弦波
声音的波形可以十分复杂,从而包含丰富的语义信息,
最简单的波形---正弦波。 y = A sin(2πft + Φ)
t表示时间
f表示频率,每秒有多少个循环,
A表示振幅
2πft + θ 被称为相位
θ被称为初始相位
正弦波具有周期性,也就是说,每隔一段时间,正弦波将会重复之前的波形。
而这段时间的最小值,便称为一个周期,一般表示为T。单位为妙。T = 1/f
角频率 angular frequency,有时也被称为角速度, ω = 2πf = 2π/T
y = Asin(ωt+θ)
余弦波 本质上和正弦波是等价的,只是相差了四分之一个周期的相位而已。
频谱
定理1: 任意复杂的周期函数,通过傅里叶变换,都可以表示为一系列不同频率的正弦波与余弦波之和。
复杂的波形可以分解为许多个正弦波的叠加,因此我们可以画出这样一张图,其横轴为这些正弦波分量的频率,纵轴为这些正弦波分量的振幅,这样的图形被称为频谱图 spectrum
在实际应用中,频谱图的纵轴通常不会是振幅,而是声压、功率等其他物理量。
听觉与感知。
频率与振幅非常适合用来描述正弦波的特性,但不适合来描述人类的听觉。
从感知学的角度,三个角度:基音、响度、共振福
- 基音与基频
电磁波按照其波长或频率,可以分为红外线、可见光、紫外线等
人眼可以看见的可见光只是电磁波谱中的一部分,声音也一样。人耳只能感受到频率在20Hz和 20000Hz之间的声音。
次声波:低于20Hz的声波
超声波:高于20000Hz的声波
我们说的这个人说话的声音很高很低,人耳所感受到的声音的高低,被称为基音 pitch.在物理上,基音所对应的物理量为基频 fundamental frequency.通常表示为F0
比如一个周期信号,由一个5Hz的正弦波和一个50Hz的正弦波叠加而成,因此这个周期信号自身的频率是5Hz.那么这个周期信号的基频F0也就等于5Hz.
对于语音信号,基频通常对应的是说话的人在说话时,其声带振动的评率,也就是声带每开启与闭合一次的时间的倒数。
周期信号的基频很容易理解,对于非周期信号,我们可以认为,在任意一段较短的时间内,这段信号都是近似与一个周期信号的。
那么,我们就可以粗鲁地计算出这一小段时间内的基频。 随着时间变化,信号的基频本身也可能出现变化,如果将时间作为横轴,将基频作为纵轴,
则可以画出一条被称为基音轨迹的曲线。
理解基音轨迹的一个简单的例子,就是汉语平移的声调,
第一声:阴平对应平坦曲线
第二声:阳平对应上升曲线
第三声:上声对应 先降后生曲线
第四声:去声 对应 下降曲线
- 响度与声强
处理声音的高低,还有声音的大小,被称为响度 loudness .在物理上被称为 声强 intensity .
要理解声强需要先理解信号的功率 power . y = f(t)
那么其功率P = 1/T ∫0 T(f(t))^ 2 dt
声强可以理解为单位面积上的声音功率,假如人耳能听到的声音最小功率为P0, 那么声强LdB可以定义为LdB = 10log10(P/P0)
- 共振峰
说起共振 resonance ,当驱动物理振动的力的频率与物体的固有频率 natural frequency 相等时,物体振动的振幅将会达到最大值,
在语音信号里,共振现象是普遍存在的,当人们发出声音时,人的整个声道,组成了一个复杂的分布参数系统,这个系统有多个固有频率,因此会将某些频率的振动放大,另一些的频率的振动衰减,
人们在说话的时候,声道的形状与尺寸是随着时间而变换的,因此固有频率也是随着时间变换的,语音信号 产生共振的频率 通常为共振峰 formant
听觉的非线性
-
人耳构造中的非线性
人耳主要分为 外耳、中耳、内耳。
外耳道部分可以被看作一条管道,有许多共振频率,会对某些频率的声音进行放大。
中耳通过三款听小骨,将鼓膜 受声波产生的振动传递到内耳。
在一定的声强范围内,这种传递是线性的。
当声强超出一定范围时,这种传递变成非线性的。从而达到保护内耳的作用。内耳中的耳蜗是一个形似蜗牛壳的听觉感受器。主要依靠毛细胞 hair cells将机械振动 (耳蜗中流体速度变化)转变为电信号。
耳蜗中不同位置的毛细胞对应着不同频率的声音。这个分布大概是按照频率的对数分布的。 -
巴克刻度
Bark scale 是由德国声学家 提出的一种心理声学的尺度。将频率范围划分成24个频率群。24个巴克。
每一个频率由其中心频率、截止频率和带宽确定。巴克刻度与频率的关系
-
梅尔刻度
mel scale 也是用以描述人耳对于频率感知的非线性的一种数学变换。
梅尔刻度是连续单调递增的。
频率f与梅尔m之间的换算公式:
-
其他频率感知非线性变换
基于等效矩形带宽 enquivalent rectangular bandwidth ERB
在信号处理系统中,我们会对信号的振幅应用一个非线性函数,以模拟人耳的这一特性。
音频信号基础概念
我们不能直接测量声波或者神经电信号
需要将语音信号转化为便于计算机处理的格式。 计算机是如何表示、存储及分析语音信号的
模拟音频信号
-
信号采集
音频处理第一步,用音频采集设备将声波转换为电信号。 也就是麦克风 microphone ,也叫话筒 或 传声器
根据工作原理可以分为 动圈式麦克风、电容式麦克风、微机电麦克风及铝带式麦克风等
共同点: 依靠麦克风内置的某种薄膜结构捕获空气的振动。从而使自身产生机械形变。 这种机械形变会使某些电子器件的属性发生变化,从而改变电路中的电流或电压,转变为电信号。 而这种用来表示声波的电信号,因为其本身通常具有连续性,所以被称为 模拟信号 analog signal
-
信号传输
需要将采集到的音频信号传递到计算机或移动设备存储分析。在播放录音或音乐是,需要将信号从计算机传输到耳机或扬声器设备。
传递音频信号的音频线。有时需要传递不止一组音频信号。例如耳机,左声道和右声道是俩组不同的音频信号。从而共同产生立体声的效果。
在麦克风的耳机里:需要同时传输左声道、右声道和麦克风信号一共三组信号。因此,将音频线连接到设备是,需要规范接口才能保证信号的正确传输。
常见的音频设备接口有三种:TS TRS TRRS
T:tip 尖端
R: ring 环
S: sleeve 套
模拟转数字:采样与量化
计算机所处理、存储的音频信号,通常都是数字信号 digital signal .
我们需要 在模拟信号 和 数字信号 之间进行转换。
这一操作通常由 声卡来完成。
模数转换器:analog-to-digital converter
数模转化器:digital-to-analog converter
将连续的模拟信号 转换为离散 的数字信号有俩个步骤: 采样 和 量化
- 采样
按照固定的频率,对模拟信号的振幅进行取值,这个频率便是 采样率 sampling rate.单位 赫兹。表示每秒钟内所取得的采样的个数。
对于一个周期信号,如果想要准确的度量这个信号,则需要在每个周期进行 至少俩次采样。 波峰 波谷 各采样一次。每个周期的采样越多,越能准确的重建原始信号。
定理: 给定一个采样率,我们所能重建的周期信号的频率是该采样率的一般。
这个频率被称为 奈奎斯特频率 Nyquist frequency
在语音信号中,绝大部分信心在10000Hz以下,所以通常2000Hz的采样率足以保留这些信息。
- 量化
音频信号在经过采样信号处理后,我们获得了原始信号在每个采样点的数值,为了高效的保存和传输这些数值,我们将其表示为整数,
因为在将实数域的振幅值转换为整数时, 我们会损失一定的精度,所以这一过程被称为量化。
量化的精度,等于相邻俩个整数所表示的 实数 的差值。如果俩个实数之间的差距小于这个差值。它们便会被量化为同一个整数。
量化的具体方式有很多种
按照精度可以分为:8位量化、16位量化、32位量化。
按照量化之后的整数是无符号整数还是有符号整数,又分为无符号和有符号俩种量化。
音频编码
通过采样和量化,我们能够将连续的音频信号表示为一个离散的整数序列。但计算机实际存储音频文件,以及在网络间进行传输是,所使用的是二进制的字节序列表示。
为了更有效的表示音频信号,我们需要对音频信号进行编码处理 conding .
将二进制 字节 恢复成音频信号的过程 称为 解码 decoding
- 线性脉冲编码
直接将采样过后的得到的振幅进行量化的方法,就是一种最简单编码方法, 称为脉冲编码调制 pulse-code modulation PCM
若是量化的时候。相邻整数所表示的信号的差值是恒定的,则称为线性脉冲编码。 liner PCM。
-
非线性脉冲编码
因为人耳的听觉具有非线性。人耳对于高振福信号的差距不如对低振幅信号的差距那么铭感。
基于这个原理,我们在量化的时候,可以对低振幅的信号采用较高的精度,而对高振幅的信号采用较低的精度。
这种编码就是非线性脉冲编码。对简单的做法,就是对信号的取值进行对数变换,也就是先对信号应用对数函数,再进行线性脉冲编码,在解码的时候,先应用指数函数进行逆变换,。 -
自适应脉冲编码
线性脉冲编码和非线性脉冲编码对整体信号采用固定的量化方案。不随时间的变换而改变。缺点是:如果一段音频,前面一部分音量很高。后面一部分音量很低。如果量化器要覆盖音量高的振幅。那么音量低的那部分就不可能得到足够的量化精度。
将信号在时间轴上分割成很多段,对每一段估算其短时能量。然后将这一段信号除以其短时能量进行正则化,然后进行标准的PCM量化。 -
差分脉冲编码与自适应差分脉冲编码
-
频域编码
音频文件格式
- WAV格式
音频信号进行采样 量化 编码之后,会以一定的格式存储在计算机中。便于不同的程序和应用之间进行交互。
WAV格式是微软、IBM提出的资源交换文件格式 resource interchange file format RIFF 的一个实例。
RIFF文件通常由一个表头 header 及多个区块 chunk组成。
WAV文件的表头采用32位正整数表示整个文件的大小。所以WAV文件的大小不能超过4GB
WAV文件在表头之后 第一个区块 记录了音频的信息,第二个区块开始是音频数据。
第一个区块 包含了 编码格式、声道数量、采样率、传输速率、采样值大小
- 常见格式比较
苹果也有自己的格式:audio interchange file format AIFF.
MP3文件,既是一种文件存储格式,也是一种有损的音频编码格式。
动手实践
我们需要对一些音频文件进行简单的处理。例如声道分离、改变采样率或不同的编码格式之间进行转换。
Sox sound eXchange 跨平台的音频处理命令行程序。
linux自带。
三个命令: sox、play、rec
play:从默认扬声器播放指定的音频文件。
RAW转WAV格式
sox -c 1 -e signed-integer -b 16 -r 16000 input.raw output.wav remix 1
-c 1 :表示音频文件只有一个声道
-e signed-integer:表示编码为有符号整数的线性脉冲编码
-b 16表示每个采样值为16位 bit
-r 16000 采样率为16000Hz
remix 1 表示输出文件只有一个声道
- 声道交换顺序。
sox input.wav output.wav remix 2 1
remix 2 1表示输出文件有俩个声道。(remix后面有几个数字就是几个声道)
第一个声道为 输入音频的第二声道
第二个声道为 输入音频的第一声道
sox input.wav output.wav remix 1 0 -1
第一声道和第三声道都是输入音频第一声道。
第二声道静音。
- 降采样
sox input.wav -r 8000 ouput.wav
-r 8000在输入文件之后,输出文件之前,表示是输出音频的参数
采样率降低为8000Hz
- 改变编码格式
sox input.wav -e mu-law output.wav # 转为 16位线性脉冲编码 sox input.wav output.flac # 输出文件的后缀名指定编码。 FLAC编码
还可以结合ffmpeg工具结合。处理其他带音频的视频等。
ffmpeg -i input.mp4 output.wav
从信号到特征: 短时分析
传统特征分析的不足
大多数机器学的方法与模型,高斯混合模型,支持向量机、神经网络等。都需要先降研究对象表示为固定维度的向量。该向量被称为特征 feature
对于一整段音频信号,其长度通常是不固定的。从何从不定长度的音频信号中,提取出固定长度的特征向量
传统的特征分析方法:将整段音频当成一个整体,然后提取其中的一些统计量。 将整段信号进行傅里叶变换,得到信号的频谱,
该频谱具备固定的维度,因此可以作为这段音频的一个特征。
这种基于整段音频信号的全局特征有显而易见的缺点。音频信号是随着时间变化而变化的。在人们说话的时候,每发出一个音节,其对应的音频特征都会与这段音频的其他部分截然不同。
传统的全局特征分析方法,相当于对音频信号在时间轴上做了某种平滑的处理。从而使时间分辨率降为0.这种做法会丢失信号中的大量局部信息。
如果音频中有一些噪音片段,那么这些片段会对最后得到的特征造成进一步污染。
全局特征只有当信号十分平稳的时候才是有意义的,例如,信号本身是周偶器信号,其局部特征不随时间变化而变化,那么其全局特征便等于其局部特征。
然后 语音信号 本身就不是平稳的。
需要从局部提取特征,因为在每一个局部的时间内,可以近似地认为信号是平稳的。这一点便是音频信号特征分析的基础-----短时分析技术
在图像领域,很少对整个图像提取全局特征,除非图像本身特别小。
卷积核本质上也是一个局部的特征提取器。
分帧
观看视频,我们看到的是一帧一帧的图像。图像安装特定的频率播放。从而让人产生视觉上的连续性。
对于语音信号,我们一样可以将采样信号在时间轴上分割为很多短小的片段,这些偏度称为帧 frame
将密集的采样信号分割 成较为稀疏的信号帧的过程,称为分帧 framing .
与视频中的图像帧不同的是,语音信号的分帧 与 人 的听觉没有太大关系,播放音频的时候,人耳听到的依然是密集的采样信号。
对音频信号进行人为分帧,纯粹是为了方便后续的信号分析与处理。
在分帧过程中,最虫咬的俩个参数便是帧本身的长度, 以及帧与帧之间的 间隔。
如果间隔等于长度,那么帧之间无重叠,
如果间隔小于长度,那么帧之间会重叠
如果间隔大于长度,那么帧之间会有空隙,无法完全覆盖原始信号。
通常我们可以假定语音信号在10至30毫秒的范围内是较为平稳的,因此我们可以将帧的长度设置在这个范围内。
一组在业界比较常见的分帧设置,采用25毫秒的帧长度,10毫秒的帧间隔。
采样率为16000Hz.我们对一帧提取40维的特征。那么考虑一段长度为1秒的音频。
1 s = 1000毫秒 ,间隔是10毫秒 ,每过10毫秒就是一个新帧。所以 能分1000/10=100个帧。
本身有16000个采样点。 进过分帧之后再提取特征,将得到 100 * 40 = 4000个特征,需要处理的书讲了减少了75%
分帧通常是所有短时分析技术的第一步,不同的音频信号,采样率可能不同。进过分帧之后,帧的频率却是固定的。
窗函数处理
在对采样信号进行分帧处理之后,便可以对每一帧信号进行特征提取,如 傅里叶变换等。
傅里叶变换是对整个时间轴的信号进行变换,我么你在分帧的过程中,只保留了当前帧所覆盖的这部分信号。
帧起点之前的信号和帧终点之后的信号全部设置为 0
分帧之后的信号在帧起点帧终点 的位置有着高度的不连续性
如果我们直接对这样的信号进行傅里叶变换,会发生吉布斯现象 Gibbs phenomenon
在不连续点处产生高频分量。导致傅里叶变换后的频谱出现局部峰值。
由于信号在分帧过程中被截断,会导致频谱在整个频带内发生拖尾现象,称为 频谱泄露
为了避免吉布斯现象和频谱泄露的负面印象。可以对分帧之后的信号进行加窗 windowing 处理。
加窗处理:就是将一帧信号的每一个值乘以不同的权重。
不同的窗函数 window function 对应着不同的权重设计思路。
设计重点:将较大的权重赋予靠近窗中心的信号。将接近0的权重赋予靠近窗边缘的信号,减轻分帧时所造成的信号不连续性。
满足上述条件的最简单的窗函数,便是高斯函数,高斯窗 Gaussian window.
在语音领域,最常用的窗函数是利用了余弦函数的汉宁窗Hannint window 及 汉明窗 Hamming window
https://blog.csdn.net/s09094031/article/details/105744859/
加窗之后,部分频率的夫值得到了抑制 。
帧叠加和帧采样
对采样信号进行了分帧和加窗处理,并从每一帧提取了特征,那么一般情况下,这些特征可以直接用于语音检、语音识别、声纹识别等不同的音频处理系统。
不同的系统所采用的模型,对特征的上下文 context 的 要求不太一样。
对于语音识别系统来书:我们将每一帧的信息单独输入模型,可能效果不如每次将连续的4帧特征 同时输入模型。因为连续多帧的特征组合在一起后,能够对单帧周围的上下文信息有一个更好的描述。可以更好的覆盖完整的音节。
对于声纹识别系统:2帧的上下文足够,
对于语音监测:1帧就够。
将相邻帧的特征拼接起来合成一个新的帧的做法:称为帧叠加 frame stacking
在同时部署多个应用是,可以令所有的应用采用相同的分帧、加窗和特征提取模块。
再令每个应用采用单独的帧叠加策略。
将连续的多帧信息作为模型输入是,帧的维度会增加数倍,因此模型的参数显然会大量增加。
为了不使计算开销过大,在运行模型的时候,可以有规律的跳过一些帧来减小计算量。这种做法称为 帧采样 fram subsampling.
这里的采样一定是降采样。
常用的音频特征
音频信号-采样与量化-分帧-加窗-特征提取-帧叠加与帧采样
特征提取
时域特征
音频信号的特征 一般分为时域特征与频域特征俩大类。
时域特征:以时间为自变量的采样信号 进行特征提取
频域特征:铜鼓哦傅里叶分析将信号转换到频域,在进行特征提取。
- 短时能量与短时平均幅值
在进过分帧、加窗处理之后的长度为N的音频帧x[n], 0 <= n <= N-1 ,其短时能量可简单表示为:
Ex = Σ 0 n-1,(x[n])^2
短时能量虽然只是一个单一的数值, 但能够被用来处理一些简单的任务,例如语音检测(无语音时短时能量较小)、清音浊音分类(浊音)
-
短时过零率
短时过零率是一个非常简单的特征,表示信号穿过零值得次数,或者信号的波形与直线y=0相交的次数, -
短时自相关函数
将短时信号延迟k个采样后,再计算其余信号本身的相关性。便得到短时自相关函数: -
短时平均幅度差函数
短时平均幅度差函数表示短时信号在延迟K个采样后,与原信号的差值。
包含了信号的周期特征。 -
线性预测编码与线性预测倒谱系数
从时域到频域: 傅里叶变换
法国学者约瑟夫傅里叶提出的傅里叶变换 Fourier transform . 是所有信号频域特征技术的基础
对于不同类型的时域信号。根据其实连续还是离散,以及是否具有周期性等。采用不同的傅里叶分析方法。
信号类型 | 分析方法 |
---|---|
周期连续信号 | 傅里叶级数 |
非周期连续信号 | 连续傅里叶变换 |
周期离散信号 | 离散傅里叶级数 |
非周期离散信号 | 离散时间傅里叶变换 |
有限离散信号 | 离散傅里叶变换 |
- 离散傅里叶变换。
在音频信号处理中。我们经常对经过分帧、加窗处理后的离散采样信号进行分析,而这时的信号帧属于有限离散信号。因此通常使用离散傅里叶变换 discrete Fourier transform DFT 计算频域特征。
离散傅里叶变换公式:
实数信号 x在经过离散傅里叶变换之后,得到的为复数频谱。
对频谱取其幅值,便得到N个频谱幅值特征。频谱幅值特征算是最简单的频域特征。已经能够直接作为机器学习系统的输入。
很少直接利用频谱幅值建模,而是会对频谱进行进一步的处理。 PLP MFCC
- 快速傅里叶变换
对于长度为N的信号, 离散傅里叶变换的时间复杂度为O(N^2).
这个复杂度对很多实时应用来说是不可接受的。
快速傅里叶变换 fast Fourier transform FFT 是一种能够以O(Nlog N)的时间复杂度计算出离散傅里叶变换的算法。
其基本原理是将变换矩阵分解为稀疏因子的乘积。
快速傅里叶变换被IEEE科学工程计算期刊列为20世纪十大算法之一。
在语音信号领域,在进行频谱分析是,我们总是使用快速傅里叶变换来计算频谱,值得注意的是,许多快速傅里叶变换的实现要求信号的长度为2的整数次幂,如果信号长度N不是2的整数次幂,就补零。
- 动手实践: 短时傅里叶变换与 Scipy
short-time Fourier transform STFT . 将分帧、加窗、离散傅里叶变换三个单独的步骤作为一个整体步骤。
频谱、倒谱、时频谱、功率谱
将一段时域信号通过离散傅里叶变换后,将频率作为横轴,幅度作为纵轴,得到的图像就是频谱。
将相位作为纵轴,就是相位频谱。
频谱:信号由哪些频率组成。
倒谱:将频谱的对数作为信号,进行傅里叶变换后得到新的频谱。此时,横轴被称为 倒频率 quefrency.
倒谱的好处在于:能够将时域的卷积运算变为倒谱域的加法运算
时频谱:信号经过短时傅里叶变换后,得到的以时间为横轴、频率为纵轴、颜色或灰度表示幅度的图像。
功率谱:将频谱或时频谱的幅值替换为幅值的平方。
感知线性预测
preceptual linear prediction PLP.凭借其对人耳听觉感知的出色建模,该技术随后在语音领域得到了广泛的应用。
许多声纹识别系统也都构建在PLP的基础智商。
1、对输入信号进行分帧和加窗处理。 建议使用20毫秒的帧长度及汉明窗。
2、对每一帧信号进行快速傅里叶变换。变换后取幅度的平方作为功率谱。
3、对功率谱进行巴克刻度变换,以校正人耳听觉对于频率的非线性。将变换后的功率谱与一些预先设计好的临界频带 critical-band滤波器进行卷积,得到带通滤波后的结果
4、通过等响度曲线 equal-loudness curve 预加重 前一步得到的结果。从而校正人耳对不同频率的敏感度
5、用幂函数y=x^1/3校正人耳对于声强的非线性。
6、从前面得到的特征进行逆离散傅里叶变换 inverse discrete Fourier transform IDFT.从而得到线性预测编码稀疏。
梅尔倒谱系数
mel-frequency cepstral coefficients MFCC。是语音淋雨最常用的特征。
无论是语音识别还是声纹识别。
1、对音频信号进行预加重 处理,从而降低部分高频能量,
2、对预加重处理后的信号进行分帧、加窗处理。
3、对每一帧信号进行快速傅里叶变换,得到频谱
4、将频谱通过一组按照梅尔刻度设计好的三角形滤波器组filterbanks,得到滤波后的结果。
5、用对数函数校正人耳对于声强的非线性。
6、通过逆离散傅里叶变换计算倒谱
7、前一步得到了12个倒谱系数,再增加一个该帧的能力,得到第13个特征,通过相邻帧计算这13个特征的一阶差分 二阶差分。最终得到39个特征。这39个特征便是最终的MFCC特征。
动手实践:用LibROSA提取MFCC特征
pytube3 可以下载YouTube视频,
使用Sox和FFmpeg将该文件转换为单声道、160000Hz 16位的WAV格式音频。
然后利用音频分析工具库LibRosa读取该音频。并提取MFCC特征
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?