2013年12月27日金曜日

Windowsで音声認識(Choices+GrammarBuilder)

先日の音声合成に続いて、Windows標準の音声認識機能を使ってみます。

標準の音声認識機能は学習方式と辞書方式どちらにも対応しているようなのですが、今回は辞書方式で認識させます。

音声合成の場合と同じく特に用意するものはありません。

さっそくサンプルプログラムです。コンソールアプリケーションです。

using System;
using System.Speech.Recognition;

namespace SpeechRecognized_Sample
{
    class Program
    {
        /// <summary>
        ///
        /// </summary>
        /// <param name="args"></param>
        static void Main(string[] args)
        {

            //認識エンジン(既定のロケールを使用)
            using (SpeechRecognitionEngine sre = new SpeechRecognitionEngine())
            {

                //イベント登録
                sre.SpeechRecognized += new EventHandler<SpeechRecognizedEventArgs>(sre_SpeechRecognized);

                //語彙登録
                Choices words = new Choices(new string[] { "晴れ", "曇り", "雨", "雪" });

                //GrammarBuilderインスタンス
                GrammarBuilder gb = new GrammarBuilder("今日の天気は");

                //GrammarBuilderインスタンスに語彙を追加
                gb.Append(words);

                //Grammarインスタンスを作成
                Grammar g = new Grammar(gb);

                //Grammarインスタンスをロード
                sre.LoadGrammar(g);

                Console.Write("認識開始" + "\n");

                //入力ソース(既定のマイク)
                sre.SetInputToDefaultAudioDevice();

                //非同期で認識開始
                sre.RecognizeAsync(RecognizeMode.Multiple);

                while (true)
                {
                    Console.ReadLine();
                }
            }
        }

        /// <summary>
        ///
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        static void sre_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
        {
            Console.WriteLine("認識しました:" + e.Result.Text + " 信頼度:" + e.Result.Confidence);
        }
    }
}


説明:
「プロジェクト」>「参照の追加」>「アセンブリ」>「フレームワーク」内の「System.Speech」のチェックを忘れないでください。
今回辞書への登録方法としてChoicesクラスとGrammarBuilderクラスを使っています。
Choicesクラスに認識させたい単語を文字列配列として与えます。
その後Choicesオブジェクトを引数としてGrammarBuilderクラスに与えます。
次にGrammarクラスにGrammarBuilderオブジェクトを与えます。
最後に認識エンジンにGrammarオブジェクトをロードして辞書に登録します。

サンプルではGrammarBuilderインスタンスを作成するときに文字列を与えています。
このようにすることで「今日の天気は」+「Choicesクラスに登録した単語」の組み合わせの文章を登録できます。

音声合成の場合より少し複雑ですが、手順がわかればそれほど難しくはないと思います。

次回はSRGSを使って認識させるサンプルの予定です。


0 件のコメント:

コメントを投稿