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

📄 wcydlg.cpp

📁 本代码是语音识别的应用程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
			if( nRet == SOCKET_ERROR )
			{
				//return 0;
			}

			int ii=0;
			int iiGet, iiRecd;
			dataLength = fileinfo.fileSize;
        	recdData = new byte[RECV_BUFFER_SIZE];
	        cbLeftToReceive = dataLength;
		
		//////////////////////////////////////////////////////////////////////////////////////
			while ((doneFlag != 1)&&(cbLeftToReceive > 0 )) 
			//while (doneFlag != 1) 
			{
				Sleep(150);
				//if ((bufferSize = fread(speechBuffer, sizeof(char), 4096, fp)) <= 0) 
				//	break; // no more data
				iiGet = ( cbLeftToReceive < RECV_BUFFER_SIZE ) ? cbLeftToReceive : RECV_BUFFER_SIZE ;
		        iiRecd = recv( m_socket, ( char *)recdData, iiGet, 0);

				returnCode = itrec_recognize(m_index, recdData, iiRecd, 
				&doneFlag, &speechBegin, &speechEnd);
				//returnCode = itrec_recognize(index, speechBuffer, bufferSize, 
				//	&doneFlag, &speechBegin, &speechEnd);
				if (returnCode != VT_EXIT_SUCCESS)
				{
					ASRresultstr+="fail...............\t";
					//break;
					//fail++;
				}
					//::MessageBox(hwnd," ok","警告",MB_OK);
				ii++;
				cbLeftToReceive -= iiRecd;
			};
			if(doneFlag==1)
				success++;
			else
				fail++;
	
            //ASRresultstr+="recognize finished\t";
			if (returnCode != VT_EXIT_SUCCESS) 	{
				itrec_detach_recognizer(m_index);
			   //::MessageBox(hwnd," fail","警告",MB_OK);
				//continue;
			}

			// Step 6: Stop the recognizer
			returnCode = itrec_stop_recognizer(m_index);
			if (returnCode != VT_EXIT_SUCCESS) {
                //MessageBox("itrec_stop_recognizer() failed");
				itrec_detach_recognizer(m_index);
				//continue;
			}

			// Step 7: Wait until the recognition result is ready
			do {
				returnCode = itrec_query_status(m_index, &recogStat, &speechBegin, &speechEnd);
				if (returnCode != VT_EXIT_SUCCESS)
				{}
					//break;
				if (recogStat == VT_RESULT_NOT_READY_YET) Sleep(500);
			} while (recogStat == VT_RESULT_NOT_READY_YET);
			if (returnCode != VT_EXIT_SUCCESS) 	{
                //MessageBox(" itrec_query_status() failed");
				itrec_detach_recognizer(m_index);
				//continue;
			}

			// Step 8: Retrieve recognition results
			
			returnCode = itrec_query_result(m_index, 3, &doneFlag, &recogStat, &numResult, NULL);
		//	sprintf(tem,"%d",numResult);
			if (numResult > 0) {
				results = (VT_RESULT*)calloc(numResult, sizeof(VT_RESULT));
				returnCode = itrec_query_result(m_index, 3, &doneFlag, &recogStat, &numResult, results);
			}
			if (returnCode != VT_EXIT_SUCCESS) 
			{
                //MessageBox(" itrec_query_result() failed");
				itrec_detach_recognizer(m_index);
				//continue;
			}

			returnCode = itrec_deactivate_grammar(m_index, &lp_grammar);
			if (returnCode != VT_EXIT_SUCCESS) 
			{
                //MessageBox(" Failed to deactivate grammar");
				itrec_detach_recognizer(m_index);
				//continue;
			}

			// Step 9: Detach from the recognizer
			returnCode = itrec_detach_recognizer(m_index);
			if (returnCode != VT_EXIT_SUCCESS) 
			{
                //MessageBox("  Failed to detach from recognizer server");
				//continue;
			}

			// Display recognition results
            //ASRresultstr+="Result: ";
			switch (recogStat) 
			{
			case VT_RESULT_AVAILABLE:			ASRresultstr+="Results Obtained\r\n";	break;
			case VT_RESULT_NONE:				ASRresultstr+="No Result\r\n";			break;
			case VT_RESULT_SPEECH_TOO_SOFT:		ASRresultstr+="No Speech\r\n";			break;
			case VT_RESULT_SPEECH_TOO_SOON:		ASRresultstr+="Speech Too Soon\r\n";	break;
			case VT_RESULT_SPEECH_TOO_NOISY:	ASRresultstr+="Too Noisy\n";			break;
			case VT_RESULT_SPEECH_TOO_LONG:		ASRresultstr+="Speech Too Long\r\n";	break;
			case VT_RESULT_NOT_READY_YET:		ASRresultstr+="Result Not Ready\r\n";	break;
			case VT_RESULT_ERROR: default:		ASRresultstr+="Error!!!\r\n";			break;
			}
            
			if (numResult == 0) {
                ASRresultstr+="******** No answer found ******\r\n";
			}
			else 
			{
				for (i = 0; i < numResult; i++)
				{
					switch (i) {
				   	case 0:
						sprintf(tempname,"1st-best result: %s(score: %5.3f)\r\n", results[i].result, results[i].score);
						break;
					case 1:
						sprintf(tempname,"2nd-best result: %s(score: %5.3f)\r\n", results[i].result, results[i].score);
						break;
					case 2:
						sprintf(tempname,"3nd-best result: %s(score: %5.3f)\r\n", results[i].result, results[i].score);
						break;
					default:
						sprintf(tempname,"%dth-best result: %s(score: %5.3f)\r\n", i+1, results[i].result, results[i].score);
						break; 
					}
					ASRresultstr+=tempname;
				}
			}

            ASRresultstr+="\n";
            sprintf(tempname,"Speech Begin: %5.3f     Speech End: %5.3f     Duration: %5.3f\r\n",
				speechBegin, speechEnd, speechEnd - speechBegin);
			ASRresultstr+=tempname;

			if (results != NULL) {
				free(results);
				results = NULL;
			}

		//////////////////////////////////////////////////////////////////////////
		CString strSend;
		strSend=ASRresultstr;
		sendto(m_socket,strSend,strSend.GetLength()+1,0,
		NULL,sizeof(SOCKADDR));
			///////////////////////////////////////////////////////////////////////
			//(SOCKADDR*)&addrTo//可选指针
		//}

		fclose(ufp);
        ASRresultstr+="************************************************\r\n";
	
	    //::PostMessage(hwnd,WM_RESLUTDATE,0,NULL);//给当前的对话框送数据。用消息实现。传对象不行

		ASRresultstr_server+=ASRresultstr;
		::SetDlgItemText(hwnd,IDC_EDIT_RECV,ASRresultstr_server);
		ReleaseMutex(hMutex);

		switch(m_index)
		{
		case 0: 
			m_num->first+=success;
			break;
		case 1:
			m_num->second+=success;
			break;
		case 2:
			m_num->third+=success;
			break;

		}
		m_List++;

		ipstruct *m_ipstrcut=new ipstruct;
		m_ipstrcut->ipstr=m_ip;
		m_ipstrcut->port=m_port;
		m_ipstrcut->m_struct=m_num;
		m_ipstrcut->Lisence_index=m_index;
		m_ipstrcut->m_list=m_List;

		::SendMessage(hwnd,WM_RESLUTDATE,0,(LPARAM)m_ipstrcut);
		//m_hip=inet_addr(m_ip);
		int m_hip=22;
		int m;
		while(TRUE)
		{
			recv( m_socket, (char *)&m, sizeof(m) , 0 );

			if(m==m_hip)
				break;
        }
		//::MessageBox(hwnd,"ok","警告",MB_OK);
		CANCLE_type * ty=new CANCLE_type;	
		ty->str_ip=m_ip;
		ty->str_port=m_port;
		ty->S=&m_socket;

		::SendMessage(hwnd,WM_CANCLE,0,(LPARAM)ty);
		//shutdown(m_socket,  0);
		//closesocket(m_socket);
		return 1;
		/////////////////////////////////////////////////////////////////////////////////
}
void CWCYDlg::OnBtnASR() 
{

}

