📄 shvoice.cpp
字号:
if(!sudxInit()){
printf("初始化识别引擎错误!\n");
exit(1);
}
FILE *fp1=fopen("d:\\Shvoice\\config.dat","rb");
if(fp1==NULL){
printf("%s样本配置文件打开错误!\n","d:\\Shvoice\\config.dat");
exit(1);
}
else{
char buffer[256],wjm1[30],wjm[30];
char jx1[10],jx2[10];
int j,jx,l=0,m=0;
while ( fgets(buffer,120,fp1) != NULL ) {
j=0;
strcpy(wjm1,"");
get_field(buffer,jx2,&j);
get_field(buffer,jx1,&j);
get_field(buffer,wjm1,&j);
sprintf(wjm,"d:\\Shvoice\\%s\\%s",jx1,wjm1);
jx=atoi(jx2);
config[l].flag=jx;
strcpy(config[l].jx,jx1);
strcpy(config[l].wjm,wjm);
max=l;
l++;
}
fclose(fp1);
}
fp1=fopen("d:\\Shvoice\\configjx.dat","rb");
if(fp1==NULL){
printf("%s样本配置文件打开错误!\n","d:\\Shvoice\\configjx.dat");
exit(1);
}
else{
int l=0,j=0;
char buffer[256],wjm1[30],jx1[10],wjm[30];
while ( fgets(buffer,20,fp1) != NULL ) {
j=0;
strcpy(wjm1,"");
int length=clear_space(buffer,20);
buffer[length]='\0';
strcpy(jx1,buffer);
sprintf(wjm,"d:\\Shvoice\\%s",jx1);
strcpy(vecload[l].fldir,wjm);
length=clear_space(vecload[l].fldir,30);
vecload[l].fldir[length]='\0';
vecload[l].i_vec = ListVecFiles(vecload[l].fldir, vecload[l].sampleList);
if(vecload[l].i_vec<=0)
vecload[l].i_vec=0;
vecload[l].vector_count = LoadVecFiles(vecload[l].sampleList, vecload[l].sampleSetList);
if(vecload[l].vector_count<=0)
vecload[l].vector_count=0;
maxr=l;
l++;
}
fclose(fp1);
}
hThread = CreateThread ( NULL, 0, (LPTHREAD_START_ROUTINE)start_ch,
NULL, 0, &id_ch );
if ( hThread == NULL ) {
printf ( "CreateThread returned error.\n" );
exit ( 1 );
}
CloseHandle ( hThread );
dv_config = CreateMutex ( NULL, FALSE, NULL );
if ( dv_config == NULL ) {
printf ( "CreateMutex returned %d\n", GetLastError() );
exit ( 1 );
}
for ( i = 0; i < maxrow; i++ ) {
sbsj[i].volFlag=0;
sbsj[i].flag=0;
sbsj[i].infor.f = sbsj[i].infor.r = 0;
sbsj[i].ev = CreateEvent ( NULL, TRUE, FALSE, NULL );
if ( sbsj[i].ev == NULL ) {
printf ( "CreateEvent returned error.\n" );
exit ( 1 );
}
sbsj[i].add_ev = CreateMutex ( NULL, FALSE, NULL );
if ( sbsj[i].add_ev == NULL ) {
printf ( "CreateMutex returned %d\n", GetLastError() );
}
hThread = CreateThread ( NULL, 0, (LPTHREAD_START_ROUTINE)start_thread,
(LPVOID)i, 0, &id_thread[i] );
if ( hThread == NULL ) {
printf ( "CreateThread returned error.\n" );
exit ( 1 );
}
CloseHandle ( hThread );
printf("启动%d路线程成功.......\n",i);
}
CallNamedPipe( );
}
void start_thread(int id)
{
char tmp[100];
struct struct_jie{
char wjm[30];
char jx[10];
int id;
int flag;
} ;
struct struct_jie *head;
while(1){
WaitForSingleObject ( sbsj[id].ev,-1L );
ResetEvent(sbsj[id].ev);
while(sbsj[id].infor.r !=sbsj[id].infor.f){
strcpy(sbsj[id].info.buffer1,"");
head=(struct struct_jie *)sbsj[id].info.buffer1;
if(sbsj[id].flag==1){
// printf("%s %s %s %d %d\n",sbsj[k].fldir,sbsj[k].flname,sbsj[k].jx,sbsj[k].flag,k);
sbsj[id].flag=0;
TStringArray wavList;
int m=ListWavFiles(sbsj[id].flname, wavList);
if(m<=0){
head->flag=0;
head->id=sbsj[id].id;
strcpy(head->jx,sbsj[id].jx);
strcpy(head->wjm,"");
memcpy(sbsj[id].info.buffer1,head,sizeof(*head));
write_to_pipe ( PIPE_SEND, sbsj[id].info.buffer1, sizeof(sbsj[id].info.buffer1));
if(WRITE_FLAG==1){
sprintf(tmp,"%s文件不存在write file id=%d flag=%d jx=%s\n",sbsj[id].flname,head->id,head->flag,head->jx);
WriteInfoLog(tmp);
}
else if(WRITE_FLAG==2)
printf("%s文件不存在write file id=%d flag=%d jx=%s\n",sbsj[id].flname,head->id,head->flag,head->jx);
continue;
}
if(sbsj[id].volFlag){
sudxSetCompVolumeFlag(TRUE);
}
else{
sudxSetCompVolumeFlag(FALSE);
// printf("采用与音量无关的方式比较\n");
}
/*
TStringArray sampleList;
sbsj[id].info.i_vec = ListVecFiles(sbsj[id].fldir, sampleList);
if(sbsj[id].info.i_vec<=0){
head->flag=0;
head->id=sbsj[id].id;
strcpy(head->jx,sbsj[id].jx);
strcpy(head->wjm,"");
memcpy(sbsj[id].info.buffer1,head,sizeof(*head));
write_to_pipe ( PIPE_SEND, sbsj[id].info.buffer1, sizeof(sbsj[id].info.buffer1));
if(WRITE_FLAG==1){
sprintf(tmp,"[%s] 局向没有对应的采样文件\n", sbsj[id].fldir);
WriteInfoLog(tmp);
}
else if(WRITE_FLAG==2)
printf("[%s] 局向没有对应的采样文件\n", sbsj[id].fldir);
continue;
}
TSampleSetList sampleSetList;
sbsj[id].info.vector_count = LoadVecFiles(sampleList, sampleSetList);
if(sbsj[id].info.vector_count<=0){
printf("没有找到样本集合文件\n");
continue;
}
*/
WaitForSingleObject ( dv_config, INFINITE );
sbsj[id].info.vector_count=0;
sbsj[id].sampleSetList.erase(sbsj[id].sampleSetList.begin(),sbsj[id].sampleSetList.end());
for(int n=0;n<=maxr;n++)
if(strcmp(vecload[n].fldir,sbsj[id].fldir)==0){
sbsj[id].info.vector_count=vecload[n].vector_count;
sbsj[id].sampleSetList=vecload[n].sampleSetList;
}
else
continue;
if(sbsj[id].info.vector_count<=0){
head->flag=0;
head->id=sbsj[id].id;
strcpy(head->jx,sbsj[id].jx);
strcpy(head->wjm,"");
memcpy(sbsj[id].info.buffer1,head,sizeof(*head));
write_to_pipe ( PIPE_SEND, sbsj[id].info.buffer1, sizeof(sbsj[id].info.buffer1));
if(WRITE_FLAG==1){
sprintf(tmp,"[%s] 局向没有对应的采样文件\n", sbsj[id].fldir);
WriteInfoLog(tmp);
}
else if(WRITE_FLAG==2)
printf("[%s] 局向没有对应的采样文件\n", sbsj[id].fldir);
ReleaseMutex ( dv_config );
continue;
}
int old_clock = clock();
sbsj[id].fp=fopen(sbsj[id].flname,"rb");
if(sbsj[id].fp==NULL){
ReleaseMutex ( dv_config );
continue;
}
fseek(sbsj[id].fp, 0L, SEEK_END);
sbsj[id].info.fSize = ftell(sbsj[id].fp);
sbsj[id].info.compare_turn = sbsj[id].info.fSize/sizeof(TSoundTag);
/*
if(compare_turn<=0){
printf("输入的声音过短,不能比较\n");
fclose(fp);
continue;
}
*/
memset(sbsj[id].pFileBuf,0,sizeof(sbsj[id].pFileBuf));
fseek(sbsj[id].fp, 0L, SEEK_SET);
sbsj[id].info.segSize = fread(sbsj[id].pFileBuf, sizeof(short), bufSampleSize, sbsj[id].fp);
// if(sbsj[id].info.segSize>=130000)
// sbsj[id].info.segSize=130000;
if(sbsj[id].info.segSize<=0){
fclose(sbsj[id].fp);
ReleaseMutex ( dv_config );
continue;
}
sbsj[id].info.outSize=0;
sbsj[id].info.tailSize=0;
sbsj[id].info.pTail=NULL;
memset(sbsj[id].info.last_result, 0, sizeof(sbsj[id].info.last_result));
while(sbsj[id].info.segSize>0) {
sbsj[id].info.error = sudxCalcBuffer(sbsj[id].pFileBuf, sbsj[id].info.segSize, &sbsj[id].info.pOut, &sbsj[id].info.outSize, &sbsj[id].info.pTail, &sbsj[id].info.tailSize1, sbsj[id].info.last_result);
if(sbsj[id].info.error>0){
strcpy(sbsj[id].outfl,"");
for(int i=0; i<sbsj[id].info.outSize; i++){
for(int j=0; j<sbsj[id].info.vector_count; j++){
if( sudxCompare(sbsj[id].info.pOut+i, &(sbsj[id].sampleSetList[j].tags[1]), FALSE) ){
if(sudxCompare(sbsj[id].info.pOut+i, sbsj[id].sampleSetList[j].tags+1, TRUE)){
strcpy(sbsj[id].outfl,sbsj[id].sampleSetList[j].name);
goto caiyang1;
}
}
}
}
caiyang1:
int time_passed = clock()-old_clock;
if(WRITE_FLAG==1){
sprintf(tmp,"语音对比计算结束, 耗时%d ms 样本文件%s 文件%s %d\n", time_passed,sbsj[id].outfl,sbsj[id].flname,sbsj[id].id);
WriteInfoLog(tmp);
}
else if(WRITE_FLAG==2)
printf("语音对比计算结束, 耗时%d ms 样本文件%s 文件%s %d\n", time_passed,sbsj[id].outfl,sbsj[id].flname,sbsj[id].id);
if(sbsj[id].outfl[0]==' '){
head->flag=0;
head->id=sbsj[id].id;
strcpy(head->jx,sbsj[id].jx);
strcpy(head->wjm,"");
memcpy(sbsj[id].info.buffer1,head,sizeof(*head));
write_to_pipe ( PIPE_SEND, sbsj[id].info.buffer1, sizeof(sbsj[id].info.buffer1));
if(WRITE_FLAG==1){
sprintf(tmp,"%s找不到合适样本write file id=%d flag=%d jx=%s\n",sbsj[id].flname,head->id,head->flag,head->jx);
WriteInfoLog(tmp);
}
else if(WRITE_FLAG==2)
printf("%s找不到合适样本write file id=%d flag=%d jx=%s\n",sbsj[id].flname,head->id,head->flag,head->jx);
goto caiyang;
}
int bz=0;
/*
sbsj[id].fp1=fopen("d:\\Shvoice\\config.dat","rb");
if(sbsj[id].fp1==NULL){
// fclose(sbsj[id].fp1);
goto caiyang;
}
char buffer[256],wjm1[30],wjm[30];
char jx1[10],jx2[10];
int jx,j=0,bz=0;
while ( fgets(buffer,120,sbsj[id].fp1) != NULL ) {
j=0;
strcpy(wjm1,"");
get_field(buffer,jx2,&j);
get_field(buffer,jx1,&j);
get_field(buffer,wjm1,&j);
sprintf(wjm,"d:\\Shvoice\\%s\\%s",jx1,wjm1);
jx=atoi(jx2);
*/
for(int k=0;k<=max;k++){
if((strcmp(config[k].wjm,sbsj[id].outfl)==0)&&(strcmp(config[k].jx,sbsj[id].jx)==0)){
bz=1;
head->flag=config[k].flag;
head->id=sbsj[id].id;
strcpy(head->jx,config[k].jx);
strcpy(head->wjm,"");
memcpy(sbsj[id].info.buffer1,head,sizeof(*head));
write_to_pipe ( PIPE_SEND, sbsj[id].info.buffer1, sizeof(sbsj[id].info.buffer1));
if(WRITE_FLAG==1){
sprintf(tmp,"%s %s %d 且write file id=%d flag=%d jx=%s\n",config[k].wjm,sbsj[id].outfl,sbsj[id].id,head->id,head->flag,head->jx);
WriteInfoLog(tmp);
}
else if(WRITE_FLAG==2)
printf("%s %s %d 且write file id=%d flag=%d jx=%s\n",config[k].wjm,sbsj[id].outfl,sbsj[id].id,head->id,head->flag,head->jx);
break;
}
else
continue;
}
if(bz==0){
head->flag=0;
head->id=sbsj[id].id;
strcpy(head->jx,sbsj[id].jx);
strcpy(head->wjm,"");
memcpy(sbsj[id].info.buffer1,head,sizeof(*head));
write_to_pipe ( PIPE_SEND, sbsj[id].info.buffer1, sizeof(sbsj[id].info.buffer1));
if(WRITE_FLAG==1){
sprintf(tmp,"没有匹配样本%s %d 且write file id=%d flag=%d jx=%s\n",sbsj[id].flname,sbsj[id].id,head->id,head->flag,head->jx);
WriteInfoLog(tmp);
}
else if(WRITE_FLAG==2)
printf("没有匹配%s %d 且write file id=%d flag=%d jx=%s\n",sbsj[id].flname,sbsj[id].id,head->id,head->flag,head->jx);
}
// fclose ( sbsj[id].fp1 );
}
//sbsj[id].info.error<=0
else if(sbsj[id].info.error<=0){
sudxExit();
if(!sudxInit()){
printf("初始化识别引擎错误!\n");
exit(1);
}
break;
}
caiyang:
if(sbsj[id].info.tailSize1)
memcpy(sbsj[id].pFileBuf, sbsj[id].info.pTail, sizeof(short)*sbsj[id].info.tailSize1);
//然后直接把新的数据连接到上次的尾巴后面
sbsj[id].info.segSize = fread( &sbsj[id].pFileBuf[sbsj[id].info.tailSize1], sizeof(short), bufSampleSize - sbsj[id].info.tailSize1, sbsj[id].fp);
if(sbsj[id].info.segSize)
sbsj[id].info.segSize+=sbsj[id].info.tailSize1;
}
//sbsj[id].info.segSize<=0
fclose(sbsj[id].fp);
ReleaseMutex ( dv_config );
}
sbsj[id].infor.f = ( sbsj[id].infor.f+1 )%SIZE_QUEUE;
}
}
}
void CallNamedPipe( void ) //处理线程
{
char buff[IN_BUFF_SIZE];
DWORD cbread;
int i,count;
struct struct_jiegou{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -