模擬機械運動及其語音控制的研究

           

          模擬機械運動及其語音控制的研究

           

          摘 要:在云計算、智能移動設備和物聯網、互聯網快速發展的今天,便利成為人們消費的最大動力,而計算機交互界面的革新是首當其沖的,作為交互技術,語音識別,無疑不會褪去其重要的角色作用。本論文介紹以VC6.0和Microsoft Speech SDK5.1為開發工具,開發語音交互界面應用程序,實現語音控制模擬機械臂完成簡單動作和關閉程序的完整過程。其中,將重點探討庫的加載、直線旋轉算法、語法庫的提取、語法命令的準確匹配等等問題。最后,指出本系統的不足及一些改進方案,并對計算機語音交互進行一番總結和展望。

          關鍵詞:計算機交互 語音控制 旋轉算法 準確匹配 展望

          中國圖書分類號:TP391.42

           

           

           

           

           

           

           

           

           

           

           

           

           

          Motion of Simulation Mechanical and Voice Control Research

          Abstract:In cloud computing, smart mobile devices and things, the rapid development of the Internet today, convenience become the biggest power consumer, and computer interface innovation is first and foremost, as an interactive technology, voice recognition, and certainly not faded its important role ineffect. This paper introduces the complete procedure of developing voice interface applications,controlling simulated robot arm to complete simple movements via voice commands,based on VC6.0 and Microsoft Speech SDK5.1 as the tool. It will also explore the library's loading,linear rotation algorithm, grammar library extraction, matching the exact command syntax and so on. Finally, less than that and some of the system improvement program, and computer speech for some summary and prospect interaction.

          Key words:Computer interaction;Voice control;Rotation algorithm;Matching ex  -actly;Outlook

           

           

           

           

           

          目 錄

           

          1引言.......................................................... 1

          1.1研究背景................................................. 1

          1.2研究意義................................................. 2

          1.3研究內容................................................. 2

          1.4本論文組織結構........................................... 3

          2 SDK及VC環境配置............................................. 4

          2.1語音開發工具............................................. 4

          2.2 工具使用及VC環境配置................................... 5

          3 語音控制程序開發流程.......................................... 6

          3.1需求分析................................................. 6

          3.2 代碼設計與測試.......................................... 9

          3.3 重要算法實現........................................... 13

          4 不足及其改進................................................. 19

          5 總結與展望................................................... 19

          5.1 總結................................................... 19

          5.2 展望................................................... 20

          致謝........................................................... 20

          參考文獻....................................................... 22


          模擬機械運動及其語音控制的研究

          1引言

          隨著計算機與多媒體技術的發展,在眾彩紛呈的人與計算機的交互方式中,實現人與計算機通過自然語音交互,一直是人類追求的目標。這就要求開發具有語音功能的程序。而語音識別,即實現使計算機獲取用戶語音輸入并理解識別,從而使用戶使用語音和口令控制計算機工作,是具有語音功能的程序的充滿魅力的一面,也是眾多研究者、高校和實驗室的研究熱點之一,具有很高的學術價值和應用前景。

          本章將介紹本論文的研究背景、研究意義、研究內容和本論文組織結構。

          1.1研究背景

          在計算機與多媒體技術、互聯網、物聯網和人們生活節奏快速發展的今天,人們的生活越來越離不開計算機與網絡,而傳統的人機交互方式,即通過鼠標、鍵盤或更原始的機械開關來操作計算機的方式,也已很不適應人們的生活節奏,并深深地影響了用戶的使用體驗快感。在各種需求和客觀條件需求下,計算機語音技術的研究早在二十世紀五十年代就已開始,并一直處于研究和應用熱點。

          作為語音技術的一個重要方面,語音識別的研究工作開始于上世紀50年代的Bell實驗室,到60年代末70年代初,其作為一個重要課題取得了實質進展,提出了動態規劃(DP)和線性預測分析技術(LP),其中后者較好解決了語音信號產生模型的問題,極大地促進了語音識別的發展,70年代,動態時間規正技術(DTM)解決了語音特征不等長匹配問題,對特定人孤立詞語音識別十分有效,在語音識別領域取得了突破,在些期間還提出了矢量量化(VQ)和隱含馬爾可夫模型(HMM)理論。80年代語音識別研究工作進一步深入,HMM模型和人工神經(ANN)在語音識別中成功應用。HMM的引入和成功應用,奠定了統計方法和模型在語音識別和語音處理中的主流地位,并且,使得借助人工智能中的啟發式搜索和語音模型自身的特點,高效、快捷的算法使得建立實時的連續語音搜索識別系統成為可能。90年代,語音識別的研究進一步深入,逐步發展到自然口語識別 和理解的人機對話系統。ANN也開始應用于語音識別,并在不斷的研究完善的和順應解決問題的需要中逐步與HMM模型和小波分析模型等結合。

          目前,語音識別領域的研究熱點包括:穩健語音識別、語音輸入設備研究、聲學HMM模型的細化、說話人自適應技術、大詞匯量關鍵詞識別、有效識別(搜索)算法研究、可信度評測算法研究、ANN應用、語音模型及深次的自然語音理解 。

          1.2研究意義

          在我們的生活中,語音識別早已成為人們消費的一部分,成為IT發展中的一大亮點,而且,在云計算與移動互聯等快速發展及其促進下,語音識別技術將是人工智能不可或缺的功能模塊,語音識別將是人機交互的主要界面。但是,由于語音識別技術的最終目的是要實現人與機器進行自然語言交流,那么在朝這個目標邁進的過程中,我們要解決的問題還有許多,有許多難點,例如,如何減小語音識別對環境的依賴性、如何提高語音識別在高噪聲環境下的魯棒性、如何更高效地把語言學、生理學、心理學等方面知識量化、建模從而應用于語音識別,更重要和根本的是,如何克服人類自身聽覺積累、知識積累和學習機制以及大腦神經系統控制機理等知識方面的缺陷的阻礙,這些問題都是需要花很大的精力和時間去克服的。可見,對語音識別的研究仍然具有很重要的意義。

          1.3研究內容

          人機交互是研究如何把計算機技術和人聯系起來,使計算機技術最大程度的人性化,而計算機語音交互界面的研究,是人機交互的重要組成部分,也主要涉及到語音識別、合成,是當前計算機行業競爭的焦點,它的好壞直接影響到計算機的可用性和效率,影響到人們日常生活和工作的質量和效率 。

          本論文將圍繞語音識別技術,利用VC 6.0和Microsoft Speech SDK5.1和Speech SDK51LangPack.exe開發工具和包開發開發一個簡單孤立詞語音控制應用程序,實現控制一個模擬機械臂做相應動作的功能。對語音識別感興趣的人員可以在本程序基礎上擴展,或借鑒本程序,實現更復雜的功能。

          在設計本語音控制模擬機構運動的應用程序過程中,主要涉及到以下論題:

          1.MFC繪圖和直線旋轉算法:主要是關于按鈕消息映射與響應、視圖中繪圖設備的定義和刷新來實現直線旋轉算法的內容。

          2.語音控制的實現:主要是開發語音識別命令控制應用程序的步驟與注意事項,并探討分析語法庫的提取、語音判斷分支的方法選擇及控制響應。

          3.簡述應用幫助說明功能塊的解決。

          1.4本論文組織結構

          第一章,介紹本論文的研究背景、研究意義、研究內容及組織結構;

          第二章,介紹利用語音識別技術開發語音控制應用程序的開發包和工具的安裝與環境配置;

          第三章,以軟件工程和面向對象編程開發知識為基礎,介紹本軟件的開發流程,其中著重討論MFC繪圖和直線旋轉的實現過程,以及開發語音控制程序中各個步驟和分支判斷、控制調用中的問題,并簡述應用幫助說明功能塊的解決。

          第四章,指出程序的不足及改進方案。

          如圖1-1為本論文組織結構圖。

          圖1-1本論文組織結構圖

           

          2 SDKVC環境配置

          2.1語音開發工具

          語音識別控制程序一般是基于語音開發工具包來開發的,具前的語音開發工具包有很多,比較常用的開發工具包有微軟的Microsoft Speech SDKIBMViaVoice,而前者顯然是基于Windows操作系統系列的語音開發工具的最佳選擇。其含有語音應用程序接口(SAPI)、微軟連續語音識別引擎(MCSR)以及串聯語音合成(又稱文本到語音)引擎(TTS)等。SAPI還包括對于低層控制和高度適應性的直接語音管理、訓練向導、事件、語法、編譯、資源、語音識別管理以及文本到語音管理 (這些在語音識別控制應用程序中都會涉及),其結構如圖2-1所示。

          圖2-1 語音識別SAPI層次圖

          從用戶角度從上抽象層往底層看,應用程序(Application)通過應用程序接口(API)和SAPI(SpeechAPI)交互,而SAPI則通過設備驅動接口(DDI)與語音識別引擎或語音合成引擎交互,這樣,用戶可以很輕松只關注于API的使用即可開發出語音識別或語音合成應用程序。

          那么,對于編程語言,這里本人選擇VC++作為開發語言,基于MFC,以Visual C++ 6.0作為開發平臺。首先,Microsoft Speech SDK要求Visual C++ 6.0及以上作為開發平臺;其次,以VC++作為開發語言,較基本地接觸到底層知識但又不太復雜,可以更本質地理解語音識別程序等應用程序的運行機制,且可以更清晰地理解程序的框架、脈絡,同時對于Windows消息驅動機制認識也更深刻。

          2.2 工具使用及VC環境配置

          1、下載Speech SDK.exe(里面有例子程序、說明文檔和以及用于開發的美國英語語音引擎),運行后,安裝Microsoft Speech SDK5.1.msi,選擇正確的安裝路徑,以后在VC6.0中打開工程,選擇“工程”(Project)->“設置”(Settings)->“C\C++”選項卡中選“策略”(Category)選中“預處理”(Preprocessor),再在其“額處包括目錄”(Additional include director    -ies)中輸入上面的路徑(這里建議將上述運行了Microsoft Speech SDK5.1.msi后生成的新的文件夾,如Include文件夾、Lib文件夾直接拷貝到你的工程文件夾中,這樣,這里可以用相對路徑,即:..\工程文件夾名\Include來加庫,當拷貝整個工程文件夾到不同的機器或不同的硬盤時,不必每次修改庫路徑),并在“預處理定義”(Preprocessor definitions)中加上“_WIN32_DCOM”(因為我們這里用的是低級的COM接口來開發);同樣,我們還要在“鏈接”(Link)選項卡中“策略”(Category)中選中“輸入”(Input),再在“附加庫路徑”(Additional library)輸入上面得到的Microsoft Speech SDK5.1文件夾下i386的路徑(同樣建議用上面的相對路徑,即:..\工程文件夾名\Lib\i386),同時在“Object\library modules”中輸入“sapi.lib”即可;

          2、注意,如果你的語法庫文件*.xml中用的簡體中文語言選項,即里面有LANGID="804"(LANGID="809"是英式英語語言編號,美式英語編號為LANGID="409"),那么為支持對其的語音識別,你還需要安裝Speech SDK51   LangPack.exe,安裝后,找到新生成的LangPack文件,點擊Microsoft Spee -ch SDK 5.1 Language Pack,運行后,再在計算機電腦上的“控制面板”中打開“語音”,選擇“語音識別”選項卡中的語言(L)中的Microsoft Simp -lified Chinese Recognizer,點擊“應用”和“確定”以后,就可以正常開發識別中文的語音應用程序,否則,你的程序在LoadCmdFromFile()處會出錯;

          3 語音控制程序開發流程

          3.1需求分析

          3.1.1系統分析

          計算機語音交互界面設計不同于一般的軟件界面設計,它需要遵循一些特殊原則,以便設計出更好的界面。一般原則如下

          1)用戶控制:用戶控制就是指讓用戶感受到計算機在他控制之下或允許他進行恰當的控制,這樣才會使用戶感到舒服;否則,會影響到用戶的情緒,甚至會導致用戶停止使用這種界面軟件。

          (2)界面的可預測性:用戶界面的工作方式應該能被用戶正確地預測,即用戶應該知道計算機下一步應該作什么。這里就需要對用戶的心理模型進行挖掘和模擬。

          3)降低記憶數量:人的暫時記憶能夠在大約20秒的時間里記住5~9件事情,如果想記住更多的事,就要將信息以某種方式分塊以減少記憶量,或者將信息、以語義編碼或給出一定的意義。

          4)語言清晰性:控制計算機的各種語音命令之間要盡量差別分明,以便減少語音識別錯誤。用戶在說出語音命令也要吐字清晰,以便語音識別引擎更好的識別。

          (5)差錯控制:語音界面與其他的界面相比有著更高的錯誤率,這是由其自身的特點和其處理技術的局限性決定的。這就需要我們提供差錯控制機制。

          (6)適應性和靈活性:適應性是指界面的設計必須要適合用戶群的工作方式;而靈活性是指允許用戶對界面進行調整以適應特定用途。

          (7)滿意度:界面的滿意度是一項重要指標。當系統以高效、實用的方式工作,并且只需要很少的工作和打擾,那么用戶就會感到滿意。

          (8)反饋及響應:界面應該及時告知用戶他們所作操作的執行結果和界面所處的狀態。因為反饋對于用戶很重要,尤其是在用戶希望和計算機進行“交談”時。在語音界面中的一個普遍的問題是用戶不知道什么時候系統準備好聽他們講,也就是說什么時候輪到他們講話。這樣當用戶在系統不接收語音輸入時說話就會產生錯誤。這可以通過為用戶提供關于系統狀態的反饋來解決,像“系統等待您的指示”之類的信息,而這就是一種很好的響應。

          本論文是圍繞語音交互界面應用程序的,該應用程序是基于語音識別技術和MFC應用程序開發技術,利用VC 6.0和Microsoft Speech SDK5.1和Speech SDK51LangPack.exe開發工具和包,開發一個簡單孤立詞語音控制應用程序,實現控制一個模擬機械臂做相應動作的功能。對語音識別感興趣的人員可以在本程序基礎上擴展,或借鑒本程序,實現更復雜的功能。

          功能需求:

          實現應用程序界面下,利用主窗口菜單欄上按鈕或語音都能控制模擬機械臂豎立、倒下和左右旋轉等簡單動作,從而可以在此基礎上進行擴展,完成更復雜的動作。

          性能需求:

          不管使用語音還是按鈕控制,都要各自實現的功能要不產生干擾,且狀態明確,尤其是語音控制,要達到只有是預建立的語法庫里面的命令才能響應,其它雜音都不能使應用程序產生反應的性能。

          軟硬件需求:

          軟件方面,Windows 98/XP及以上版本操作系統,以及上述工具包;

          硬件方面,需要主機耳邁、麥克風插孔要好,并且要求有好的耳邁和麥克風,保證語音輸入能夠清晰的捕獲到。

          3.1.2系統設計

          要實現控制模擬機械臂完成關于旋轉等簡單動作,這里,在應用程序中,以直線作為模擬機械臂,完成所述豎立、倒下、左右旋轉等動作,即是選取一個參考點作為圓心,利用計算機圖形學的知識,完成相應圖形的旋轉。

          那么,要看到機械臂(直線)及其相應旋轉,可以在MFC所提供的三種應用程序結構中選擇SDI結構,因為,這里要看到機械臂及其相應動作,正好文檔視圖區域可作為其“畫布”背景;而作為按鈕控制時,恰可充分利用主框架菜單欄,在其上添加相應按鈕并設置視圖類來響應按鈕消息,從而實現按鈕響應;對于語音控制,在上述完成SDK及VC環境配置后,要在相應頭文件中添加相應頭文件包括預處理命令并在相應處完成COM的初始化、語音消息的定義及消息映射機制,詳見代碼設計步驟。

          考慮到上述語音交互界面設計原則上以及用戶的情況,還需要在軟件中添加使用說明文檔,在本程序中巧妙而簡單的解決了,具體詳見代碼設計階段。

          在本應用程序實現過程中,我將系統實現大致分為兩步:

          1、首先實現菜單命令按鈕控制機械臂完成相應動作;

          2、完成語音控制機械臂完成同樣的功能;

          系統流程如圖3-1

          圖3-1 語音控制應用程序系統流程圖

           

          3.2 代碼設計與測試

          1、菜單命令按鈕控制機械臂完成相應動作

              在完成上述SDK的安裝和上述操作后,運行Microsoft Visual C++ 6.0,按照MFC AppWizard 完成相應步驟并進入工程,按照第二章所說明的步驟完成VC環境的配置。

          要使進入應用程序之后,初始界面(主要是視圖類所顯示的區域)應顯示的是模擬機械臂的初始狀態(這里假設是機械臂橫放在水平面),并且,很顯然,當我們有可能在某一時刻切換到另一窗口,而當我們返回時,要仍能顯示我們切出該應用程序窗口之前應用程序的狀態,因此,我們的繪圖模塊應放在系統重繪刷新之后仍被調用的函數,而視圖類的OnPaint()函數正是符合上述要求的方法模塊,而由MFC運行機制,視圖類的OnPaint()函數實際調用OnDraw()函數,所以,實際上,我們的繪圖模塊應放在OnDraw()模塊中。

          同時,由于我們整個程序幾乎是操作機械臂(直線),因此,我們應將直線的坐標及部分相應屬性應作為視圖類的成員,這樣可以避免大量代碼重復,同時方便各個函數模塊對機械臂的操作。

          具體步驟如下:

          1)   定義直線坐標為視圖類的屬性:

          CPoint m_LinePoint1,m_LinePoint2;//直線坐標的起點、終點

          2) 為畫相應機械臂,需要相應畫筆設備環境,同時,可以建立一個水平線作為假設的地面,地面可采用系統默認畫筆畫出,由于機械臂和地面在應用程序運行始終一直出現,同樣,應將其作為視圖類的成員:

          CPen m_Pen1;//定義畫機械臂的畫筆

          并在視圖類的構造函數中,初始化機械臂的畫筆為:

          m_Pen1.CreatePen(PS_SOLID,2,RGB(0,0,0));

          3) 在視圖OnDraw()函數中創建客戶區設備描述上下文,并調用設備描述上下文畫相應的機械臂和地面,從而顯示應用程序初始界面;

          4) 在WorkSpace中進入資源類視圖ResourceView,選擇Menu選項,并進入主框架界面,在菜單欄添加菜單(設以"控制命令"作為其標題屬性Caption),在其上加入相應命令,比如以“豎立”作為其Caption屬性,而其ID設為“ID_COM_StandUp”;

          5) 按快捷鍵“Ctrl+W”或選擇VC工程菜單欄上的“視圖”(View)->“類向導”(ClassWizard),進入類向導,從“對象標識”(Object ID)選中剛才加入的命令的標識“ID_COM_StandUp”,然后從“類名”(Class Name)選中工程中的視圖類名(這步以后,就確定命令按鈕的消息由視圖類來響應),從“消息”(Messages)中選中COMMAND,此時單擊“增加函數”(Add Functions…),“確定”之后,再單擊“編輯函數”(Edit code),“確定”之后即進入新創建的函數,在里面添加代碼使機械臂完成相應動作。

          6) 根據需要,相應重復上述步驟,可添加其它命令功能。

          2、語音控制機械臂完成同樣的動作功能

          語音控制應用程序的開發流程比較固定,即:

          1)   首先,要加入庫,即上面第二章的步驟;

          2)   要初始化COM接口,這個過程是:

                 首先要在StdAfx.h頭文件中#endif之前加入:  

                 #include<atlbase.h> 

                 extern CComModule_Module;

                 #include<atlcom.h>

                 接著要初始化COM接口,只能是在CWinApp子類中,加入

                ::CoInitiallizeEx(NULL,COINIT_APARTMENTTHREADED);

          3)   創建語音識別引擎;

              在視圖類中建立定義COM的引擎對象:

              CComPtr<ISpRecognizer> m_Recognizer;

             并在視圖類的適當位置實例化引擎對象,在這里有點小技巧,即:應使引擎對象在應用程序顯示主窗口之后、進行任何操作之前,經查,符合此要求的函數有一個CView類的OnInitialUpdate()函數,那么我們要在程序視圖類中重載該函數,視圖類的頭文件中的Overrides下,添加:virtual void OnInitialUpdate(),并在視圖類的CPP文件中添加該函數,并在該函數中添加:

           HRESULT hr=S_OK;

          hr=m_Recognizer.CoCreateInstance(CLSID_SpSharedRecognizer);

          //Shared

           一個應用程序必須從兩個不同類型的語音識別引擎(ISpRecognizer)中選擇一種。一種是可以與其它語音識別程序共享識別器的語音識別引擎,這在大多數識別程序中被推薦使用。為了為IspRecognizer建立一個共享的ISpRecoContext接口,一個應用程序只需要用CLSID_SpSharedRecoContext調用COM的 CoCreateInstance方法。這種方案中,SAPI將建立一個音頻輸入流,把它設置為SAPI默認的音頻輸入流。對于大型服務器程序,它可能在單獨在一個系統上運行,性能是關鍵,一個InProc語音識別引擎更適合,而且,獨立語音識別引擎InProc更適合特定人語音識別,為了為InProc ISpRecognizer建立一個IspRecoContext,程序必須首先用CLSID_SpInprocRecoInstance調用CoCreateInstance來建立屬于它自己的InProc IspRecognizer。然后程序必須調用ISpRecogniz

          -er::SetInput()來建立一個音頻輸入流 ;

          4)   創建語音識別上下文(這是核心,且也是放在OnInitialUpdate函數中);

              hr=m_Recognizer->CreateRecoContext(&m_RecoContext);

          5)   設定語法識別通知消息(用預處理命令,可以放在Resource.h中,如:#define WM_RECOEVENT WM_USER+102)及相應識別處理方法(函數),SetNotifyWindowMessage(m_hWnd,WM_RECOEVETN,0,0),并注意在后面應用程序中要建立消息映射:ON_MESSAGE(WM_RECOEVENT,OnRecoEvent)和定義消息(在頭文件中):afx_msg void OnRecoEvent(),并實現消息處理函數OnRecoEvent();

          6)   設置我們感興趣的事件,具體可參閱Speech SDK help.chm文檔中查看SPEVENTENUM(這里我只設對識別的感興趣);

               CONST ULONGLONG ullinterest=SPFEI(SPEI_RECOGNITION);

               hr=m_RecoContext->SetInterest(ullinterest,ullinterest);

          7)   創建語法對象,語法規則也有兩種類型,一種是聽寫型(Dictation)

          ,允許使用引擎中的大量短語,但識別效率低;另一種是命令和控制型(Comm    -and and Control),能最大限度地識別自定義的短語,故識別效率高 。程序中,我使用的是命令和控制型:首先,設置語法對象的ID(用預處理命令#define *);其次,加載語法規則(LoadCmdFrom());

                 //創建命令式語法 1、創建語法對象 2、加載語法規則

              hr=m_RecoContext->CreateGrammar(GIDCMDCTRL,&m_RecoGrammar);

                 //加載語法

                 WCHAR wszXMLFile[20]=L"";

              MultiByteToWideChar(CP_ACP,0,(LPCSTR)"CmdStrl.xml",-1,wszXMLFile,256);//ANSI轉換為UNICODE

                 if(SUCCEEDED(hr))

                 {

              hr=m_RecoGrammar->LoadCmdFromFile(wszXMLFile,SPLO_DYNAMIC);

                     if(FAILED(hr))

                        MessageBox("LoadFile Error!");

                 }

          注意,如果是開發聽寫式語音應用程序,則為:

          hr = m_cpDictationGrammar->LoadDictation(NULL, SPLO_STATIC);//加載詞典

          8)   而在命令和控制型中,語法規則用xml格式,參見Speech SDK 5.1 中的 Designing Grammar Rules,那么程序中我的語法文件為CmdStrl.xml:

           <?xml version="1.0" encoding="gb2312"?>

             -<GRAMMAR LANGID="804">

             -<DEFINE>

            <IDNAME="CMD" VAL="10" />

            </DEFINE>

           -<RULE NAME="COMMAND" ID="CMD" TOPLEVEL="ACTIVE">

           -<L>

            <p>豎立</p>

            <p>右旋轉</p>

            <p>倒下</p>

            <p>左旋轉</p>

              </L>

              </RULE>

              </GRAMMAR>

          9)   在開始識別時,激活語法對象;

           hr=m_RecoGrammar->SetRuleState(NULL,NULL,SPRS_ACTIVE);//C&C

          10) 獲取識別消息并進行處理,放在OnRecoEvent()中;

          11)  在語法識別消息處理之后,另一個函數中,或在整個應用程序退出前釋放掉語音識別語法對象、上下文、引擎等,只需調用相應對象的Re   -lease()方法即可。

              注意,千萬不要在識別消息處理方法的最后,即退出該方法之前釋放掉相應接口,否則會出現bug,即在你每一次運行程序時,它只能識別一個語音消息,再在第二次運行該應用程序時有可能出現響應上一次運行時最后輸入的語音消息響應。

          3.3 重要算法實現

          1、直線旋轉

          (一)“豎立”和“倒下”功能的實現

          a.     直線旋轉算法有多種,當我們選用勾股定理時,我們只須知道直線的長度和直接線的坐標即可,而直線長度易得到,因為預設“豎立”和“倒下”前初態機械臂在地面上,因此,直線的長度為初態時終點橫坐標減去其起點橫坐標,而且顯然,直線在旋轉中應長度不變,因此,我們最好將其長度也作為視圖類的成員,理由同上述將直線的坐標作為視圖類成員一樣。

              那么我們每次旋轉直線時,其實只是定好參考點作為圓心,那么這里顯然是以起點作為圓心,只須每次重畫時,將原來的線刷新掉,再重畫終點并將起點與終點連接起來即可,其實這也是直線旋轉算法的思路。當我們用勾股定理來實現直線旋時,如圖3-2

          圖3-2勾股定理畫線旋轉圖

              測試:運行發現,當直線豎立時,旋轉角度太大,一兩步就豎立了,顯然看上去直線旋轉不流暢,缺乏美感和真實感,此方法不行,那么為什么會出現這樣的問題,仔細推算,原因在于,直線坐標是LONG型,而經過勾股定理的計算,先平方再開方,算得的是浮點型,再在式子中取為LONG型,會丟失許多數據。

          b.     再考慮其它實現方法,由于直線的初始狀態比較特殊,又只是到豎立狀態,所以這里可采用相對坐標和旋轉角度來求直線終點坐標,即利用直線長和角度的余弦或正弦來求,由于MFC視圖中默認坐標系是原點為左上角,水平向右為橫軸,豎直向下為豎軸,因此,逆時針方向角度則為負值,算法為:

          m_LinePt2.x=long(m_LinePt1.x+m_LineLen*cos(-Beta/180.0*Pi));

          m_LinePt2.y=long(m_LinePt1.y+m_LineLen*sin(-Beta/180.0*Pi));

          (其中,直線起點終終不變,變化的只是角度Beta大小即可,當Beta角度為90度時循環終止即可)

              測試:運行發現,角度Beta可以靈活設置,可以設置得較小,那么當時直線旋轉時,上述a中的問題就徹底解決了,既變化角度可控,又視圖流暢,而且上述算法每個終態只與其各自初態相關,算法簡單,計算量小。

          (二)那么當實現直線其它旋轉算法時,是不是都可直接用上面的公式呢?顯然,實現直線倒下,可以采用上述類似算法,但當實現直線左右旋轉時,上述算法不可行,因為上述算法中因為直線初態本身是水上平的,所以用相對坐標和角度時,每次角度變化所作的變化恰好是水平坐標相對起點(水平坐標)的變化,縱坐標的變化也恰好是縱坐標相對起點縱坐標的變化,但當假設直線初始狀態為某個傾斜角度時,角度的變化卻不是相當于終點縱坐標的相對于起點縱坐標的變化。那么這時,只能找其它方法,根據計算機圖形學知識相關知識:旋轉是以某個參考點為圓心,將對象上的各個點(x,y)變為新的坐標(x′,y′)的變化。當參考點為(0,0)時,旋轉公式為:

               

          ,所以上述公式可以變為:

            

          如果參考點不是 ,而是任意一點 ,那么,繞 點的旋轉由三個步驟完成

          (1)將對象平移 ;

          (2)按(式1)作旋轉變換;

          (3)平移 。

          組合這三個步驟的計算公式為:

          3-3 圖形旋轉算法坐標圖

          當然,根據MFC繪圖中坐標系,這里角度表示意義可能不一樣。算法流程圖類似圖3-2,只是將算法改為圖3-3演示的算法,并將終止條件稍變即可。

          測試:通過上述算法,并在“左旋轉”和“右旋轉”時只是角度正負做對應調整即可,實現的旋轉也具有真實感和美感。

          我們發現,由b中算法簡單,但適用范圍太小,由c中算法通用,但計算量很大,復雜,總之,具上,當為“豎立”和“倒下”時采用b算法,當為“左/右旋轉”時,采用算法c;

          2、語音判斷分支的選取

          通過查資料,當我們采用CSpEvent::RecoResult()->GetText(0,-1,…)提取到要識別的所有命令時,一般的資料是采CString::CollateNoCase                        (_T(“…”))或CString::CompareNoCase(_T(“…”)),本程序開始也是采用此方法,即在OnRecoEvent()方法中采用如下代碼時:

             HRESULT hr=S_OK;

             USES_CONVERSION;

             CSpEvent event;

             while(hr=event.GetFrom(m_RecoContext)==S_OK)

              { 

                 switch(event.eEventId)

                {   

                 case SPEI_RECOGNITION:

                 m_GotReco=TRUE;

                 static const WCHAR wszUnrecognized[]=L"<Unrecognized>";

                 CSpDynamicString dstrText;     if(FAILED(event.RecoResult()->GetText(0,-1,TRUE,&dstrText,NULL)))

                 {dstrText=wszUnrecognized;

                 }

                 /* BSTR, known as basic string or binary string, is a pointer to a wide

                 character string used by Automation data manipulation functions.*/

                  BSTR SRout;

                 dstrText.CopyToBSTR(&SRout);//allocates a system BSTR

                 CString Restring;

                 Restring.Empty();

                 Restring=SRout;

              if(1==!Restring.CollateNoCase(_T("豎立")))              {OnCOMStandUp();break;}

          ……

          測試:發現程序能夠識別語法文件“CmdStrl.xml”中定義的命令,但是執行多次便能夠發現問題,當我們在運行程序后,使用“豎立”語音命令后,程序中機械臂正確豎立,當我們再隨意用語音,比如說:“OK”"OR"、"RUN"、"RETURN"后,程序運行會出現一會兒豎立、一會兒倒下,顯然與我們的期望不符。

          再通過這個問題我們來查找原因,其實,當取出識別的語音后轉換成CString類型,語音輸入判斷分支中,用CString的CollateNoCase()方法時,當比如說取得的語音與我們預定義的語法庫中的字符串相比較,結果為0時,經過取反,計算機得到為1,這樣也觸發了識別控制命令,然后同樣去調用了相應的動作執行過程(函數),產生與我們的期望的不相符的結果。

          那么,為解決問題,我們需找到另一個方法,顯然我們還是在CString類中找其它方法,經過查找MSDN,我們找到了CString::Compare()方法,我們將上面的if(1==!Restring.CollateNoCase(_T("…"))) 改為 if(0== Restring.Compare(_T("…)))后,再多次運行,最終解決了問題。

          3、說明幫助文檔的解決

          由于本程序只是簡單語音命令控制程序,同時第一次接觸該程序的用戶不一定知道如何使用,所以必須在運行程序的第一個界面就能使用戶看到說明文檔,那么如何解決呢?在程序中,我們可以看到,由于是采用SDI應用程序架構,且進入初始界面時,視圖區域大部分是空白,顯然我們可以在這個背景上顯示說明文檔,為此,可調用設備環境的TextOut()來裝載我們已寫好的說明文本資源,并且,我們應將這些顯示文檔放在旋轉算法的循環之外,這樣每次直線旋轉時并不影響其視覺感觀,而地面(水平線)的繪制應放在其循環中,這樣直線旋轉時始終有地面這個參照物,符合真實感觀,其它的還有小的功能模塊也可以簡單實現。

              當然,為了確定做完某一個動作后機械臂(直線)的狀態,我們可以添加一個視圖類的成員,每次執行一個動作,便將其值設為相應值,在最終顯示時的OnDraw()方法中,每次判斷最后一次做的動作并繪制其最終應顯示的狀態。

          程序運行初始界面如圖3-4:

          圖3-4 程序運行初始界面圖

          程序旋轉過程中在某一時刻恰豎立狀態如圖3-5:

          圖3-5 程序運行時刻圖

          4 不足及其改進

          1.程序稍微簡單,機械臂只能實現簡單動作,有待后續拓展與開發;

          2.機械臂旋轉過程中還應可以暫停,并可以更加精細地控制機械頭旋轉的動作,當然,正如1所述,有待在現有程序上拓展與開發;

          3.刷新問題沒有解決好,在機械臂旋轉重繪中,本程序用的是全局刷新函數::InvalidateRect(NULL,NULL,TRUE);其最終是刷新了桌面上打開的所有窗口與圖標,但嘗試過,目前該程序中只有此方法才能實現所希望的旋轉,這個有待查找更好的方法(函數)。

          5 總結與展望

          5.1 總結

          本論文主要討論了針對語音識別技術在計算機交互界面的應用研究而開發的一個程序,并著重討論了基于MFC開發語音識別程序的主要流程、開發過程中涉及的部分算法,并誠實指出本程序的不足與改進。本論文的工作主要包括以下幾點:

          1.MFC繪圖和直線旋轉算法:主要是關于按鈕消息映射與響應、視圖中繪圖設備的定義和刷新來實現直線旋轉算法的內容。

          2.語音控制的實現:主要是開發語音識別命令控制應用程序的步驟與注意事項,并探討分析語法庫的提取、語音判斷分支的方法選擇及控制響應。

          3.簡述應用幫助說明功能塊的解決。

          可見,語音識別和人機交互技術結合應用于計算機語音交互有很重大的學術價值和實用價值。隨著信息社會的發展,尤其是語音技術在嵌入式發展的巨大實用前景,必定有更多的人員進行語音交互界面的應用研究,本論文的研究只是其中的一個試驗,我也將在后續工作中繼續進行完善,繼續進行這方面的研究。

          5.2 展望

          語音技術的發展仍將充滿活力,對語音識別的研究與應用將一直具有遠大前景與重要意義,即:將最終實現人與機器進行自然語音交互這一目標。在這一目標下,我們將看到的是,在語音識別研究及其應用方面,困繞語音識別的上述所述問題將得到很大的解決,協同發音、噪音影響、模式匹配速度慢、特征提取準確度等問題將不再是語音識別技術應用的阻力;而與此同時,在現實中,用戶體驗將全然一新,人類不再受制于鍵盤、鼠標、顯示器等圖形用戶接口,人將更習慣于用命令或語音來控制計算機或機器人來為自己服務,使機器成為我們的“知音”,成為我們人類的朋友,成為人類生理的一部分。

          而且,在云技術及移動互聯等快速發展及其促進下,語音識別技術將是人工智能必不可少數的功能模塊,語音識別將是人機交互的主要界面。

          致謝

          終于在不斷的學習與克服困惑中,將要完成自己的畢業論文,在這個過程中,逐漸明白:盡早地定位錯誤在開發中非常重要;碰到問題要解決問題;編程開發要持之以恒,才能有較大進步。在這個過程中,要感謝童老師,從最初定題、資料收集、論文修正與指點,每一個時刻都有童老師在背后給予關注,并且,還能寬容地給予足夠時間,讓我平靜細心寫自己的論文,當然,在這個過程中,也還有好朋友、同學給予硬件和軟件的輔助或指點,在此深表感謝!

           

           

           

           

           

           

           

           

           

           

           

           

           

           

           

           

          參考文獻

          [1]邢銘生,朱浩,王宏斌.語音識別技術綜述.科協論壇[J].2010.3(下)

          [2]付勇,童強老師.計算機語音交互界面應用研究.湖北師范學院2010屆計算機科學與技術學院畢業論文(設計).2010.5.20:1~39.

          [3]肖瑋,使用SAPI實現語音識別與合成.現代計算機[J].2005.2(第二0五期).

          [4]呂爭,吳明慧.基于語音的人機交互界面的研究與實現[J].荊門職業技術學院學報,2007,22(6): 14~18.

          [5]百度百科.API[EB/OL]. http://baike.baidu.com/view/16068.htm, 2011.4.3.

          [6]童強.delphi實現電腦語音控制程序[J].微計算機信息.2006.3: 21~23.

          [7]何好義,計算機語音識別技術與及其應用.大眾科技[J].2005.6期(總第80期).

          [8]Lorenzo Platteau,Talk to your applications[J].2003.11.7.

          [9]馬孜卓,Microsoft Speech SDK及語音技術研究[J].2010.3.

          [10]陳一寧,朱璇等.語音識別開發工具包SRDK的研究與開發.計算機工程與應用.2003.1.

          [11]邢銘生,朱浩,王宏斌.語音識別技術綜述.科學文壇,2010年第三期(下):62~63.

          posted on 2011-08-11 21:54 Hua Hero 閱讀(545) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          <2025年7月>
          293012345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          導航

          統計

          常用鏈接

          留言簿

          隨筆檔案

          文章檔案

          搜索

          最新評論

          主站蜘蛛池模板: 青神县| 五寨县| 绥棱县| 阿拉善盟| 衡水市| 齐河县| 米易县| 荔波县| 南召县| 宜城市| 武胜县| 潮安县| 遂溪县| 东至县| 谷城县| 新津县| 舞钢市| 沙洋县| 枣庄市| 肥西县| 道真| 巧家县| 威海市| 康保县| 平远县| 黑河市| 昂仁县| 灌南县| 台湾省| 宜宾市| 洞头县| 广州市| 泽普县| 仙居县| 濮阳市| 辰溪县| 北流市| 平塘县| 东方市| 香格里拉县| 龙海市|