The jonki

呼ばれて飛び出てじょじょじょじょーんき

【kinect】日本語の音声認識を使ってみるための設定

Kinect for Windows Developer Toolkit v1.5.0のカメが動くSpeech BasicsのWPF版をベースに日本語を認識するための設定をメモ。

言語パッケージのインストール

こちらからKinectSpeechLanguagePack_ja-JP.exeをダウンロードして、実行するだけでインストールできる。

ソース

デフォルトだと英語用になっているので、ja-JPに変える。インストールされている言語パッケージの分ループしてくれるので、使いたい言語をif分でキャッチして使うようです。
またサンプルアプリだとSpeechGrammer.xmlというxmlファイルを辞書としてロードしています。自分で新しくプロジェクトを作った時なんかは[Resources.resx]->[リソース]->[ファイル]->[自分の辞書.xml]を追加する感じ。とりあえずテストでいろいろ使いたいので、今回は直接辞書登録を叩くやり方にしました。

MainWindow.xaml.cs
        private static RecognizerInfo GetKinectRecognizer()
        {
            foreach (RecognizerInfo recognizer in SpeechRecognitionEngine.InstalledRecognizers())
            {
                string value;
                recognizer.AdditionalInfo.TryGetValue("Kinect", out value);
                Console.WriteLine(recognizer.Culture.Name);
                //if ("True".Equals(value, StringComparison.OrdinalIgnoreCase) && "en-US".Equals(recognizer.Culture.Name, StringComparison.OrdinalIgnoreCase))
                if ("True".Equals(value, StringComparison.OrdinalIgnoreCase) && "ja-JP".Equals(recognizer.Culture.Name, StringComparison.OrdinalIgnoreCase))
                {
                    return recognizer;
                }
            }

            return null;
        }

        /*** 中略 ***/

        private void WindowLoaded(object sender, RoutedEventArgs e)
                /*** 中略 ***/


                var directions = new Choices();
                directions.Add(new SemanticResultValue("まじうける", "マジ受けるんですけど"));
                directions.Add(new SemanticResultValue("こんにちは", "ちょりーっす"));
                directions.Add(new SemanticResultValue("じゃおうえんさつこくりゅうは", "邪王炎殺黒龍波"));
                directions.Add(new SemanticResultValue("backward", "BACKWARD"));
                directions.Add(new SemanticResultValue("backwards", "BACKWARD"));
                directions.Add(new SemanticResultValue("back", "BACKWARD"));
                directions.Add(new SemanticResultValue("turn left", "LEFT"));
                directions.Add(new SemanticResultValue("turn right", "RIGHT"));
                
                var gb = new GrammarBuilder { Culture = ri.Culture };
                gb.Append(directions);
                
                var g = new Grammar(gb);
                spEngine.LoadGrammar(g);

                //// Create a grammar from grammar definition XML file.
                //using (var memoryStream = new MemoryStream(Encoding.ASCII.GetBytes(Properties.Resources.SpeechGrammar)))
                //{
                //    var g = new Grammar(memoryStream);
                //    spEngine.LoadGrammar(g);
                //}

                /*** 略 ***/

うーん、英語のをそのままにしたけど、日英普通に認識する…。英語で登録してJapanese Englishで認識してるのかな。