www.pudn.com > VRecognize.rar > VRecognize.cpp
// Test.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include "dllSudx.h" typedef vectorTStringArray; struct ASampleSet { char name[256]; TSoundTag tags[301]; }; typedef vector TSampleSetList; TStringArray sampleList; TSampleSetList sampleSetList; int vector_count = 0; int ListWavFiles(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; } 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 LoadVecFiles(TStringArray& fileList, TSampleSetList& sampleSetList) { int retVal = 0; for(int i=0; i <样本目录> <音量标志>\n"); printf("\t声音文件名是要被识别的声音文件,样本目录中包含已经预先处理好的样本\n" "\t 音量标志: 表示识别时是否采用音量相关的方式,为0表示识别时不管音量大小,为1表示识别时需要考虑音量大小\n" "Press any key continue..."); getch(); return -1; }*/ //int volFlag = atol(argv[3]); if(bVolumeFlag) { sudxSetCompVolumeFlag(TRUE); printf("采用与音量相关的方式比较\n"); } else { sudxSetCompVolumeFlag(FALSE); printf("采用与音量无关的方式比较\n"); } TStringArray sampleList; int i = ListVecFiles(vecDirectory, sampleList); if(i<=0) { printf("No sample files in dir [%s]\n", vecDirectory); return -2; } TSampleSetList sampleSetList; int vector_count = LoadVecFiles(sampleList, sampleSetList); if(vector_count<=0) { printf("没有找到样本集合文件\n"); return -3; } printf("Now start...\n"); const int bufSampleSize = 49306; ////充值成功,你的账户余额为的 8k采样,8位长度编码的语音文件大小 unsigned char * p8bitBuf = new unsigned char[ bufSampleSize]; short *pFileBuf = new short[bufSampleSize*2]; //每次处理2M个16bit pcm样本,也就是4M byte数据。 // char outFile[1000]; // sprintf(outFile, "%s\\%s.vec", "c:", VoiceName); // FILE* fout = fopen(outFile, "w+b"); //打开或创建向量文件 FILE *fp = fopen(VoiceName, "rb"); fseek(fp, 0L, SEEK_END); long size = ftell(fp); fseek(fp, 44L, SEEK_SET); //跳过wav头 int old_clock = clock(); // long segSize = fread(p8bitBuf, sizeof(char), bufSampleSize, fp); //alaw2linear( p8bitBuf , bufSampleSize , pFileBuf ); long segSize = fread(pFileBuf, sizeof(short), bufSampleSize, fp); TSoundTag* pOut; int outSize, tailSize; short* pTail=NULL; int last_result[17]; int iMax = sudxGetMaxInputSampleSize(); int error = sudxCalcBuffer( pFileBuf, segSize, &pOut, &outSize, &pTail, &tailSize, last_result); if ( error > 0 ) { if ( outSize > (64 + 1 )) { old_clock = clock(); int compare_turn = outSize - 64 - 1; for(i=0; i 300) { if(sudxCompare(pOut+1+i, sampleSetList[j].tags+1, TRUE)) printf("精确匹配位置 %d, file[%s]\n", (i+1)*128, sampleSetList[j].name); else printf("!!Slow Not Match at sample pos %d, file[%s]\n", (i+1)*128, sampleSetList[j].name); } } else { printf("Not Match at sample pos %d, file [%s]\n", (i+1)*128, sampleSetList[j].name); } } } int time_passed = clock()-old_clock; printf("计算结束, 耗时%d ms\n", time_passed); printf("比较速度为每秒钟可查找%f秒音乐\n", double(compare_turn)*128.0/8000.0/(double(time_passed)/1000.0)); } else { printf("输入的声音过短,不能比较\n"); return -2; } } else { return -1; } return 0; } int VRecoInit(char * vecDirectory ) { int i = ListVecFiles(vecDirectory, sampleList); if(i<=0) { printf("No sample files in dir [%s]\n", vecDirectory); return -2; } vector_count = LoadVecFiles(sampleList, sampleSetList); if(vector_count<=0) { printf("没有找到样本集合文件\n"); return -3; } return 0; } /// int VRecognize(char *VoiceName, char* vecDirectory , bool bVolumeFlag, int * iMatchCount) { /*if(argc!=4) { printf("参数错误\n"); printf("使用方法:test <声音文件名> <样本目录> <音量标志>\n"); printf("\t声音文件名是要被识别的声音文件,样本目录中包含已经预先处理好的样本\n" "\t 音量标志: 表示识别时是否采用音量相关的方式,为0表示识别时不管音量大小,为1表示识别时需要考虑音量大小\n" "Press any key continue..."); getch(); return -1; }*/ //int volFlag = atol(argv[3]); if(bVolumeFlag) { sudxSetCompVolumeFlag(TRUE); printf("采用与音量相关的方式比较\n"); } else { sudxSetCompVolumeFlag(FALSE); printf("采用与音量无关的方式比较\n"); } char gcaMsg[1000]; sprintf(gcaMsg , "Now start...%s\n", VoiceName); printf( gcaMsg ); fflush(stdout); const int bufSampleSize = 2048*1024; ////充值成功,你的账户余额为的 8k采样,8位长度编码的语音文件大小 unsigned char * p8bitBuf = new unsigned char[ bufSampleSize]; short *pFileBuf = new short[bufSampleSize]; //每次处理2M个16bit pcm样本,也就是4M byte数据。 // char outFile[1000]; // sprintf(outFile, "%s\\%s.vec", "c:", VoiceName); // FILE* fout = fopen(outFile, "w+b"); //打开或创建向量文件 try { sprintf(gcaMsg , "bf fopen...%s\n", VoiceName); printf( gcaMsg ); fflush(stdout); FILE *fp = fopen(VoiceName, "rb"); fseek(fp, 0L, SEEK_END); long size = ftell(fp); fseek(fp, 44L, SEEK_SET); //跳过wav头 sprintf(gcaMsg , "af fopen...%s\n", VoiceName); printf( gcaMsg ); fflush(stdout); int old_clock = clock(); long segSize = fread(p8bitBuf, sizeof(char), bufSampleSize, fp); alaw2linear( p8bitBuf , bufSampleSize , pFileBuf ); sprintf(gcaMsg , "Af alaw2linear...%s\n", VoiceName); printf( gcaMsg ); fflush(stdout); // long segSize = fread(pFileBuf, sizeof(short), bufSampleSize, fp); TSoundTag* pOut; int outSize, tailSize; short* pTail=NULL; int last_result[17]; //int iMax = sudxGetMaxInputSampleSize(); int error = sudxCalcBuffer( pFileBuf, segSize, &pOut, &outSize, &pTail, &tailSize, last_result); if ( error > 0 ) { sprintf(gcaMsg , "Af sudxCalcBuffer...%s\n", VoiceName); printf( gcaMsg ); fflush(stdout); if ( outSize > (64 + 1 )) { old_clock = clock(); int compare_turn = outSize - 64 - 1; for(int i=0; i 300) { if(sudxCompare(pOut+1+i, sampleSetList[j].tags+1, TRUE)) { (* iMatchCount) ++; printf("精确匹配位置 %d, file[%s]\n", (i+1)*128, sampleSetList[j].name); } else { // printf("!!Slow Not Match at sample pos %d, file[%s]\n", (i+1)*128, sampleSetList[j].name); } } } } } int time_passed = clock()-old_clock; printf("计算结束, 耗时%d ms Match Count =%d\n", time_passed,(* iMatchCount) ); printf("比较速度为每秒钟可查找%f秒音乐\n", double(compare_turn)*128.0/8000.0/(double(time_passed)/1000.0)); fflush( stdout ); } else { printf("输入的声音过短,不能比较\n"); return -2; } } else { sprintf(gcaMsg , "Now Fail ...%s\n return -1", "CalcBuffer"); printf( gcaMsg ); fflush(stdout); return -1; } } catch ( ... ) { sprintf(gcaMsg , "Now Fail ...%s\n return -3", "Catch"); printf( gcaMsg ); fflush(stdout); return -3; } return 0; }