⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 shvoice.cpp

📁 语音识别:语音矢量化及算法及与原文件的矢量对比功能源代码
💻 CPP
📖 第 1 页 / 共 3 页
字号:
	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 + -