www.pudn.com > hmmPlatform.rar > DemoHMMDlg.cpp


// DemoHMMDlg.cpp : 实现文件 
// 
 
#include "stdafx.h" 
#include "Platform.h" 
#include "DemoHMMDlg.h" 
#include ".\demohmmdlg.h" 
 
 
// CDemoHMMDlg 对话框 
 
IMPLEMENT_DYNAMIC(CDemoHMMDlg, CDialog) 
CDemoHMMDlg::CDemoHMMDlg(CWnd* pParent /*=NULL*/) 
	: CDialog(CDemoHMMDlg::IDD, pParent) 
{ 
	// 设定默认参数 
	this->m_pStrFiles = NULL; 
	this->m_nFileCount = 0; 
	this->m_nCodeNums = 4; 
	this->m_pCodeBook = NULL; 
} 
 
CDemoHMMDlg::~CDemoHMMDlg() 
{ 
	if (this->m_pStrFiles != NULL) 
	{ 
		delete[] this->m_pStrFiles; 
	} 
 
	if (this->m_pCodeBook != NULL) 
	{ 
		delete[] this->m_pCodeBook; 
	} 
} 
 
void CDemoHMMDlg::DoDataExchange(CDataExchange* pDX) 
{ 
	CDialog::DoDataExchange(pDX); 
} 
 
 
BEGIN_MESSAGE_MAP(CDemoHMMDlg, CDialog) 
	ON_BN_CLICKED(IDC_BTN_OPENFILE, OnBnClickedBtnOpenfile) 
	ON_BN_CLICKED(IDC_BTN_OPENFILE2, OnBnClickedBtnOpenfile2) 
	ON_BN_CLICKED(IDC_BTN_VQ, OnBnClickedBtnVq) 
	ON_BN_CLICKED(IDC_BTN_VITERBI, OnBnClickedBtnViterbi) 
	ON_BN_CLICKED(IDC_BTN_BTW, OnBnClickedBtnBtw) 
END_MESSAGE_MAP() 
 
 
// CDemoHMMDlg 消息处理程序 
////////////////////////////////////////////////////////////////////////// 
// 打开识别文件 
void CDemoHMMDlg::OnBnClickedBtnOpenfile() 
{ 
	// TODO: 在此添加控件通知处理程序代码 
	CFileDialog dlg(TRUE, "*.*", NULL, OFN_ALLOWMULTISELECT); 
	CString* pStrFiles = NULL; 
	unsigned int nFileNums = 0; 
	POSITION pos; 
	// 模板文件名显示在text框中 
	CString strList; 
	// 当前正在访问的文件名下标 
	unsigned int nIndex = 0; 
 
	if (dlg.DoModal() == IDOK) 
	{ 
		if (this->m_pStrFiles != NULL) 
		{ 
			delete[] this->m_pStrFiles; 
			this->m_pStrFiles = NULL; 
		} 
 
		// 计算文件数量 
		pos = dlg.GetStartPosition(); 
		this->m_nFileCount = 0; 
 
		while(pos != NULL) 
		{ 
			this->m_nFileCount++; 
 
			dlg.GetNextPathName(pos); 
		} 
 
		// 保存文件路径 
		this->m_pStrFiles = new CString[this->m_nFileCount]; 
		pos = dlg.GetStartPosition(); 
		nIndex = 0; 
 
		while(pos != NULL) 
		{ 
			this->m_pStrFiles[nIndex] = dlg.GetNextPathName(pos); 
			strList += this->m_pStrFiles[nIndex] + "\r\n"; 
 
			nIndex++; 
		} 
 
		// 显示模板文件列表 
		CWnd::SetDlgItemText(IDC_EDIT_RESULT, strList); 
	} 
} 
 
