AddModelDlg.cpp
上传用户:goak128
上传日期:2013-07-17
资源大小:155k
文件大小:4k
源码类别:

控制台编程

开发平台:

C/C++

  1. // AddModelDlg.cpp : 实现文件
  2. //
  3. #include "stdafx.h"
  4. #include "Platform.h"
  5. #include "AddModelDlg.h"
  6. #include ".addmodeldlg.h"
  7. // CAddModelDlg 对话框
  8. IMPLEMENT_DYNAMIC(CAddModelDlg, CDialog)
  9. CAddModelDlg::CAddModelDlg(CWnd* pParent /*=NULL*/)
  10. : CDialog(CAddModelDlg::IDD, pParent)
  11. , m_strWord(_T(""))
  12. , m_nStatusNums(0)
  13. , m_nCodeNums(0)
  14. , m_strWavFile(_T(""))
  15. , m_nFrameSize(0)
  16. {
  17. // 设置默认参数
  18. this->m_nCodeNums = ADDMODELDLG_CODENUMS;
  19. this->m_nStatusNums = ADDMODELDLG_STATUSNUMS;
  20. this->m_nFrameSize = ADDMODELDLG_FRAMESIZE;
  21. }
  22. CAddModelDlg::~CAddModelDlg()
  23. {
  24. }
  25. void CAddModelDlg::DoDataExchange(CDataExchange* pDX)
  26. {
  27. CDialog::DoDataExchange(pDX);
  28. DDX_Text(pDX, IDC_EDIT_WORD, m_strWord);
  29. DDX_Text(pDX, IDC_EDIT_STATUSNUMS, m_nStatusNums);
  30. DDX_Text(pDX, IDC_EDIT_CODENUMS, m_nCodeNums);
  31. DDX_Text(pDX, IDC_EDIT_WAVFILE, m_strWavFile);
  32. DDX_Text(pDX, IDC_EDIT_FRAMESIZE, m_nFrameSize);
  33. }
  34. BEGIN_MESSAGE_MAP(CAddModelDlg, CDialog)
  35. ON_BN_CLICKED(IDC_BTN_OPENFILE, OnBnClickedBtnOpenfile)
  36. ON_BN_CLICKED(IDC_BTBADD, OnBnClickedBtbadd)
  37. END_MESSAGE_MAP()
  38. // CAddModelDlg 消息处理程序
  39. //////////////////////////////////////////////////////////////////////////
  40. // 选择训练文件
  41. void CAddModelDlg::OnBnClickedBtnOpenfile()
  42. {
  43. // TODO: 在此添加控件通知处理程序代码
  44. CFileDialog dlg(TRUE);
  45. if (dlg.DoModal() == IDOK)
  46. {
  47. // 显示选择的文件名
  48. CWnd::SetDlgItemText(IDC_EDIT_WAVFILE, dlg.GetPathName());
  49. }
  50. }
  51. //////////////////////////////////////////////////////////////////////////
  52. // 添加新HMM模型
  53. void CAddModelDlg::OnBnClickedBtbadd()
  54. {
  55. // TODO: 在此添加控件通知处理程序代码
  56. CSmallFileWaveOut waveOut;
  57. WAVEHDR waveHdr;
  58. waveHdr.lpData = NULL;
  59. // 原始裸音频数据
  60. double* pRawData = NULL;
  61. // 端点检测后的数据
  62. double* pSection = NULL;
  63. // 倒谱数据
  64. double* pCepstrum = NULL;
  65. unsigned int nDataLen = 0;
  66. // HMM模型
  67. CHMM hmmModel;
  68. // 获取设置数据
  69. CWnd::UpdateData(TRUE);
  70. // 打开所训练文件
  71. if (waveOut.LoadFile(this->m_strWavFile, (DWORD) CWnd::GetSafeHwnd()))
  72. {
  73. //// 获取原始数据
  74. waveOut.GetSamples(&waveHdr, 0);
  75. if (waveHdr.lpData != NULL)
  76. {
  77. // 获取原始数据
  78. // 进行8位数据的转换
  79. if (waveOut.m_wavFile.GetWaveFormat().wBitsPerSample == 8)
  80. {
  81. // 计算数据长度
  82. nDataLen = waveHdr.dwBufferLength;
  83. pRawData = new double[nDataLen];
  84. CWaveConvertor::ConvertToDoubleMono(
  85. (byte*) waveHdr.lpData, waveHdr.dwBufferLength, pRawData);
  86. }
  87. // 进行16位数据转换
  88. else
  89. {
  90. // 计算数据长度
  91. nDataLen = waveHdr.dwBufferLength / 2;
  92. pRawData = new double[nDataLen];
  93. CWaveConvertor::ConvertToDoubleMono(
  94. (int*) waveHdr.lpData, waveHdr.dwBufferLength, pRawData);
  95. }
  96. // 对输入数据进行加窗处理
  97. CSpeech::AddWindow(this->m_nFrameSize, pRawData, nDataLen);
  98. // 对输入数据进行端点检测
  99. // pSection = new double[nDataLen];
  100. // nDataLen = CSpeech::SubSection(
  101. // pRawData, nDataLen, this->m_nFrameSize, pSection);
  102. // 计算LPC倒谱
  103. pCepstrum = new double[nDataLen];
  104. CWaveConvertor::ConvertToCepStrum(
  105. nDataLen, this->m_nFrameSize, pRawData, pCepstrum);
  106. // 进行hmm初始化训练
  107. hmmModel.PrepareTrain(
  108. this->m_strWord, pCepstrum, nDataLen, this->m_nFrameSize, this->m_nStatusNums, this->m_nCodeNums);
  109. // 保存hmmModel初始化训练结果
  110. hmmModel.SaveModel("c:\" + this->m_strWord + ".md");
  111. // 释放所占用资源 
  112. delete[] pRawData;
  113. delete[] pCepstrum;
  114. //delete[] pSection;
  115. waveOut.Stop();
  116. // 训练文件打开失败
  117. AfxMessageBox("训练完毕!");
  118. }
  119. }
  120. else
  121. {
  122. // 训练文件打开失败
  123. AfxMessageBox("训练文件格式错误!");
  124. }
  125. }