1. 程式人生 > >一套基於模板匹配的語音識別技術。提取語音的特徵,並建立模板庫,可以將語音識別技術應用於機器人

一套基於模板匹配的語音識別技術。提取語音的特徵,並建立模板庫,可以將語音識別技術應用於機器人

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow

也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!

               
  1. 檢視類,廢話少說,看看帶註釋的原始碼
  2. #include "stdafx.h"    
  3. #include "robot.h" 
      
  4. #include"Label.h"    
  5.    
  6. #include "robotDoc.h"    
  7. #include "robotView.h"    
  8.    
  9. #ifdef _DEBUG    
  10. #define new DEBUG_NEW    
  11. #undef THIS_FILE 
      
  12. static char THIS_FILE[] = __FILE__;   
  13. #endif    
  14.    
  15. /////////////////////////////////////////////////////////////////////////////    
  16. // CRobotView    
  17.    
  18. IMPLEMENT_DYNCREATE(CRobotView, CFormView)   
  19.    
  20. BEGIN_MESSAGE_MAP(CRobotView, CFormView)   
  21.     //{{AFX_MSG_MAP(CRobotView)    
  22.     ON_WM_CTLCOLOR()   
  23.     ON_WM_TIMER()   
  24.     //}}AFX_MSG_MAP    
  25.     ON_MESSAGE(WM_COMMNOTIFY, OnCommNotify)   
  26. END_MESSAGE_MAP()   
  27.    
  28. /////////////////////////////////////////////////////////////////////////////    
  29. // CRobotView construction/destruction    
  30.    
  31. CRobotView::CRobotView()   
  32.     : CFormView(CRobotView::IDD)   
  33. {   
  34.     //{{AFX_DATA_INIT(CRobotView)    
  35.     //}}AFX_DATA_INIT    
  36.     // TODO: add construction code here    
  37.     m_ncomand1=10;   
  38.     m_bflag=0;   
  39.     m_nsudu=1;   
  40.     m_ngzq=0;   
  41.     m_nguanjie;   
  42.     m_nfangxiang;   
  43.     m_nmsg[0]=0;   
  44.     m_njishu=0;   
  45.     m_nmsg[1]=0;   
  46.     m_nmsg[2]=0;   
  47.     m_nmsg[3]=0;   
  48.     m_nmsg[4]=0;   
  49.     m_nsum=0;   
  50.     m_ndelay=0;   
  51.     nLength=0;   
  52.     m_recflag=1;   
  53.     m_failflag=1;   
  54.     m_brush.CreateSolidBrush(RGB(40,98,122)); // 生成一綠色刷子     
  55.    
  56. }   
  57.    
  58. CRobotView::~CRobotView()   
  59. {   
  60. }   
  61.    
  62. void CRobotView::DoDataExchange(CDataExchange* pDX)   
  63. {   
  64.     CFormView::DoDataExchange(pDX);   
  65.     //{{AFX_DATA_MAP(CRobotView)    
  66.     //DDX_Control(pDX, IDC_EDIT1, m_edit1);    
  67.     DDX_Control(pDX, IDC_STATIC_LINK, m_link);   
  68.     DDX_Control(pDX, IDC_STATIC_1, m_ml);   
  69.     DDX_Control(pDX, IDC_STATIC_4, m_workpart);   
  70.     DDX_Control(pDX, IDC_STATIC_COMMAND, m_command);   
  71.     DDX_Control(pDX, IDC_STATIC_STATUS, m_static);   
  72.     DDX_Control(pDX, IDC_STATIC_BUCHANG, m_buchangshu);   
  73.     DDX_Control(pDX, IDC_STATIC_5, m_buchang);   
  74.     DDX_Control(pDX, IDC_STATIC_3, m_sudu);   
  75.     DDX_Control(pDX, IDC_STATIC_2, m_zhuangtai);   
  76.     //}}AFX_DATA_MAP    
  77. }   
  78.    
  79. BOOL CRobotView::PreCreateWindow(CREATESTRUCT& cs)   
  80. {   
  81.     // TODO: Modify the Window class or styles here by modifying    
  82.     //  the CREATESTRUCT cs    
  83.    
  84.     return CFormView::PreCreateWindow(cs);   
  85. }   
  86.    
  87.    
  88.    
  89. /////////////////////////////////////////////////////////////////////////////    
  90. // CRobotView diagnostics    
  91.    
  92. #ifdef _DEBUG    
  93. void CRobotView::AssertValid() const   
  94. {   
  95.     CFormView::AssertValid();   
  96. }   
  97.    
  98. void CRobotView::Dump(CDumpContext& dc) const   
  99. {   
  100.     CFormView::Dump(dc);   
  101. }   
  102.    
  103. CRobotDoc* CRobotView::GetDocument() // non-debug version is inline    
  104. {   
  105.     ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CRobotDoc)));   
  106.     return (CRobotDoc*)m_pDocument;   
  107. }   
  108. #endif //_DEBUG    
  109.    
  110. /////////////////////////////////////////////////////////////////////////////    
  111. // CRobotView message handlers    
  112.    
  113. void CRobotView::OnDraw(CDC* pDC)    
  114. {   
  115.     // TODO: Add your specialized code here and/or call the base class    
  116.     SuduDisplay(m_nsudu);   
  117.     GzqDisplay(m_ngzq);   
  118. }   
  119.    
  120. void CRobotView::OnInitialUpdate()    
  121. {   
  122.     CFormView::OnInitialUpdate();   
  123.        
  124.     // TODO: Add your specialized code here and/or call the base class    
  125.     m_link.SetLink(TRUE)   
  126.         .SetTextColor(RGB(0,0,255))   
  127.         .SetFontUnderline(TRUE)   
  128.         .SetLinkCursor(AfxGetApp()->LoadCursor(IDC_ICON1));   
  129.     m_command.SetFontSize(24)   
  130.         .SetFontName("Terminal")   
  131.               .SetTextColor(RGB(240,240,40));   
  132.     m_static.SetFontSize(24)   
  133.               .SetTextColor(RGB(240,240,40));   
  134.     m_workpart.SetFontSize(24)   
  135.         .SetFontBold(TRUE)   
  136.               .SetTextColor(RGB(0,240,0));   
  137.     m_buchangshu.SetFontSize(24)   
  138.               .SetTextColor(RGB(240,240,40));   
  139.     m_buchang.SetFontSize(24)   
  140.             .SetFontBold(TRUE)   
  141.               .SetTextColor(RGB(0,240,0));   
  142.     m_sudu.SetFontSize(24)   
  143.             .SetFontBold(TRUE)   
  144.               .SetTextColor(RGB(0,240,0));   
  145.     m_zhuangtai.SetFontSize(24)   
  146.             .SetFontBold(TRUE)   
  147.               .SetTextColor(RGB(0,240,0));   
  148.     m_ml.SetFontSize(24)   
  149.             .SetLinkCursor(AfxGetApp()->LoadCursor(IDC_ICON1))   
  150.             .SetFontBold(TRUE)   
  151.              .SetTextColor(RGB(0,240,0));   
  152.     GetParentFrame()->RecalcLayout();   
  153.     ResizeParentToFit();   
  154. }   
  155.    
  156. LRESULT CRobotView::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)    
  157. {   
  158.     // TODO: Add your specialized code here and/or call the base class    
  159.     if(message == (WM_USER + 1002))   
  160.         ProcessMessage(wParam, lParam);   
  161.     else if(message==(WM_USER+1003))   
  162.         ProcessMyMessage();   
  163.     return CFormView::WindowProc(message, wParam, lParam);   
  164. }   
  165. void CRobotView::ProcessMessage(WPARAM wParam, LPARAM lParam)   
  166. {   
  167.        
  168.     CRobotDoc* pDoc=GetDocument();   
  169.     char* l[57] = {"零","一","二",///012    
  170.         "三","四","五","六","七","八","九","執行","各關節歸零","大臂正轉",///12    
  171.         "大臂反轉","小臂正轉","小臂反轉","手腕正轉","手腕反轉","手爪張開","手爪閉合","上升","下降","大臂執行",///13--22    
  172.         "大臂負執行","小臂執行","小臂負執行","手腕執行","手腕負執行","手爪執行","手爪負執行","升降執行",////23---30    
  173.         "升降負執行","大臂歸零","小臂歸零","手腕歸零","手爪歸零","升降歸零","速度加","原點記憶",///31---38    
  174.         "系統復位","示教盒","","","回原點","速度減","區號加","區號減","單步再現","週期再現",///39---48    
  175.         "連續再現","返回","繼續","資料記憶","讀取資料","設定串列埠","開啟串列埠","關閉串列埠"};      
  176.     CString    strcomand;   
  177.     CString    strstatus;   
  178.     m_recflag=1;   
  179.     if(!pDoc->m_bConnected)   
  180.     {   
  181.         KillTimer(1);   
  182.         MessageBox("請先開啟串列埠");   
  183.         return;   
  184.     }   
  185.     if(wParam==100)   
  186.     {   
  187.         KillTimer(1);   
  188.         if(!m_failflag)   
  189.             {   
  190.                     CWnd* pWnd=GetDlgItem(IDC_STATIC_5);   
  191.                     pWnd->SetWindowText("");   
  192.                     pWnd=GetDlgItem(IDC_STATIC_BUCHANG);   
  193.                     pWnd->SetWindowText("");   
  194.                     pWnd=GetDlgItem(IDC_STATIC_COMMAND);   
  195.                     pWnd->SetWindowText("請輸入新的命令");   
  196.                     pWnd=GetDlgItem(IDC_STATIC_STATUS);   
  197.                     pWnd->SetWindowText("執行完畢");   
  198.                     m_ncomand1=0;   
  199.                        
  200.                 }   
  201.                 else   
  202.                     MessageBox("請檢查連線是否正確或下位機是否開啟","通訊失敗",MB_ICONWARNING);   
  203.                 }   
  204.     else if(wParam>=11&&wParam<=56)   
  205.     {   
  206.         m_bflag=0;   
  207.         m_ncomand1=wParam;   
  208.         strcomand=l[m_ncomand1];   
  209.         CWnd* pWnd=GetDlgItem(IDC_STATIC_COMMAND);   
  210.         pWnd->SetWindowText(strcomand);   
  211.         pWnd=GetDlgItem(IDC_STATIC_STATUS);   
  212.         pWnd->SetWindowText("");   
  213.         pWnd=GetDlgItem(IDC_STATIC_5);   
  214.         pWnd->SetWindowText("");   
  215.         pWnd=GetDlgItem(IDC_STATIC_BUCHANG);   
  216.         pWnd->SetWindowText("");   
  217.         m_nsum=0;   
  218.         m_njishu=0;   
  219.     }   
  220.     else if(wParam>=0&&wParam<=9)   
  221.     {      
  222.         if(m_ncomand1>=12&&m_ncomand1<=21)           
  223.         {   
  224.             m_bflag=1;   
  225.             m_nmsg[m_njishu]=wParam;   
  226.            //pWnd=GetDlgItem(IDC_STATIC_COMMAND);    
  227.             //pWnd->SetWindowText(strcomand);    
  228.             CWnd* pWnd=GetDlgItem(IDC_STATIC_5);   
  229.             pWnd->SetWindowText("步長:");   
  230.             ++m_njishu;   
  231.             if(m_njishu==1)   
  232.             {   
  233.                 CString m_stemp;   
  234.                 m_nsum=m_nmsg[0];   
  235.                 m_stemp.Format("%d",m_nsum);   
  236.                 pWnd=GetDlgItem(IDC_STATIC_BUCHANG);   
  237.                 pWnd->SetWindowText(m_stemp);   
  238.             }   
  239.             if(m_njishu==2)   
  240.             {   
  241.                 CString m_stemp;   
  242.                 m_nsum=m_nmsg[0]*10+m_nmsg[1];   
  243.                 m_stemp.Format("%d",m_nsum);   
  244.                 pWnd=GetDlgItem(IDC_STATIC_BUCHANG);   
  245.                 pWnd->SetWindowText(m_stemp);   
  246.             }   
  247.             if(m_njishu==3)   
  248.             {   
  249.                 CString m_stemp;   
  250.                 m_nsum=m_nmsg[0]*100+m_nmsg[1]*10+m_nmsg[2];   
  251.                 //m_nmsg[0]=0;    
  252.                 //m_nmsg[1]=0    
  253.                 //  m_nmsg[2]=0;    
  254.                 //  m_njishu=0;    
  255.                 m_stemp.Format("%d",m_nsum);   
  256.                 pWnd=GetDlgItem(IDC_STATIC_BUCHANG);   
  257.                 pWnd->SetWindowText(m_stemp);   
  258.             }   
  259.             if(m_njishu==4)   
  260.             {   
  261.                 CString m_stemp;   
  262.                 m_nsum=m_nmsg[0]*1000+m_nmsg[1]*100+m_nmsg[2]*10+m_nmsg[3];   
  263.                 m_stemp.Format("%d",m_nsum);   
  264.                 pWnd=GetDlgItem(IDC_STATIC_BUCHANG);   
  265.                 pWnd->SetWindowText(m_stemp);   
  266.             }   
  267.             if(m_njishu>4)   
  268.             {   
  269.                 m_njishu=1;   
  270.                 m_nmsg[0]=m_nmsg[4];   
  271.                 CString m_stemp;   
  272.                 m_nsum=m_nmsg[0];   
  273.                 m_stemp.Format("%d",m_nsum);   
  274.                 pWnd=GetDlgItem(IDC_STATIC_BUCHANG);   
  275.                 pWnd->SetWindowText(m_stemp);   
  276.                 m_nmsg[1]=0;   
  277.                 m_nmsg[2]=0;   
  278.                 m_nmsg[3]=0;   
  279.             }   
  280.         }          
  281.         else   
  282.             ;   //MessageBox("清先輸入運動步數命令");    
  283.     }   
  284.     else if(wParam=10)   
  285.     {    SetTimer(1,500,NULL);   
  286.         if(m_ncomand1>=11&&m_ncomand1<=56)   
  287.         {   
  288.             if(!m_bflag)   
  289.             {   
  290.                 strstatus="正在執行命令,請稍後.....";   
  291.                 CWnd* pWnd=GetDlgItem(IDC_STATIC_STATUS);   
  292.                 pWnd->SetWindowText(strstatus);   
  293.                 Execute(m_ncomand1);   
  294.                
  295.             }      
  296.             else //if(m_ncomand1>=12&&m_ncomand1<=21)    
  297.             {   
  298.                 unsigned char m_uhi,m_ulo;   
  299.                 m_nmsg[0]=0;   
  300.                 m_nmsg[1]=0;   
  301.                 m_nmsg[2]=0;   
  302.                 m_nmsg[3]=0;   
  303.                 m_njishu=0;   
  304.             /// CWnd* pWnd=GetDlgItem(IDC_STATIC_STATUS);    
  305.                /// pWnd->SetWindowText("正在執行命令,請稍後.....");    
  306.                 switch(m_ncomand1)   
  307.                 {   
  308.                 case(12):   
  309.                     m_nguanjie=01;   
  310.                     m_nfangxiang=00;   
  311.                     m_uhi=(unsigned char)(m_nsum/256);   
  312.                     m_ulo=(unsigned char)(m_nsum-m_uhi*256);   
  313.                     m_ndelay=(m_nsum+500)/m_nsudu;   
  314.                     Execute_1(m_nguanjie,m_nfangxiang,m_uhi,m_ulo,m_ndelay);   
  315.                     break;   
  316.                     case(13):   
  317.                     m_nguanjie=0x01;   
  318.                     m_nfangxiang=0xff;   
  319.                     m_uhi=(unsigned char)(m_nsum/256);   
  320.                     m_ulo=(unsigned char)(m_nsum-m_uhi*256);   
  321.                     m_ndelay=(m_nsum+500)/m_nsudu;   
  322.                     Execute_1(m_nguanjie,m_nfangxiang,m_uhi,m_ulo,m_ndelay);   
  323.                     break;   
  324.                     case(14):   
  325.                     m_nguanjie=0x02;   
  326.                     m_nfangxiang=0x00;   
  327.                     m_uhi=(unsigned char)(m_nsum/256);   
  328.                     m_ulo=(unsigned char)(m_nsum-m_uhi*256);   
  329.                     m_ndelay=(m_nsum)/(m_nsudu*3);   
  330.                     Execute_1(m_nguanjie,m_nfangxiang,m_uhi,m_ulo,m_ndelay);   
  331.                     break;   
  332.                     case(15):   
  333.                     m_nguanjie=0x02;   
  334.                     m_nfangxiang=0xff;   
  335.                     m_uhi=(unsigned char)(m_nsum/256);   
  336.                     m_ulo=(unsigned char)(m_nsum-m_uhi*256);   
  337.                     m_ndelay=(m_nsum)/(m_nsudu*3);   
  338.                     Execute_1(m_nguanjie,m_nfangxiang,m_uhi,m_ulo,m_ndelay);   
  339.                     break;   
  340.                     case(16):   
  341.                     m_nguanjie=0x04;   
  342.                     m_nfangxiang=0x00;   
  343.                     m_uhi=(unsigned char)(m_nsum/256);   
  344.                     m_ulo=(unsigned char)(m_nsum-m_uhi*256);   
  345.                     m_ndelay=(m_nsum+500)/m_nsudu;   
  346.                     Execute_1(m_nguanjie,m_nfangxiang,m_uhi,m_ulo,m_ndelay);   
  347.                     break;   
  348.                     case(17):   
  349.                     m_nguanjie=0x04;   
  350.                     m_nfangxiang=0xff;   
  351.                     m_uhi=(unsigned char)(m_nsum/256);   
  352.                     m_ulo=(unsigned char)(m_nsum-m_uhi*256);   
  353.                     m_ndelay=(m_nsum+500)/m_nsudu;   
  354.                     Execute_1(m_nguanjie,m_nfangxiang,m_uhi,m_ulo,m_ndelay);   
  355.                     break;   
  356.                     case(18):   
  357.                     m_nguanjie=0x05;   
  358.                     m_nfangxiang=0x00;   
  359.                     m_uhi=(unsigned char)(m_nsum/256);   
  360.                     m_ulo=(unsigned char)(m_nsum-m_uhi*256);   
  361.                     m_ndelay=(m_nsum+500)/m_nsudu;   
  362.                     Execute_1(m_nguanjie,m_nfangxiang,m_uhi,m_ulo,m_ndelay);   
  363.                     break;   
  364.                     case(19):   
  365.                     m_nguanjie=0x05;   
  366.                     m_nfangxiang=0xff;   
  367.                     m_uhi=(unsigned char)(m_nsum/256);   
  368.                     m_ulo=(unsigned char)(m_nsum-m_uhi*256);   
  369.                     m_ndelay=(m_nsum+500)/m_nsudu;   
  370.                     Execute_1(m_nguanjie,m_nfangxiang,m_uhi,m_ulo,m_ndelay);   
  371.                     break;   
  372.                     case(20):   
  373.                     m_nguanjie=0x03;   
  374.                     m_nfangxiang=0x00;   
  375.                     m_uhi=(unsigned char)(m_nsum/256);   
  376.                     m_ulo=(unsigned char)(m_nsum-m_uhi*256);   
  377.                     m_ndelay=(m_nsum+500)/(m_nsudu*2);   
  378.                     Execute_1(m_nguanjie,m_nfangxiang,m_uhi,m_ulo,m_ndelay);   
  379.                     break;   
  380.                     case(21):   
  381.                     m_nguanjie=0x03;   
  382.                     m_nfangxiang=0xff;   
  383.                     m_uhi=(unsigned char)(m_nsum/256);   
  384.                     m_ulo=(unsigned char)(m_nsum-m_uhi*256);   
  385.                     m_ndelay=(m_nsum+500)/(m_nsudu*2);   
  386.                     Execute_1(m_nguanjie,m_nfangxiang,m_uhi,m_ulo,m_ndelay);   
  387.                     break;   
  388.                 }   
  389.                    
  390.            }   
  391.             m_failflag=1;}   
  392.        else   
  393.            MessageBox("清先輸入命令");   
  394.      }   
  395.      else   
  396.          MessageBox("不能識別,請重新輸入命令");   
  397. }   
  398. void CRobotView::ProcessMyMessage()   
  399. {   
  400.     CDC *PDc=GetDC();   
  401.     m_failflag=0;   
  402.         switch(m_ncomand1)   
  403.         {   
  404.         case(37):   
  405.             {   
  406.                 m_nsudu++;   
  407.                 if(m_nsudu==6)   
  408.                     m_nsudu=1;   
  409.                 OnDraw(PDc);   
  410.             }   
  411.             break;   
  412.         case(44):   
  413.             {   
  414.                 m_nsudu--;   
  415.                 if(m_nsudu==0)   
  416.                     m_nsudu=5;   
  417.                 OnDraw(PDc);   
  418.             }   
  419.