void CWaveFileDlg::OnDetect()
{
char ch[40];
char wave[20];
GetDlgItemText(IDC_WAVEPATh,wave,20);
GetDlgItemText(IDC_DETECTPATH,ch,40);
Speech speech;
speech.DetectPoint(ch,wave);
// TODO: Add your control notification handler code here
}
void Speech::DetectPoint(char ch[],char wave[])
{
short *Data;
int DataNum=0;
int *Frame_num;
int *Win;
int StartPoint=0;
int EndPoint=0;//对b1.wav Eh=150,El=30;Zh=200,Zl=40
float Eh=150,El=30;
int Zh=200,Zl=40;
int Flag=0;
Frame_num=new int[1];
Win=new int[1];
Data=new short[DataNum];
DataNum=TellFileLength(wave);
ReadFiles(Data,DataNum,ch);
Window_Div(Frame_num,Win,DataNum,wave); FILE *fp=fopen("C:\\WaveFile\\DtectFile.txt","w");
for(int i=0;i<*Frame_num;i++)
{
if(Flag==0)//0为静音段的标记
{
if((AvgEneger(Data+i*((*Win)/2),*Win)>El)||AvgEneger(Data+i*((*Win)/2),*Win)>Zl)
{
StartPoint=i;
Flag=1;
continue;
}
}
if(Flag==1)//判断是否处在过度段,1为过度段的标记
{
if(AvgEneger(Data+i*((*Win)/2),*Win)<El&&AvgZeroRate(Data+i*((*Win)/2),*Win)<Zl)
{
Flag=0;
StartPoint=0;
continue;
}
else if((AvgEneger(Data+i*((*Win)/2),*Win)>Eh)||(AvgZeroRate(Data+i*((*Win)/2),*Win)>Zh))//判断是否处在语音段,2为语音段的标记
{
Flag=2;
continue;
}
}
if(Flag==2)
{
if(AvgEneger(Data+i*((*Win)/2),*Win)<El&&AvgZeroRate(Data+i*((*Win)/2),*Win)<Zl)
{
Flag=3;
EndPoint=i;
if((EndPoint-StartPoint<10)&&(EndPoint<*Frame_num-5))//如果语音段太短,则认为是噪声舍弃重新寻找开始与结束点
{
Flag=0;
StartPoint=0;
EndPoint=0;
}
else
{
fprintf(fp,"%d,%d\n",StartPoint,EndPoint);
// for(int k=(StartPoint+1)*(*Win/2);k<=EndPoint*(*Win/2);k++)
// fprintf(fp,"%d\n",*(Data+k));
if(EndPoint<*Frame_num-5)
{
Flag=0;
StartPoint=0;
EndPoint=0;
}
else break;
}
}
}
}
delete Frame_num;
delete Win;
delete Data;
Frame_num=NULL;
Win=NULL;
Data=NULL;
fflush(fp);
fp=NULL;
}
{
char ch[40];
char wave[20];
GetDlgItemText(IDC_WAVEPATh,wave,20);
GetDlgItemText(IDC_DETECTPATH,ch,40);
Speech speech;
speech.DetectPoint(ch,wave);
// TODO: Add your control notification handler code here
}
void Speech::DetectPoint(char ch[],char wave[])
{
short *Data;
int DataNum=0;
int *Frame_num;
int *Win;
int StartPoint=0;
int EndPoint=0;//对b1.wav Eh=150,El=30;Zh=200,Zl=40
float Eh=150,El=30;
int Zh=200,Zl=40;
int Flag=0;
Frame_num=new int[1];
Win=new int[1];
Data=new short[DataNum];
DataNum=TellFileLength(wave);
ReadFiles(Data,DataNum,ch);
Window_Div(Frame_num,Win,DataNum,wave); FILE *fp=fopen("C:\\WaveFile\\DtectFile.txt","w");
for(int i=0;i<*Frame_num;i++)
{
if(Flag==0)//0为静音段的标记
{
if((AvgEneger(Data+i*((*Win)/2),*Win)>El)||AvgEneger(Data+i*((*Win)/2),*Win)>Zl)
{
StartPoint=i;
Flag=1;
continue;
}
}
if(Flag==1)//判断是否处在过度段,1为过度段的标记
{
if(AvgEneger(Data+i*((*Win)/2),*Win)<El&&AvgZeroRate(Data+i*((*Win)/2),*Win)<Zl)
{
Flag=0;
StartPoint=0;
continue;
}
else if((AvgEneger(Data+i*((*Win)/2),*Win)>Eh)||(AvgZeroRate(Data+i*((*Win)/2),*Win)>Zh))//判断是否处在语音段,2为语音段的标记
{
Flag=2;
continue;
}
}
if(Flag==2)
{
if(AvgEneger(Data+i*((*Win)/2),*Win)<El&&AvgZeroRate(Data+i*((*Win)/2),*Win)<Zl)
{
Flag=3;
EndPoint=i;
if((EndPoint-StartPoint<10)&&(EndPoint<*Frame_num-5))//如果语音段太短,则认为是噪声舍弃重新寻找开始与结束点
{
Flag=0;
StartPoint=0;
EndPoint=0;
}
else
{
fprintf(fp,"%d,%d\n",StartPoint,EndPoint);
// for(int k=(StartPoint+1)*(*Win/2);k<=EndPoint*(*Win/2);k++)
// fprintf(fp,"%d\n",*(Data+k));
if(EndPoint<*Frame_num-5)
{
Flag=0;
StartPoint=0;
EndPoint=0;
}
else break;
}
}
}
}
delete Frame_num;
delete Win;
delete Data;
Frame_num=NULL;
Win=NULL;
Data=NULL;
fflush(fp);
fp=NULL;
}
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货