BOOL CWCYDlg::InitSocket()
{
	
	m_socket = socket( AF_INET, SOCK_STREAM, IPPROTO_IP );
	if( m_socket == INVALID_SOCKET )
	{
		MessageBox("创建失败");
		return 0;	 
	}
	int nResult = 0;
	SOCKADDR_IN addrSock;
	memset(&addrSock,0,sizeof(addrSock));
	addrSock.sin_family=AF_INET;
	addrSock.sin_port=htons(8439);
	//addrSock.sin_addr.S_un.S_addr=inet_addr( "INADDR_ANY" );
	//自动获取本地ip
	/////////////////////////////////////////////////////////////
	  WORD wVersionRequested;
      WSADATA wsaData;
      char name[255];
      //CString ip;
	  char *ip;
      PHOSTENT hostinfo;
      wVersionRequested = MAKEWORD( 2, 0 );

      if ( WSAStartup( wVersionRequested, &wsaData ) == 0 )
      {
            if( gethostname ( name, sizeof(name)) == 0)
                  if((hostinfo = gethostbyname(name)) != NULL)
                        ip = inet_ntoa (*(struct in_addr *)*hostinfo->h_addr_list);
            WSACleanup( );
      }

	//////////////////////////////////////////////////////////
	addrSock.sin_addr.S_un.S_addr=inet_addr( ip);

	nResult = bind( m_socket ,( sockaddr* )&addrSock, sizeof( SOCKADDR_IN ) );	
	nResult = listen( m_socket , 5 );  
	return 0;
}

