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

📄 dhmm_vq_mfc.cpp

📁 语音识别配套的VQ及DHMM模型训练程序(C语言)
💻 CPP
📖 第 1 页 / 共 2 页
字号:
//	函数名称:DHMM_VQ_Encode_A_Word_Sample
//	函数功能:将一个词的所有帧特征进行VQ编码
//	函数性质:API
//	输入参数:
//		d2dda_Code_Book,存放码书
//		n_Code_Book_Size,码书大小
//		n_Code_Word_Dim,特征维数
//		pu_Word_Sample->d2dda_Feature_Sequence,待VQ的词每帧特征
//	输出参数:
//		pu_Word_Sample->pn_VQed_Feature_Sequence,VQ后的词每帧特征
//	返回值:
//		0 表示成功
//	备注:
int DHMM_VQ_Encode_A_Word_Sample(DYNA_2DIM_DOUBLE_ARRAY d2dda_Code_Book, int n_Code_Book_Size, int n_Code_Word_Dim,
								 WORD_SAMPLE * pu_Word_Sample)
{
	int n_Word_Sample_Frame_Index;

	ASSERT(n_Code_Word_Dim == pu_Word_Sample->n_Feature_Dim);
	for (n_Word_Sample_Frame_Index = 0; n_Word_Sample_Frame_Index < pu_Word_Sample->n_Feature_Sequence_Len; n_Word_Sample_Frame_Index++)
	{
		pu_Word_Sample->pn_VQed_Feature_Sequence[n_Word_Sample_Frame_Index] = 
			DHMM_VQ_Encode_A_Code_Word(d2dda_Code_Book, n_Code_Book_Size, n_Code_Word_Dim,
				pu_Word_Sample->d2dda_Feature_Sequence[n_Word_Sample_Frame_Index]);
	}

	return 0;
}

//////////////////////////////////////////////////////////////////////
//	函数名称:DHMM_VQ_Encode_A_Code_Word
//	函数功能:将一个词的一帧特征进行VQ编码
//	函数性质:Private
//	输入参数:
//		d2dda_Code_Book,存放码书
//		n_Code_Book_Size,码书大小
//		n_Code_Word_Dim,特征维数
//		pd_Code_Word,待VQ的一帧特征
//	输出参数:
//		无
//	返回值:
//		VQ后的一帧特征
//	备注:
static int DHMM_VQ_Encode_A_Code_Word(DYNA_2DIM_DOUBLE_ARRAY d2dda_Code_Book, int n_Code_Book_Size, int n_Code_Word_Dim,
							   double * pd_Code_Word)
{
	int n_VQ_Result;
	double d_VQ_Result_Distance;
	int n_Code_Book_Word_Index, n_Code_Word_Dim_Index;
	double dTmp;
	double dSqr;

	n_VQ_Result = -1;
	d_VQ_Result_Distance = MAX_DOUBLE_VALUE;
	
	for (n_Code_Book_Word_Index = 0; n_Code_Book_Word_Index < n_Code_Book_Size; n_Code_Book_Word_Index++)
	{
		dTmp = 0.0F;
		
		for (n_Code_Word_Dim_Index = 0; n_Code_Word_Dim_Index < n_Code_Word_Dim; n_Code_Word_Dim_Index++)
		{
			dSqr = (pd_Code_Word[n_Code_Word_Dim_Index] - d2dda_Code_Book[n_Code_Book_Word_Index][n_Code_Word_Dim_Index])*32768/4;
			dTmp += dSqr * dSqr / 2;
		}
		if (dTmp < d_VQ_Result_Distance)
		{
			n_VQ_Result = n_Code_Book_Word_Index;
			d_VQ_Result_Distance = dTmp;
		}
	}

	return(n_VQ_Result);
}


