Kinectの音声認識を使ってWebブラウザを操作するサンプル
次に、ソリューションエクスプローラー内のMainWindow.xamlを展開して表示される、MainWindow.xaml.vbをダブルクリックしてリスト5のコードを記述します。
ロジックコードを記述する
リスト5 (MainWindow.xaml.vb)
Option Strict On Imports Microsoft.Kinect Imports Coding4Fun.Kinect.Wpf
音声認識用のオーディオ形式を表すクラスが含まれる、Microsoft.Speech.AudioFormat名前空間をインポートします。
Imports Microsoft.Speech.AudioFormat
音声認識を実装するためのクラスが含まれる、Microsoft.Speech.Recognition名前空間をインポートします。
Imports Microsoft.Speech.Recognition Imports System.IO Class MainWindow Dim myKinect As KinectSensor
XMLの要素を表すXElementクラス用オブジェクト変数xmldocを宣言します。
Dim xmldoc As XElement Dim index As Integer
音声認識サービスを実行するためのアクセス権を提供するSpeechRecognitionEngineクラス用メンバ変数engineを宣言します。
Dim engine As SpeechRecognitionEngine Dim words As String
ウィンドウが読み込まれた時の処理
XElement.LoadメソッドでXML文書ファイル(URL.xml)を読み込みます。
要素を構成するための代替項目の一覧を表すChoicesクラスのインスタンス、sentenceオブジェクトを作成します。Descendantsメソッドで、子孫要素であるすべての
name要素の属性”tolower”の値をAddメソッドで、認識させる言葉としてChoicesオブジェクトであるsentenceに追加します。新しいTextBlockのインスタンスmyTextBlockオブジェクトを作成します。文字サイズ、文字の太さを指定し、Textプロパティに属性”tolower”の値を指定します。これらのプロパティの設定されたTextBlockをStackPanelに追加します。これで、StackPanel内にサイト名が表示されます。
認識される言葉として、サイト名の他に、Back、Next、Endを追加しておきます。
Kinectが接続されている場合はKinectを作動させます。
GrammarBuilderクラスは、単純な入力から複雑な Grammar(構文情報を取得管理するクラス)を構築するためのメカニズムを提供するクラスで、登録された言葉(builder)の構文設定を行い、SpeechRecognitionEngineへと設定します。詳細な解説に付いては、「音声認識」の解説を参照してください。
言葉が認識された際には、AddHandlerステートメントで言葉を認識した際に発生するSpeechRecognizedイベントに、イベントハンドラを指定します。Confidenceプロパティで音声認識の信頼度を設定します。-1が低、0が標準、1が高信頼度となります。-1を指定するとどんな言葉でも反応する恐れがあります。1を指定するとなかなか認識してくれません。今回は信頼度が0.5より大きい場合に、指定したサイトに遷移するよう指定しています。
認識された音声(speechArgs.Result.Text)を変数wordsに格納します。wordsの内容で条件分岐を行います。XML文書のname要素の属性”tolower”の値がwordsの値と同じならname 要素の内容テキストのURLに遷移します。wordsの値がEndの場合はEnvironment.Exit(0)でプログラムを終了します。Backの場合は後のページに戻り、Nextの場合は次のページを表示します。
Kinectの音声インターフェースは、Kinect.AudioSourceで提供されます。Startメソッドで音声入力を開始します。入力ストリームを取得し、SpeechRecognitionEngine クラスのSetInputToDefaultAudioDeviceメソッドで、SpeechRecognitionEngine の現在のインスタンスに、システム既定のオーディオ入力を割り当てます。
複数の音声認識が可能なように、RecognizeMode.Multipleを指定して、RecognizeAsyncメソッドで非同期音声認識を開始します。
ColorStream.EnableメソッドでRGBカメラの動作を開始し、AddHandlerステートメントで、RGBカメラのフレーム更新イベントを追加します。
Private Sub MainWindow_Loaded(sender As Object, e As System.Windows.RoutedEventArgs) Handles Me.Loaded xmldoc = XElement.Load("URL.xml") Dim sentence As Choices = New Choices For Each result In From c In xmldoc.Descendants("name") Select c If result.Value <> String.Empty Then sentence.Add(result.Attribute("tolower").Value) Dim myTextBlock As New TextBlock myTextBlock.FontSize = 20 myTextBlock.FontWeight = FontWeights.Bold myTextBlock.Text = result.Attribute("tolower").Value stackPanel1.Children.Add(myTextBlock) End If Next With sentence .Add("Back") .Add("Next") .Add("End") End With If KinectSensor.KinectSensors.Count > 0 Then myKinect = KinectSensor.KinectSensors(0) myKinect.Start() End If 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 words Dim query = From c In xmldoc.Descendants("name") Where c.Attribute("tolower").Value.Equals(words) Select c For Each result In query webBrowser1.Navigate(New Uri(result.Value, UriKind.Absolute)) Next If words = "End" Then If myKinect.IsRunning = True Then myKinect.Stop() myKinect.AudioSource.Stop() End If Environment.Exit(0) End If If words = "Back" Then If webBrowser1.CanGoBack = True Then webBrowser1.GoBack() End If End If If words = "Next" Then If webBrowser1.CanGoForward = True Then webBrowser1.GoForward() End If End If Case Else Exit Select End Select End If End Sub Dim audio As KinectAudioSource = myKinect.AudioSource Using s As Stream = audio.Start() engine.SetInputToDefaultAudioDevice() engine.RecognizeAsync(RecognizeMode.Multiple) End Using Try myKinect.ColorStream.Enable() AddHandler myKinect.ColorFrameReady, AddressOf myKinect_ColorFrameReady Catch ex As Exception MessageBox.Show(ex.Message) Close() End Try End Sub
RGBカメラのフレームが更新されたことを通知するイベント
sourceImageという名前を持つImageコントロールのSourceプロパティに、e.OpenColorImageFrameメソッドで、新しいフレームのRGBカメラの情報を取得し、Coding4Fun.Kinect.Wpfの拡張メソッドであるToBitmapSourceで、myColorImageをBitmapSourceに変換して指定します。これで、Imageコントロール内にカラーの実画像(実写)が表示されます。このメソッドで取得するColorImageFrameは、Usingで括るか、明示的にDisposeする必要があります。
Private Sub myKinect_ColorFrameReady(sender As Object, e As ColorImageFrameReadyEventArgs) Using myColorImage As ColorImageFrame = e.OpenColorImageFrame sourceImage.Source = myColorImage.ToBitmapSource End Using End Sub
ウィンドウが閉じられる時に発生するイベント
Kinectセンサーが動作している時は、RGBカメラのフレーム更新イベントを破棄し、StopメソッドでKinectセンサーを停止し、音声認識も停止します。最後にDisposeメソッドでリソースを解放します。
Private Sub MainWindow_Closing(sender As Object, e As System.ComponentModel.CancelEventArgs) Handles Me.Closing If myKinect Is Nothing = False Then If myKinect.IsRunning = True Then RemoveHandler myKinect.ColorFrameReady, AddressOf myKinect_ColorFrameReady myKinect.Stop() engine.RecognizeAsyncStop() myKinect.Dispose() End If End If End Sub End Class
今回のサンプルは以上で終了です。PCに話しかけるのは慣れないと少々恥ずかしいですが、最近はスマートフォンなども音声認識が流行っていますし、自分しかいない場合でしたら恥ずかしさもないと思うので、ぜひ試してみてください。
それでは、次回もお楽しみに。
Kinectに音声認識させるサンプルプログラム
Kinectの音声認識を使ってWebブラウザを操作するサンプル
連載バックナンバー
Think ITメルマガ会員登録受付中
全文検索エンジンによるおすすめ記事
- 声で選んだアイテムをプレイヤーの身体に装着・連動させるKinectサンプル
- Kinectを使った、音声によるデータ保存と検索のサンプル
- 人体の連続した動作を音声でキャプチャするKinectのサンプルプログラム
- Kinectを使ったバーチャル試着室で着せ替えシミュレーション
- Kinectの音声認識を使って、プレイヤーを分離、結合させるデモを試してみる
- Kinect v2の音声認識で「仮面」を選んで変身してみる
- Kinectを使って、自分の手のひらに小さな分身を出現させてみる
- Kinect v2を使った「じゃんけんゲーム」を作る
- KinectButtonを動的に作成して、ジェスチャーで文字を表示させるサンプル
- Kinect v2のジェスチャーでBing Mapsを未来的に直感操作する