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("训练文件格式错误!");
}
}