int DHMM_VQ_To_519_CodeBook(void)
{
	int nRetCode;
	DYNA_2DIM_DOUBLE_ARRAY d2dda_Code_Book;
	int n_Code_Word_Index;

	int n_Code_Book_Size = u_Pro_Config.n_VQ_Code_Book_Size;
	int n_Code_Word_Dim = u_Pro_Config.n_Feature_Dim;

	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);

	CString Code_Book_txt = u_Pro_Config.sz_Toload_Code_Book_File_Name;
	Code_Book_txt.Replace(".DAT","519.dat");
	FILE *fp_Code_Book_File = fopen(Code_Book_txt,"wb");
	// added by wangxia
	FILE *fp_Code_Book_TXT_File = fopen("..//..//data//codeTXT.dat","wb+");
	FILE *fp_Code_Book_BIN_File = fopen("..//..//data//codeBIN.dat","wb+");
	ASSERT(fp_Code_Book_File != NULL);

	short data;
	float f_data;

	for (n_Code_Word_Index = 0; n_Code_Word_Index < n_Code_Book_Size; n_Code_Word_Index++)
	{
		for(int dim = 0 ; dim < n_Code_Word_Dim; dim++)
		{
			f_data = ((d2dda_Code_Book[n_Code_Word_Index][dim]) * 32768L/4/* + 0.5F*/);
			ASSERT((f_data >= short(MIN_SHORT_VALUE)) && (f_data <= MAX_SHORT_VALUE));
			data = (short)f_data;
            fwrite(&data, sizeof(short), 1, fp_Code_Book_File);
			fprintf(fp_Code_Book_TXT_File, "%d,",data);
			fwrite(&data, sizeof(short), 1, fp_Code_Book_BIN_File);
		}
	}

	d2dda_Free(d2dda_Code_Book, u_Pro_Config.n_VQ_Code_Book_Size, u_Pro_Config.n_Feature_Dim);
	fclose(fp_Code_Book_File);
	fclose(fp_Code_Book_TXT_File);
	fclose(fp_Code_Book_BIN_File);
	return 0;
}

