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

📄 shvoice.cpp

📁 语音识别:语音矢量化及算法及与原文件的矢量对比功能源代码
💻 CPP
📖 第 1 页 / 共 3 页
字号:
#include "stdafx.h"
#include <windows.h>
#include <stdio.h>
#include <string.h>
#include "dllSudx.h"

typedef vector<string>	TStringArray;

#define PIPE_REV "\\\\.\\PIPE\\pipe_20"
#define PIPE_SEND "\\\\.\\PIPE\\pipe_21"
#define SIZE_QUEUE 1024
#define IN_BUFF_SIZE 256
#define maxrow 8

int WRITE_FLAG=0,max=0,maxr=0;

DWORD id_thread[maxrow],id_ch;

void start_thread(int id);
void start_ch(void);
void CallNamedPipe( void ) ;
int clear_space ( char *string, int length );
char* GetFileName(const char* fullpath);
void write_to_pipe ( char *name, void *buff, int length );
void get_field ( char *buff, char *str, int *j );
void WriteInfoLog(char *msg);
bool DirExist(char *pszDirName);
bool CreateDir(char *pszDirName);
//void InitSock ( void ); 
//void callsocket(void);
void wav_vec(char *wav,char*vec,int bz);
void edit_config(void);
void jzsj(void);

HANDLE hp,hp1,dv_config;

const int bufSampleSize =512*1024;//定义采样大小

struct ASampleSet
{
	char name[256];
	TSoundTag tags[401];
};

typedef vector<ASampleSet>	TSampleSetList;

typedef struct {
unsigned char infor[SIZE_QUEUE][IN_BUFF_SIZE];	//事件指针头尾
int f;
int r;
} EVENT_INFO;

struct file_info
{
int i_vec;
int vector_count;
long segSize;
TSoundTag* pOut;
int outSize;
int tailSize;
int tailSize1;
short* pTail;
int last_result[17];
char buffer1[256];
int error;
int fSize;
int compare_turn;
};

struct shuzu
{
    TStringArray sampleList;
    TSampleSetList sampleSetList;
    short pFileBuf[bufSampleSize];	
    FILE *fp;
	FILE *fp1;
	HANDLE ev;//事件
    HANDLE add_ev;
	int id;//用户ID
    int flag;//标记
	char flname[256];//接收文件
    int volFlag;//采样声音控制开关
	char fldir[30];//语音样本目录
    char jx[10];//局向
	char outfl[256];//合适的样本
	EVENT_INFO infor;
	struct file_info info;
};
struct shuzu sbsj[maxrow];

struct config_dat
{
int flag;
char jx[10];
char wjm[30];
};
struct config_dat config[500];

struct load_vec
{
TStringArray sampleList;
TSampleSetList sampleSetList;
int vector_count;
int i_vec;
char fldir[30];
};
struct load_vec vecload[30];

int SListWavFiles(char* dir, TStringArray& fileList)
{
    struct _finddata_t c_file;
    long hFile;
	char tmp[1024];
	int retVal = 0;

	sprintf(tmp, "%s\\%s", dir, "*.wav");
	
    /* Find first .c file in current directory */
    if( (hFile = _findfirst( tmp, &c_file )) == -1L )
		return retVal;
	else
	{
		sprintf(tmp, "%s\\%s", dir, c_file.name);
		fileList.push_back(tmp);
		retVal++;
		while( _findnext( hFile, &c_file ) == 0 )
		{
			sprintf(tmp, "%s\\%s", dir, c_file.name);
			fileList.push_back(tmp);
			retVal++;
		}
		_findclose( hFile );
	}

	return retVal;
}

