崑山科技大學 資訊工程 系...

45
崑山科技大學 資訊工程系 學生專題製作報告 體感遙控電視機的設計與實現 Design and Implement of Motion Sensor Remote Controlling the Television 指導教授:黃慶祥 博士 專題組員:宋佩鴻 學號:4980E046 中華民國 102 06

Upload: others

Post on 13-Aug-2020

6 views

Category:

Documents


0 download

TRANSCRIPT

  • 崑 山 科 技 大 學 資 訊 工 程 系

    學 生 專 題 製 作 報 告

    體感遙控電視機的設計與實現

    Design and Implement of Motion Sensor Remote Controlling the Television

    指導教授:黃慶祥 博士

    專題組員:宋佩鴻 學號:4980E046

    中華民國 102 年 06 月

  • 體感遙控電視機的設計與實現 Design and Implement of Motion Sensor Remote Controlling the

    Television

    學 生:宋佩鴻 Student: Sung, Pei-Hung

    指導老師:黃慶祥 Advisor: Hwang, Ching-Shine

    崑山科技大學 資訊工程系 專題報告

    A Report Submitted to Department of Information Engineering

    Kun Shan University in Partial Fulfillment of the Requirements

    for the Degree of Bachelor in

    Information Engineering June 2013

    Tainan, Taiwan, Republic of China

    中華民國 102 年 06 月

  • I

    體感遙控電視機的設計與實現

    學生:宋佩鴻 指導老師:黃慶祥

    崑山科技大學資訊工程系

    摘 要 本研究採文獻調查法進行,主要探討家庭當中電視以體感方式的操作,所開

    發的系統採用市售的體感裝置、電視棒及筆記型電腦達成研究成果。這是最後決

    定達成成果的設備,在之前還有想過所有的軟體、韌體裝在隨身碟上和一般的視

    訊裝置,插在電視上即能操作,為第二方案,但較難達成所以決定目前的方式。 開發期間針對情境設計操作情形,如年長者操作、多人操作、特殊姿勢操作,

    主要以「能夠直覺地操作」為開發目標。 當中,較困難部分為兩處,一為長者操作,須考量年長者身體弱化情形配合

    設計手勢;另一部分為特殊姿勢辨識,由於技術上判別的方式,導致特殊姿勢無

    法辨識使用者為人型,即無法操作;前者已透過好的設計解決,後者仍在研究克

    服中。 程式部分主要參考官方提供的範例、網路上部落客的程式範例去做修改,額外要做的部分,就是把參考用的程式不必要的片段刪除,尤其是官方的參考是包

    含了全部的應用。 在展示時衍生了另一個問題,電視棒需要電視線或天線,需要在接近戶外的地方才能接收到電視訊號,如果訊號不佳,會影響到觀看的部分,使用者將誤會

    是系統上的問題,這是非常可笑的硬體部分,會場必須具有外來的電視訊號,否

    則必須自行架設接收天線,這已脫離了系統探討的部分。 關鍵詞:體感、手勢、操作、遙控器、家庭、直覺

  • II

    誌 謝

    專題製作開始到現在過了一年多,由於我的專題是只有我一個人

    All in one 包辦、所有的問題都要自己處理,所以學習到了各方面的事情,不是因為不想尋找組員共同研究,但曾經有一位來詢問的同學,

    我只提問了「你對我的專題有興趣嗎?」他就打退堂鼓了。由於我每

    次 Meeting 鮮少出席報告進度,也幾乎在忙實習的事,專題的部分可能只實佔了 2、3 個月的時間,感謝黃慶祥老師相信我都能達到進度且沒有過問太多和追查進度,老師也常常追隨新的知識,在每次 Meeting的時候與家族成員分享、並且寄信給各位,讓大家有一些新的想法與

    點子。

  • III

    目 錄(Contents)

    摘要 ....................................................................................................................................... I 誌謝 ...................................................................................................................................... II 目錄 ..................................................................................................................................... III 表目錄 ................................................................................................................................. IV 圖目錄 .................................................................................................................................. V 一、 緒論 ............................................................................................................................. 1

    1.1 研究目的與動機 ................................................................................................................ 1 1.2 背景 .................................................................................................................................... 1

    二、相關研究 ....................................................................................................................... 2 2.1 硬體 .................................................................................................................................. 2

    2.1.1 市面 Kinect 體感裝置 .............................................................................................. 2 2.1.2 使用之 Kinect 體感裝置 .......................................................................................... 3 2.1.3 使用之電視棒 .......................................................................................................... 5

    2.2 套件及技術 ...................................................................................................................... 5 2.2.1 Microsoft Visual Studio 2010 (Software) .................................................... 5 2.2.2 Microsoft .NET Framework (API) ............................................................................ 6 2.2.3 Microsoft C# (語言) ................................................................................................. 6 2.2.4 XAML (語言) ............................................................................................................ 7 2.2.5 WPF (開發介面) ...................................................................................................... 7

    三、系統架構 ....................................................................................................................... 9 3.1 描述 .................................................................................................................................. 9 3.2 KINECT SDK 之架構 .......................................................................................................... 10 3.3 系統效能指標 ................................................................................................................ 11

    四、系統實作 ..................................................................................................................... 12 4.1 主介面 ............................................................................................................................ 12 4.2 介面設計程式碼 (XAML) ............................................................................................... 13 4.3 KINECT 基本色彩及骨架載入副程式+語音功能載入程式碼 (C#) ............................... 18 4.4 KINECT 基本色彩及骨架副程式+語音顯示框架+教學程式碼(C#) ............................... 26

    五、成果 ............................................................................................................................. 33 六、結論 ............................................................................................................................. 35 七、參考文獻 ..................................................................................................................... 36

    APPENDIX A:REFERENCE ............................................................................................................ 36 APPENDIX B:REFERENCE ............................................................................................................ 37

  • IV

    表 目 錄

    TABLE 2- 1 各種 KINECT 裝置......................................................................................................................... 2 TABLE 2- 2 「KINECT FOR WINDOWS」規格 ..................................................................................................... 4

  • V

    圖 目 錄

    FIGURE 2- 1 「KINECT FOR WINDOWS」裝置外型 ........................................................................................... 3 FIGURE 2- 2 「KINECT FOR WINDOWS」裝置外型(透視) ................................................................................. 3 FIGURE 2- 3 「KINECT FOR WINDOWS」USB 電源連接線與變壓器 ................................................................ 4 FIGURE 2- 4 「KINECT FOR WINDOWS」與電腦連接情形 ............................................................................... 4 FIGURE 2- 5 使用電視棒的廠商與型號 ...................................................................................................... 5 FIGURE 3- 1 MSRCTV 系統模組架構圖 ........................................................................................................ 9 FIGURE 3- 2 感應器接收溝通「NUI 資料庫」提供應用程式示意圖...................................................... 10 FIGURE 3- 3 「KINECT SDK」架構圖 ........................................................................................................... 10 FIGURE 4- 1 使用畫面 ................................................................................................................................ 12

  • 1

    一、 緒論

    1.1 研究目的與動機

    體感遙控電視機的設計與實現 (Design and Implement of Motion Sensor

    Remote Controlling the Television, MSRCTV )包括 VID子系統(Video Image

    Detection Subsystem)、SR子系統(Speech Recognition Subsystem)。專案

    目的是以應用體感控制家庭中的電視機為主,期望能代替電視遙控器;可以

    避免遙控器故障或遺失的問題,不適用於公眾進出場合或廣告看板,希望還

    能夠提供一些銀髮族樂活、運動、互動之效果。

    1.2 背景

    老年化社會多見於發達國家,在台灣人口老化亦不是例外,為了迎防趨

    勢走向,科技發展紛紛出現相關研究之發表,像是『居家照護』、『居家監控』

    等論文及系統。資訊家電在科技時代也漸漸進入主流,利用無線或有線通訊

    方式,讓居家可統一由單一電腦或任何嵌入式系統管理;讓遠在外處的時候,

    操作及監控居家任電器及現場狀況。除了電腦及手機,家電也陸續進入了智

    慧型階段;都市的發展,運動也越來越室內化,電視遊樂器也開始有相似於

    室外運動及健身器材效果的遊戲,出現了各種偵測技術之應用;在達到娛樂

    效果之外,技術的克服,模擬的情況及情境也漸能做到仿真的效果,如:擴

    增實境。

    市面上三星公司的產品 smart TV 之體感操控功能與本系統為相同,差異

    性在於,本系統大大的降低了價錢,即可以體驗到體感操作的功能與樂趣,

    且更新系統相當容易快速,語音的命令也能夠符合台灣地區語言做設計。

  • 2

    二、相關研究

    2.1 硬體

    2.1.1 市面 Kinect 體感裝置

    目前市售的 Kinect 有三種,加上最近發表會未販售的共四種機型:

    Kinect for Xbox One

    (Xbox One) 僅發表尚未發售

    Kinect for Xbox 360

    (Xbox 360)

    引自:www.extremetech.com

    引自:Brian's Planes

    Kinect for Windows

    (Windows Vista / 7 onwards)

    本專題使用

    Kinect Limited Edition

    Star Wars Bundle

    (XBOX 360)

    引自:www.derivative.ca

    引自:www.microsoftstore.com

    Table 2- 1 各種 Kinect 裝置

    尤其為 Table 2-1 左上方的「Kinect for Xbox One」(2013 年 5 月 21 日記者

    會上發表,尚未發售)為目前最新型之 Kinect 體感裝置,比其他任何一種版本

    較有更高畫質的 1080p 鏡頭、加強之陣列麥克風、夜視加強……等。

    http://techfastclub.com/2013/05/25/always-online-well-get-back-to-you-on-that-one/#more-858http://92500232rc.wordpress.com/2013/02/24/using-xbox-360-kinect-on-a-windows-pc/http://www.derivative.ca/wiki088/index.php?title=Kinecthttp://dri1.img.digitalrivercontent.net/Storefront/Company/msstore/images/hardware/pdp/en-US_Xbox360_Kinect_Bndle_Star_Wars_Mill_5XK-00001.jpg

  • 3

    2.1.2 使用之 Kinect 體感裝置

    不過作為開放開發使用的機型為 Table 2-1 左下方的「Kinect for

    Windows」,以下為構造詳細介紹:

    Figure 2- 1 「Kinect for Windows」裝置外型

    引自:Kinect Genius Bar Figure 2- 2 「Kinect for Windows」裝置外型(透視)

    以下規格以「Kinect for Windows」為主:

    項目 功能

    顏色與深度、骨架追蹤 可探測到 0.8~4 公尺(近距離模式 0.4~3 公尺)

    視野角度 水平 57 度、垂直 43 度

    底座馬達旋轉 上下各 27 度

    每秒畫格 12、15、30 FPS(可由 API 改變)

    深度解析度 VGA(640x480)、QVGA(320x240)(80x60);比例皆為 4:3

    顏色解析度 VGA(640x480)、XSGA(1280x960);比例皆為 4:3

    聲音格式 16KHz,32bit 單聲道 PCM(Pulse Code Modulation)

    3D 深度影像探測鏡頭

    RGB 彩色影像探測鏡頭

    陣列式麥克風 傾斜馬達

    http://kinectgeniusbar.com/tag/voice-recognition/

  • 4

    聲音輸入 麥克風陣列、24bit 類比數位轉換(ADC) 、

    聲學回音消除(AEC)、自動增益功能(AGC)、抑制噪音

    Table 2- 2 「Kinect for Windows」規格

    Figure 2- 3 「Kinect for Windows」USB 電源連接線與變壓器

    引自:www.microsoftstore.com

    Figure 2- 4 「Kinect for Windows」與電腦連接情形

    引自:Packtlib.packtpub.com

    http://www.microsoftstore.com/store/msusa/en_US/pdp/productID.253690100https://packtlib.packtpub.com/library/kinect-for-windows-software-development-kit-programming-guide/ch02lvl1sec15

  • 5

    2.1.3 使用之電視棒

    本專題採用『登昌恆興業股份有限公司』之「DVB192A HD 數位電視棒」:

    Figure 2- 5 使用電視棒的廠商與型號 引自:www.upmostgroup.com.tw

    2.2 套件及技術

    2.2.1 Microsoft Visual Studio 2010 (Software)

    Microsoft Visual Studio(簡稱 VS)是美國微軟公司的開發工具套件系列

    產品。VS 是一個基本完整的開發工具集,它包括了整個軟體生命周期中所需

    要的大部分工具,如 UML 工具、代碼管控工具、整合式開發環境(IDE)等等。

    所寫的目的碼適用於微軟支援的所有平台,包括 Microsoft Windows、Windows

    Mobile、Windows CE、.NET Framework、.NET Compact Framework 和 Microsoft

    Silverlight。

    而Visual Studio .NET是用於快速生成企業級ASP.NET Web應用程式和高

    http://www.upmostgroup.com.tw/product_detail.php?prod_id=773

  • 6

    效能桌面應用程式的工具。Visual Studio 包含基於元件的開發工具(如 Visual

    C#、Visual J#、Visual Basic 和 Visual C++),以及許多用於簡化基於小組的解

    決方案的設計、開發和部署的其他技術。

    2.2.2 Microsoft .NET Framework (API)

    .NET Framework 是由微軟開發,一個致力於敏捷軟體開發(Agile

    software development)、快速應用開發(Rapid application development)、平臺

    無關性和網路透明化的軟體開發平臺。.NET 是微軟為下一個十年對伺服器和

    桌上型軟體工程邁出的第一步。NET 包含許多有助於網際網路和內部網應用

    迅捷開發的技術。

    .NET Framework 是微軟公司繼 Windows DNA 之後的新開發平臺。.NET

    Framework 是以一種採用系統虛擬機執行的編程平臺,以通用語言執行庫

    (Common Language Runtime)為基礎,支援多種語言(C#、VB.NET、C++、

    Python 等)的開發。

    .NET 也為應用程式介面(API)提供了新功能和開發工具。這些革新使

    得程式設計員可以同時進行 Windows 應用軟體和網路應用軟體以及元件和服

    務(web 服務)的開發。.NET 提供了一個新的反射性的且物件導向程式設計

    編程介面。.NET 設計得足夠通用化從而使許多不同高階語言都得以被彙集。

    2.2.3 Microsoft C# (語言)

    C#是微軟推出的一種基於.NET 框架的、物件導向的高階程式語言。C#

    由 C 語言和 C++衍生而來,繼承了其強大的效能,同時又以.NET 框架類別庫

    作為基礎,擁有類似 Visual Basic 的快速開發能力。C#由安德斯·海爾斯伯格

    主持開發,微軟在 2000 年發行了這種語言。

    ECMA 標準列出的 C#設計標的:

    C#旨在設計成為一種「簡單、現代、通用」,以及物件導向的程式語言

    此種語言的實作,應提供對於以下軟體工程要素的支援:Strongly type 的

  • 7

    檢查、陣列維度檢查、未初始化的變數參照檢測、自動垃圾收集(Garbage

    Collection,指一種記憶體自動釋放技術)。軟體必須做到強大、持久,並

    具有較強程式開發的生產力。

    此種語言為在分散式環境中的開發提供適用的元件開發應用。

    為使程式設計師容易遷移到這種語言,原始碼的可移植性十分重要,尤

    其是對於那些已熟悉 C 和 C++的程式設計師而言。

    對國際化的支援非常重要。

    C#適合為獨立和嵌入式的系統編寫程式,從使用複雜作業系統的大型系

    統到特定應用的小型系統均適用。

    雖然 C#程式在儲存和操作能力需求方面具備經濟性,但此種語言並不能

    在效能和程式大小方面與 C 語言或組合語言相抗衡。

    2.2.4 XAML (語言)

    Extensible Application Markup Language,XAML,是 WPF(Windows

    Presentation Foundation)的一部分,是一種 XML 的使用者介面描述語言,有

    著 HTML 的外觀,又揉合了 XML 語法的本質,例如:可以使用標籤

    設定按鈕(Button)。類似 Linux 平台下的 glade。至於 WinFX XAML Browser

    Application(XBAP)是用 XAML 作介面描述,在瀏覽器中執行的程式,可取

    代過去的 ActiveX、Java Applet、Flash。

    XAML 本質上屬於一種.NET Programming Language,屬於通用語言執行

    時(Common Language Runtime),同 C#、VB.NET 等同。與 HTML 類似,特

    點是用來描述使用者介面。XAML 的語法格式為:,Application

    是必備的基本元素。XAML 可以定義 2D 和 3D 物件、旋轉(rotations)、動

    畫(animations),以及各式各樣的效果。

    2.2.5 WPF (開發介面)

    Windows Presentation Foundation(WPF)是美國微軟公司推出.NET

    Framework 3.0 及以後版本的組成部分之一,它是一套基於 XML、.NET

  • 8

    Framework、向量繪圖技術的展示層開發框架,微軟視其為下一代使用者介面

    技術,廣泛被用於 Windows Vista 的介面開發。

    WPF 使用一種新的 XAML(eXtensible Application Markup Language)語

    言來開發介面,這將把介面開發以及後台邏輯很好的分開,降低了耦合度,使

    使用者介面設計師與程式開發者能更好的合作,降低維護和更新的成本。

    WPF/E 是 WPF 的子集合,全名是:Windows Presentation Foundation

    Everywhere。在基於 XAML 與 JavaScript 之下,可跨越各種平台,目前 WPF/E

    已演化為 Microsoft Silverlight,擔負微軟在 RIA (Rich Interactive Application,

    Rich Internet Application) 領域,並正面與 Adobe Flash 競爭的產品。

  • 9

    三、系統架構

    3.1 描述

    本系統是由 WPF( Windows Presentation Foundation )編輯的應用程式,需

    要Microsoft .NET Framework環境的PC才能執行;Kinect SDK則需要Windows

    7 或是 Windows Vista 等級以上的 PC 才能安裝,在開發本系統時的 WPF 專案

    裡面之參考,內容包括了 Kinect 裝置的 API、語音控制 API 及滑鼠控制 API。

    為了達成以身體手勢的方式代替搖控器對電視的控制之功能,本專題開

    發的 MSRCTV 由 Windows 7 作業系統配合 Kinect SDK 環境之需、Kinect for

    Windows 及市面上的數位電視棒整合而成, MSRCTV 完全在於軟體的開發上

    且只針對家庭中開發使用。如 Figure 3-1 所示。

    Figure 3- 1 MSRCTV 系統模組架構圖

  • 10

    3.2 Kinect SDK 之架構

    Figure 3- 2 感應器接收溝通「NUI 資料庫」提供應用程式示意圖

    引自:msdn.microsoft.com

    Kinect 的 NUI 程式庫提供應用程式取得 Kinect 感應器傳送至主機的

    三種資訊串流 (必須在初始化 API 時指定要接收那幾種串流):

    彩色影像串流

    深度影像串流

    聲音串流

    Figure 3- 3 「Kinect SDK」架構圖

    引自:msdn.microsoft.com

    1. Kinect 硬體:

    這部份指的就是 Kinect 底座的馬達、三個攝影機 (RGB 攝影機、紅外

    線 CMOS 攝影機、紅外線發射器)、以及陣列式麥克風。

    2. Kinect 驅動程式

    核心模式下包含了以下驅動程式:

    http://msdn.microsoft.com/zh-tw/hh367958.aspxhttp://msdn.microsoft.com/zh-tw/hh367958.aspx

  • 11

    Microsoft Kinect Audio Array Control

    Microsoft Kinect Camera

    Microsoft Kinect Device

    Kinect USB Audio

    3. NUI API

    4. 麥克風陣列 DMO 編碼器

    5. Windows 7 內建影音處理:

    也就是架構圖中灰色底的部分,這就是為什麼 Kinect for Windows SDK

    只支援 Windows 7 的主要原因了。

    3.3 系統效能指標

    針對目標來進行系統方面的效能調校,避免為了不必要的需求,訂出了

    以下目標:

    回應時間(對於使用者下達命令,直到做出回應的時間)

    簡易操作(避免手勢命令難操作、且不易記住)

    直覺化(以使用者的角度,設計出人性化的操作)

    正確度(各種艱辛的情境,也能接收命令的達成度)

  • 12

    四、系統實作

    4.1 主介面

    開啟後基本上使用者只會看到鏡頭拍到的環境所呈現在電腦上的視窗,

    亦可將視窗隱藏。如 Figure 4-1 所示:

    Figure 4- 1 使用畫面

  • 13

    4.2 介面設計程式碼 (XAML)

    以下為介面設計的部分(XAML 語言),包含了語音命令顯示框架、操作

    教學彈出視窗、狀態、鏡頭串流呈現畫面框架:

    F1M150.001,146.9932L126.565,169.3822L126.565,153.5962L150.001,130.6182L173.435,153.5962L1

    73.435,169.3822z

    0.5,0.5

    0.5,0.5

  • 14

    0.5,0.5

    0.5,0.5

  • 15

    Controls Basics

  • 16

    HorizontalScrollBarVisibility="Visible" VerticalScrollBarVisibility="Disabled">

  • 17

    手勢命令列表

    語音命令列表

  • 18

    4.3 Kinect 基本色彩及骨架載入副程式+語音功能載入程式碼 (C#)

    以下為設計 Kinect 偵測人體基本匯入設計的部分(C#語言),包含了色彩

    探測、骨架探測、語音載入 API 應用部分,其中語音部分較多段可以以 region

    到#endregion為一個單位做搜尋:

    #region 畫面深度色彩骨架及語音功能載入

    private void Window_Loaded(object sender, RoutedEventArgs e)

    {

    foreach (var sensor in KinectSensor.KinectSensors)

    {

    if (sensor.Status == KinectStatus.Connected)

    {

    try

    {

    //啟動彩色串流時順道設定影像品質

    //k.ColorStream.Enable(ColorImageFormat.RgbResolution640x480Fps30);

    k.ColorStream.Enable();

    k.DepthStream.Enable();

    k.SkeletonStream.Enable();

    k.AllFramesReady += new

    EventHandler(k_AllFramesReady);

    k.Start();

    // If we made it this far, we succeeded.

    k = sensor;

    break;

    }

    catch (System.IO.IOException) { }

    }

    }

    //平滑處理,防止高頻率微小抖動和突發大跳動造成的關節雜訊

    TransformSmoothParameters parameters = new TransformSmoothParameters();

    parameters.Smoothing = 0.7f;

    parameters.Correction = 0.3f;

    parameters.Prediction = 0.4f;

    parameters.JitterRadius = 1.0f;

    parameters.MaxDeviationRadius = 0.5f;

    k.SkeletonStream.Enable(parameters);

    //聲音辨位

    audiosource = k.AudioSource;

    BeamTracking();

    synthesizer = new SpeechSynthesizer();//宣告一個新的文字語音合成¡L

    Siri_Speech();//設定文字語音合成音量與速度

    this.speechRecognizer = this.CreateSpeechRecognizer();//初始化語音辨識,建立文

  • 19

    法字句

    if (this.speechRecognizer != null && k != null)

    {

    // 在"SDK Release Notes"裡有提到:語音初始化,需要等待4秒才能就緒

    this.readyTimer = new DispatcherTimer();

    this.readyTimer.Tick += this.ReadyTimerTick;

    this.readyTimer.Interval = new TimeSpan(0, 0, 4);//等待4秒

    this.readyTimer.Start();

    //this.ReportSpeechStatus("初始化語音串流中...(請稍後)");

    textBlock1.Text = "初始化語音串流中...(請稍後)";

    textBlock2.Text = (string.Empty);

    }

    }

    #endregion

    #region 開啟kinect語音功能

    private void BeamTracking()

    {

    KinectAudioSource audioSource = AudioSourceSetup();

    //audioSource.BeamAngleChanged += audioSource_BeamAngleChanged;//

    //audioSource.SoundSourceAngleChanged +=

    audioSource_SoundSourceAngleChanged;//

    audioSource.SoundSourceAngleChanged += new

    EventHandler(audioSource_SoundSourceAngleChanged);////

    擇一

    audioSource.Start();

    }

    private static KinectAudioSource AudioSourceSetup()

    {

    KinectAudioSource source = audiosource;

    source.NoiseSuppression = true;

    source.AutomaticGainControlEnabled = true;

    source.BeamAngleMode = BeamAngleMode.Adaptive;

    return source;

    }

    #endregion

    #region 建立語音辨識,建立文法字句

    private SpeechRecognitionEngine CreateSpeechRecognizer()

    {

    RecognizerInfo ri = GetKinectRecognizer();//取得 Kinect 語音識別 if

    (ri == null)

    {

    System.Windows.MessageBox.Show(

    @"初始化語音識別有問題",

    "無法載入語音識別",

    MessageBoxButton.OK,

    MessageBoxImage.Error);

    this.Close();

    return null;

    }

    SpeechRecognitionEngine sre; //建立語音識別引擎

  • 20

    try

    {

    sre = new SpeechRecognitionEngine(ri.Id);

    }

    catch

    {

    System.Windows.MessageBox.Show(

    @"初始化語音識別有問題",

    "無法載入語音識別",

    MessageBoxButton.OK,

    MessageBoxImage.Error);

    this.Close();

    return null;

    }

    //========================================================

    //建立文法字句

    GrammarBuilder gBuilder = new GrammarBuilder();

    gBuilder.Culture = ri.Culture;

    gBuilder.Append(new Choices("Take", "Dan", "Zai", "Turn", "Hello", "Bye",

    "Speech", "Gesture", "Close", "Shut", "Hide", "Show", "Channel"));

    gBuilder.Append(new Choices("Picture", "See", "TV", "Bye", "Way", "one", "two",

    "three", "four", "five", "six", "seven", "eight", "nine", "ten", "eleven", "twelve",

    "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eightteen", "nineteen", "twenty",

    "up", "down", "bye", "help", "tutorials","Screen", "Next", "Previous"));

    //===============================================

    // Create the actual Grammar instance, and then load it into the speech recognizer.

    var g = new Grammar(gBuilder);

    sre.LoadGrammar(g); //建立文法字句 sre.SpeechRecognized += this.SreSpeechRecognized; //接受語音事件 sre.SpeechHypothesized += this.SreSpeechHypothesized; //推斷語音事件 sre.SpeechRecognitionRejected += this.SreSpeechRecognitionRejected; //拒絕語音事件

    return sre;

    }

    #endregion

    #region 初始化語音辨識

    private static RecognizerInfo GetKinectRecognizer()

    {

    Func matchingFunc = r =>

    {

    string value;

    r.AdditionalInfo.TryGetValue("Kinect", out value);

    return "True".Equals(value, StringComparison.InvariantCultureIgnoreCase) &&

    "en-US".Equals(r.Culture.Name, StringComparison.InvariantCultureIgnoreCase);

    };

    return

    SpeechRecognitionEngine.InstalledRecognizers().Where(matchingFunc).FirstOrDefault();

  • 21

    }

    #endregion

    #region ===拒絕語音事件=== private void SreSpeechRecognitionRejected(object sender,

    SpeechRecognitionRejectedEventArgs e)

    {

    this.RejectSpeech(e.Result);

    }

    private void RejectSpeech(RecognitionResult result)

    {

    string status = "拒絕語句: " + (result == null ? string.Empty : result.Text + "

    肯定度:" + result.Confidence);

    textBlock1.Text = status;

    var bc = new BrushConverter();

    textBlock1.Background =

    (System.Windows.Media.Brush)bc.ConvertFrom("#FFF8B2BC");

    }

    #endregion

    #region 推斷語音事件

    private void SreSpeechHypothesized(object sender, SpeechHypothesizedEventArgs e)

    {

    textBlock1.Text = "推斷語句: " + e.Result.Text + " 肯定度:" + e.Result.Confidence;

    }

    #endregion

    #region 接受語音事件

    private void SreSpeechRecognized(object sender, SpeechRecognizedEventArgs e)

    {

    if (AcceptSound == false)

    {

    if (e.Result.Confidence < 0.4) //肯定度低於0.6,判為錯誤語句Dy {

    this.RejectSpeech(e.Result);

    return;

    }

    var bd = new BrushConverter();

    textBlock1.Background =

    (System.Windows.Media.Brush)bd.ConvertFrom("#FF70D842");

    switch (e.Result.Text.ToUpperInvariant())

    {

    case "HI TV":

    case "HELLO TV":

    var ba = new BrushConverter();

    textBlock2.Background =

    (System.Windows.Media.Brush)ba.ConvertFrom("#FF70D842");

    textBlock2.Text = "音控開啟";

    Siri_Text = "What can I do for you ?";

    ok.Visibility = Visibility.Visible;

    AcceptSound = true;

    break;

  • 22

    case "WOW BEI QUAR DAN SEE":

    case "DAN SEE":

    var aa = new BrushConverter();

    textBlock2.Background =

    (System.Windows.Media.Brush)aa.ConvertFrom("#FF70D842");

    textBlock2.Text = "音控開啟";

    Siri_Text = "What can I do for you ?";

    ok.Visibility = Visibility.Visible;

    AcceptSound = true;

    break;

    case "BYE BYE TV":

    case "BYE BYE":

    case "BYE TV":

    var bb = new BrushConverter();

    textBlock2.Background =

    (System.Windows.Media.Brush)bb.ConvertFrom("#FFF8B2BC");

    textBlock2.Text = "音控關閉";

    Siri_Text = "Bye bye !";

    ok.Visibility = Visibility.Hidden; AcceptSound = false;

    break;

    case "ZAI GAME":

    var ab = new BrushConverter();

    textBlock2.Background =

    (System.Windows.Media.Brush)ab.ConvertFrom("#FFF8B2BC");

    textBlock2.Text = "音控關閉";

    Siri_Text = "Bye bye !";

    ok.Visibility = Visibility.Hidden;

    AcceptSound = false;

    break;

    case "CHANNEL ONE":

    Siri_Text = "頻道1";

    SendKeys.SendWait("{1}");

    break;

    case "CHANNEL TWO":

    Siri_Text = "頻道2";

    SendKeys.SendWait("{2}");

    break;

    case "CHANNEL THREE":

    Siri_Text = "頻道3";

    SendKeys.SendWait("{3}");

    break;

    case "CHANNEL FOUR":

    Siri_Text = "頻道4";

    SendKeys.SendWait("{4}");

    break;

    case "CHANNEL FIVE":

    Siri_Text = "頻道5";

    SendKeys.SendWait("{5}");

    break;

    case "CHANNEL SIX":

    Siri_Text = "頻道6";

    SendKeys.SendWait("{6}");

    break;

    case "CHANNEL SEVEN":

  • 23

    Siri_Text = "頻道7";

    SendKeys.SendWait("{7}");

    break;

    case "CHANNEL EIGHT":

    Siri_Text = "頻道8";

    SendKeys.SendWait("{8}");

    break;

    case "CHANNEL NINE":

    Siri_Text = "頻道9";

    SendKeys.SendWait("{9}");

    break;

    case "CHANNEL TEN":

    Siri_Text = "頻道10";

    SendKeys.SendWait("{1}");

    SendKeys.SendWait("{0}");

    break;

    case "CHANNEL ELEVEN":

    Siri_Text = "頻道11";

    SendKeys.SendWait("{1}");

    SendKeys.SendWait("{1}");

    break;

    case "CHANNEL TWELVE":

    Siri_Text = "頻道12";

    SendKeys.SendWait("{1}");

    SendKeys.SendWait("{2}");

    break;

    case "CHANNEL THIRTEEN":

    Siri_Text = "頻道13";

    SendKeys.SendWait("{1}");

    SendKeys.SendWait("{3}");

    break;

    case "CHANNEL FOURTEEN":

    Siri_Text = "頻道14";

    SendKeys.SendWait("{1}");

    SendKeys.SendWait("{4}");

    break;

    case "CHANNEL FIFTEEN":

    Siri_Text = "頻道15";

    SendKeys.SendWait("{1}");

    SendKeys.SendWait("{5}");

    break;

    case "CHANNEL SIXTEEN":

    Siri_Text = "頻道16";

    SendKeys.SendWait("{1}");

    SendKeys.SendWait("{6}");

    break;

    case "CHANNEL SEVENTEEN":

    Siri_Text = "頻道17";

    SendKeys.SendWait("{1}");

    SendKeys.SendWait("{7}");

    break;

    case "CHANNEL EIGHTEEN":

    Siri_Text = "頻道18";

    SendKeys.SendWait("{1}");

  • 24

    SendKeys.SendWait("{8}");

    break;

    case "CHANNEL NINETEEN":

    Siri_Text = "頻道19";

    SendKeys.SendWait("{1}");

    SendKeys.SendWait("{9}");

    break;

    case "CHANNEL TWENTY":

    Siri_Text = "頻道20";

    SendKeys.SendWait("{2}");

    SendKeys.SendWait("{0}");

    break;

    case "CHANNEL PREVIOUS":

    Siri_Text = "頻道往上";

    SendKeys.SendWait("{=}");

    break;

    case "CHANNEL NEXT":

    Siri_Text = "頻道往下";

    SendKeys.SendWait("{-}");

    break;

    case "TURN UP":

    Siri_Text = "音量升高";

    SendKeys.SendWait("{F10}");

    break;

    case "TURN DOWN":

    Siri_Text = "音量價低";

    SendKeys.SendWait("{F9}");

    break;

    case "TAKE PICTURE":

    Siri_Text = "照相成功;

    MyMediaElement.LoadedBehavior = MediaState.Manual;

    MyMediaElement.Source = new Uri(@"Music\camera01.wav",

    UriKind.RelativeOrAbsolute);

    MyMediaElement.Position = new TimeSpan(0, 0, 0);

    MyMediaElement.Play();

    ButtonScreenshotClick(null, null);

    break;

    case "GESTURE TUTORIALS":

    case "GESTURE HELP":

    Siri_Text = "顯示教學";

    ShowGestureTutorial(true);

    break;

    case "SPEECH TUTORIALS":

    case "SPEECH HELP":

    Siri_Text = "顯示教學";

    ShowSpeechTutorial(true);

    break;

    case "CLOSE TUTORIALS":

    case "CLOSE HELP":

    Siri_Text = "關閉教學";

    ShowGestureTutorial(false);

    ShowSpeechTutorial(false);

    break;

    case "SHUT DOWN":

  • 25

    Siri_Text = "Good bye my love";

    System.Windows.Application.Current.Shutdown();

    program_shutdown();

    break;

    case "SHOW SCREEN":

    Siri_Text = "SHOW SCREEN";

    this.Topmost = true;

    this.Visibility = Visibility.Visible;

    break;

    case "HIDE SCREEN":

    Siri_Text = "HIDE SCREEN";

    this.Topmost = false;

    this.Visibility = Visibility.Hidden;

    break;

    default:

    Siri_Text = "Sorry , I don't understand.";

    break;

    }

    }

    string status = "You: " + e.Result.Text + "\n Siri: " + Siri_Text +

    "\n===============";

    listBox.Items.Add(status);

    synthesizer.Speak(Siri_Text);

    }

    #endregion

    #region 文字合成音

    void Siri_Speech()

    {

    synthesizer.Volume = 100;//聲音大小(0 ~ 100)

    synthesizer.Rate = -2;//聲音速度(-10 ~ 10)

    }

    #endregion

    #region 目前語音狀態顯示

    private void ReportSpeechStatus(string status)

    {

    Dispatcher.BeginInvoke(new Action(() => { textBlock1.Text = status; }),

    DispatcherPriority.Normal);

    }

    private void UpdateInstructionsText(string instructions)

    {

    Dispatcher.BeginInvoke(new Action(() => { textBlock2.Text = instructions; }),

    DispatcherPriority.Normal);

    }

    private void ReadyTimerTick(object sender, EventArgs e)

    {

    this.Start();//讀a取Lu使LI用DI者I語y音£g

    textBlock1.Text = ("語音識別裝置已就緒");

    textBlock2.Text = ("提示:語音操作尚未開啟" );

  • 26

    this.readyTimer.Stop();

    this.readyTimer = null;

    }

    #endregion

    #region 初始化語音訊號

    private void Start()

    {

    var audioSource = k.AudioSource;

    audioSource.EchoCancellationMode = EchoCancellationMode.None; // No AEC for this

    sample

    audioSource.AutomaticGainControlEnabled = false; // Important to turn this off

    for speech recognition

    var kinectStream = audioSource.Start();//開啟Kinect語音串流

    Stream s = kinectStream;

    this.speechRecognizer.SetInputToAudioStream(

    s, new SpeechAudioFormatInfo(EncodingFormat.Pcm, 16000, 16, 1, 32000,

    2, null));

    this.speechRecognizer.RecognizeAsync(RecognizeMode.Multiple);

    }

    #endregion

    4.4 Kinect 基本色彩及骨架副程式+語音顯示框架+教學程式碼(C#)

    以下為設計 Kinect 偵測人體基本匯入設計的部分(C#語言),包含了色彩

    探測、骨架探測主要副程式部分:

    #region 骨架判斷

    void k_AllFramesReady(object sender, AllFramesReadyEventArgs e)

    {

    //SkeletonFrame sf = e.SkeletonFrame;

    /*

    DepthImageFrame depthFrame;

    short[] rawDepthDath = new short[depthFrame.PixelDataLength];

    depthFrame.CopyPixelDataTo(rawDepthDath);

    Byte[] pixels = new byte[depthFrame.Height * depthFrame.Width * 4];

    int player = rawDepthDath[depthIndex] & DepthImageFrame.PlayerIndexBitmask;

    if (player > 0)

    {

    }

    */

    using (ColorImageFrame frame = e.OpenColorImageFrame())

  • 27

    {

    if (frame != null)

    {

    byte[] pixelData = new byte[frame.PixelDataLength];

    frame.CopyPixelDataTo(pixelData);

    color.Source = BitmapImage.Create(frame.Width, frame.Height, 96, 96,

    PixelFormats.Bgr32, null, pixelData,

    frame.Width * frame.BytesPerPixel);

    }

    }

    using (SkeletonFrame skframe = e.OpenSkeletonFrame())

    {

    if (skframe != null)

    {

    Skeleton[] FrameSkeletons = new Skeleton[skframe.SkeletonArrayLength];

    skframe.CopySkeletonDataTo(FrameSkeletons);

    //抓第一個人

    int firstSkeleton = FrameSkeletons[0].TrackingId;

    //k.SkeletonStream.ChooseSkeletons(firstSkeleton);

    for (int i = 0; i < FrameSkeletons.Length; i++)

    //for (int i = 0; i < 2; i++)

    //

    //int i = 0;

    //if (SkeletonTrackingState.Tracked == firstSkeleton.TrackingState)

    if (FrameSkeletons[i].TrackingState ==

    SkeletonTrackingState.Tracked)

    {

    #region 骨架宣告(X座標,Y座標,Z座標)

    //增加"頭"骨架

    Joint headSkeleton = FrameSkeletons[i].Joints[JointType.Head];

    //增加"左手掌"骨架

    Joint leftHandSkeleton =

    FrameSkeletons[i].Joints[JointType.HandLeft];

    //增加"左手踝"骨架

    Joint wristLeftSkeleton =

    FrameSkeletons[i].Joints[JointType.WristLeft];

    //增加"左手臂"骨架

    Joint elbowLeftSkeleton =

    FrameSkeletons[i].Joints[JointType.ElbowLeft];

    //增加"左肩"骨架

    Joint shoulderLeftSkeleton =

    FrameSkeletons[i].Joints[JointType.ShoulderLeft];

    //增加"胸骨炳"骨架

    Joint shoulderCenterSkeleton =

    FrameSkeletons[i].Joints[JointType.ShoulderCenter];

    //增加"右肩"骨架

    Joint shoulderRightSkeleton =

    FrameSkeletons[i].Joints[JointType.ShoulderRight];

    //增加"右手臂"骨架

  • 28

    Joint elbowRightSkeleton =

    FrameSkeletons[i].Joints[JointType.ElbowRight];

    //增加"右手踝"骨架

    Joint wristRightSkeleton =

    FrameSkeletons[i].Joints[JointType.WristRight];

    //增加"右手掌"骨架

    Joint rightHandSkeleton =

    FrameSkeletons[i].Joints[JointType.HandRight];

    //增加"劍突"骨架

    Joint spineSkeleton =

    FrameSkeletons[i].Joints[JointType.Spine];

    //增加"左髖骨(左腰)"骨架

    Joint hipLeftSkeleton =

    FrameSkeletons[i].Joints[JointType.HipLeft];

    //增加"髖骨(膀胱肚臍)"骨架

    Joint hipCenterSkeleton =

    FrameSkeletons[i].Joints[JointType.HipCenter];

    //增加"右髖骨(右腰)"骨架

    Joint hipRightSkeleton =

    FrameSkeletons[i].Joints[JointType.HipRight];

    //增加"左膝蓋"骨架

    Joint kneeLeftSkeleton =

    FrameSkeletons[i].Joints[JointType.KneeLeft];

    //增加"左腳踝"骨架

    Joint ankleLeftSkeleton =

    FrameSkeletons[i].Joints[JointType.AnkleLeft];

    //增加"左腳踝"骨架

    Joint footLeftSkeleton =

    FrameSkeletons[i].Joints[JointType.FootLeft];

    //增加"右膝蓋"骨架

    Joint kneeRightSkeleton =

    FrameSkeletons[i].Joints[JointType.KneeRight];

    //增加"右膝蓋"骨架

    Joint ankleRightSkeleton =

    FrameSkeletons[i].Joints[JointType.AnkleRight];

    //增加"右腳踝"骨架

    Joint footRightSkeleton =

    FrameSkeletons[i].Joints[JointType.FootRight];

    #endregion

    /*#點對點距離用方法#*/

    GestureDection(shoulderLeftSkeleton,

    shoulderRightSkeleton,leftHandSkeleton, rightHandSkeleton, shoulderCenterSkeleton,

    hipCenterSkeleton, headSkeleton);

    }

    }

    }

    }

    #endregion

    #region 點對點距離用方法

    private void GestureDection(Joint shoulderRightSkeleton, Joint shoulderLeftSkeleton,

  • 29

    Joint leftHandSkeleton, Joint rightHandSkeleton, Joint shoulderCenterSkeleton, Joint

    hipCenterSkeleton, Joint headSkeleton)

    {

    //===接受手勢控制on ===

    if ((AcceptGusture == true))

    {

    //textBlock2.Text = "手勢打開" ;

    //"指令:關閉接受手勢控制"

    //"動作:左手"+"右手"放在"肚子"

    if (distance(leftHandSkeleton, shoulderLeftSkeleton) < 0.1 &&

    distance(rightHandSkeleton, shoulderLeftSkeleton) < 0.1)

    {

    isLeftHandFrigger = false;

    isRightHandFrigger = false;

    AcceptGusture = false;

    textBlock2.Text = "手勢關閉";

    }

    //"指令:Vol+音量+"

    //"動作:右手"越過"肚子"的X座標

    if ((leftHandSkeleton.Position.X) > (headSkeleton.Position.X))

    {

    CheckGesture();

    if (CheckGesture_ready)

    {

    isLeftHandFrigger = true;

    SendKeys.SendWait("{F10}");

    textBlock2.Text = "Vol+";

    }

    }

    else

    {

    isLeftHandFrigger = false;

    }

    //"指令:Vol-音量-"

    //"動作:左手"越過"肚子"的X座標

    if ((rightHandSkeleton.Position.X) < (headSkeleton.Position.X))

    {

    CheckGesture();

    if (CheckGesture_ready)

    {

    isRightHandFrigger = true;

    SendKeys.SendWait("{F9}");

    textBlock2.Text = "Vol-";

    }

    }

    else

    {

    isRightHandFrigger = false;

  • 30

    }

    //"指令:CH-頻道-"

    //"動作:左手"越過"頭"的X座標-0.3係數

    if (leftHandSkeleton.Position.X < headSkeleton.Position.X - 0.3)

    {

    CheckGesture();

    if (CheckGesture_ready)

    {

    isLeftHandOverFrigger = true;

    SendKeys.SendWait("{-}");

    textBlock2.Text = "CH-";

    }

    }

    else

    {

    isLeftHandOverFrigger = false;

    }

    //"指令:CH+頻道+"

    //"動作:右手"越過"頭"的X座標+0.3係數

    if (rightHandSkeleton.Position.X > headSkeleton.Position.X + 0.3)

    {

    CheckGesture();

    if (CheckGesture_ready)

    {

    isRightHandOverFrigger = true;

    SendKeys.SendWait("{=}");

    textBlock2.Text = "CH+";

    }

    }

    else

    {

    isRightHandOverFrigger = false;

    }

    //"指令:顯示"

    //"動作:右手"越過"頭"的Y座標 if

    (rightHandSkeleton.Position.Y > headSkeleton.Position.Y)

    {

    CheckGesture();

    if (CheckGesture_ready)

    {

    isRightHandOverFrigger2 = true;

    this.Topmost = true;

    this.Visibility = Visibility.Visible;

    }

    }

    else

    {

    isRightHandOverFrigger2 = false;

  • 31

    }

    //"指令:關閉"

    //"動作:左手"越過"頭"的Y座標

    if (leftHandSkeleton.Position.Y > headSkeleton.Position.Y)

    {

    CheckGesture();

    if (CheckGesture_ready)

    {

    isLeftHandOverFrigger2 = true;

    this.Topmost = false;

    this.Visibility = Visibility.Hidden;

    }

    }

    else

    {

    isRightHandOverFrigger2 = false;

    }

    //"指令:開啟接受手勢控制"

    //"動作:左手"+"右手"放在"頭部" if (distance(leftHandSkeleton,

    headSkeleton) < 0.15 && distance(rightHandSkeleton, headSkeleton) < 0.15 && (AcceptGusture

    == false))

    {

    AcceptGusture = true;

    textBlock2.Text = "手勢打開" ;

    }

    }

    #endregion

    #region ===判斷距離===

    double distance(Joint p1, Joint p2)

    {

    return Math.Sqrt(Math.Pow(p1.Position.X - p2.Position.X, 2) +

    Math.Pow(p1.Position.Y - p2.Position.Y, 2));

    }

    #endregion

    #region ===防止同一個動作重複執行指令===

    private void CheckGesture()

    {

    if (!isLeftHandFrigger && !isRightHandFrigger && !isLeftHandOverFrigger

    && !isRightHandOverFrigger && !isHandOverHead && !isRightHandOverHead && !isLeftHandOverHead

    && !isLeftHandOverFrigger2 && !isRightHandOverFrigger2)

    {

    CheckGesture_ready = true;

    }

    else

    {

    CheckGesture_ready = false;

    }

  • 32

    }

    #endregion

    #region ===listBox捲軸自動捲至最底===

    private void m_cStatusList_ScrollChanged(object sender, ScrollChangedEventArgs e)

    {

    if (e.ExtentHeightChange > 0.0)

    ((ScrollViewer)e.OriginalSource).ScrollToEnd();

    }

    #endregion

    #region ===打開教學===

    private void button1_MouseEnter(object sender, System.Windows.Input.MouseEventArgs e)

    {

    ShowGestureTutorial(true);

    }

    private void button1_MouseLeave(object sender, System.Windows.Input.MouseEventArgs e)

    {

    ShowGestureTutorial(false);

    }

    private void button2_MouseEnter(object sender, System.Windows.Input.MouseEventArgs e)

    {

    ShowSpeechTutorial(true);

    }

    private void button2_MouseLeave(object sender, System.Windows.Input.MouseEventArgs e)

    {

    ShowSpeechTutorial(false);

    }

    private void ShowGestureTutorial(bool bShow)

    {

    this.GestureTutorial.IsOpen = bShow;

    this.stackPanel3.IsEnabled = !bShow;

    }

    private void ShowSpeechTutorial(bool bShow)

    {

    this.SpeechTutorial.IsOpen = bShow;

    this.stackPanel3.IsEnabled = !bShow;

    }

    #endregion

  • 33

    五、成果

    以下為操作使用,一開始使用者能夠在畫面上看到自己和自己做的動作。

  • 34

    可以切換音量、頻道和隱藏左上角的畫面。

    語音操作:

  • 35

    六、結論

    這是相當好玩的過程,在操縱此系統時可以嘗到科技的味道、在家庭中

    與家人同樂。雖然在發展上有點矛盾,使得遙控器的演變並不是越來越方便,

    而是越來越新鮮。

  • 36

    七、參考文獻

    Appendix A:Reference

    C#/C++ 由微軟公司所開發,且運作於.NET Framework 之上的高階程式

    語言。

    .NET Framework 是以一種採用系統虛擬機執行的編程平臺,以通用語言執行庫為

    基礎,支援多種語言(C#、VB.NET、C++、Python等)的開發。

    API 又稱為應用編程介面,就是軟體系統不同組成部分銜接的約定。

    Kinect 知名電視遊樂器 Xbox 360,以體感方式遊玩之遙控裝置。

    Kinect for Windows 價格是在目前所有三項不同用途之 Kinect 裝置最昂貴,於

    Windows 系統中開發使用的體感裝置硬體。

    Kinect SDK Kinect 官方開放之開發軟體。

    OpenNI 非官方開發之套件,主要應用大宗是 Kinect 裝置,此套件是在

    Kinect SDK 未開放前,相關工程師共同開發所釋出的套件,但

    OpenNI 與 Kinect SDK 驅動程式不相容。

    WPF Windows Presentation Foundation 是 基 於 XML 、 .NET

    Framework、向量繪圖技術的展示框架。WPF 使用一種新的

    XAML 語言來開發介面,這將把介面開發以及後台邏輯很好的

    分開,降低了耦合度,使使用者介面設計師與程式開發者能更

    好的合作,降低維護和更新的成本。

    XMAL eXtensible Application Markup Language 是 WPF 的一部分,是一

    種 XML 的使用者介面描述語言,有著 HTML 的外觀,又揉合

    了 XML 語法的本質。

    Video Image Detection 影像圖形辨識,是將影像輸入至分析的儀器中來進行影像分

    析。

    Speech Recognition 語音識別技術,也被稱為自動語音識別,其目標是將人類

    的語音中的詞彙內容轉換為計算機可讀的輸入。

  • 37

    Appendix B:Reference [1] Calvin 凱樂文 , “如何使用 Kinect 語音辨識 (語音助理 Mini Siri),”

    http://tw-hkt.blogspot.tw/2012/04/kinect-mini-siri.html (Apr. 2012)

    [2] Aran Mulholland, “WPF: PopUp on MouseOver of a ComboBoxItem, ”8 Dec.

    2009,

    http://stackoverflow.com/questions/1869497/wpf-popup-on-mouseover-of-a-comboboxi

    tem (9 Dec. 2009)

    [3] starlee 寒 星 軒 , “ 在 WPF 页 面 中 用 Popup 模 拟 模 态 对 话 框 ,”

    http://blog.csdn.net/starlee/article/details/3996972 (Mar. 2009)

    http://tw-hkt.blogspot.tw/2012/04/kinect-mini-siri.htmlhttp://stackoverflow.com/questions/1869497/wpf-popup-on-mouseover-of-a-comboboxitemhttp://stackoverflow.com/questions/1869497/wpf-popup-on-mouseover-of-a-comboboxitemhttp://blog.csdn.net/starlee/article/details/3996972

    摘 要誌 謝目 錄(Contents)表 目 錄圖 目 錄一、 緒論1.1 研究目的與動機1.2 背景

    二、相關研究2.1 硬體2.1.1 市面Kinect體感裝置2.1.2 使用之Kinect體感裝置2.1.3 使用之電視棒

    2.2 套件及技術2.2.1 Microsoft Visual Studio 2010 (Software)2.2.2 Microsoft .NET Framework (API)2.2.3 Microsoft C# (語言)2.2.4 XAML (語言)2.2.5 WPF (開發介面)

    三、系統架構3.1 描述3.2 Kinect SDK之架構3.3 系統效能指標

    四、系統實作4.1 主介面4.2 介面設計程式碼 (XAML)4.3 Kinect基本色彩及骨架載入副程式+語音功能載入程式碼 (C#)4.4 Kinect基本色彩及骨架副程式+語音顯示框架+教學程式碼(C#)

    五、成果六、結論七、參考文獻Appendix A:ReferenceAppendix B:Reference