//////////////////////////////////////////////////////////////////////
//	函数名称:DHMM_VQ_Load_All_Feature
//	函数功能:从语料库中读取全部的特征
//	函数性质:API
//	输入参数:
//		无
//	输出参数:
//		pd2dda_Total_Feature,存放读出的特征
//		pn_Total_Feature_Num,存放读出的总的特征数
//	返回值:
//		0 表示成功
//	备注:
//		!!!!!该函数的内存分配策略特别,
//		返回的存储全部码字的数组,由callee分配内存,因此,caller必须负责释放!!!!!
//		特征文件的文件名格式在u_Pro_Config.sz_Feature_Origin_File_Name_Format指出,
//		语料库人数在u_Pro_Config.n_Feature_Person_Num指出
int DHMM_VQ_Load_All_Feature(DYNA_2DIM_DOUBLE_ARRAY * pd2dda_Total_Feature, long * pn_Total_Feature_Num)
{
	int nRetCode;
	char sz_Feature_File_Name[256];
	char sz_Silence_File_Name[256];
	FEATURE_FILE_HEAD u_Feature_File_Head;
	long n_Total_Frame_Num;
	DYNA_2DIM_DOUBLE_ARRAY d2dda_All_Feature;
	int n_Person_Index, n_Sentence_Index, n_Total_Frame_Index;

	//	统计所有语料库的总特征数目
	n_Total_Frame_Num = 0;
	for (n_Person_Index = 0; n_Person_Index < u_Pro_Config.n_Feature_Person_Num; n_Person_Index++)
	{
		//	如果只用训练集的特征训练VQ码本,则跳过统计测试集特征
		if ((u_Pro_Config.l_VQ_Config & VQ_CONFIG_LOAD_ALL_FEATURE_METHOD_MASK) == VQ_CONFIG_LOAD_TRAIN_SET_ONLY)
		{
			if (u_Pro_Config.n_DHMM_Model_Person_Start_Index <= u_Pro_Config.n_DHMM_Model_Person_End_Index)
			{
				if ((n_Person_Index < u_Pro_Config.n_DHMM_Model_Person_Start_Index) || (n_Person_Index > u_Pro_Config.n_DHMM_Model_Person_End_Index)) continue;
			}
			else
			{
				if ((n_Person_Index > u_Pro_Config.n_DHMM_Model_Person_End_Index) && (n_Person_Index < u_Pro_Config.n_DHMM_Model_Person_Start_Index)) continue;
			}
		}
		else if ((u_Pro_Config.l_VQ_Config & VQ_CONFIG_LOAD_ALL_FEATURE_METHOD_MASK) == VQ_CONFIG_LOAD_ALL_FEATURE)
		{}

		sprintf(sz_Feature_File_Name, u_Pro_Config.sz_Feature_Origin_File_Name_Format, n_Person_Index);
		nRetCode = dfa_Feature_Get_File_Info(sz_Feature_File_Name, &u_Feature_File_Head);
		ASSERT(nRetCode == 0);
		//ASSERT((u_Feature_File_Head.sSentenceNum == u_Feature_File_Head.sSentenceNum2) && (u_Feature_File_Head.sSentenceNum == u_Pro_Config.n_Feature_Sentence_Num));		ASSERT(u_Feature_File_Head.sFeatureOrder == u_Pro_Config.n_Feature_Dim);
		n_Total_Frame_Num += dfa_Feature_Get_File_Total_Frame_Num(sz_Feature_File_Name, u_Pro_Config.n_Feature_Sentence_Num, u_Pro_Config.n_Sentence_Start_Index);
		if (u_Pro_Config.USE_SILENCE_FEA == 1)
		{
			strcpy(sz_Silence_File_Name, sz_Feature_File_Name);
			int j = strlen(sz_Silence_File_Name) - 4;
			sz_Silence_File_Name[j] = '\0';
			strcat(sz_Silence_File_Name,"_sl.dat");
			nRetCode = dfa_Feature_Get_File_Info(sz_Silence_File_Name, &u_Feature_File_Head);
			ASSERT(nRetCode == 0);
			ASSERT(u_Feature_File_Head.sFeatureOrder == u_Pro_Config.n_Feature_Dim);
			n_Total_Frame_Num += dfa_Feature_Get_Silence_Total_Frame_Num(sz_Silence_File_Name, u_Pro_Config.n_Feature_Sentence_Num, u_Pro_Config.n_Sentence_Start_Index);
		}
	}

	//	为存放所有特征分配内存
	d2dda_All_Feature = d2dda_New(n_Total_Frame_Num, u_Pro_Config.n_Feature_Dim);

	//	读入所有特征
	n_Total_Frame_Index = 0;
	for (n_Person_Index = 0; n_Person_Index < u_Pro_Config.n_Feature_Person_Num; n_Person_Index++)
	{
		//	如果只用训练集的特征训练VQ码本,则跳过读取测试集特征
		if ((u_Pro_Config.l_VQ_Config & VQ_CONFIG_LOAD_ALL_FEATURE_METHOD_MASK) == VQ_CONFIG_LOAD_TRAIN_SET_ONLY)
		{
			if (u_Pro_Config.n_DHMM_Model_Person_Start_Index <= u_Pro_Config.n_DHMM_Model_Person_End_Index)
			{
				if ((n_Person_Index < u_Pro_Config.n_DHMM_Model_Person_Start_Index) || (n_Person_Index > u_Pro_Config.n_DHMM_Model_Person_End_Index)) continue;
			}
			else
			{
				if ((n_Person_Index > u_Pro_Config.n_DHMM_Model_Person_End_Index) && (n_Person_Index < u_Pro_Config.n_DHMM_Model_Person_Start_Index)) continue;
			}
		}
		else if ((u_Pro_Config.l_VQ_Config & VQ_CONFIG_LOAD_ALL_FEATURE_METHOD_MASK) == VQ_CONFIG_LOAD_ALL_FEATURE)
		{}

		sprintf(sz_Feature_File_Name, u_Pro_Config.sz_Feature_Origin_File_Name_Format, n_Person_Index);
		for(n_Sentence_Index = 0; n_Sentence_Index < u_Pro_Config.n_Feature_Sentence_Num; n_Sentence_Index++)
		{
			int Sen_Index = n_Sentence_Index + u_Pro_Config.n_Sentence_Start_Index;
			int framenum = dfa_Feature_Read_A_Sentence(sz_Feature_File_Name, Sen_Index, u_Pro_Config.n_Feature_Dim, &d2dda_All_Feature[n_Total_Frame_Index]);
			ASSERT(framenum >= 0);
			n_Total_Frame_Index += framenum;
			if (u_Pro_Config.USE_SILENCE_FEA == 1)
			{
				strcpy(sz_Silence_File_Name, sz_Feature_File_Name);
				int j = strlen(sz_Silence_File_Name) - 4;
				sz_Silence_File_Name[j] = '\0';
				strcat(sz_Silence_File_Name,"_sl.dat");
				framenum = dfa_Feature_Read_A_Silence(sz_Silence_File_Name, Sen_Index, u_Pro_Config.n_Feature_Dim, &d2dda_All_Feature[n_Total_Frame_Index]);
				ASSERT(framenum >= 0);
				n_Total_Frame_Index += framenum;
			}
		}

	}
	ASSERT(n_Total_Frame_Index == n_Total_Frame_Num);

	*pd2dda_Total_Feature = d2dda_All_Feature;
	*pn_Total_Feature_Num = n_Total_Frame_Num;

	return 0;
}

⌨️ 快捷键说明

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