在做语音处理的时候,特别是语音识别时,有时候静音段太长,这样会有很大的数据量 ,占用内存空间不说,还增大多余计算量,去除语音的静音段显得很重要。于是利用Matlab首先实现语音的端点检测,再除掉静音段。
端点检测的程序采用上篇的,然后取得语音段即可。
[x,fs,bits]=wavread('test1.wav');
x = double(x);
x = x / max(abs(x));
FrameLen = 240;%帧长为240点
FrameInc = 80;%帧移为80点
amp1 = 10;%初始短时能量高门限
amp2 = 2;%初始短时能量低门限
zcr1 = 10;%初始短时过零率高门限
zcr2 = 5;%初始短时过零率低门限
maxsilence = 8; % 8*10ms = 80ms
minlen = 15; % 15*10ms = 150ms
%语音段的最短长度,若语音段长度小于此值,则认为其为一段噪音
status = 0; %初始状态为静音状态
count = 0; %初始语音段长度为0
silence = 0; %初始静音段长度为0
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);
%计算短时能量
amp = sum(abs(enframe(x, FrameLen, FrameInc)), 2);
%调整能量门限
amp1