% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% %%%%%%%% 对语音用glr方法分割,并对分割的正确率进行统计(带标注) %%%%%%%%%
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
clear all;
close all;
%load frameLabelsE;
%tic;
str='C:\Users\lx\Desktop\interview_sample.wav\';
files=dir(str);
Num_speechs=length(files);
%result=zeros(1,Num_speechs); %%%% 用于存放各语音的分割正确率
for count=3:Num_speechs
str1=strcat(str,files(count).name);
[s,fs,nbits]=wavread(str1);
%final_speech=vad(s);
segments=enframe(s,2*fs); %%%% 2s 1小段语音
seg_num=size(segments,1);
segs=cell(1,seg_num); %%%% 将数据转换成cell形式存放便于后续操作
cepmel_all=cell(1,seg_num);
%labels=cell(1,seg_num); %%%% 将标注放到cell中便于后续操作
%frameLabels=frameLabelsE{count-2}; %%%% 读入当前语音的标注
%%%%%%%%%% 检验帧数和标注的数目是否匹配 %%%%%%%%%
%if (seg_num~=length(frameLabels))
% disp(count);
%end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%% 求各小段语音的倒谱参数,为后续操作方便起见,此处求倒谱时无帧移 %%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
for i=1:seg_num
cepmel=melcepst(segments(i,:),8000,'M',12,25,160,160,50/8000,4000/8000);%%
cepmel_all{i}=cepmel;
segs{i}=segments(i,:);
%labels{i}=frameLabels(i);
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%% 计算段间的GLR距离,并将距离最小的两段聚到一起,最终得到两段语音 %%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
while seg_num~=2
minDis=realmax;
for j=1:seg_num-1
for k=(j+1):seg_num
Dis=glr_Dis(cepmel_all{j},cepmel_all{k});
if (Dis<minDis)
minDis=Dis;
minDis1=j;
minDis2=k;
end
end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% 将距离最小的两段语音及其倒谱参数合并,段的数目变成seg_num-1,直至聚成2段 %%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
segs{minDis1}=[segs{minDis1},segs{minDis2}];
cepmel_all{minDis1}=[cepmel_all{minDis1};cepmel_all{minDis2}];
%labels{minDis1}=[labels{minDis1},labels{minDis2}];
for i=(minDis2+1):seg_num
segs{i-1}=segs{i};
cepmel_all{i-1}=cepmel_all{i};
%labels{i-1}=labels{i};
end
segs{seg_num}=[];
cepmel_all{seg_num}=[];
%labels{seg_num}=[];
seg_num=seg_num-1;
end
%%%%%%%%%%%%%%%%% 一段语音的分割完成 %%%%%%%%%%%%%%%%%%%
%%%%%%%%% 统计各部分的正确分割率及总的正确分割率 %%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% num1=sum(labels{1});
% num=length(labels{1});
% if (num1>(0.5*num))
% num0=length(labels{2})-sum(labels{2});
% else
% num0=num-num1;
% num1=sum(labels{2});
% end
% correctN=num1+num0;
% totalN=num+length(labels{2});
% rate=correctN/totalN;
% result(count-2)=rate;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%% 将分离出来的两段语音分别以一定的名称写到“.wav”文件里存放 %%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
str2='C:\Users\lx\Desktop\';
voice1=segs{1};
voice2=segs{2};
ind=findstr(files(count).name,'.wav');
b=files(count).name(1:ind(1)-1);
str3=strcat(str2,b,'#1.wav');
wavwrite(voice1,fs,nbits,str3);
str4=strcat(str2,b,'#2.wav');
wavwrite(voice2,fs,nbits,str4);
end
%disp('E');
%disp(result);
%disp(sum(result)/30);
%toc;
%save result_D_branch3 result;
%cmodal.WindowStyle='modal';
%cmodal.Interpreter='tex';
%uiwait(msgbox(' 分割完毕','提示','help',cmodal));