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


// AddModelDlg.cpp : 实现文件 
// 
 
#include "stdafx.h" 
#include "Platform.h" 
#include "AddModelDlg.h" 
#include ".\addmodeldlg.h" 
 
 
// CAddModelDlg 对话框 
 
IMPLEMENT_DYNAMIC(CAddModelDlg, CDialog) 
CAddModelDlg::CAddModelDlg(CWnd* pParent /*=NULL*/) 
	: CDialog(CAddModelDlg::IDD, pParent) 
	, m_strWord(_T("")) 
	, m_nStatusNums(0) 
	, m_nCodeNums(0) 
	, m_strWavFile(_T("")) 
	, m_nFrameSize(0) 
{ 
	// 设置默认参数 
	this->m_nCodeNums = ADDMODELDLG_CODENUMS; 
	this->m_nStatusNums = ADDMODELDLG_STATUSNUMS; 
	this->m_nFrameSize = ADDMODELDLG_FRAMESIZE; 
} 
 
CAddModelDlg::~CAddModelDlg() 
{ 
} 
 
void CAddModelDlg::DoDataExchange(CDataExchange* pDX) 
{ 
	CDialog::DoDataExchange(pDX); 
	DDX_Text(pDX, IDC_EDIT_WORD, m_strWord); 
	DDX_Text(pDX, IDC_EDIT_STATUSNUMS, m_nStatusNums); 
	DDX_Text(pDX, IDC_EDIT_CODENUMS, m_nCodeNums); 
	DDX_Text(pDX, IDC_EDIT_WAVFILE, m_strWavFile); 
	DDX_Text(pDX, IDC_EDIT_FRAMESIZE, m_nFrameSize); 
} 
 
 
BEGIN_MESSAGE_MAP(CAddModelDlg, CDialog) 
	ON_BN_CLICKED(IDC_BTN_OPENFILE, OnBnClickedBtnOpenfile) 
	ON_BN_CLICKED(IDC_BTBADD, OnBnClickedBtbadd) 
END_MESSAGE_MAP() 
 
 
// CAddModelDlg 消息处理程序 
 
////////////////////////////////////////////////////////////////////////// 
// 选择训练文件 
void CAddModelDlg::OnBnClickedBtnOpenfile() 
{ 
	// TODO: 在此添加控件通知处理程序代码 
	CFileDialog dlg(TRUE); 
 
	if (dlg.DoModal() == IDOK) 
	{ 
		// 显示选择的文件名 
		CWnd::SetDlgItemText(IDC_EDIT_WAVFILE, dlg.GetPathName()); 
	} 
} 
 
////////////////////////////////////////////////////////////////////////// 
// 添加新HMM模型 
void CAddModelDlg::OnBnClickedBtbadd() 
{ 
	// TODO: 在此添加控件通知处理程序代码 
	CSmallFileWaveOut waveOut; 
	WAVEHDR waveHdr; 
	waveHdr.lpData = NULL; 
	// 原始裸音频数据 
	double* pRawData = NULL; 
	// 端点检测后的数据 
	double* pSection = NULL; 
	// 倒谱数据 
	double* pCepstrum = NULL; 
	unsigned int nDataLen = 0; 
	// HMM模型 
	CHMM hmmModel; 
 
	// 获取设置数据 
	CWnd::UpdateData(TRUE); 
 
	// 打开所训练文件 
	if (waveOut.LoadFile(this->m_strWavFile, (DWORD) CWnd::GetSafeHwnd())) 
	{ 
		//// 获取原始数据 
		waveOut.GetSamples(&waveHdr, 0); 
 
		if (waveHdr.lpData != NULL) 
		{ 
			// 获取原始数据 
			// 进行8位数据的转换 
			if (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(this->m_nFrameSize, pRawData, nDataLen); 
			// 对输入数据进行端点检测 
			// pSection = new double[nDataLen]; 
			// nDataLen = CSpeech::SubSection( 
			//	pRawData, nDataLen, this->m_nFrameSize, pSection); 
 
			// 计算LPC倒谱 
			pCepstrum = new double[nDataLen]; 
			CWaveConvertor::ConvertToCepStrum( 
				nDataLen, this->m_nFrameSize, pRawData, pCepstrum); 
 
			// 进行hmm初始化训练 
			hmmModel.PrepareTrain( 
				this->m_strWord, pCepstrum, nDataLen, this->m_nFrameSize, this->m_nStatusNums, this->m_nCodeNums); 
			// 保存hmmModel初始化训练结果 
			hmmModel.SaveModel("c:\\" + this->m_strWord + ".md"); 
 
			// 释放所占用资源  
			delete[] pRawData; 
			delete[] pCepstrum; 
			//delete[] pSection; 
			waveOut.Stop(); 
 
			// 训练文件打开失败 
			AfxMessageBox("训练完毕!"); 
		} 
	} 
	else 
	{ 
		// 训练文件打开失败 
		AfxMessageBox("训练文件格式错误!"); 
	} 
}