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

📄 shvoice.cpp

📁 语音识别:语音矢量化及算法及与原文件的矢量对比功能源代码
💻 CPP
📖 第 1 页 / 共 3 页
字号:
	char wjm[30];
	char jx[10];
	int id;   
	int flag;
	} ;
   struct struct_jiegou *my;

	hp = CreateNamedPipe ( PIPE_REV, PIPE_ACCESS_DUPLEX, 
		PIPE_WAIT | PIPE_READMODE_BYTE | PIPE_TYPE_MESSAGE,
		4, 512, 512, 10000, NULL);
	if ( hp == INVALID_HANDLE_VALUE ) {
		DWORD ErrorCode;
		ErrorCode = GetLastError();
		printf ( "CreateNamedPipe return %d\n", ErrorCode );
		exit ( 1 ) ;
	}
	
	printf ( "Create Named Pipe PIPE_SOURCE.\n" );
	while ( 1 ) {
		if ( !ConnectNamedPipe ( hp, NULL ) ) {
			printf ( "ConnectNamedPipe err.\n" );
			CloseHandle ( hp );
			exit ( 1 );
		}
		ReadFile ( hp, buff, IN_BUFF_SIZE, &cbread, NULL );
		DisconnectNamedPipe ( hp );

		my=(struct struct_jiegou *)buff;
        count=0;
		
		while(1){

		i=my->id%maxrow;

		if ( ( sbsj[i].infor.r+1 )%SIZE_QUEUE != sbsj[i].infor.f ) {
			memcpy ( sbsj[i].infor.infor[sbsj[i].infor.r], buff,cbread<IN_BUFF_SIZE?cbread:IN_BUFF_SIZE );
		    sbsj[i].infor.r = ( sbsj[i].infor.r+1 )%SIZE_QUEUE;

			WaitForSingleObject ( sbsj[i].add_ev, INFINITE );

			sbsj[i].id=my->id;
			strcpy(sbsj[i].fldir,"d:\\Shvoice\\");
            strcpy(sbsj[i].flname,my->wjm);
		    strcpy(sbsj[i].jx,my->jx);
        	strcat(sbsj[i].fldir,sbsj[i].jx);

			if(!DirExist(sbsj[i].fldir))
		     if(!CreateDir(sbsj[i].fldir)){
				  printf("对不起,样本目录创建不成功!\n");
        		  ReleaseMutex ( sbsj[i].add_ev );
                  break;
			 }

			sbsj[i].flag=1;
         	ReleaseMutex ( sbsj[i].add_ev );
			SetEvent ( sbsj[i].ev );
            break;
		}
		 else{
		   
			if(count==0)
			     printf ( "事件队列已满\n" );
			
			else if(count>=5){
    			printf ( "事件队列已满\n" );
				Sleep(50);
				break;
			}
				count++;
			    Sleep(50);
			}
		}
	}
}
void write_to_pipe ( char *name, void *buff, int length )
{
	BOOL connected_flag;
	DWORD  ret;
	ULONG cbwritten;
	int timeout_counter = 0;
	DWORD error;

	connected_flag = FALSE;
	while ( !connected_flag ) {
		if ( WaitNamedPipe ( name, 100 ) == FALSE ) {
			error = GetLastError ( );
			if ( error == ERROR_PIPE_BUSY ) {
				continue;
			}
		}
        hp1 = CreateFile ( name, GENERIC_WRITE|GENERIC_READ, 0, NULL,   
			OPEN_EXISTING,  0,  NULL ); 
		if ( hp1 == INVALID_HANDLE_VALUE ) {
			ret = GetLastError ( );
			if ( ret != ERROR_PIPE_BUSY ) { 
				break;
			}
		}
		else
			connected_flag=TRUE;
	}

	if ( WriteFile ( hp1, buff, length , &cbwritten, NULL ) == FALSE ) {
		CloseHandle ( hp1 );
	}
	CloseHandle ( hp1 );
}

