声で選んだアイテムをプレイヤーの身体に装着・連動させるKinectサンプル
前ページからの続きです。
ウィンドウが読み込まれた時の処理
Kinectが接続されているかどうかを確認します。
Choicesクラスは、要素を構成するための代替項目の一覧を表すクラスで、GrammarBuilder オブジェクトからのみ直接使用されます。認識させる言葉をAddメソッドで登録します。
GrammarBuilderクラスは、単純な入力から複雑な Grammar(構文情報を取得管理するクラス)を構築するためのメカニズムを提供するクラスで、登録された言葉の構文(文法)設定を行い、SpeechRecognitionEngineへと設定します。
Appendメソッドで、登録した言葉を GrammarBuilder オブジェクトとして現在の GrammarBuilder に追加します。
文法のチェックされた言葉(builder)で初期化された、新しいGrammerクラスのインスタンス、myGrammerオブジェクトを作成します。
Grammerクラスは、構文情報を取得および管理するためにランタイムをサポートするクラスです。
SpeechRecognitionEngineクラスの新しいインスタンスengineオブジェクトを作成します。
SpeechRecognitionEngineクラスのLoadGrammerメソッドで、Grammar によって指定されたとおりに、特定の構文を同期的に読み込みます。
Kinectを開始します。Kinectの音声インターフェースは、Kinect.AudioSourceで提供されます。
Startメソッドで音声入力を開始します。
入力ストリームを取得し、SpeechRecognitionEngine クラスのSetInputToDefaultAudioDeviceメソッドで、SpeechRecognitionEngine の現在のインスタンスに、システム既定のオーディオ入力を割り当てます。
複数の音声認識が可能なように、RecognizeMode.Multipleを指定して、RecognizeAsyncメソッドで非同期音声認識を開始します。
Kinectが接続されていない場合はメッセージを出して処理を抜けます。
RGBカメラ、距離カメラ、プレイヤーおよびスケルトンの認識を開始します。
AddHandlerステートメントで、RGBカメラ、距離カメラ、スケルトンのフレーム更新イベントが発生した場合のAllFramesReadyにkinect_AllFramesReadyイベントハンドラを追加します。
言葉が認識された際には、AddHandlerステートメントで言葉を認識した際に発生するSpeechRecognizedイベントに、イベントハンドラを指定します。
Confidenceプロパティで音声認識の信頼度を設定します。-1が低、0が標準、1が高信頼度となります。
この時、-1を指定するとどんな言葉でも反応する恐れがあります。1を指定するとなかなか認識してくれません。
今回は信頼度が0.5より大きい場合に言葉を認識するよう指定しています。
speechArgs.Result.Textで認識された音声を変数wordsに格納し、wordsの言葉で条件分岐を行います。
「マスク」と発声した場合は、XElement.Loadメソッドでface.xmlを読み込みます。FancyDressInfoクラス型の新しいリストであるmyFancyDressInfoを作成します。
Descendantsメソッドで、子孫要素である全ての
ListBox1のItemsSourceプロパティにmyFancyDressInfoオブジェクトを指定します。
ListBox1に「鬼」や「般若」の画像が表示されます。
ListBox1のSeletedIndexプロパティに「マスクアップ」「マスクダウン」という言葉で増減する変数noの値を指定しておきます。
「部品」と発声した場合は、XElement.Loadメソッドでgoods.xmlを読み込みます。
FancyDressInfoクラス型の新しいリストであるmyFancyDressInfoを作成します。
Descendantsメソッドで、子孫要素である全ての
FancyDressInfo クラスの各プロパティに、result.Element(要素名).Value で要素の内容テキストを指定します。
result.Attribute(属性名).Valueで
次に値の設定された各プロパティをAddメソッドでmyFancyDressInfoオブジェクトに追加していきます。
ListBox2のItemsSourceプロパティにmyFancyDressInfoオブジェクトを指定すると、ListBox2に「金棒」や「扇子」の画像が表示されます。
ListBox2のSeletedIndexプロパティに「部品アップ」「部品ダウン」という言葉で増減する変数no2の値を指定しておきます。
「マスクダウン」ではメンバ変数noの値を1ずつ増加します。
「マスクアップ」ではメンバ変数noの値を1ずつ減少します。
「部品ダウン」ではメンバ変数no2の値を1ずつ増加します。
「部品アップ」ではメンバ変数no2の値を1ずつ減少します。
「おわり」と発した場合はKinectの動作とオーディオや音声認識の動作を停止し、プログラムを終了します。
Private Sub MainWindow_Loaded(sender As Object, e As System.Windows.RoutedEventArgs) Handles Me.Loaded If KinectSensor.KinectSensors.Count > 0 Then kinect = KinectSensor.KinectSensors(0) kinect.Start() End If Dim sentence As Choices = New Choices With sentence .Add("マスク") .Add("マスクダウン") .Add("マスクアップ") .Add("部品") .Add("部品ダウン") .Add("部品アップ") .Add("おわり") End With Dim builder As GrammarBuilder = New GrammarBuilder builder.Append(sentence) Dim myGrammer As Grammar = New Grammar(builder) engine = New SpeechRecognitionEngine() engine.LoadGrammar(myGrammer) AddHandler engine.SpeechRecognized, Sub(speechSender As Object, speechArgs As SpeechRecognizedEventArgs) Dim confidence As Single = speechArgs.Result.Confidence If confidence > 0.5 Then words = speechArgs.Result.Text Select Case words Case "マスク" If ListBox1.Items.Count > 0 Then Exit Sub Else xmldoc = XElement.Load("face.xml") Dim myFancyDressInfo As New List(Of FancyDressInfo) For Each result In From c In xmldoc.Descendants("name") Select c With myFancyDressInfo .Add(New FancyDressInfo With {.name = "Image/" & result.Value, ._height = CInt(CDbl(result.Attribute("height").Value) / 1.8), ._width = CInt(CDbl(result.Attribute("width").Value) / 1.8)}) End With Next ListBox1.ItemsSource = myFancyDressInfo ListBox1.SelectedIndex = no End If Case "部品" If ListBox2.Items.Count > 0 Then Exit Sub Else xmldoc = XElement.Load("goods.xml") Dim myFancyDressInfo As New List(Of FancyDressInfo) For Each result In From c In xmldoc.Descendants("name") Select c With myFancyDressInfo .Add(New FancyDressInfo With {.name = "Image/" & result.Value, ._height = CDbl(result.Attribute("height").Value), ._width = CDbl(result.Attribute("width").Value)}) End With Next ListBox2.ItemsSource = myFancyDressInfo ListBox2.SelectedIndex = no2 End If Case "マスクダウン" If no >= ListBox1.Items.Count - 1 Then no = ListBox1.Items.Count - 1 no = no + 1 ListBox1.SelectedIndex = no Case "マスクアップ" If no <= 0 Then no = 0 no = no - 1 ListBox1.SelectedIndex = no Case "部品ダウン" If no2 >= ListBox2.Items.Count - 1 Then no2 = ListBox2.Items.Count - 1 no2 = no2 + 1 ListBox2.SelectedIndex = no2 Case "部品アップ" If no2 <= 0 Then no2 = 0 no2 = no2 - 1 ListBox2.SelectedIndex = no2 Case "おわり" If kinect.IsRunning = True Then kinect.Stop() kinect.AudioSource.Stop() engine.RecognizeAsyncStop() End If Environment.Exit(0) Case Else Exit Select End Select End If End Sub Dim audio As KinectAudioSource = kinect.AudioSource Using s As Stream = audio.Start() engine.SetInputToDefaultAudioDevice() engine.RecognizeAsync(RecognizeMode.Multiple) End Using Try If KinectSensor.KinectSensors.Count = 0 Then MessageBox.Show("Kinectを接続してください") Exit Sub Else kinect.ColorStream.Enable() kinect.DepthStream.Enable() kinect.SkeletonStream.Enable() AddHandler kinect.AllFramesReady, AddressOf kinect_AllFramesReady End If Catch ex As Exception MessageBox.Show(ex.Message) Close() End Try End Sub
声でアイテムを選んで身体に装着・連動させるKinectサンプル
連載バックナンバー
Think ITメルマガ会員登録受付中
全文検索エンジンによるおすすめ記事
- Kinectを使ったバーチャル試着室で着せ替えシミュレーション
- Kinectを使って、自分の手のひらに小さな分身を出現させてみる
- Kinectで手の動きに合わせてモニタ上の画像を動かすサンプル
- Kinectで人体を認識して棒人間を動かすサンプル
- Kinect v2の音声認識で「仮面」を選んで変身してみる
- センサーの範囲内にいる人間を見つけて撮影・保存するKinectサンプル
- Kinectで手の動きとカーソルを連動して操作するサンプル
- 人体の連続した動作を音声でキャプチャするKinectのサンプルプログラム
- Kinectで手の動きに合わせて波紋を発生させるサンプル
- Kinectで得た人体情報を転送して、Windows Phoneの画面上に関節の位置を表示してみる