void CDemoHMMDlg::OnBnClickedBtnOpenfile2() 
{ 
	// TODO: 在此添加控件通知处理程序代码] 
	CFileDialog dlg(TRUE); 
	WAVEHDR waveHdr; 
	waveHdr.lpData = NULL; 
	// 原始裸音频数据 
	double* pRawData = NULL; 
	// 端点检测后的数据 
	double* pSection = NULL; 
	// 倒谱数据 
	double* pCepstrum = NULL; 
	unsigned int nDataLen = 0; 
	unsigned int nFrameSize = 256; 
 
	if (dlg.DoModal() == IDOK) 
	{ 
		// 显示WAVE文件路径 
		CWnd::SetDlgItemText(IDC_STATIC_WAVEFILE, "待识别文件:" + dlg.GetPathName()); 
 
		// 计算WAVE文件码本 
		// 初始化码本 
		if (this->m_pCodeBook == NULL) 
		{ 
			this->m_pCodeBook = new double[this->m_nCodeNums]; 
		} 
 
		// 打开所训练文件 
		if (this->m_waveOut.LoadFile(dlg.GetPathName(), (DWORD) CWnd::GetSafeHwnd())) 
		{ 
			// 获取原始数据 
			this->m_waveOut.GetSamples(&waveHdr, 0); 
 
			if (waveHdr.lpData != NULL) 
			{ 
				// 获取原始数据 
				// 进行8位数据的转换 
				if (this->m_waveOut.m_wavFile.GetWaveFormat().wBitsPerSample == 8) 
				{ 
					// 计算数据长度 
					nDataLen = waveHdr.dwBufferLength; 
					pRawData = new double[nDataLen]; 
 
					CWaveConvertor::ConvertToDoubleMono( 
						(byte*) waveHdr.lpData, waveHdr.dwBufferLength, pRawData); 
				} 
				// 进行16位数据转换 
				else 
				{ 
					// 计算数据长度 
					nDataLen = waveHdr.dwBufferLength / 2; 
					pRawData = new double[nDataLen]; 
 
					CWaveConvertor::ConvertToDoubleMono( 
						(int*) waveHdr.lpData, waveHdr.dwBufferLength, pRawData); 
				} 
 
				// 对输入数据进行加窗处理 
				CSpeech::AddWindow(nFrameSize, pRawData, nDataLen); 
				// 对输入数据进行端点检测 
				/*pSection = new double[nDataLen]; 
				nDataLen = CSpeech::SubSection( 
					pRawData, nDataLen, nFrameSize, pSection);*/ 
 
				// 计算LPC倒谱 
				pCepstrum = new double[nDataLen]; 
				CWaveConvertor::ConvertToCepStrum( 
					nDataLen, nFrameSize, pRawData, pCepstrum); 
				 
				// 生成码本 
				CVQ::KMeansCluster( 
					pCepstrum, nDataLen, this->m_pCodeBook, this->m_nCodeNums); 
 
				// 释放所占用资源 
				delete[] pCepstrum; 
				delete[] pRawData; 
				// delete[] pSection; 
			} 
		} 
		else 
		{ 
			// 训练文件打开失败 
			AfxMessageBox("训练文件格式错误!"); 
		} 
	} 
} 
 
// 利用VQ方法实现识别 
void CDemoHMMDlg::OnBnClickedBtnVq() 
{ 
	// TODO: 在此添加控件通知处理程序代码 
	CString strWord = CHMM::RecogonizeByVQ(this->m_pCodeBook, this->m_nCodeNums,  
		this->m_pStrFiles, this->m_nFileCount); 
 
	AfxMessageBox("识别结果为:" + strWord); 
} 
 
// 利用Viterbi实现识别 
void CDemoHMMDlg::OnBnClickedBtnViterbi() 
{ 
	// TODO: 在此添加控件通知处理程序代码 
	CString strWord = CHMM::RecogonizeByViterbi(this->m_pCodeBook, this->m_nCodeNums,  
		this->m_pStrFiles, this->m_nFileCount); 
 
	AfxMessageBox("识别结果为:" + strWord); 
} 
 
// 利用DTW实现识别 
void CDemoHMMDlg::OnBnClickedBtnBtw() 
{ 
	// TODO: 在此添加控件通知处理程序代码 
	CString strWord = CHMM::RecogonizeByDTW(this->m_pCodeBook, this->m_nCodeNums,  
		this->m_pStrFiles, this->m_nFileCount); 
 
	AfxMessageBox("识别结果为:" + strWord); 
}