//寻找wav文件
int ListWavFiles(char* dir, TStringArray& fileList)
{
    struct _finddata_t c_file;
    long hFile;
	char tmp[1024];
	int retVal = 0;

	sprintf(tmp, "%s", dir);
	
    if( (hFile = _findfirst( tmp, &c_file )) == -1L )
		return retVal;

	else{
		sprintf(tmp, "%s\\%s", dir, c_file.name);
		fileList.push_back(tmp);
		retVal++;
		while( _findnext( hFile, &c_file ) == 0 ){
			sprintf(tmp, "%s\\%s", dir, c_file.name);
			fileList.push_back(tmp);
			retVal++;
		}
		_findclose( hFile );
	}
	return retVal;
}
//寻找vec文件
int ListVecFiles(char* dir, TStringArray& fileList)
{
    struct _finddata_t c_file;
    long hFile;
	char tmp[1024];
	int retVal = 0;

	sprintf(tmp, "%s\\%s", dir, "*.vec");
	
    /* Find first .c file in current directory */
    if( (hFile = _findfirst( tmp, &c_file )) == -1L ){
		return retVal;
	}
	else{
		sprintf(tmp, "%s\\%s", dir, c_file.name);
		fileList.push_back(tmp);
		retVal++;
		while( _findnext( hFile, &c_file ) == 0 ){
			sprintf(tmp, "%s\\%s", dir, c_file.name);
			fileList.push_back(tmp);
			retVal++;
		}
		_findclose( hFile );
	}
	return retVal;
}

//清字符串结尾
int clear_space ( char *string, int length )
{
  int i;

  for ( i = 0; i < length; i++ )
    if (( string[i] == ' ') || (string[i] == '\0')||(string[i] == '13')||(string[i]=='10'))
      break;
  string[i] = '\0';
  length = i;
  return length;
}

bool DirExist(char *pszDirName)
{
	WIN32_FIND_DATA fileinfo;
    char	_szDir[_MAX_PATH];
    strcpy(_szDir, pszDirName);
    int nLen = strlen(_szDir);
    if( (_szDir[nLen-1] == '\\') || (_szDir[nLen-1] == '/') )
    {
    	_szDir[nLen-1] = '\0';
    }
	HANDLE	hFind = ::FindFirstFile(_szDir, &fileinfo);

	if (hFind == INVALID_HANDLE_VALUE)
	{
		return false;
	}
    if( fileinfo.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY )
    {
    	::FindClose(hFind);
        return true;
    }
    ::FindClose(hFind);
	return false;
}

// 创建目录,包含子目录,可以创建多级子目录
bool CreateDir(char *pszDirName)
{
	int bRet = 0;
    char  _szDir[_MAX_PATH];
    char  _szTmp[_MAX_DIR];
    int  nLen = 0;
    int  idx ;
	if( (DirExist(pszDirName)) == true )
    	return true;
    strcpy(_szDir, pszDirName);
    nLen = strlen(_szDir);
    if( _szDir[nLen-1] == '\\' || _szDir[nLen-1] == '/' )
    {
    	_szDir[nLen-1] = '\0';
    }
    nLen = strlen(_szDir);
    memset(_szTmp, 0, _MAX_DIR);
    char  _str[2];
    for(idx = 0; idx < nLen; idx++)
    {
    	if(_szDir[idx] != '\\' )
        {
        	_str[0] = _szDir[idx];
            _str[1] = 0;
			strcat(_szTmp, _str);
        }
        else
        {
            bRet = ::CreateDirectory(_szTmp, NULL);
            if( bRet )
            {
            	::SetFileAttributes(_szTmp, FILE_ATTRIBUTE_NORMAL);
            }
        	_str[0] = _szDir[idx];
            _str[1] = 0;
			strcat(_szTmp, _str);
        }
        if( idx == nLen-1 )
        {
            bRet = ::CreateDirectory(_szTmp, NULL);
            if( bRet )
            {
            	::SetFileAttributes(_szTmp, FILE_ATTRIBUTE_NORMAL);
            }
        }
    }
	if( DirExist(_szTmp) )
    	return true;
	return false;
}

void get_field ( char *buff, char *str, int *j )
{
	int k;

	k = 0;
	while ( buff[*j] == ' ' )
		(*j)++;
	while ((buff[*j] != ' ' ) ){
		str[k++] = buff[(*j)++];		
	}
	str[k] = '\0';
}

