首先在matlab中装好voicebox工具箱,里面有一些需要用到的.m文件
具体程序如下:
x=readwav('D:/hao.wav');
t=x;
N=size(x)
x=double(x);
x=x/max(abs(x));%归一化
y1=0;%未到语音的端点帧
%amp1=10;
%amp2=2;
status=0;
minlen=15;
figure(1);
subplot(311);
plot(x);
FrameLen=240;
FrameInc=80;
tmp1 = enframe(x(1:end-1), FrameLen, FrameInc);
tmp2 = enframe(x(2:end) , FrameLen, FrameInc);
signs = (tmp1.*tmp2)<0;
diffs = (tmp1 -tmp2)>0.02;
zcr = sum(signs.*diffs, 2);
subplot(312);
plot(zcr);%显示过零率
title('过零率')
xlabel('帧')
amp=sum(abs(enframe(filter([1 -0.9375],1,x),FrameLen,FrameInc)),2);
subplot(313);
plot(amp);%显示短时能量
title('短时能量');
xlabel('帧');
amp1=min(10,max(amp)/4);
b=max(amp)/4
amp2=min(2,max(amp)/8);
c=max(amp)/8
%开始端点检测
x1=0;
x2=0;
for n=1:length(zcr)
switch status
case 0,
if amp(n)>amp1 %进入语音段
x1=n;
status=1;
end
case 1, %保持在语音段
if amp(n)<amp1
x2=n
count=x2-x1;
status=3,
end
case 3,
if count<minlen
statu=0;
end
end
end
x1
x2
这个里面可以显示过零率和短时能量的端点检测图形
x1和x2分别是语音的起始端点的帧和结束端点的帧。这里我只是用到了短时能量来求出x1和x2。
需要一些改进。