DWORD WINAPI CWCYDlg::Hhread_Num(LPVOID lpParameter)
{
	// TODO: Add your control notification handler code here
	HWND hwnd=((thread_type*)lpParameter)->hwnd;//将参数传递到本地变量
    SOCKET m_socket_entry=((thread_type*)lpParameter)->S;

	SOCKET s_c;  
///////////////////////////////////////////////////////////////////////////////////////
	SOCKADDR_IN Tempaddr;
	int len = sizeof ( Tempaddr );
	int m_flag=0;
	//int m_n=0;
	//int success_1=0;
	//int nResult;
    //num_struct * m_num=new num_struct;
    m_num->first=0;
	m_num->second=0;
	m_num->third=0;
	//m_List=0;
	////////////////////////////////////////////////////// //
	m_client=0;
    while(1)
	{
		do{
		s_c = accept( m_socket_entry, ( sockaddr *)&Tempaddr, &len );
		}while(s_c == INVALID_SOCKET);	

	m_client++;
	char * str_addr;
	int  str_port;
	//DWORD addr=Tempaddr.sin_addr;
	str_addr=inet_ntoa(Tempaddr.sin_addr);    //inet_ntoa converts ipv4 to string
	//inet_addr converts string  to (Ipv4) Internet 
	str_port=Tempaddr.sin_port;
	//::SetDlgItemText(hwnd,IDC_EDIT_LICENSE,str_addr);

	m_flag = rand(); 
	m_flag=m_flag%NUM_INSTANCE;
	//
	THreadConn_type * Conn= new THreadConn_type;
	Conn->index=m_client;
	Conn->str_ip=str_addr;
	Conn->str_port=str_port;
	::SendMessage(hwnd,WM_CONN,0,(LPARAM)Conn);

	 sockrecv* sr=new sockrecv;	
	 sr->hwnd=hwnd;
	 sr->S=s_c;
	 sr->index=m_flag;
	 sr->str_ip=str_addr;
	 sr->str_port=str_port;
	 ///////////////////////////////////////////////////////

    HANDLE  hThread;
	hThread=CreateThread(NULL,0,entry,(LPVOID)sr,0,NULL);

	CloseHandle(hThread);
	//closesocket(s_c);
	}

}

void CWCYDlg::OnResult(WPARAM wParam, LPARAM lParam)
{
	//对Lisence的操作。
	int T_index=0;
	T_index=((ipstruct *)lParam)->Lisence_index;

	int m_n;
	CString strTemp;
	//char *Temp_ip=((ipstruct *)lParam)->ipstr;
	//int Temp_port=((ipstruct *)lParam)->port;
	int m_L=((ipstruct *)lParam)->m_list;

	switch(T_index)
	{
	case 0:
		m_n=((ipstruct *)lParam)->m_struct->first;
		strTemp.Format("%d",m_n);
		m_ListCtl.SetItemText(0,1,strTemp);
		break;
	case 1:
		m_n=((ipstruct *)lParam)->m_struct->second;
		strTemp.Format("%d",m_n);
		m_ListCtl.SetItemText(1,1,strTemp);
		break;
	case 2:
		m_n=((ipstruct *)lParam)->m_struct->third;
		strTemp.Format("%d",m_n);
		m_ListCtl.SetItemText(2,1,strTemp);
		break;
    default :
		break;
    }

}

DWORD WINAPI CWCYDlg::THread_Connect(LPVOID lpParameter)
{
	return 0;
}

void CWCYDlg::OnConn(WPARAM wParam, LPARAM lParam)
{
	//显示连接上的客户端
	int m_L=((THreadConn_type*)lParam)->index;
	m_L=m_L-1;
	char *Temp_ip=((THreadConn_type*)lParam)->str_ip;
	int  Temp_port=((THreadConn_type*)lParam)->str_port;

	CString strTemp;
	LVITEM item;
	item.mask=LVIF_TEXT|LVIF_IMAGE;
	item.iSubItem=0;

	item.iItem=m_L;
	item.pszText="  ";
    m_ListP_i.InsertItem(&item);
	m_ListP_i.SetItemText(m_L,0,Temp_ip);

	strTemp.Format("%d",Temp_port);
	m_ListP_i.SetItemText(m_L,1,strTemp);

	return ;
}

void CWCYDlg::OnCancle(WPARAM wParam, LPARAM lParam)
{
    char * str_i=((CANCLE_type *)lParam)->str_ip;
	int port=((CANCLE_type *)lParam)->str_port;
    SOCKET *s = ((CANCLE_type *)lParam)->S;
	int num=m_client;
	CString strIP;
	CString strport;
	char * c_ip=NULL;
	int result;
	int m_port=0;
	for(int i=0;i<num;i++)
	{
		strIP=m_ListP_i.GetItemText(i,0);
		c_ip=strIP.GetBuffer(strIP.GetLength());
		strport=m_ListP_i.GetItemText(i,1);
		m_port=atoi(strport);	
		result=strcmp(strIP,c_ip);
		if((result==0)&&(m_port==port))
		{
			m_ListP_i.DeleteItem(i);
			break;
		}
	}
	m_client--;
	shutdown(*s,   0);
	closesocket(*s);

}

⌨️ 快捷键说明

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