资源简介
资源为一压缩包有mfcc函数,端点检测函数,分帧函数,说明文档。该资源为本人学习说话人识别用matlab所写,代码附有详细注释,说明文件中展示了运行结果。(本人需在csdn下载几个资源,苦于资源分已用尽,定价3分,求大家慷慨解囊~~~若有同样遭遇者需要该资源,可私信我,记得留下邮箱哦~)
代码片段和文件信息
%%——endpoint_detection.m sound=endpoint_detection(x)——连续词端点检测————%%
function sound=endpoint_detection_tiao_f(x) %返回值sound是一个结构体.begin和.end分别代表
%有用语音段的开始和结束帧,x为原始直接语音输入
N=length(x); %在mfcc里面将其装入一个矩阵
L=256; %短时窗长,窗长选用256即帧长
k=128; %帧移k一般取帧长的一半
E=sum((abs(enframe(xLk))).^2 2); %计算短时能量
tmp1=enframe(x(1:length(x)-1)Lk); %计算过零率
tmp2=enframe(x(2:length(x))Lk);
signs=(tmp1.*tmp2)<0;
diffs=(tmp1-tmp2)>0.02;
Z=sum(signs.*diffs2);
%端点检测:系数值0.30.050.02要根据自己的语音设置
ZeroLevel=0.3; %设置短时过零率门限0.3是自已通过试验设置的
ZL=max(Z)*ZeroLevel;
ET=0.05*max(E); %能量较高门限,用于能量第一次判决
EL=0.02*max(E); %能量较低(次高)门限,用于能量第二次判决
voiceIndex=find(E>=ET); %根据较高的门限ET初步判断
kk=1;
sound(kk).begin=voiceIndex(1); %sound结构体:第kk段语音,begin和end标记起止位置
for i=2:length(voiceIndex)-1 %判断条件:voiceIndex中连续帧
if voiceIndex(i+1)-voiceIndex(i)>1
sound(kk).end=voiceIndex(i);
sound(kk+1).begin=voiceIndex(i+1);
kk=kk+1;
end
end
sound(kk).end=voiceIndex(end);
index=[];
for i=1:length(sound) %忽略细节:sound语音剔除持续低于3个帧的话语段(认为是噪声)
if sound(i).end-sound(i).begin<3 %有变更,最初是3:持续低于4个帧
index=[indexi];
end
end
sound(index)=[];
for i=1:length(sound) %根据较低的门限EL进一步判断:
head=sound(i).begin; %E[sound(i).begin-1]>=EL则sound(i).begin=sound(i).begin-1;
while (head-1)>=1&&E(head-1)>=EL %E[sound(i).end+1]>EL则sound(i).end=sound(i).end+1;
head=head-1;
end
sound(i).begin=head;
tail=sound(i).end;
while (tail+1)<=length(E)&&E(tail+1)>EL
tail=tail+1;
end
sound(i).end=tail;
end
for i=1:length(sound) %根据过零率门限ZL进一步判断:
head=sound(i).begin; %Z[sound(i).begin-1]>=ZL则sound(i).begin=sound(i).begin-1;
while (head-1)>=1&&Z(head-1)>=ZL %Z[sound(i).end+1]>ZL则sound(i).end=sound(i).end+1;
head=head-1;
end
sound(i).begin=head;
tail=sound(i).end;
while (tail+1)<=length(Z)&&Z(tail+1)>ZL;
tail=tail+1;
end
sound(i).end=tail;
end
if ~isempty(sound) %删去重复的话语段:话语段起止帧均相等表示为重复话语段
index=[];
for i=1:length(sound)-1
if sound(i).begin==sound(i+1).begin&&sound(i).end==sound(i+1).end
index=[indexi];
end
end
sound(index)=[];
end
if ~isempty(sound) %sound话语段(以帧数为单位)处理为out话语段(以采样点为单位)
for i=1:length(sound)
out(i).begin=(sound(i).begin-1)*(L-k)+1;
out(i).end=(sound(i).end)*(L-k)+k;
end
else
out=[];
end
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 3270 2015-04-27 16:22 endpoint_detection.m
文件 5311 2014-07-24 16:49 enfr
文件 3121 2015-04-27 16:18 mfcc.m
文件 24922 2015-04-27 16:48 说明与运行结果.docx
评论
共有 条评论