Speech Basicsサンプルは、亀の絵に対して「Forward」「Back」「Turn Left」「Turn Right」と声で命令を与えて動かせるサンプルです。
このサンプルの中で各国語対応をおこなっている部分があり判定文が以下のようになっています。
- Private Shared Function GetKinectRecognizer() As RecognizerInfo
- For Each recognizer As RecognizerInfo In SpeechRecognitionEngine.InstalledRecognizers()
- Dim value As String = ""
- recognizer.AdditionalInfo.TryGetValue("Kinect", value)
- If "True".Equals(value, StringComparison.OrdinalIgnoreCase) AndAlso "en-US".Equals(recognizer.Culture.Name, StringComparison.OrdinalIgnoreCase) Then
- Return recognizer
- End If
- Next recognizer
- Return Nothing
- End Function
Private Shared Function GetKinectRecognizer() As RecognizerInfo
For Each recognizer As RecognizerInfo In SpeechRecognitionEngine.InstalledRecognizers()
Dim value As String = ""
recognizer.AdditionalInfo.TryGetValue("Kinect", value)
If "True".Equals(value, StringComparison.OrdinalIgnoreCase) AndAlso "en-US".Equals(recognizer.Culture.Name, StringComparison.OrdinalIgnoreCase) Then
Return recognizer
End If
Next recognizerReturn Nothing
End Function
しかし、recognizer.AdditionalInfo.TryGetValue("Kinect", value)の結果とカルチャーを判定しているのですがen-USとja-JPではSpeech Recongnitionに次のような違いがあるため、常に結果はFalseになってしまいますカルチャー名のみ変更が必要です。
- Microsoft Server Speech Recognition Language - Kinect (en-US)
Microsoft Server Speech Recognition Language - TELE (ja-JP)
- Microsoft Server Speech Recognition Language - Kinect (ja-JP)
この判定でIf文を「If "ja-JP".Equals(recognizer.Culture.Name, StringComparison.OrdinalIgnoreCase) Then」にすると日本語による音声認識がおこなえるようになります。
なお、Speechが入っている状態でKinect for Windows Language Packs v1.5.0を入れ忘れていると日本語のMicrosoft Server Speech Recognition Languageは「-TELE (ja-JP)」となります。このライブラリでも正常に動くことは動きますが、ちゃんとKinect for Windows Language Packs v1.5.0を忘れずに入れましょう。
コマンドに対する音声登録は次のような形で行います(サンプルではここでの登録結果をXMLファイルから読み取って使っています)。
- Dim directions As New Choices
- directions.Add(New SemanticResultValue("まえ", "FORWARD"))
- directions.Add(New SemanticResultValue("うしろ", "BACKWARD"))
- directions.Add(New SemanticResultValue("ひだり", "LEFT"))
- directions.Add(New SemanticResultValue("みぎ", "RIGHT"))
- Dim gb = New GrammarBuilder With {.Culture = ri.Culture}
- gb.Append(directions)
- Dim g As New Grammar(gb)
- speechEngine.LoadGrammar(g)
Dim directions As New Choices
directions.Add(New SemanticResultValue("まえ", "FORWARD"))
directions.Add(New SemanticResultValue("うしろ", "BACKWARD"))
directions.Add(New SemanticResultValue("ひだり", "LEFT"))
directions.Add(New SemanticResultValue("みぎ", "RIGHT"))
Dim gb = New GrammarBuilder With {.Culture = ri.Culture}
gb.Append(directions)
Dim g As New Grammar(gb)
speechEngine.LoadGrammar(g)
もしかしたらクリアな環境に入れると日本語についてもkinect (ja-JP)とかになるのでしょうか…。