AddModelDlg.cpp
上传用户:goak128
上传日期:2013-07-17
资源大小:155k
文件大小:4k
- // 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("训练文件格式错误!");
- }
- }