void start_ch(void)
{
	char s,str[10]="",str1[20]="",wstr[30]="",rstr[30]="";

	while(1){
		s=getch();
		switch(s){
			 case 'h':
			 case 'H':
					printf("......................\n");
     				printf("    1:  按a关闭写日记......\n");
					printf("    2:  按b开放写日记...........\n");
					printf("    3:  按c屏幕输出日记..............\n");
					printf("    4:  按d将批量wav文件转样本文件........\n");
					printf("    5:  按e将单个wav文件转样本文件.............\n");
					printf("    6:  按f修改样本库配置文件.............. ........\n");
					printf("    7:  按s加载配置:增加样本和修改样本库要加载...........\n");
 					printf("......................\n");
        			break;
			 case 'a':
			 case 'A':
   				    WRITE_FLAG=0;
					break;
			 case 'b':
             case 'B':
					WRITE_FLAG=1;
					break;
			 case 'c':
			 case 'C':
					WRITE_FLAG=2;
					break;
			 case 'd':
			 case 'D':
				    printf("说明:程序是匹次处理,输入wav文件所在目录,输入vec样本输出目录\n");
					printf("请输入wav文件所在目录\n");
					printf("wav所在目录(如c:)=");
					gets(str);
					  if ( strlen(str) > 0 ) {
			         	  strncpy(wstr,str,sizeof(wstr)-1);
				          wstr[sizeof(wstr)-1] = '\0';
					  }
					printf("vec样本输出目录(如d:)=");
				    gets(str);
					  if ( strlen(str) > 0 ) {
			         	  strncpy(rstr,str,sizeof(rstr)-1);
				          rstr[sizeof(rstr)-1] = '\0';
					  }
					  printf("wav目录=%s,vec目录=%s\n",wstr,rstr);
                      wav_vec(wstr,rstr,1);
					break;
			 case 'e':
			 case 'E':
				    printf("说明:程序是单个处理,输入wav文件全名(目录+文件名),输入vec样本输出目录\n");
					printf("请输入wav文件全名(目录+文件名)\n");
					printf("wav文件名=");
					gets(str);
					  if ( strlen(str) > 0 ) {
			         	  strncpy(wstr,str,sizeof(wstr)-1);
				          wstr[sizeof(wstr)-1] = '\0';
					  }
					printf("vec样本输出目录(如d:)=");
				    gets(str);
					  if ( strlen(str) > 0 ) {
			         	  strncpy(rstr,str,sizeof(rstr)-1);
				          rstr[sizeof(rstr)-1] = '\0';
					  }
					  printf("wav文件=%s,vec目录=%s\n",wstr,rstr);
                      wav_vec(wstr,rstr,0);
					break;
			 case 'f':
			 case 'F':
				    edit_config();
					break;
			 case 's':
			 case 'S':
				    jzsj();
					break;
             default:
					break;
		 }
	}
}
/*
void InitSock ( void )     //socket 初始化
{
    WSADATA WSAData;

	if ( WSAStartup(MAKEWORD(1,1), &WSAData) )  {
		printf ( "Start socket failure.\n" );
		exit ( 1 );
	}
}
/*
void callsocket(void)
{
    SOCKADDR_IN server; 
    SOCKET sock;        
	char sce_dbsvr_ip[16];
	short sce_dbsvr_port;
	int sockerr;

	strcpy ( sce_dbsvr_ip, "127.0.0.1" );
	sce_dbsvr_port = 5555 + dbnum;

    sock = socket ( AF_INET, SOCK_STREAM, 0 );
    if ( sock == INVALID_SOCKET ) {
   		printf ( "Function returned error! " );
		return FALSE;
    }
    
	server.sin_addr.s_addr = inet_addr ( sce_dbsvr_ip );
    server.sin_family      = AF_INET;
    server.sin_port        = htons ( sce_dbsvr_port );

    if ( connect(sock,(PSOCKADDR)&server,sizeof(server)) < 0 ) {
		sockerr = WSAGetLastError();
		if ( sockerr == WSAECONNREFUSED ) {
			closesocket( sock );
			Sleep ( 50 );
			goto start_db_opr;
		}
		printf ( "函数connect()返回%d\n", sockerr );
        closesocket( sock );
		return FALSE;
    }
	send ( sock, (char*)input, i_length, 0 );
	recv ( sock, (char*)output, o_length, 0 );
	send ( sock, "OK", 2, 0 );
	closesocket ( sock );
	return TRUE;
}
*/
void edit_config(void)
{
    PROCESS_INFORMATION ProcInfo;
    DWORD ExitCode;
    STARTUPINFO startinfo;
	char strname[100];

	        sprintf(strname,"notepad.exe d:\\Shvoice\\config.dat");
            memset(&startinfo,0,sizeof(STARTUPINFO) );
		    if ( !CreateProcess(NULL,strname,NULL,NULL,TRUE,
					  0,NULL,NULL,&startinfo,&ProcInfo) ) {
			      printf("Error:---open d:||Shvoice||config.dat fail.code=%d\n",
					     GetLastError() );
                  Sleep(1000);
			}
			while(1) {
				Sleep(1000);
                if ( !GetExitCodeProcess(ProcInfo.hProcess,&ExitCode) ) {
	               printf("GetExitCodeProcess  error.code=%d\n",GetLastError() );
				   break;
				} else {
					   printf("Info: thanks a lot!\n");
					   break;
				}
			}
}

