📄 dhmm_recog_mfc.cpp
字号:
// DHMM_RECOG_MFC.cpp:
// Implementation of the DHMM_RECOG_MFC Module.
// That is to compute Max_likelihood or Max_Output_Probably.
//
// Created 2001/08, By DongMing, MDSR.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "DHMM_Recog_MFC.h"
#include "kwspot.h"
#include "DHMM_Model_MFC.h"
#include "DAT_File_Access.h"
#include "DHMM_VQ_MFC.h"
#include "DHMM_GL.h"
#include "DHMM_LHS.h"
#include "DHMM_HQ.h"
extern PRO_CONFIG u_Pro_Config;
//////////////////////////////////////////////////////////////////////
// API functions
int DHMM_Recog_Kitty(void)
{
u_Pro_Config.l_DHMM_Recog_Config_Set = RECOG_CONFIG_DHMM_RECOG_TRAINSET;
PRO_LOG("\tRecognition using Train Set...\n");
//DHMM_Recog_One_Set();
RESULT_LOG("\n--------Train Set. Accuracy Rate\t%d\t\t\t%8.4f\n", u_Pro_Config.n_DHMM_Model_Person_Start_Index, u_Pro_Config.d_Recognition_Accurate_Rate);
u_Pro_Config.l_DHMM_Recog_Config_Set = RECOG_CONFIG_DHMM_RECOG_TESTSET;
PRO_LOG("\tRecognition using Test Set...\n");
DHMM_Recog_One_Set();
RESULT_LOG("\n--------Test Set. Accuracy Rate\t%d\t\t\t%8.4f\n", u_Pro_Config.n_DHMM_Model_Person_Start_Index, u_Pro_Config.d_Recognition_Accurate_Rate);
return 0;
}
int DHMM_Recog_One_Set(void)
{
int n_Recog_Result, n_True_Result;
char sz_Feature_File_Name[256];
int n_Recog_Result_Good_Count = 0, n_Recog_Result_Bad_Count = 0;
int n_Person_Index, n_Word_Sample_Index;
int Total_Model_Num;
Total_Model_Num =u_Pro_Config.n_DHMM_Model_Num;
double* pd_DHMM_Model_Probably;
pd_DHMM_Model_Probably = new double[Total_Model_Num];
ASSERT(pd_DHMM_Model_Probably);
DYNA_2DIM_INT_ARRAY d2dna_Recog_Table = d2dna_New(u_Pro_Config.n_DHMM_Model_Num, Total_Model_Num);
for (int n_Sentence_Index = 0; n_Sentence_Index < u_Pro_Config.n_DHMM_Model_Num; n_Sentence_Index++)
for (int nTmp = 0; nTmp < Total_Model_Num; nTmp++)
d2dna_Recog_Table[n_Sentence_Index][nTmp] = 0;
// 对所有测试集的人进行循环
for (n_Person_Index = 0; n_Person_Index < u_Pro_Config.n_Recog_Person_Num; n_Person_Index++)//u_Pro_Config.n_Recog_Person_Num; n_Person_Index++)
{
// 判断是否测试集中的人,不是则跳出此轮循环
if(u_Pro_Config.l_DHMM_Recog_Config_Set == RECOG_CONFIG_DHMM_RECOG_TRAINSET)
{
if (u_Pro_Config.n_Recog_Person_Start_Index <= u_Pro_Config.n_Recog_Person_End_Index)
{
if (!((n_Person_Index < u_Pro_Config.n_Recog_Person_Start_Index) || (n_Person_Index > u_Pro_Config.n_Recog_Person_End_Index))) continue;
}
else
{
if (!((n_Person_Index > u_Pro_Config.n_Recog_Person_End_Index) && (n_Person_Index < u_Pro_Config.n_Recog_Person_Start_Index))) continue;
}
}
else if(u_Pro_Config.l_DHMM_Recog_Config_Set == RECOG_CONFIG_DHMM_RECOG_TESTSET)
{
if (u_Pro_Config.n_Recog_Person_Start_Index <= u_Pro_Config.n_Recog_Person_End_Index)
{
if ((n_Person_Index < u_Pro_Config.n_Recog_Person_Start_Index) || (n_Person_Index > u_Pro_Config.n_Recog_Person_End_Index)) continue;
}
else
{
if ((n_Person_Index > u_Pro_Config.n_Recog_Person_End_Index) && (n_Person_Index < u_Pro_Config.n_Recog_Person_Start_Index)) continue;
}
}
// 对每个人的每个词,进行一次识别测试
sprintf(sz_Feature_File_Name, u_Pro_Config.sz_Recog_Origin_File_Name_Format, n_Person_Index);
for (n_Word_Sample_Index = 0; n_Word_Sample_Index < u_Pro_Config.n_Recog_Sentence_Num; n_Word_Sample_Index++)
{
int Sen_Index = n_Word_Sample_Index + u_Pro_Config.n_Sentence_Start_Index;
n_Recog_Result = DHMM_Recog_Basic(sz_Feature_File_Name, Sen_Index, pd_DHMM_Model_Probably);
n_True_Result = n_Word_Sample_Index % WORD_ITEM_NUM;
if (u_Pro_Config.WATCH_RECOG_RESULT == 1)
{
DHMM_LLS_Ret(pd_DHMM_Model_Probably, Total_Model_Num, n_True_Result, n_Recog_Result);
}
// 统计识别正确性
d2dna_Recog_Table[n_True_Result][n_Recog_Result]++;
if (n_Recog_Result == n_True_Result)
n_Recog_Result_Good_Count++;
else
{
n_Recog_Result_Bad_Count++;
}
}
PRO_LOG("\tNumber:%4d person, recognition %4d right!\r", n_Person_Index, n_Recog_Result_Good_Count);
}
// 计算识别率
u_Pro_Config.d_Recognition_Accurate_Rate = n_Recog_Result_Good_Count / double(n_Recog_Result_Good_Count + n_Recog_Result_Bad_Count) * 100;
PRO_LOG("\nAccurate Rate = %d / %d = %10.4f%%.\n", n_Recog_Result_Good_Count, (n_Recog_Result_Good_Count + n_Recog_Result_Bad_Count), u_Pro_Config.d_Recognition_Accurate_Rate);
/**/
PRO_LOG(" Recognition Table:\n");
PRO_LOG("\t");
for (int nTmp = 0; nTmp < Total_Model_Num; nTmp++)
PRO_LOG("%2d ", nTmp);
PRO_LOG("\n");
PRO_LOG("\t-------------------------------------------\n");
for (n_Sentence_Index = 0; n_Sentence_Index < u_Pro_Config.n_DHMM_Model_Num; n_Sentence_Index++)
{
PRO_LOG("\t");
for (nTmp = 0; nTmp < Total_Model_Num; nTmp++)
PRO_LOG("%2d ", d2dna_Recog_Table[n_Sentence_Index][nTmp]);
PRO_LOG("\n");
}
PRO_LOG("\n");
d2dna_Free(d2dna_Recog_Table, u_Pro_Config.n_DHMM_Model_Num, Total_Model_Num);
delete[] pd_DHMM_Model_Probably;
return 0;
}
int DHMM_LLS_Ret(double* pd_DHMM_Model_Probably, const int Total_Model_Num, const int n_True_Result, const int n_Recog_Result)
{
char RetFile[100];
strcpy(RetFile,"..\\..\\data\\Recog_Ret\\Kitty_Recog_LLS_Ret.txt");
FILE* fp;
fp = fopen(RetFile,"a+");
ASSERT(fp!=NULL);
for (int n_Model_Index = 0; n_Model_Index < Total_Model_Num; n_Model_Index++)
{
fprintf(fp, "%7.0f, ", pd_DHMM_Model_Probably[n_Model_Index]);
}
fprintf(fp, " %2d ", n_Recog_Result);
fprintf(fp, "%2d ", n_True_Result);
fclose(fp);
return 0;
}
//////////////////////////////////////////////////////////////////////
// 函数名称:DHMM_Recog_Basic
// 函数功能:基本识别(一次识别)
// 函数性质:API
// 输入参数:
// sz_Feature_File_Name,待识别说话人的特征文件名
// n_Word_Sample_Index,待识别词条标号
// 输出参数:
// 无
// 返回值:
// 识别结果
// 备注:仅仅使用Viterbi或前后向,比较似然分数
int DHMM_Recog_Basic(char * sz_Feature_File_Name, int n_Word_Sample_Index, double* pd_DHMM_Model_Probably)
{
int nRetCode;
DYNA_2DIM_DOUBLE_ARRAY d2dda_Code_Book;
DHMM_MODEL * pu_DHMM_Model;
WORD_SAMPLE u_Word_Sample;
//double * pd_DHMM_Model_Probably;
DYNA_2DIM_INT_ARRAY d2dna_DHMM_Model_Sequence;
int n_Model_Index;
int n_Recog_Result;
double d_Recog_Result_Probably;
static int n_file_count = 0;
int Total_Model_Num;
Total_Model_Num =u_Pro_Config.n_DHMM_Model_Num;
// 读入码书
d2dda_Code_Book = d2dda_New(u_Pro_Config.n_VQ_Code_Book_Size, u_Pro_Config.n_Feature_Dim);
ASSERT(d2dda_Code_Book != NULL);
nRetCode = DHMM_VQ_Load_Code_Book_File(u_Pro_Config.sz_Toload_Code_Book_File_Name,
d2dda_Code_Book, u_Pro_Config.n_VQ_Code_Book_Size, u_Pro_Config.n_Feature_Dim);
ASSERT(nRetCode == 0);
if ((u_Pro_Config.l_DHMM_Model_Config & MODEL_CONFIG_GENERATE_DHMM_MODEL_MASK) == (MODEL_CONFIG_TRAIN_WITH_SILENCE_MODEL))
u_Pro_Config.n_DHMM_Model_State_Num += 2;
else if((u_Pro_Config.l_DHMM_Model_Config & MODEL_CONFIG_GENERATE_DHMM_MODEL_MASK) == MODEL_CONFIG_LOAD_WITH_SILENCE_MODEL)
u_Pro_Config.n_DHMM_Model_State_Num += 2;
// 为各个词条的模型准备内存,并读入模型
pu_DHMM_Model = new DHMM_MODEL[Total_Model_Num];
ASSERT(pu_DHMM_Model);
for (n_Model_Index = 0; n_Model_Index < Total_Model_Num; n_Model_Index++)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -