算法思路:
输入为归一化的语音段x和采样率Fs
(1)求原始信号从每点开始的长度为Len内的短时过零率,得到crslt为每点对应的短时过零率;
(2)然后进行过零率波形的平滑,其方法是对crslt做fft,去掉过零率波形中的高频,即fft谱中间置零;用ifft恢复平滑后的过零率波形为 C2;
(3)根据设置的过零率门限zero_threshold,将平滑后的过零率C2中不超过门限的置1;
(4)计算原始信号中每点开始的FrameLength短时帧能量,得到E;
(5)平滑短时能量谱得到E3,且进行归一化E3=E3./max(E3);
(6)根据归一化能量门限energy_threshold,平滑后的过零率中超过门限的置1得到E4;
(7)将过零率和归一化能量相与: v=E4&C3;
对这个v进行每点过零判断,cross2记录v总共的过零次数, pt(cross2)=n;用来记录每次过零时对应第几个样点;
(8)通过v(1)是否为1以及cross2是偶数还是奇数确定端点矩阵T;
v(1)=1则认为起始点为浊音点,v(1)=0则认为清音或者静默;
v(1)是否为1决定了起点b的设置;
cross2的奇偶决定了起点和终点的配对;
所以分四种情况考虑:
例如:if(v(1)==0&(mod(cross2,2)==0)) %% Low, even
则b=pt(n);e=pt(n+1);
依次判断每一对起点终点间距是否大于20ms帧长,如果大于则认为是该起始点成立,间距为一段浊音;
最后可以得到矩阵T,每一列代表一段浊音,第一行代表起点,第二行代表终点
此端点检测算法目前还不是100%好用,还需要对多种段落的语音试验。