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