端点检测是指从包含语音的一段信号中确定出语音的起始点和结束点位置.
在进行基于音频信号的深度学习中,模型训练前进行端点检测,将每一个有效的激励信号提取出来,不仅可以增加样本数量,而且能够减少网络训练过程中不必要的计算,提升模型训练的准确率.
1.双门限法原理
双门限法最初是基于短时平均能量和短时平均过零率而提出的,其原理是汉语的韵母中有元音,能量较大,所以可以从短时平均能量中找到韵母,而声母是辅音,它们的频率较高,相应的短时平均过零率较大,所以用这两个特点找到声母和韵母,等于找出完整的汉语音节.双门限法是使用二级判决来实现的,如图所示.
a是语音的波形,b是语音的短时平均能量,c是语音的短时平均过零率
进行判决的具体步骤如下:
1.第一级判决
①根据在语音短时能量包络线上选取的一个较高阈值(门限)T2进行一次粗判.
则高于该T2阈值肯定是语音(即在CD段之间肯定是语音),而语音起止点应位于该阈值与短时能量包络交点所对应的时间点之外(即在CD段之外).
②在平均能量上确定一个较低的阈值(门限)T1,并从C点往左,从D点往右搜索,分别找到短时能量包络与阈值T1相交的两个点B和E,于是BE段就是用双门限法根据短时能量所判定的语音段起止点位置.
2.第二级判决
以短时平均过零率为准,从B点往左和从E点往右搜索,找到短时平均过零率低于某个阈值T3的两点A和F,这便是语音段的起止点.
根据这两级判决,求出了语音的起始点位置A和结束点位置F.但考虑到语音发音时单词之间的静音区会有一个最小长度表示发音间的停顿,就是在小于阈值T3满足这样一个最小长度后才判断为该语音段结束,实际上相当于延长了语音尾音的长度,如图中在语音波形上标出语音的起止点分别为A和F+(从图中看出终止点位置为F,而实际处理中延长到
F+).
在端点检测的具体运行中,首先是对语音进行分帧,在分帧的基础上方能求出短时平均能量和短时平均过零率,然后逐帧地依阈值进行比较和判断.
2.双参数的双门限端点检测的实例
使用能量,自相关函数,用双门限判决来提取端点.
之前使用能量和过零率检测端点的双门限法,实际上就是一个双参数的双门限检测法,它涉及能量和过零率两个参数,同时给出三个或四个门限值T1,T2,T3(T4).其中,有一个参数是dst1,另一个参数是dst2.
以下进一步介绍二级判决说明
1.第一级判决
①根据在第一个参数dst1上选取的一个较高的阈值T2(或在第二个参数dst2上选取的一个较高阈值T4),进行一次粗判,就是高于该T2(或T4)阈值肯定是语音.
②在第一个参数dst1上确定一个较低的阈值T1,从①中的交汇点向两边扩展搜索,分别找到dst1与阈值T1相交的两个点,粗判定为语音段的起止点位置.
2.第二级判决
以dst2为准,从第一级判断得到的起止点位置向两端扩展搜索,找到dst2与某个阈值T3
相交的两点,这边是语音段的起止点.
按照这样的思路编制出相应的函数:
(1)vad_param2D
功能:按照dst1和dst2两个参数提取语音端点的位置
调用格式:[voiceseg,vsl,SF,NF]=vad_param2D(dst1,dst2,T1,T2,T3,T4);
实例:用双参数进行端点检测
①在输入参数中,x是语音信号序列,为了要分帧,设置帧长为wlen和帧移为inc,NIS是前导无话段的帧数.
在语音处理中为了能估算噪声的情况,往往在一段语音的前部有一段前导无话段,利用该段前导无话段来估算噪声的特性.
在实际中,有时可能不知道前导无话段的帧数,但从语音信号的波形图中可以估算出前导无话段的时长IS,有了IS就能计算出前导无话段的帧数NIS
NIS = fix(IS * fs - wlen) / inc + 1)
②在这里的讨论中都认为噪声是平稳的,所以估算出的噪声短时平均能量和自相关函数适用于整段语音.
③语音信号为x(n),加窗分帧后为xi(m),其中下标i表示为第i帧,帧长为N,总帧数为fn,而每帧的能量计算为:
A M P i = ∑ m = 1 N x i 2 ( m ) AMP_i\ = \displaystyle \sum^{N} _{m=1} x_i^{2}(m) AMPi =m=1∑Nxi2(m)
语音信号为x(n),加窗分帧后为xi(m),其中下标i表示为第i帧(i=1,2,3,……,M),M为总帧数.
每帧数据的短时自相关函数定义为:
R i ( k ) = ∑ m = 1 L − k x i ( m ) x i ( m + k ) R_i(k) = \displaystyle \sum^{L-k} _{m=1} x_i(m)x_i(m+k) Ri(k)=m=1∑L−kxi(m)xi(m+k)
L为语音分帧后的长度,k为延迟量
如果在相邻两帧之间计算相关函数,便是互相关函数,其表达式为:
R i ( k ) = ∑ m = 1 L − k x i − 1 ( m ) x i ( m + k ) R_i(k) = \displaystyle \sum^{L-k} _{m=1} x_{i-1}(m)x_i(m+k) Ri(k)=m=1∑L−kxi−1(m)xi(m+k)
因为语音信号是准稳态信号,它的变化较缓慢,根据噪声的情况设置两个阈值T3和T4,当相关函数最大值大于T4时,便判定为是语音;当相关函数最大值大于或小于T3时,则判定为语音信号的端点.
④先对前导无话段计算噪声短时平均能量和自相关函数:
etemp=mean(etemp(1:NIS));
thredth=max(Rum(2:NIS));
再在这两值的基础上设置能量的两个阈值(T1)和(T2),以及互相关函数的阈值(T3):
T2 = 4etemp; T1 = 2etemp;
T3=1.1*thredth;
在这里阈值不设为一个固定的值,将会随前导无话段计算噪声的情况动态地变动.有了阈值以后就能按双门限法进行检测了.
⑤在检测完成后的端点为x1和x2,还进一步设置了SF和NF这两个序列,它们都是1xfn的数组,
SF=1表示该帧为有话帧,SF=0表示该帧为无话帧;
NF与SF相反,NF=1表示该帧为无话帧,NF=0表示该帧为有话帧.
⑥同时又设置了一个voiceseg结构数据,它也给出了语音端点的信息.因为在分析的一组语音中可能中间有几次停顿,每一组有一个开始时间和结束时间,在voiceseg结构数据中就包含了每一组有话音段的开始时间,结束时间和这组有话段语音的长度,它们都是以帧为单位.
voiceseg的计算是通过以下两个语句完成的:
spee