基于能量和过零率的语音端点检测
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课题:基于能量和过零率的语音端点检测姓名:陈启望简盛龙颜艳丹
专业:2008级电子科学与技术(2)班
指导老师:胡朝炜
国立华侨大学信息科学与工程学院
一、前言
在复杂的应用环境下,从信号流中分辨出语音信号和非语音信号,是语音处理的一个基本问题。端点检测就是从包含语音的一段信号中确定出语音的起始点和结束点。正确的端点检测对于语音识别和语音编码系统都有重要的意义,它可以使采用的数据真正是语音信号的数据,从而减少数据量和运算量并减少处理时间。
二.方案选择
判别语音段的起始点和终止点的问题主要归结为区别语音和噪声的问题。
①短时能量——如果能够保证系统的输入信噪比很高(即使最低电平的语音的能量也比噪声能量要高),那么只要计算输入信号的短时能量就基本能够把语音段和噪声背景区别开来。但是,在实际应用中很难保证这么高的信噪比,仅仅根据能量来判断是比较粗糙的。
②短时平均过零率——它是语音信号时域分析中的一种特征参数。它是指每帧内信号通过零值的次数。在离散时间语音信号情况下,如果相邻的采样具有不同的代数符号就称为发生了过零。如果是正弦信号,其平均过零率就是信号频率的两倍除以采样频率,而采样频率是固定的。因此过零率在一定程度上可以反映信号的频率信息。语音信号不是简单的正弦序列,所以平均过零率的表示方法就不那么确切。
③两级判决法——在用短时能量判断的同时,还需进一步利用短时平均过零率进行判断,因为清音比噪声的短时平均过零率比背景
噪声的平均过零率要高出高几倍。即基于能量和过零率的端点检测方法,也称双门限比较法。
综上所述,选择第三种方法,更加准确,实现的程序也不是很复杂。
三、方法的理论介绍
1.第一级判决
a.先根据语音短时能量的轮廓选取一个较高的门限T1,进行一个粗
判:语音起止点位于该门限与短时能量包络交点所对应的时间间隔之外(即AB段之外)。
b.根据背景噪声的平均能量确定一个较低的门限T2,并从A点往左、
从B点往右搜索,分别找到短时能量包络与门限T2相交的两个点C和D,于是CD段就是用双门限方法根据短时能量锁判定的语音段。
2.第二级判决
以短时平均过零率为标准,从C点往左和从D点往右搜索,找到短时平均过零率低于某个门限T3的两点E和F,这便是语音段的起
止点。门限T3是由背景噪声的平均过零率所确定的。
这里要注意,门限T2,T3都是由背景噪声特性确定的,因此,在进行起止点判决钱,通常都要采集若干帧背景噪声并计算其平均短时能量和平均过零率,作为选择T2和T3的依据。当让,T1,T2,T3,三个门限值的确定还应当通过多次实验。
四、基于matlab 程序实现能量与过零率的端点检测方法的步骤 ① 语音信号x(n)进行分帧处理,每一帧记为Si (n ),n=1,2,…,N ,n 为离散语音信号时间序列,N 为帧长,i 表示帧数。
② 计算每一帧语音的短时能量,得到语音的短时帧能量:
()21N
i n Ei s n
==∑。
③ 计算每一帧语音的过零率,得到短时帧过零率:
()()1sgn sgn 1N
i i n Zi s n s n ==--⎡⎤⎡⎤⎣⎦⎣⎦
∑
④ 考察语音的平均能量设置一个较高的门限T1,用以确定语音开始,然后再根据背景噪声的平均能量确定一个稍低的门限T2,用以确定第一级中的语音结束点。T2=α*En ,En 为噪声声段的平均值。完成第一级判决。第二级判决同样根据背景噪声的平均过零率Zn ,设置一个门限T3,用于判断语音前端的清音和后端的尾音。 五、程序实现
%zcro.m 过零率函数 function f=zcro(x) f=zeros(size(x,1),1);
for i=1:size(x,1) z=x(i,:)
for j=1:(length(z)-1);
if z(j)*z(j+1)< 0; f(i)=f(i)+1;
end
end
end
%fra.m 分帧函数
function f=fra(len,inc,x) fh=fix(((size(x,1)-len)/inc) +1)
f=zeros(fh,len);
i=1;n=1;
while i<= fh
j=1;
while j<=len
f(i,j)=x(n);
j=j+1;n=n+1;
end
n=n-len+inc;
i=i+1;
End
主程序
%% filename: yuyin.m clear all;
clf;
clc;
[filename,pathname]=
uigetfile('*.wav','Open wave file');
file = [pathname,filename]; [x,fs,nbits]=wavread(file);
len=length(x);
y1=buffer(x(1:len-1),200,100 );
y2=buffer(x(2:len),200,100); signs = (y1.*y2)<0;
diffs = (y1-y2)>0.002;
zcr = sum(signs.*diffs,1); %y=fra(50,50,x);
y=buffer(x,50,0);
y2=y.^2;
energy=sum(y2,1);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%