void wav_vec(char *wav,char*vec,int bz)
{
	TStringArray wavList;
    int fileCount;

	if(bz!=0)
	      fileCount = SListWavFiles(wav, wavList);
	else
	      fileCount = ListWavFiles(wav, wavList);

	if(fileCount<=0){
		printf("[%s]里没有wav文件\n", wav);
		return;
	}
	
	DWORD  dwFlag = GetFileAttributes(vec);
    	if (  dwFlag==0xFFFFFFFF ){ 
		if(!CreateDir(vec)){
				  printf("对不起,样本目录创建不成功!\n");
				  return;
		}
		}

	printf("please wait,Now start...\n");
	const int bufSampleSize = 512*1024;
	short *pFileBuf = new short[bufSampleSize];	//每次处理2M个16bit pcm样本,也就是4M byte数据。

	for(int i=0; i<fileCount; i++){
		char outFile[30];
		
		sprintf(outFile, "%s\\%s.vec", vec, GetFileName(wavList[i].c_str()));

		FILE* fout = fopen(outFile, "w+b");		//打开或创建向量文件
	    FILE *fp;

		if(bz!=0)
		    fp = fopen(wavList[i].c_str(), "rb");
        else
		    fp = fopen(wav, "rb");
		fseek(fp, 0L, SEEK_END);
		long size = ftell(fp);
		fseek(fp, 0L, SEEK_SET);	//跳过wav头 
			
		int old_clock = clock();
		long segSize = fread(pFileBuf, sizeof(short), bufSampleSize, fp);
		
		TSoundTag* pOut;
		int outSize, tailSize;
		short* pTail=NULL;
		int last_result[17];

		memset(last_result, 0, sizeof(last_result));

		while(segSize>0){
			int error = sudxCalcBuffer(	pFileBuf, segSize, &pOut, &outSize, &pTail, &tailSize, last_result);
			if(error>0)
				fwrite(pOut, sizeof(TSoundTag), outSize, fout);
			else{
				printf("错误!\n");
				return;
			}

			if(tailSize)
				memcpy(pFileBuf, pTail, sizeof(short)*tailSize);

			segSize = fread( &pFileBuf[tailSize], sizeof(short), bufSampleSize - tailSize, fp);
			if(segSize)
				segSize+=tailSize;
		}
		fclose(fout);
		fclose(fp);
		
		double speed = double(size)*double(CLOCKS_PER_SEC)/double(clock()-old_clock);
		
		if(bz!=0)
     		printf("Processed file [%s], size %d, speed %d byte/sec\n",  wavList[i].c_str(), size, int(speed));
		else
	    	printf("Processed file [%s], size %d, speed %d byte/sec\n",  wav, size, int(speed));

	}
	delete pFileBuf;
    printf("Info:wav to vec finishied!\n");
	return;
}

void jzsj(void)
{

    printf("请等待...........\n");
	FILE *fp1=fopen("d:\\Shvoice\\config.dat","rb");
     
	if(fp1==NULL){
                printf("%s样本配置文件打开错误!\n","d:\\Shvoice\\config.dat");
                return;
	}
    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;
					memset(config[l].jx,0,sizeof(config[l].jx));
					strcpy(config[l].jx,jx1);
					memset(config[l].wjm,0,sizeof(config[l].wjm));
					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");
	   		    return;
               }
    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);
                    memset(vecload[l].fldir,0,sizeof(vecload[l].fldir));
					strcpy(vecload[l].fldir,wjm);
					length=clear_space(vecload[l].fldir,30);
					vecload[l].fldir[length]='\0';
	                vecload[l].sampleList.erase(vecload[l].sampleList.begin(),vecload[l].sampleList.end());
					vecload[l].i_vec = ListVecFiles(vecload[l].fldir, vecload[l].sampleList);
             		if(vecload[l].i_vec<=0)
			        vecload[l].i_vec=0;
					vecload[l].sampleSetList.erase(vecload[l].sampleSetList.begin(),vecload[l].sampleSetList.end());
             		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);
	}
	printf("数据加载成功!\n");
	return;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -