📄 shvoice.cpp
字号:
#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 + -