语音端点检测代码

标签:
杂谈 |
分类: 学术研究 |
function [x1,x2] = vad(x)
%幅度归一化到[-1,1]
x = double(x);
x = x / max(abs(x));
%常数设置
FrameLen = 240;%帧长为240点
FrameInc
= 80;%帧移为80点
amp1 = 10;%初始短时能量高门限
amp2 =
2;%初始短时能量低门限
zcr1 =
10;%初始短时过零率高门限
zcr2 =
5;%初始短时过零率低门限
maxsilence = 8;
%语音段中允许的最大静音长度,如果语音段中的静音帧数未超过此值,则认为语音还没结束;如果超过了
%该值,则对语音段长度count进行判断,若count<minlen,则认为前面的语音段为噪音,舍弃,跳到静音
%状态0;若count>minlen,则认为语音段结束;
minlen
%语音段的最短长度,若语音段长度小于此值,则认为其为一段噪音
status
count
silence =
0;
%计算过零率
tmp1
tmp2
signs = (tmp1.*tmp2)<0;
diffs = (tmp1 -tmp2)>0.02;
zcr
%计算短时能量
%amp = sum(abs(enframe(filter([1
-0.9375], 1, x), FrameLen, FrameInc)), 2);
amp = sum(abs(enframe(x, FrameLen, FrameInc)), 2);
%调整能量门限
amp1 = min(amp1, max(amp)/4);
amp2 = min(amp2, max(amp)/8);
%开始端点检测
x1 = 0;
x2 = 0;
for n=1:length(zcr)