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

📄 dhmm_recog_mfc.cpp

📁 语音识别配套的VQ及DHMM模型训练程序(C语言)
💻 CPP
📖 第 1 页 / 共 2 页
字号:
//	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 + -