char* GetFileName(const char* fullpath)
{
	char drive[_MAX_DRIVE];
	char dir[_MAX_DIR];
	static char fname[_MAX_FNAME];
	char ext[_MAX_EXT];
	
	_splitpath(fullpath, drive, dir, fname, ext );
	return fname;
}

//加载vec到数组
int LoadVecFiles(TStringArray& fileList, TSampleSetList& sampleSetList)
{
	int retVal = 0;

	for(int i=0; i<fileList.size(); i++){

		FILE* fp = fopen(fileList[i].c_str(), "rb");
		if(fp!=NULL){
			ASampleSet	aset;
			int size = fread(aset.tags, sizeof(TSoundTag),401, fp);
			if(size<=0){
				fclose(fp);
			 	break;
			}
			strcpy(aset.name, fileList[i].c_str());
				sampleSetList.push_back(aset);
			       retVal++;
					   fclose(fp);
		}
		else
			break;
	}
		return retVal;
}

void WriteInfoLog(char *msg)
{
	static short LastDay=0;
    FILE *fg;
	short CurDay;
	SYSTEMTIME date;
	char filename[40];
	static HANDLE hSemLog=NULL;

    if ( hSemLog==NULL ) {
		      if ( (hSemLog=CreateSemaphore(NULL,1,1,NULL)) == NULL ) {
			       printf("CreateSemaphore error.code=%d\n",GetLastError() );
			       return;
			  }
		  }

    while( WaitForSingleObject(hSemLog,10000)==WAIT_TIMEOUT ) 
		printf("--Alarm wait hSemLog Timeout\n");

		GetLocalTime(&date);
		CurDay = date.wDay;
    
	char vec[30]="d:\\Shvoice\\log";

	if(!DirExist(vec))
		if(!CreateDir(vec)){
				  printf("对不起,样本目录创建不成功!\n");
				  return;
		}

	sprintf(filename,"d:\\Shvoice\\log\\%02d.log",CurDay);

	if ( CurDay!=LastDay && LastDay!=0) {
		LastDay = CurDay;		
		DeleteFile(filename);
	}

	if ( (fg=fopen(filename,"at")) == NULL) {
		printf("Error:open file=%s error.\n",filename);
//		fclose(fg);
		ReleaseSemaphore(hSemLog,1,NULL);
		return;
	}
	
    fprintf(fg,"%02d:%02d:%02d %s\n",
		    date.wHour,date.wMinute,date.wSecond,msg);
	fclose(fg);
	ReleaseSemaphore(hSemLog,1,NULL);
}

typedef struct tagMATCHRESULT
{
	unsigned char	ucScore;
	DWORD			dwMatchOffset;
} MATCHRESULT;

int sudxMatch(TSoundTag* pSrcVec,				//待识别信号源向量的首地址指针
					 int nSrcLen,                       //信号源向量的长度(以TSoundTag为计量单位)
					 TSoundTag* pSampleVec,             //样本向量的首地址指针
					 int nSampleLen,                    //样本向量的个数                       
					 BOOL bMode,                        //模式。=TRUE:快速模式;=FALSE:准确模式
					 int* pnMaxMatch,                   //输出匹配结果个数
					 MATCHRESULT* pMatchResult)        //输出匹配结果(得分、偏移量)
{
	int tailLen;
	if(bMode==TRUE){	
		if(nSampleLen<64)	
			return 0;
		else
			tailLen = 64;
	}
	else{
		if(nSampleLen<300)	
			return 0;	
		else
			tailLen = 300;
	}

	int matchCount = 0;
	for(int i=0; i<nSrcLen-tailLen && matchCount<100; i++){
		int score;
		if(sudxCompareEx(pSrcVec+i, pSampleVec, bMode, &score)){
			pMatchResult[matchCount].ucScore = score;
			pMatchResult[matchCount].dwMatchOffset = i;
			i+=3;
			matchCount++;
		}
	}
	return matchCount ? TRUE : FALSE;
}

void main(void)
{
	int i;
	HANDLE hThread;

⌨️ 快捷键说明

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