none
オフラインのWindows10 Cortana で音声認識を実現する方法の可能性調査 サンプルコード記述方法調査 と Windows7 Windows音声認識エンジン8.0(日本語)(SAPI5.4) アルファベット 認識させる方法? RRS feed

  • 全般的な情報交換

  • Windows7 Windows音声認識エンジン8.0(日本語)(SAPI5.4) アルファベット 認識させる方法?

    ご存知の方おられますでしょうか?もしおられましたら、知恵をさずけていただけると助かります。

    マイクロソフト社の日本法人では、分かる人はいないとの、コメントを電話にていただきました。

    状況:

    すべての、A~Zを認識できず、日本語の、音声辞書で登録(えー、びー、...、コード内で、A,Bに変換)しても、意図した

    変換がされません。

    お金も使わないようにと言われているため、英語のエンジンも無料でないと使えなく、

    そもそも、日本人が、ネイティブ発音で、A~Zまで(特に、L,R)言える人は少なくそれも、現実的に使えるのか、不明な状態です。

    以上です。


    • 移動 星 睦美 2015年10月14日 1:05 Visual C# から
    • 種類を変更済み 星 睦美 2015年10月14日 1:05 情報交換
    • 編集済み pokepa1001 2015年12月11日 1:17 タイトル変更のアドバイスあり、Cortanaオフラインでの音声認識エンジン部分のみのサンプルコード調査も、内容が加わったため
    2015年10月7日 0:26

すべての返信

  • フォーラム オペレーターの星 睦美です。
    pokepa1001 さん、投稿ありがとうございます。Windows7 での音声認識に関する質問ですね。

    Visual C# フォーラムに投稿いただいていますので、Visual C# で開発されているアプリケーションから音声認識をお試しいただいているのではないかと思います。
    音声を認識させて操作したい対象(例えばブラウザやMicroosft Office 製品、または独自のアプリケーションなど)の情報を含めて、作成しているプログラムに関する開発環境や利用環境、途中から認識しにくくなった、最初から認識できない、複数のユーザープロファイルまたはPCで同じ状況を確認できた等の詳しい情報をいただけるとフォーラム ユーザーもアドバイスの手がかりを見つけやすくなるかも知れません。音声認識エンジンはOS の機能のためプログラミングとの関連がない場合にはOS に関するフォーラムのほうが情報を集めやすいと思いますので、Windows7 のエディションと最新の適用プログラムの有無を参考にお知らせいただければと思います。

    フォーラムのご利用方法(質問の投稿)について

    ※参考になる回答には投稿者からの[回答としてマーク] をお願いいたします。


    フォーラム オペレーター 星 睦美 - MSDN Community Support

    2015年10月7日 1:25
  • 情報頂きましてありがとうございます。

    使用環境は、

    OS:Windows7 Pro.(64bit) (日本語OS)

    音声認識エンジン:あらかじめOS内蔵の コントロールパネルでは、Windows音声認識エンジン8.0

                と、表示される、SAPI5.4 の日本語OSのため、日本語エンジン

    プログラミング開発環境ソフト:Visual Studio の C#

    です。

    症状:0-10、A-Zを、日本語エンジンで認識させています。

       例えば、Aなら、”えー”と日本人が発音して、コードの中で、例えばですが、”えー”なら、

       Aと表示するようにしています。

       認識率アルファベットによっては、50%以上、アルファベットによっては、音声辞書で録音しても、

       その文字になるきっかけの、平仮名がひらえない状況です。

       例えば、M=えむ、N=えぬ、がどちらかに、なるなど。T=てぃー、てー、D=でぃー、で、でぃ

       音声辞書で録音しても、うまく意図する文字に、ひらがなで引っかからない状況です。

       苦肉の策で何か、知恵があればい、頂けますと助かります。

        前提として、別途費用発生する方法は、極力無し。との前提の中で試行錯誤しています。

        WindowsXP, VB6.0 SAPI 6.1 では、そこそこの認識率に、A-Z行けたのですが、

        Windows7内蔵の音声認識エンジンでは、認識率低くなる実験結果を個人的には、

        体験しながら、試行錯誤中です。

         音声認識エンジンのトレーニングも、3回以上は、行っています。

       最終的には、不特定多数の人が使う音声認識インターフェースがねらいのため、自分の声だけで

       この程度なら、PCごと、ユーザーごと、個別に音声認識トレーニング必要なのかなという印象です。

    質問1:

       0-10は、なんとか大丈夫ですが、A-Zは、認識率が低く、

        音声辞書で自分の声を録音して、認識するようにしましたが、今度は、

        数字が、アルファベットの音声辞書に引っ張られます。

        数字モードと、アルファベットモードの時に、音声認識エンジンの

        例えば、以下の行などを、数字モードでは、使いい、アルファベットモードでは、

        一旦クリアするような命令があれば、それで試してみたいのですが、見つかっていません。

        recognizer.LoadGrammar(new Grammar(new GrammarBuilder("いち")));

           ...

        これらの命令を、モードごとに一旦クリアしてから、再度使うときに、これらの行また通過するような

       命令ありますでしょうか?

        今回のプログラミングでは、アルファベットモードを、ABモードとしています。

        モードの切り替えも音声で行っています。これは、ユニークな言葉を選んだので、

        90%程度の認識率で認識します。(もちろん周りで人などうるさい雑音あると低い方向になる傾向です。)

        USBマイク(PCの筐体外であらかじめA/D変換するマイク)でも、同様の傾向です。

    質問2:

        英語の音声認識エンジンが、無料でダウンロードできるのでしょうか?

            ネット上の、ある文献では、UltimateのバージョンのWindowsでないと、英語の音声認識エンジンは、

        インストールできないとの情報を見つけました。

    目的:あるプログラムのユーザーインターフェース部分に、音声認識により、キーボード使うのが不得意な人

        向けに、音声認識を使う企画あります。

        そのために、原理試作的に、どのようにプログラミングすれば、利用できるか?原理試作プログラミング・調査

        試行錯誤が自分の担当となっています。

    コード:

    具体的な、コード(.cs)を以下に貼り付けさせていただきます。

    文字数が、6000文字と制限有り、抜粋しています。

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    using System.Speech;
    using System.Speech.Recognition;
    using System.Collections.ObjectModel;
    //using System.Threading;
    using System.Speech.Synthesis;
    using System.Globalization;


    namespace CameraDemo
    {
        public partial class Form1 : Form
        {
            //ビープ音を鳴らす
            //System.Runtime.InteropServices.DllImport("user32.dll")] 

            SpeechSynthesizer speechSynthesizer = new SpeechSynthesizer();
            CultureInfo cultureInfo = Application.CurrentCulture;
            //ReadOnlyCollection<InstalledVoice> voices = speechSynthesizer.GetInstalledVoices(cultureInfo);

            //var tts = WScript.CreateObject("SAPI.SpVoice");

            //tts.Speak("Hello world! おはよう! Konnichiwa!");

            #region Recognize speech and write to console

            //1)まずはは、音声認識エンジン「SpeechRecognitionEngine 」変数を宣言します。
          static SpeechRecognitionEngine recognizer = null;
          


          //2)音声認識機能起動の関数を実装します

            //音toText変数
            public string StrSoundtoText;
            public Boolean SpeechRecogFlg;
            public string StrAddBox;//テキストボックスに追加する直前の入れ物

            public Form1()
            {
                InitializeComponent();
            }



            public void Form1_Load(object sender, EventArgs e)
            {
              
      
            }
       

    //音声認識が成功の関数
            public void _recognizeSpeechAndWriteToConsole_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
            {
                //音楽再生インスタンス生成
                //System.Media.SoundPlayer sPlayer = new System.Media.SoundPlayer("C:\\indows\\Media\\Windows メッセージ (警告).wav");
                //初期化。
                StrSoundtoText = "";
                //認識された文字列を、生データのまま表示。
                textRecognition.Text = e.Result.Text;
                //文法ファイル的に、認識された文字列を補正します。

                if (txtSpeech.Text.Length > 16)
                {
                    txtSpeech.Text = "";
                }
                /////////////////////////////////////////////////////////////////////////////
                //ここに、文法ファイルのアルゴリズム記述してください
                if (radioButton1.Checked == true | radioButton2.Checked == true | radioButton3.Checked == true | radioButton4.Checked == true)
                {
                    if (e.Result.Text == "うぃち" | e.Result.Text == "いち" | e.Result.Text == "えち" | e.Result.Text == "わん")
                    {
                        StrSoundtoText = "1";
                    }
                    else if (e.Result.Text == "に" | e.Result.Text == "にー" | e.Result.Text == "にい" | e.Result.Text == "つー")
                    {
                        StrSoundtoText = "2";
                    }
                    else if (e.Result.Text == "さん" | e.Result.Text == "あん" | e.Result.Text == "さ" | e.Result.Text == "さあ")
                    {
                        StrSoundtoText = "3";
                    }
                    else if (e.Result.Text == "よん")
                    {
                        StrSoundtoText = "4";
                    }
                    else if (e.Result.Text == "ご" | e.Result.Text == "ごお" | e.Result.Text == "ごー" | e.Result.Text == "ごう")
                    {
                        StrSoundtoText = "5";
                    }
                    else if (e.Result.Text == "ろ" | e.Result.Text == "ろく" | e.Result.Text == "おく")
                    {
                        StrSoundtoText = "6";
                    }
                    else if (e.Result.Text == "なな" | e.Result.Text == "しち")
                    {
                        StrSoundtoText = "7";
                    }
                    else if (e.Result.Text == "あち" | e.Result.Text == "はち" | e.Result.Text == "はちー")
                    {
                        StrSoundtoText = "8";
                    }
                    else if (e.Result.Text == "く")
                    {
                        StrSoundtoText = "9";
                    }
                    else if (e.Result.Text == "じゅう")
                    {
                        StrSoundtoText = "10";
                    }
                }
                if (e.Result.Text == "おわり")
                {
                    StrSoundtoText = "END";
                }
                else if (e.Result.Text == "あか")
                {
                    StrSoundtoText = "RED";
                }
                else if (e.Result.Text == "あお")
                {
                    StrSoundtoText = "BLUE";
                }
                else if (e.Result.Text == "きいろ")
                {
                    StrSoundtoText = "YELLOW";
                }
                else if (e.Result.Text == "くろ")
                {
                    txtSpeech.Text = "BLACK";
                }
                else if (e.Result.Text == "ぜろ" | e.Result.Text == "まる" | e.Result.Text == "れい" | e.Result.Text == "れえ")
                {
                    StrSoundtoText = "0";
                }
                else if (e.Result.Text == "ぱ")
                {
                    StrSoundtoText = "@";
                }
                else if (e.Result.Text == "けーぶる" | e.Result.Text == "けーぶ" | e.Result.Text == "けいぶる" | e.Result.Text == "けいぶ")
                {
                    StrSoundtoText = "けーぶる";
                }
                else if (e.Result.Text == "ほうこう" | e.Result.Text == "ほーこ" | e.Result.Text == "ほーこお" | e.Result.Text == "ほーこう")
                {
                    StrSoundtoText = "ほうこう";
                }
                else if (e.Result.Text == "ふとさ" | e.Result.Text == "ふとさ" | e.Result.Text == "ふとあ" | e.Result.Text == "ふとら")
                {
                    StrSoundtoText = "ふとさ";
                }
                else if (e.Result.Text == "てん" | e.Result.Text == "どっと" | e.Result.Text == "しょうすう" | e.Result.Text == "ぽいんと" | e.Result.Text == "ぽいん" | e.Result.Text == "ぽい")
                {
                    StrSoundtoText = ".";
                }
                else if (e.Result.Text == "きた" | e.Result.Text == "いた")
                {
                    StrSoundtoText = "北森";
                }
                else if (e.Result.Text == "えーびー")
                {
                    StrSoundtoText = "えーびー";
                }
                else if (e.Result.Text == "すうじ")
                {
                    StrSoundtoText = "すうじ";
                }
                else if (e.Result.Text == "くりあ" | e.Result.Text == "クリア")
                {
                    StrSoundtoText = "";
                    txtSpeech.Text = "";
                }

                if (radioButton5.Checked == true)
                {
                    //ABモード(アフファベットモード)なら、前処理で翻訳あっても、モード変更文字列以外は、一旦クリア
                    if (StrSoundtoText=="RED"| StrSoundtoText=="YELLOW"| StrSoundtoText=="BLUE"| StrSoundtoText=="BLACK"|StrSoundtoText=="はいせん"| StrSoundtoText=="ほうこう"| StrSoundtoText=="ふとさ"| StrSoundtoText=="."| StrSoundtoText=="えーびー"| StrSoundtoText=="すうじ"| StrSoundtoText=="クリア"| StrSoundtoText=="くりあ"| StrSoundtoText=="おわり"| StrSoundtoText=="北森")
                    {
                        //何もしない
                    }
                    else 
                    {
                        //クリア
                        StrSoundtoText = "";
                    }
                    if (e.Result.Text == "えー" | e.Result.Text == "え" | e.Result.Text == "えい")
                    {
                        StrSoundtoText = "A";
                    }
                    else if (e.Result.Text == "び" | e.Result.Text == "びい" | e.Result.Text == "びー")
                    {
                        StrSoundtoText = "B";
                    }
                    else if (e.Result.Text == "す" | e.Result.Text == "しい" | e.Result.Text == "しぃ" | e.Result.Text == "しぃー" | e.Result.Text == "しー")
                    {
                        StrSoundtoText = "C";
                    }
                    else if (e.Result.Text == "でぃ" | e.Result.Text == "でい" | e.Result.Text == "でぃー" | e.Result.Text == "でー" | e.Result.Text == "で" | e.Result.Text == "だい")
                    {
                        StrSoundtoText = "D";
                    }
                    else if ( e.Result.Text == "いー")
                    {
                        StrSoundtoText = "E";
                    }
                    else if (e.Result.Text == "え" | e.Result.Text == "えふ")
                    {
                        StrSoundtoText = "F";
                    }
                    else if (e.Result.Text == "じー" | e.Result.Text == "じ" | e.Result.Text == "じぃ" | e.Result.Text == "じい" | e.Result.Text == "ぜ" | e.Result.Text == "ぜっ" | e.Result.Text == "ごるふ" | e.Result.Text == "ごりら")
                    {
                        StrSoundtoText = "G";
                    }
                    else if (e.Result.Text == "えいち" | e.Result.Text == "えっち" | e.Result.Text == "えち" | e.Result.Text == "いち")
                    {
                        StrSoundtoText = "H";
                    }
                    else if (e.Result.Text == "あぃ" | e.Result.Text == "あい" | e.Result.Text == "あーい")
                    {
                        StrSoundtoText = "I";
                    }
                }
                else if (e.Result.Text == "ばっくすぺーす" | e.Result.Text == "しゅうせい")
                {

                    if (txtSpeech.Text.Length > 0)
                    {
                        txtSpeech.Text = txtSpeech.Text.Substring(0, txtSpeech.Text.Length - 1);
                    }
                    //MessageBeep(0);
                    StrSoundtoText = "";
                    //800Hzの周波数で200ミリ秒間再生する
                    Console.Beep();
                    //10000の周波数で500ミリ秒間再生する
                    Console.Beep(10000, 500);
                }
                else
                {
                    //
                }

                //結果を、中継の箱に代入
                StrAddBox = StrSoundtoText;
                /////////////////////////////////////////////////////////////////////////////
                //ここに、文法ファイルで補正した、認識文字列に対しての、制御アルゴリズム記述してください
                //モード切り替え
                
                if (StrSoundtoText=="すうじ")
                {
                    txtSpeech.Text = "";
                    StrAddBox="<数字モード>(デモ)";
                    radioButton4.Checked = true;
                    goto PointDisplay;
                }
                else if (StrSoundtoText == "はいせん")
                {
                    txtSpeech.Text = "";
                    StrAddBox = "<配線モード>(デモ)";
                    radioButton1.Checked = true;
                    goto PointDisplay;
                }
                else if (StrSoundtoText == "ほうこう")
                {
                    txtSpeech.Text = "";
                    StrAddBox = "<方向ルモード>(デモ)";
                    radioButton2.Checked = true;
                    goto PointDisplay;
                }
                else if (StrSoundtoText == "ふとさ")
                {
                    txtSpeech.Text = "";
                    StrAddBox = "<太さモード>(デモ)";
                    radioButton3.Checked = true;
                    goto PointDisplay;
                }
                else if (StrSoundtoText == "えーびー")
                {
                    txtSpeech.Text = "";
                    StrAddBox = "<ABモード>(デモ)";
                    radioButton5.Checked = true;
                    goto PointDisplay;
                }
                //各モードの処理
                //英数字モード以外の場合
                if (radioButton4.Checked == false & radioButton5.Checked == false)
                {
                    //ケーブルモードの場合
                    if (radioButton1.Checked == true)
                  {
                      switch (StrAddBox)
                      {
                          case "1":
                              StrAddBox = "KIV1(デモ)";
                              break;
                          case "2":
                              StrAddBox = "KIV2(デモ)";
                              break;
                          case "3":
                              StrAddBox = "KIV3(デモ)";
                              break;
                          case "4":
                              StrAddBox = "KIV4(デモ)";
                              break;
                          case "5":
                              StrAddBox = "KIV5(デモ)";
                              break;
                          case "6":
                              StrAddBox = "KIV6(デモ)";
                              break;
                          default:
                              StrAddBox = "?";
                              break;
                      }
                    }
                    //方向モードの場合
                    if (radioButton2.Checked == true)
                    {
                        switch (StrAddBox)
                        {
                            case "1":
                                StrAddBox = "正方向・右1(デモ)";
                                break;
                            case "2":
                                StrAddBox = "正方向・中2(デモ)";
                                break;
                            case "3":
                                StrAddBox = "正方向・左3(デモ)";
                                break;
                            case "4":
                                StrAddBox = "逆方向・右4(デモ)";
                                break;
                            case "5":
                                StrAddBox = "逆方向・中5(デモ)";
                                break;
                            case "6":
                                StrAddBox = "逆方向・左5(デモ)";
                                break;
                            default:
                                StrAddBox = "?";
                                break;
                        }
                    }
                    //太さモードの場合
                    if (radioButton3.Checked == true)
                    {
                        switch (StrAddBox)
                        {
                            case "1":
                                StrAddBox = "0.30 1(デモ)";
                                break;
                            case "2":
                                StrAddBox = "0.75 2(デモ)";
                                break;
                            case "3":
                                StrAddBox = "1.00 3(デモ)";
                                break;
                            case "4":
                                StrAddBox = "1.25 4(デモ)";
                                break;
                            case "5":
                                StrAddBox = "1.50 5(デモ)";
                                break;
                            case "6":
                                StrAddBox = "1.75 6(デモ)";
                                break;
                            case "7":
                                StrAddBox = "2.00 7(デモ)";
                                break;
                            case "8":
                                StrAddBox = "3.00 8(デモ)";
                                break;
                            case "9":
                                StrAddBox = "5.00 9(デモ)";
                                break;
                            case "10":
                                StrAddBox = "7.00 10(デモ)";
                                break;
                            default:
                                StrAddBox = "?";
                                break;
                        }
                    }
                }
            PointDisplay:
                //共通処理
                //800Hzの周波数で200ミリ秒間再生する
                Console.Beep();
                //10000の周波数で500ミリ秒間再生する
                //Console.Beep(10000, 500);
                if (StrSoundtoText=="" )
                {
                    StrAddBox = "";
                }
            if (StrSoundtoText.Length > 3)
            {
                //speechSynthesizer.Speak("mode or Color");
            }
            else
            {
                //speechSynthesizer.Speak(StrAddBox.ToString());
            } 
                txtSpeech.Text = txtSpeech.Text + StrAddBox;
                /////////////////////////////////////////////////////////////////////////////
            }
           //音声認識失敗の関数
            static void _recognizeSpeechAndWriteToConsole_SpeechRecognitionRejected(object sender, SpeechRecognitionRejectedEventArgs e)
            {
                Console.WriteLine("Speech rejected. Did you mean:");
                foreach (RecognizedPhrase r in e.Result.Alternates)
                {
                    Console.WriteLine("    " + r.Text);
                }
            }
            #endregion 上記の関数で、「チーズ―」或いは「とります」を言ったら、写真とる関数と連携し、写真を自動的にとる機能が出来ます。

            private void btnStart_Click(object sender, EventArgs e)
            {
                //音声認識エンジン「SpeechRecognitionEngine 」を作成
                recognizer = new SpeechRecognitionEngine();
                /////////////////////////////////////////////////////////////////////////////
                //文法ファイルに、位置します。文法ファイル方式と、コード内に直接記述の2通りの方法があるようです。
                //1
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("うぃち")));
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("いち")));
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("わん")));
                //2
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("に")));
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("にー")));
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("にい")));
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("つー")));
                //3
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("さん")));
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("あん")));
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("さ")));
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("さあ")));
                //4
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("よん")));
                //5
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("ご")));
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("ごお")));
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("ごー")));
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("ごう")));
                //6
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("ろ")));
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("ろく")));
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("おく")));
                //7
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("なな")));
                //1recognizer.LoadGrammar(new Grammar(new GrammarBuilder("ひち")));
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("しち")));
                //8
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("あち")));
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("はち")));
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("はちー")));
                //9
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("く")));
                //10
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("じゅう")));
                //おわり
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("おわり")));
                //あか
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("あか")));
                //あお
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("あお")));
                //きいろ
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("きいろ")));
                //くろ
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("くろ")));
                //0
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("ぜろ")));
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("まる")));
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("れい")));
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("れえ")));
                //A
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("えー")));
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("え")));
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("えい")));
                //B
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("び")));
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("びい")));
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("びー")));
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("びぃ")));
                //C
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("す")));
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("しい")));
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("しぃ")));
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("しぃー")));
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("しー")));
                //D
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("でぃ")));
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("でい")));
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("でぃー")));
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("でー")));
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("で")));
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("だい")));
                //クリア
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("クリア")));
                //ばっくすぺーす
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("ばっくすぺーす")));
                //しゅうせい
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("しゅうせい")));
                //はいせん
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("はいせん")));
                /////////////////////////////////////////////////////////////////////////////
                //音声認識成功の関数「SpeechRecognized 」 を追加
               recognizer.SpeechRecognized += _recognizeSpeechAndWriteToConsole_SpeechRecognized;
           //音声認識失敗の関数「SpeechRecognized 」 を追加
                recognizer.SpeechRecognitionRejected += _recognizeSpeechAndWriteToConsole_SpeechRecognitionRejected;
                recognizer.SetInputToDefaultAudioDevice(); // set the input to the default audio device
                recognizer.RecognizeAsync(RecognizeMode.Multiple); // recognize speech asynchronous
                //ボタン 音声認識色へ
                btnStart.BackColor = Color.Green;

            }
            //ケーブルモードTrueにしたときの動作
            private void radioButton1_CheckedChanged(object sender, EventArgs e)
            {
                if ( radioButton1.Checked==true )
                {
                    radioButton2.Checked = false;
                    radioButton3.Checked = false;
                    radioButton4.Checked = false;
                    radioButton5.Checked = false;
                }
            }
            //方向モードTrueにしたときの動作
            private void radioButton2_CheckedChanged_1(object sender, EventArgs e)
            {
                if (radioButton2.Checked == true)
                {
                    radioButton1.Checked = false;
                    radioButton3.Checked = false;
                    radioButton4.Checked = false;
                    radioButton5.Checked = false;
                }
            }
            //太さモードTrueにしたときの動作
            private void radioButton3_CheckedChanged_1(object sender, EventArgs e)
            {
                if (radioButton3.Checked == true)
                {
                    radioButton1.Checked = false;
                    radioButton2.Checked = false;
                    radioButton4.Checked = false;
                    radioButton5.Checked = false;
                }
            }
            //数字モードTrueにしたときの動作
            private void radioButton4_CheckedChanged_1(object sender, EventArgs e)
            {
                if (radioButton4.Checked == true)
                {
                    radioButton1.Checked = false;
                    radioButton2.Checked = false;
                    radioButton3.Checked = false;
                    radioButton5.Checked = false;
                }
            }
            //アルファベットモードTrueにしたときの動作
            private void radioButton5_CheckedChanged(object sender, EventArgs e)
            {
                if (radioButton5.Checked == true)
                {
                    radioButton1.Checked = false;
                    radioButton2.Checked = false;
                    radioButton3.Checked = false;
                    radioButton4.Checked = false;
                }

            }  
            
      }

    }

    2015年10月7日 4:44
  • 情報頂きましてありがとうございます。

    使用環境は、

    OS:Windows7 Pro.(64bit) (日本語OS)

    音声認識エンジン:あらかじめOS内蔵の コントロールパネルでは、Windows音声認識エンジン8.0

                と、表示される、SAPI5.4 の日本語OSのため、日本語エンジン

    プログラミング開発環境ソフト:Visual Studio の C#

    です。

    症状:0-10、A-Zを、日本語エンジンで認識させています。

       例えば、Aなら、”えー”と日本人が発音して、コードの中で、例えばですが、”えー”なら、

       Aと表示するようにしています。

       認識率アルファベットによっては、50%以上、アルファベットによっては、音声辞書で録音しても、

       その文字になるきっかけの、平仮名がひらえない状況です。

       例えば、M=えむ、N=えぬ、がどちらかに、なるなど。T=てぃー、てー、D=でぃー、で、でぃ

       音声辞書で録音しても、うまく意図する文字に、ひらがなで引っかからない状況です。

       苦肉の策で何か、知恵があればい、頂けますと助かります。

        前提として、別途費用発生する方法は、極力無し。との前提の中で試行錯誤しています。

        WindowsXP, VB6.0 SAPI 6.1 では、そこそこの認識率に、A-Z行けたのですが、

        Windows7内蔵の音声認識エンジンでは、認識率低くなる実験結果を個人的には、

        体験しながら、試行錯誤中です。

         音声認識エンジンのトレーニングも、3回以上は、行っています。

       最終的には、不特定多数の人が使う音声認識インターフェースがねらいのため、自分の声だけで

       この程度なら、PCごと、ユーザーごと、個別に音声認識トレーニング必要なのかなという印象です。

    質問1:

       0-10は、なんとか大丈夫ですが、A-Zは、認識率が低く、

        音声辞書で自分の声を録音して、認識するようにしましたが、今度は、

        数字が、アルファベットの音声辞書に引っ張られます。

        数字モードと、アルファベットモードの時に、音声認識エンジンの

        例えば、以下の行などを、数字モードでは、使いい、アルファベットモードでは、

        一旦クリアするような命令があれば、それで試してみたいのですが、見つかっていません。

        recognizer.LoadGrammar(new Grammar(new GrammarBuilder("いち")));

           ...

        これらの命令を、モードごとに一旦クリアしてから、再度使うときに、これらの行また通過するような

       命令ありますでしょうか?

        今回のプログラミングでは、アルファベットモードを、ABモードとしています。

        モードの切り替えも音声で行っています。これは、ユニークな言葉を選んだので、

        90%程度の認識率で認識します。(もちろん周りで人などうるさい雑音あると低い方向になる傾向です。)

        USBマイク(PCの筐体外であらかじめA/D変換するマイク)でも、同様の傾向です。

    質問2:

        英語の音声認識エンジンが、無料でダウンロードできるのでしょうか?

            ネット上の、ある文献では、UltimateのバージョンのWindowsでないと、英語の音声認識エンジンは、

        インストールできないとの情報を見つけました。

    目的:あるプログラムのユーザーインターフェース部分に、音声認識により、キーボード使うのが不得意な人

        向けに、音声認識を使う企画あります。

        そのために、原理試作的に、どのようにプログラミングすれば、利用できるか?原理試作プログラミング・調査

        試行錯誤が自分の担当となっています。

    コード:

    具体的な、コード(.cs)を以下に貼り付けさせていただきます。

    文字数が、6000文字と制限有り、抜粋しています。

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    using System.Speech;
    using System.Speech.Recognition;
    using System.Collections.ObjectModel;
    //using System.Threading;
    using System.Speech.Synthesis;
    using System.Globalization;


    namespace CameraDemo
    {
        public partial class Form1 : Form
        {
            //ビープ音を鳴らす
            //System.Runtime.InteropServices.DllImport("user32.dll")] 

            SpeechSynthesizer speechSynthesizer = new SpeechSynthesizer();
            CultureInfo cultureInfo = Application.CurrentCulture;
            //ReadOnlyCollection<InstalledVoice> voices = speechSynthesizer.GetInstalledVoices(cultureInfo);

            //var tts = WScript.CreateObject("SAPI.SpVoice");

            //tts.Speak("Hello world! おはよう! Konnichiwa!");

            #region Recognize speech and write to console

            //1)まずはは、音声認識エンジン「SpeechRecognitionEngine 」変数を宣言します。
          static SpeechRecognitionEngine recognizer = null;
          


          //2)音声認識機能起動の関数を実装します

            //音toText変数
            public string StrSoundtoText;
            public Boolean SpeechRecogFlg;
            public string StrAddBox;//テキストボックスに追加する直前の入れ物

            public Form1()
            {
                InitializeComponent();
            }



            public void Form1_Load(object sender, EventArgs e)
            {
              
      
            }
       

    //音声認識が成功の関数
            public void _recognizeSpeechAndWriteToConsole_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
            {
                //音楽再生インスタンス生成
                //System.Media.SoundPlayer sPlayer = new System.Media.SoundPlayer("C:\\indows\\Media\\Windows メッセージ (警告).wav");
                //初期化。
                StrSoundtoText = "";
                //認識された文字列を、生データのまま表示。
                textRecognition.Text = e.Result.Text;
                //文法ファイル的に、認識された文字列を補正します。

                if (txtSpeech.Text.Length > 16)
                {
                    txtSpeech.Text = "";
                }
                /////////////////////////////////////////////////////////////////////////////
                //ここに、文法ファイルのアルゴリズム記述してください
                if (radioButton1.Checked == true | radioButton2.Checked == true | radioButton3.Checked == true | radioButton4.Checked == true)
                {
                    if (e.Result.Text == "うぃち" | e.Result.Text == "いち" | e.Result.Text == "えち" | e.Result.Text == "わん")
                    {
                        StrSoundtoText = "1";
                    }
                    else if (e.Result.Text == "に" | e.Result.Text == "にー" | e.Result.Text == "にい" | e.Result.Text == "つー")
                    {
                        StrSoundtoText = "2";
                    }
                    else if (e.Result.Text == "さん" | e.Result.Text == "あん" | e.Result.Text == "さ" | e.Result.Text == "さあ")
                    {
                        StrSoundtoText = "3";
                    }
                    else if (e.Result.Text == "よん")
                    {
                        StrSoundtoText = "4";
                    }
                    else if (e.Result.Text == "ご" | e.Result.Text == "ごお" | e.Result.Text == "ごー" | e.Result.Text == "ごう")
                    {
                        StrSoundtoText = "5";
                    }
                    else if (e.Result.Text == "ろ" | e.Result.Text == "ろく" | e.Result.Text == "おく")
                    {
                        StrSoundtoText = "6";
                    }
                    else if (e.Result.Text == "なな" | e.Result.Text == "しち")
                    {
                        StrSoundtoText = "7";
                    }
                    else if (e.Result.Text == "あち" | e.Result.Text == "はち" | e.Result.Text == "はちー")
                    {
                        StrSoundtoText = "8";
                    }
                    else if (e.Result.Text == "く")
                    {
                        StrSoundtoText = "9";
                    }
                    else if (e.Result.Text == "じゅう")
                    {
                        StrSoundtoText = "10";
                    }
                }

                else if (e.Result.Text == "ぜろ" | e.Result.Text == "まる" | e.Result.Text == "れい" | e.Result.Text == "れえ")
                {
                    StrSoundtoText = "0";
                }
                else if (e.Result.Text == "ぱ")
                {
                    StrSoundtoText = "@";
                }
                else if (e.Result.Text == "けーぶる" | e.Result.Text == "けーぶ" | e.Result.Text == "けいぶる" | e.Result.Text == "けいぶ")
                {
                    StrSoundtoText = "けーぶる";
                }
                else if (e.Result.Text == "ほうこう" | e.Result.Text == "ほーこ" | e.Result.Text == "ほーこお" | e.Result.Text == "ほーこう")
                {
                    StrSoundtoText = "ほうこう";
                }
                else if (e.Result.Text == "ふとさ" | e.Result.Text == "ふとさ" | e.Result.Text == "ふとあ" | e.Result.Text == "ふとら")
                {
                    StrSoundtoText = "ふとさ";
                }
                else if (e.Result.Text == "てん" | e.Result.Text == "どっと" | e.Result.Text == "しょうすう" | e.Result.Text == "ぽいんと" | e.Result.Text == "ぽいん" | e.Result.Text == "ぽい")
                {
                    StrSoundtoText = ".";
                }
                else if (e.Result.Text == "きた" | e.Result.Text == "いた")
                {
                    StrSoundtoText = "北森";
                }
                else if (e.Result.Text == "えーびー")
                {
                    StrSoundtoText = "えーびー";
                }
                else if (e.Result.Text == "すうじ")
                {
                    StrSoundtoText = "すうじ";
                }
                else if (e.Result.Text == "くりあ" | e.Result.Text == "クリア")
                {
                    StrSoundtoText = "";
                    txtSpeech.Text = "";
                }

                if (radioButton5.Checked == true)
                {
                    //ABモード(アフファベットモード)なら、前処理で翻訳あっても、モード変更文字列以外は、一旦クリア
                    if (StrSoundtoText=="RED"| StrSoundtoText=="YELLOW"| StrSoundtoText=="BLUE"| StrSoundtoText=="BLACK"|StrSoundtoText=="はいせん"| StrSoundtoText=="ほうこう"| StrSoundtoText=="ふとさ"| StrSoundtoText=="."| StrSoundtoText=="えーびー"| StrSoundtoText=="すうじ"| StrSoundtoText=="クリア"| StrSoundtoText=="くりあ"| StrSoundtoText=="おわり"| StrSoundtoText=="北森")
                    {
                        //何もしない
                    }
                    else 
                    {
                        //クリア
                        StrSoundtoText = "";
                    }
                    if (e.Result.Text == "えー" | e.Result.Text == "え" | e.Result.Text == "えい")
                    {
                        StrSoundtoText = "A";
                    }
                    else if (e.Result.Text == "び" | e.Result.Text == "びい" | e.Result.Text == "びー")
                    {
                        StrSoundtoText = "B";
                    }
                    else if (e.Result.Text == "す" | e.Result.Text == "しい" | e.Result.Text == "しぃ" | e.Result.Text == "しぃー" | e.Result.Text == "しー")
                    {
                        StrSoundtoText = "C";
                    }
                    else if (e.Result.Text == "でぃ" | e.Result.Text == "でい" | e.Result.Text == "でぃー" | e.Result.Text == "でー" | e.Result.Text == "で" | e.Result.Text == "だい")
                    {
                        StrSoundtoText = "D";
                    }
                    else if ( e.Result.Text == "いー")
                    {
                        StrSoundtoText = "E";
                    }
                    else if (e.Result.Text == "え" | e.Result.Text == "えふ")
                    {
                        StrSoundtoText = "F";
                    }
                    else if (e.Result.Text == "じー" | e.Result.Text == "じ" | e.Result.Text == "じぃ" | e.Result.Text == "じい" | e.Result.Text == "ぜ" | e.Result.Text == "ぜっ" | e.Result.Text == "ごるふ" | e.Result.Text == "ごりら")
                    {
                        StrSoundtoText = "G";
                    }
                    else if (e.Result.Text == "えいち" | e.Result.Text == "えっち" | e.Result.Text == "えち" | e.Result.Text == "いち")
                    {
                        StrSoundtoText = "H";
                    }
     
                }
                else if (e.Result.Text == "ばっくすぺーす" | e.Result.Text == "しゅうせい")
                {

                    if (txtSpeech.Text.Length > 0)
                    {
                        txtSpeech.Text = txtSpeech.Text.Substring(0, txtSpeech.Text.Length - 1);
                    }
                    //MessageBeep(0);
                    StrSoundtoText = "";
                    //800Hzの周波数で200ミリ秒間再生する
                    Console.Beep();
                    //10000の周波数で500ミリ秒間再生する
                    Console.Beep(10000, 500);
                }
                else
                {
                    //
                }

                //結果を、中継の箱に代入
                StrAddBox = StrSoundtoText;
                /////////////////////////////////////////////////////////////////////////////
                //ここに、文法ファイルで補正した、認識文字列に対しての、制御アルゴリズム記述してください
                //モード切り替え
                
                if (StrSoundtoText=="すうじ")
                {
                    txtSpeech.Text = "";
                    StrAddBox="<数字モード>(デモ)";
                    radioButton4.Checked = true;
                    goto PointDisplay;
                }
                else if (StrSoundtoText == "はいせん")
                {
                    txtSpeech.Text = "";
                    StrAddBox = "<配線モード>(デモ)";
                    radioButton1.Checked = true;
                    goto PointDisplay;
                }
                else if (StrSoundtoText == "ほうこう")
                {
                    txtSpeech.Text = "";
                    StrAddBox = "<方向ルモード>(デモ)";
                    radioButton2.Checked = true;
                    goto PointDisplay;
                }
                else if (StrSoundtoText == "ふとさ")
                {
                    txtSpeech.Text = "";
                    StrAddBox = "<太さモード>(デモ)";
                    radioButton3.Checked = true;
                    goto PointDisplay;
                }
                else if (StrSoundtoText == "えーびー")
                {
                    txtSpeech.Text = "";
                    StrAddBox = "<ABモード>(デモ)";
                    radioButton5.Checked = true;
                    goto PointDisplay;
                }
                //各モードの処理
                //英数字モード以外の場合
                if (radioButton4.Checked == false & radioButton5.Checked == false)
                {
                    //ケーブルモードの場合
                    if (radioButton1.Checked == true)
                  {
                      switch (StrAddBox)
                      {
                          case "1":
                              StrAddBox = "KIV1(デモ)";
                              break;
                          case "2":
                              StrAddBox = "KIV2(デモ)";
                              break;
                          case "3":
                              StrAddBox = "KIV3(デモ)";
                              break;
                          case "4":
                              StrAddBox = "KIV4(デモ)";
                              break;
                          case "5":
                              StrAddBox = "KIV5(デモ)";
                              break;
                          case "6":
                              StrAddBox = "KIV6(デモ)";
                              break;
                          default:
                              StrAddBox = "?";
                              break;
                      }
                    }
                    //方向モードの場合
                    if (radioButton2.Checked == true)
                    {
                        switch (StrAddBox)
                        {
                            case "1":
                                StrAddBox = "正方向・右1(デモ)";
                                break;
                            case "2":
                                StrAddBox = "正方向・中2(デモ)";
                                break;
                            case "3":
                                StrAddBox = "正方向・左3(デモ)";
                                break;
                            case "4":
                                StrAddBox = "逆方向・右4(デモ)";
                                break;
                            case "5":
                                StrAddBox = "逆方向・中5(デモ)";
                                break;
                            case "6":
                                StrAddBox = "逆方向・左5(デモ)";
                                break;
                            default:
                                StrAddBox = "?";
                                break;
                        }
                    }
                    //太さモードの場合
                    if (radioButton3.Checked == true)
                    {
                        switch (StrAddBox)
                        {
                            case "1":
                                StrAddBox = "0.30 1(デモ)";
                                break;
                            case "2":
                                StrAddBox = "0.75 2(デモ)";
                                break;
                            case "3":
                                StrAddBox = "1.00 3(デモ)";
                                break;
                            case "4":
                                StrAddBox = "1.25 4(デモ)";
                                break;
                            case "5":
                                StrAddBox = "1.50 5(デモ)";
                                break;
                            case "6":
                                StrAddBox = "1.75 6(デモ)";
                                break;
                            case "7":
                                StrAddBox = "2.00 7(デモ)";
                                break;
                            case "8":
                                StrAddBox = "3.00 8(デモ)";
                                break;
                            case "9":
                                StrAddBox = "5.00 9(デモ)";
                                break;
                            case "10":
                                StrAddBox = "7.00 10(デモ)";
                                break;
                            default:
                                StrAddBox = "?";
                                break;
                        }
                    }
                }
            PointDisplay:
                //共通処理
                //800Hzの周波数で200ミリ秒間再生する
                Console.Beep();
                //10000の周波数で500ミリ秒間再生する
                //Console.Beep(10000, 500);
                if (StrSoundtoText=="" )
                {
                    StrAddBox = "";
                }
            if (StrSoundtoText.Length > 3)
            {
                //speechSynthesizer.Speak("mode or Color");
            }
            else
            {
                //speechSynthesizer.Speak(StrAddBox.ToString());
            } 
                txtSpeech.Text = txtSpeech.Text + StrAddBox;
                /////////////////////////////////////////////////////////////////////////////
            }
           //音声認識失敗の関数
            static void _recognizeSpeechAndWriteToConsole_SpeechRecognitionRejected(object sender, SpeechRecognitionRejectedEventArgs e)
            {
                Console.WriteLine("Speech rejected. Did you mean:");
                foreach (RecognizedPhrase r in e.Result.Alternates)
                {
                    Console.WriteLine("    " + r.Text);
                }
            }
            #endregion 上記の関数で、「チーズ―」或いは「とります」を言ったら、写真とる関数と連携し、写真を自動的にとる機能が出来ます。

            private void btnStart_Click(object sender, EventArgs e)
            {
                //音声認識エンジン「SpeechRecognitionEngine 」を作成
                recognizer = new SpeechRecognitionEngine();
                /////////////////////////////////////////////////////////////////////////////
                //文法ファイルに、位置します。文法ファイル方式と、コード内に直接記述の2通りの方法があるようです。
                //1
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("うぃち")));
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("いち")));
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("わん")));
                //2
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("に")));
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("にー")));
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("にい")));
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("つー")));
                //3
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("さん")));
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("あん")));
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("さ")));
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("さあ")));
                //4
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("よん")));
                //5
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("ご")));
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("ごお")));
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("ごー")));
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("ごう")));
                //6
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("ろ")));
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("ろく")));
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("おく")));
                //7
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("なな")));
                //1recognizer.LoadGrammar(new Grammar(new GrammarBuilder("ひち")));
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("しち")));
                //8
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("あち")));
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("はち")));
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("はちー")));
                //9
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("く")));
                //10
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("じゅう")));
                //おわり
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("おわり")));
                //あか
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("あか")));
                //あお
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("あお")));
                //きいろ
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("きいろ")));
                //くろ
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("くろ")));
                //0
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("ぜろ")));
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("まる")));
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("れい")));
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("れえ")));
                //A
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("えー")));
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("え")));
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("えい")));
                //B
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("び")));
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("びい")));
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("びー")));
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("びぃ")));
                //C
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("す")));
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("しい")));
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("しぃ")));
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("しぃー")));
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("しー")));
                //D
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("でぃ")));
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("でい")));
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("でぃー")));
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("でー")));
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("で")));
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("だい")));
                //クリア
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("クリア")));
                //ばっくすぺーす
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("ばっくすぺーす")));
                //しゅうせい
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("しゅうせい")));
                //はいせん
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("はいせん")));
                /////////////////////////////////////////////////////////////////////////////
                //音声認識成功の関数「SpeechRecognized 」 を追加
               recognizer.SpeechRecognized += _recognizeSpeechAndWriteToConsole_SpeechRecognized;
           //音声認識失敗の関数「SpeechRecognized 」 を追加
                recognizer.SpeechRecognitionRejected += _recognizeSpeechAndWriteToConsole_SpeechRecognitionRejected;
                recognizer.SetInputToDefaultAudioDevice(); // set the input to the default audio device
                recognizer.RecognizeAsync(RecognizeMode.Multiple); // recognize speech asynchronous
                //ボタン 音声認識色へ
                btnStart.BackColor = Color.Green;

            }
            //ケーブルモードTrueにしたときの動作
            private void radioButton1_CheckedChanged(object sender, EventArgs e)
            {
                if ( radioButton1.Checked==true )
                {
                    radioButton2.Checked = false;
                    radioButton3.Checked = false;
                    radioButton4.Checked = false;
                    radioButton5.Checked = false;
                }
            }
            //方向モードTrueにしたときの動作
            private void radioButton2_CheckedChanged_1(object sender, EventArgs e)
            {
                if (radioButton2.Checked == true)
                {
                    radioButton1.Checked = false;
                    radioButton3.Checked = false;
                    radioButton4.Checked = false;
                    radioButton5.Checked = false;
                }
            }
            //太さモードTrueにしたときの動作
            private void radioButton3_CheckedChanged_1(object sender, EventArgs e)
            {
                if (radioButton3.Checked == true)
                {
                    radioButton1.Checked = false;
                    radioButton2.Checked = false;
                    radioButton4.Checked = false;
                    radioButton5.Checked = false;
                }
            }
            //数字モードTrueにしたときの動作
            private void radioButton4_CheckedChanged_1(object sender, EventArgs e)
            {
                if (radioButton4.Checked == true)
                {
                    radioButton1.Checked = false;
                    radioButton2.Checked = false;
                    radioButton3.Checked = false;
                    radioButton5.Checked = false;
                }
            }
            //アルファベットモードTrueにしたときの動作
            private void radioButton5_CheckedChanged(object sender, EventArgs e)
            {
                if (radioButton5.Checked == true)
                {
                    radioButton1.Checked = false;
                    radioButton2.Checked = false;
                    radioButton3.Checked = false;
                    radioButton4.Checked = false;
                }

            }  
            
      }

    }

    2015年10月7日 4:52
  • 情報頂きましてありがとうございます。

    使用環境は、

    OS:Windows7 Pro.(64bit) (日本語OS)

    音声認識エンジン:あらかじめOS内蔵の コントロールパネルでは、Windows音声認識エンジン8.0

                と、表示される、SAPI5.4 の日本語OSのため、日本語エンジン

    プログラミング開発環境ソフト:Visual Studio の C#

    です。

    症状:0-10、A-Zを、日本語エンジンで認識させています。

       例えば、Aなら、”えー”と日本人が発音して、コードの中で、例えばですが、”えー”なら、

       Aと表示するようにしています。

       認識率アルファベットによっては、50%以上、アルファベットによっては、音声辞書で録音しても、

       その文字になるきっかけの、平仮名がひらえない状況です。

       例えば、M=えむ、N=えぬ、がどちらかに、なるなど。T=てぃー、てー、D=でぃー、で、でぃ

       音声辞書で録音しても、うまく意図する文字に、ひらがなで引っかからない状況です。

       苦肉の策で何か、知恵があればい、頂けますと助かります。

        前提として、別途費用発生する方法は、極力無し。との前提の中で試行錯誤しています。

        WindowsXP, VB6.0 SAPI 6.1 では、そこそこの認識率に、A-Z行けたのですが、

        Windows7内蔵の音声認識エンジンでは、認識率低くなる実験結果を個人的には、

        体験しながら、試行錯誤中です。

         音声認識エンジンのトレーニングも、3回以上は、行っています。

       最終的には、不特定多数の人が使う音声認識インターフェースがねらいのため、自分の声だけで

       この程度なら、PCごと、ユーザーごと、個別に音声認識トレーニング必要なのかなという印象です。

    質問1:

       0-10は、なんとか大丈夫ですが、A-Zは、認識率が低く、

        音声辞書で自分の声を録音して、認識するようにしましたが、今度は、

        数字が、アルファベットの音声辞書に引っ張られます。

        数字モードと、アルファベットモードの時に、音声認識エンジンの

        例えば、以下の行などを、数字モードでは、使いい、アルファベットモードでは、

        一旦クリアするような命令があれば、それで試してみたいのですが、見つかっていません。

        recognizer.LoadGrammar(new Grammar(new GrammarBuilder("いち")));

           ...

        これらの命令を、モードごとに一旦クリアしてから、再度使うときに、これらの行また通過するような

       命令ありますでしょうか?

        今回のプログラミングでは、アルファベットモードを、ABモードとしています。

        モードの切り替えも音声で行っています。これは、ユニークな言葉を選んだので、

        90%程度の認識率で認識します。(もちろん周りで人などうるさい雑音あると低い方向になる傾向です。)

        USBマイク(PCの筐体外であらかじめA/D変換するマイク)でも、同様の傾向です。

    質問2:

        英語の音声認識エンジンが、無料でダウンロードできるのでしょうか?

            ネット上の、ある文献では、UltimateのバージョンのWindowsでないと、英語の音声認識エンジンは、

        インストールできないとの情報を見つけました。

    目的:あるプログラムのユーザーインターフェース部分に、音声認識により、キーボード使うのが不得意な人

        向けに、音声認識を使う企画あります。

        そのために、原理試作的に、どのようにプログラミングすれば、利用できるか?原理試作プログラミング・調査

        試行錯誤が自分の担当となっています。

    コード:

    具体的な、コード(.cs)を以下に貼り付けさせていただきます。

    文字数が、6000文字と制限有り、抜粋しています。

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    using System.Speech;
    using System.Speech.Recognition;
    using System.Collections.ObjectModel;
    //using System.Threading;
    using System.Speech.Synthesis;
    using System.Globalization;


    namespace CameraDemo
    {
        public partial class Form1 : Form
        {
            //ビープ音を鳴らす
            //System.Runtime.InteropServices.DllImport("user32.dll")] 

            SpeechSynthesizer speechSynthesizer = new SpeechSynthesizer();
            CultureInfo cultureInfo = Application.CurrentCulture;
            //ReadOnlyCollection<InstalledVoice> voices = speechSynthesizer.GetInstalledVoices(cultureInfo);

            //var tts = WScript.CreateObject("SAPI.SpVoice");

            //tts.Speak("Hello world! おはよう! Konnichiwa!");

            #region Recognize speech and write to console

            //1)まずはは、音声認識エンジン「SpeechRecognitionEngine 」変数を宣言します。
          static SpeechRecognitionEngine recognizer = null;
          


          //2)音声認識機能起動の関数を実装します

            //音toText変数
            public string StrSoundtoText;
            public Boolean SpeechRecogFlg;
            public string StrAddBox;//テキストボックスに追加する直前の入れ物

            public Form1()
            {
                InitializeComponent();
            }



            public void Form1_Load(object sender, EventArgs e)
            {
              
      
            }
       

    //音声認識が成功の関数
            public void _recognizeSpeechAndWriteToConsole_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
            {
                //音楽再生インスタンス生成
                //System.Media.SoundPlayer sPlayer = new System.Media.SoundPlayer("C:\\indows\\Media\\Windows メッセージ (警告).wav");
                //初期化。
                StrSoundtoText = "";
                //認識された文字列を、生データのまま表示。
                textRecognition.Text = e.Result.Text;
                //文法ファイル的に、認識された文字列を補正します。

                if (txtSpeech.Text.Length > 16)
                {
                    txtSpeech.Text = "";
                }
                /////////////////////////////////////////////////////////////////////////////
                //ここに、文法ファイルのアルゴリズム記述してください
                if (radioButton1.Checked == true | radioButton2.Checked == true | radioButton3.Checked == true | radioButton4.Checked == true)
                {
                    if (e.Result.Text == "うぃち" | e.Result.Text == "いち" | e.Result.Text == "えち" | e.Result.Text == "わん")
                    {
                        StrSoundtoText = "1";
                    }
                    else if (e.Result.Text == "に" | e.Result.Text == "にー" | e.Result.Text == "にい" | e.Result.Text == "つー")
                    {
                        StrSoundtoText = "2";
                    }
                    else if (e.Result.Text == "さん" | e.Result.Text == "あん" | e.Result.Text == "さ" | e.Result.Text == "さあ")
                    {
                        StrSoundtoText = "3";
                    }
                    else if (e.Result.Text == "よん")
                    {
                        StrSoundtoText = "4";
                    }
                    else if (e.Result.Text == "ご" | e.Result.Text == "ごお" | e.Result.Text == "ごー" | e.Result.Text == "ごう")
                    {
     
                if (radioButton5.Checked == true)
                {
                    //ABモード(アフファベットモード)なら、前処理で翻訳あっても、モード変更文字列以外は、一旦クリア
                    if (StrSoundtoText=="RED"| StrSoundtoText=="YELLOW"| StrSoundtoText=="BLUE"| StrSoundtoText=="BLACK"|StrSoundtoText=="はいせん"| StrSoundtoText=="ほうこう"| StrSoundtoText=="ふとさ"| StrSoundtoText=="."| StrSoundtoText=="えーびー"| StrSoundtoText=="すうじ"| StrSoundtoText=="クリア"| StrSoundtoText=="くりあ"| StrSoundtoText=="おわり"| StrSoundtoText=="北森")
                    {
                        //何もしない
                    }
                    else 
                    {
                        //クリア
                        StrSoundtoText = "";
                    }
                    if (e.Result.Text == "えー" | e.Result.Text == "え" | e.Result.Text == "えい")
                    {
                        StrSoundtoText = "A";
                    }
                    else if (e.Result.Text == "び" | e.Result.Text == "びい" | e.Result.Text == "びー")
                    {
                        StrSoundtoText = "B";
                    }
                    else if (e.Result.Text == "す" | e.Result.Text == "しい" | e.Result.Text == "しぃ" | e.Result.Text == "しぃー" | e.Result.Text == "しー")
                    {
                        StrSoundtoText = "C";
                    }
                    else if (e.Result.Text == "でぃ" | e.Result.Text == "でい" | e.Result.Text == "でぃー" | e.Result.Text == "でー" | e.Result.Text == "で" | e.Result.Text == "だい")
                    {
                        StrSoundtoText = "D";
                    }
      
                    //MessageBeep(0);
                    StrSoundtoText = "";
                    //800Hzの周波数で200ミリ秒間再生する
                    Console.Beep();
                    //10000の周波数で500ミリ秒間再生する
                    Console.Beep(10000, 500);
                }
                else
                {
                    //
                }

                //結果を、中継の箱に代入
                StrAddBox = StrSoundtoText;
                /////////////////////////////////////////////////////////////////////////////
                //ここに、文法ファイルで補正した、認識文字列に対しての、制御アルゴリズム記述してください
                //モード切り替え
                
                if (StrSoundtoText=="すうじ")
                {
                    txtSpeech.Text = "";
                    StrAddBox="<数字モード>(デモ)";
                    radioButton4.Checked = true;
                    goto PointDisplay;
                }
                else if (StrSoundtoText == "はいせん")
                {
                    txtSpeech.Text = "";
                    StrAddBox = "<配線モード>(デモ)";
                    radioButton1.Checked = true;
                    goto PointDisplay;
                }
                else if (StrSoundtoText == "ほうこう")
                {
                    txtSpeech.Text = "";
                    StrAddBox = "<方向ルモード>(デモ)";
                    radioButton2.Checked = true;
                    goto PointDisplay;
                }
                else if (StrSoundtoText == "ふとさ")
                {
                    txtSpeech.Text = "";
                    StrAddBox = "<太さモード>(デモ)";
                    radioButton3.Checked = true;
                    goto PointDisplay;
                }
                else if (StrSoundtoText == "えーびー")
                {
                    txtSpeech.Text = "";
                    StrAddBox = "<ABモード>(デモ)";
                    radioButton5.Checked = true;
                    goto PointDisplay;
                }

       
                }
            PointDisplay:
                //共通処理
                //800Hzの周波数で200ミリ秒間再生する
                Console.Beep();
                //10000の周波数で500ミリ秒間再生する
                //Console.Beep(10000, 500);
                if (StrSoundtoText=="" )
                {
                    StrAddBox = "";
                }
            if (StrSoundtoText.Length > 3)
            {
                //speechSynthesizer.Speak("mode or Color");
            }
            else
            {
                //speechSynthesizer.Speak(StrAddBox.ToString());
            } 
                txtSpeech.Text = txtSpeech.Text + StrAddBox;
                /////////////////////////////////////////////////////////////////////////////
            }
           //音声認識失敗の関数
            static void _recognizeSpeechAndWriteToConsole_SpeechRecognitionRejected(object sender, SpeechRecognitionRejectedEventArgs e)
            {
                Console.WriteLine("Speech rejected. Did you mean:");
                foreach (RecognizedPhrase r in e.Result.Alternates)
                {
                    Console.WriteLine("    " + r.Text);
                }
            }
            #endregion 上記の関数で、「チーズ―」或いは「とります」を言ったら、写真とる関数と連携し、写真を自動的にとる機能が出来ます。

            private void btnStart_Click(object sender, EventArgs e)
            {
                //音声認識エンジン「SpeechRecognitionEngine 」を作成
                recognizer = new SpeechRecognitionEngine();
                /////////////////////////////////////////////////////////////////////////////
                //文法ファイルに、位置します。文法ファイル方式と、コード内に直接記述の2通りの方法があるようです。
                //1
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("うぃち")));
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("いち")));
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("わん")));
                //2
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("に")));
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("にー")));
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("にい")));
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("つー")));
                //3
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("さん")));
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("あん")));
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("さ")));
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("さあ")));
                //4
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("よん")));
         
                //C
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("す")));
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("しい")));
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("しぃ")));
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("しぃー")));
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("しー")));
                //D
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("でぃ")));
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("でい")));
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("でぃー")));
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("でー")));
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("で")));
                recognizer.LoadGrammar(new Grammar(new GrammarBuilder("だい")));
       
                /////////////////////////////////////////////////////////////////////////////
                //音声認識成功の関数「SpeechRecognized 」 を追加
               recognizer.SpeechRecognized += _recognizeSpeechAndWriteToConsole_SpeechRecognized;
           //音声認識失敗の関数「SpeechRecognized 」 を追加
                recognizer.SpeechRecognitionRejected += _recognizeSpeechAndWriteToConsole_SpeechRecognitionRejected;
                recognizer.SetInputToDefaultAudioDevice(); // set the input to the default audio device
                recognizer.RecognizeAsync(RecognizeMode.Multiple); // recognize speech asynchronous
                //ボタン 音声認識色へ
                btnStart.BackColor = Color.Green;

            }
            //ケーブルモードTrueにしたときの動作
            private void radioButton1_CheckedChanged(object sender, EventArgs e)
            {
                if ( radioButton1.Checked==true )
                {
                    radioButton2.Checked = false;
                    radioButton3.Checked = false;
                    radioButton4.Checked = false;
                    radioButton5.Checked = false;
                }
            }
            //方向モードTrueにしたときの動作
            private void radioButton2_CheckedChanged_1(object sender, EventArgs e)
            {
                if (radioButton2.Checked == true)
                {
                    radioButton1.Checked = false;
                    radioButton3.Checked = false;
                    radioButton4.Checked = false;
                    radioButton5.Checked = false;
                }
            }
            //太さモードTrueにしたときの動作
            private void radioButton3_CheckedChanged_1(object sender, EventArgs e)
            {
                if (radioButton3.Checked == true)
                {
                    radioButton1.Checked = false;
                    radioButton2.Checked = false;
                    radioButton4.Checked = false;
                    radioButton5.Checked = false;
                }
            }
            //数字モードTrueにしたときの動作
            private void radioButton4_CheckedChanged_1(object sender, EventArgs e)
            {
                if (radioButton4.Checked == true)
                {
                    radioButton1.Checked = false;
                    radioButton2.Checked = false;
                    radioButton3.Checked = false;
                    radioButton5.Checked = false;
                }
            }
            //アルファベットモードTrueにしたときの動作
            private void radioButton5_CheckedChanged(object sender, EventArgs e)
            {
                if (radioButton5.Checked == true)
                {
                    radioButton1.Checked = false;
                    radioButton2.Checked = false;
                    radioButton3.Checked = false;
                    radioButton4.Checked = false;
                }

            }  
            
      }

    }

    2015年10月7日 4:57
  • 送信時点での、状況です。

    これまで、CD品質のサンプリング周波数に、モノラルマイク(~10kHz 3dbおち)を設定していましたが、

    わらおもすがる思いで、96kHzサンプリング 16bit モノラルにて、

    音声認識トレーニングさせていただき、自分のプログラムにて認識率の実験させていただきます。

    (マイクの帯域的に、無駄なような気もしますが) パラボラUSBマイク(~20kHz)も所有しています。

    2015年10月7日 5:29
  • いつもお世話になっております。長谷川浩之です。

    recognizer.LoadGrammar(new Grammar(new GrammarBuilder("いち")));

    これなどの命令で、”いち”という音声認識用のエンジンをメモリに、LOADしても、l

    以下の情報で、一旦クリアできそうな気がします。

    よって、数字モード、アルファベットモードで、別の、エンジン情報をメモリにLOADして、

    うまく、引っ掛けられそうな気がしてきました。

    これから、実験します。

    数字モードと、アルファベットモードが別なら、最適化にり、音声認識率は、日本語エンジンでも

    上昇させることが可能、個人的には、仮説を立てています。 結果、また、ご連絡させていただきます。

    https://msdn.microsoft.com/ja-jp/library/system.speech.recognition.speechrecognitionengine.unloadgrammar(v=vs.110).aspx

    2015年10月7日 6:16
  • Sony子会社リストラ組の長谷川浩之です。

    不自由な方も気軽に使える商品、

    ユニバーサルデザインの製品を設計される、世界のクリエーターの方のためにも、使わえる方のためにも、

    誰でも気軽に、VisualStudioと、WindowsやiOS Androidプログラミングできるようになるために、オープンに公開させていただきます。

    先ほどの、URL参考に、

    数字モード、アルファベットモードなどモードごとに入力して、

    認識する種類を少なくすることにより、

    ハンデ1:データの空間が小さめの、Windows音声認識エンジン8.0でも、

    ハンデ2:日本人が、アルファベットをネイティブスピーカー並の発音ができなくても、

    認識率を、高めるヒントになりそうです。

    音声認識エンジンを①により、一旦クリアして、

    数字だけの、音声認識エンジンの何らかのデータをメモリに、LOADするような命令を書けば、

    数字だけにひかかるようになる傾向が実験より見えました。

    これ同様に、アルファベットモードでも行えば、A-Zの26種類に、引っ掛かり易くなると推測されます。

    アルファベットの結果もご連絡させていただきます。

                    // Unload all grammars and list the loaded grammars.
                    recognizer.UnloadAllGrammars();                            ・・・①
                    //音声認識エンジン「SpeechRecognitionEngine 」を作成
                    recognizer = new SpeechRecognitionEngine();

                    //1
                    recognizer.LoadGrammar(new Grammar(new GrammarBuilder("うぃち")));
                    recognizer.LoadGrammar(new Grammar(new GrammarBuilder("いち")));
                    recognizer.LoadGrammar(new Grammar(new GrammarBuilder("わん")));
                    //2
                    recognizer.LoadGrammar(new Grammar(new GrammarBuilder("に")));
                    recognizer.LoadGrammar(new Grammar(new GrammarBuilder("にー")));
                    recognizer.LoadGrammar(new Grammar(new GrammarBuilder("にい")));
                    recognizer.LoadGrammar(new Grammar(new GrammarBuilder("つー")));

                /////////////////////////////////////////////////////////////////////////////
                //音声認識成功の関数「SpeechRecognized 」 を追加
               recognizer.SpeechRecognized += _recognizeSpeechAndWriteToConsole_SpeechRecognized;
           //音声認識失敗の関数「SpeechRecognized 」 を追加
                recognizer.SpeechRecognitionRejected += _recognizeSpeechAndWriteToConsole_SpeechRecognitionRejected;
                recognizer.SetInputToDefaultAudioDevice(); // set the input to the default audio device
                recognizer.RecognizeAsync(RecognizeMode.Multiple); // recognize speech asynchronous
                //ボタン 音声認識色へ
                btnStart.BackColor = Color.Green;

    2015年10月7日 7:17
  •  

    Sony子会社リストラ組の長谷川浩之です。

    不自由な方も気軽に使えるユニバーサルデザイン商品設計の方や、

    自分も小学生の頃、図書館で借りたN88-BASICの本で、ユニーの社員教育用

    NECグループ様の 音楽磁気テープに、プログラム記録する方式の、PC-8801mkⅡを使用させていただきまして、

    プログラミングや、改造をさせていただいたことが、プログラミングや電子回路設計、マイコン組込みソフト

    設計の仕事の基礎になったため、ネット越しに恩返しとして、

    夏休みの宿題で、小学生の方が気軽に、音声認識用いた、作品づくりに役立つように、公開させていただきます。

    使用PCは、VAIO TYPE G (VGN-G3 2008年頃の作品 SSD64GB Core2 主記憶メモリ 6GB)

    まず、先ほどの、情報訂正させていただきます。

    以下、①②のように、数字モード、アルファベットモード切り替えのために、

    命令を書いて、一旦クリアしたほうが、止まらないことわかりました。実験より。

    モードを切り替えて、認識する文字の種類減らしても、もうひと工夫必要です。

    検討します。またご報告します。

    上記の、音声認識エンジンの個別の辞書LOADには、数秒ちょっと時間かかります。

    主記憶半導体メモリなどに、何らかのデータをLOADしている

    時間なのかなと、想像しています。

    これの時間短くするアイデアお持ちの方おられましたら、逆にアイデア書き込んでいただけると、

    人類全体で、100億セット出回ると、かなりの生産性や、電力の低減につながります。

                  //public SpeechRecognitionEngine recognizer = null;
                    recognizer = null;                          ・・・①
                    //音声認識エンジン「SpeechRecognitionEngine 」を作成
                    recognizer = new SpeechRecognitionEngine();   ・・・②
                    /////////////////////////////////////////////////////////////////////////////
                    //A
                    recognizer.LoadGrammar(new Grammar(new GrammarBuilder("えー")));
                    recognizer.LoadGrammar(new Grammar(new GrammarBuilder("え")));
                    recognizer.LoadGrammar(new Grammar(new GrammarBuilder("えい")));
                    //B
                    recognizer.LoadGrammar(new Grammar(new GrammarBuilder("び")));
                    recognizer.LoadGrammar(new Grammar(new GrammarBuilder("びい")));
                    recognizer.LoadGrammar(new Grammar(new GrammarBuilder("びー")));
                    recognizer.LoadGrammar(new Grammar(new GrammarBuilder("びぃ")));

            ・・・

                    /////////////////////////////////////////////////////////////////////////////
                    //音声認識成功の関数「SpeechRecognized 」 を追加
                    recognizer.SpeechRecognized += _recognizeSpeechAndWriteToConsole_SpeechRecognized;
                    //音声認識失敗の関数「SpeechRecognized 」 を追加
                    recognizer.SpeechRecognitionRejected += _recognizeSpeechAndWriteToConsole_SpeechRecognitionRejected;
                    recognizer.SetInputToDefaultAudioDevice(); // set the input to the default audio device
                    recognizer.RecognizeAsync(RecognizeMode.Multiple); // recognize speech asynchronous
                    //ボタン 音声認識色へ
                    btnStart.BackColor = Color.Green;

    2015年10月7日 8:03
  • 最初に、質問を記入しました。Sony子会社リストラ組 転職組の 長谷川浩之です。

    世界の皆様、小学生の方にもノウハウ使っていだだけるように説明させていただきます。

    英語も中学英語文法で、読み書きできますが、日本語も文章上手くないレベルなので

    、日本語で打ち込みさせていただきます。

    実験で以下わかりました。

    Windows PC⇒コントロールパネル⇒音声認識⇒音声合成

    音声認識タブ⇒オーディオ入力ボタン⇒録音タブ

    使っているマイクのアイコンや文字列をマウスで触ってください。

    プロパティボタン⇒自分のVAIO TYPE G シリーズのG3

    では、Realtek High Definition Audiotou ソフトが

    マイクの面倒を見てくれているようです。

    拡張タブ⇒直接モードチェックボックス ON ⇒ノイズ抑制チェックボックス オン   ・・・①

    ①をオフのまま、使ってましたが、ザーというまわりのノイズから、ホワイトノイズ的な

    雑音が録音した自分の声に重なっていました。とおくで話している人の音も入っていました。

    これをオンにすると、音声プロファイル録音の時も、

    今までより、短時間で録音成功します。

    成功した音を聞くと、雑音がヘリすっきりした感じになっています。ソフトウェア処理で、周波数の高い部分や、

    明らかに雑音と判断されるような、波形を小さめにするなど、このソフトを作った人のアイデアが詰まっているのでしょうが、

    改善方向です。聞いた音声からは。これで、音声プロファイルを作り直せば、認識率が、アルファベットも改善するのではと

    考えています。

    0-10の数字は、ノイズ抑制のチェックボックス OFFのままの録音でも認識するようになりました。工夫を加えて。

    その工夫は、後で、コードをはりつけさせていただきます。世界の方、自由に使って、地球全体で生産性改善しましょう。

    パソコンが違っても、何らかのソフトウェアが搭載されているものと思われます。

    すごく安いパソコンでは、入っていないかもしれませんが、ノイズを少なくするための、無料のソフトがダウンロードできて

    後から追加できるかもしれません。または、電子回路を設計して、オーディを系にPCに入る前にフィルタ効果など

    与えると近い効果があるかもしれません。

    自分のPCでは、この他、音響エコーキャンセル、モノマイクとうチェックボックスがあります。後で効果実験して、ご報告させていただきます。

    サンプリング周波数は、3[dB]落ちが10[kHz]のヘッドセットに内蔵のマイクのため、変えて実験しても差がよく分からず、

    CD並みのサンプリング周波数に戻しました。

    また、ご報告させていただきます。


    2015年10月8日 7:01
  • 具体的な解決方法ではありませんが、Windows標準の音声エンジンではなく、オープンソースの音声エンジンを使ってみるというのも一つの手かもしれませんね。ざっと調べたところ、Open JTalkやNVDAなどが挙げられます。

    2015年10月9日 9:17
  • おはようございます。最初に質問を記入しました長谷川浩之です。

    /////////////////////////////////////////////////////////////////////////////////

    hirotoshi_k86様、

    お忙しいところ情報を寄付いただきましてありがとうございます。

    おすすめいただいた、音声認識エンジンが無料で、C#などVisual Studioの

    どれかの言語でオペレーションできるなら調査させていただきます。

    Xperia(Xperia Z所有)で文字入力の際、予測変換機能PBoXや、

    これを開発した人が、Appleグループに転職して、iPhone(iPhone 4s所有)に搭載した

    とのネット上あくまでも噂の、

    予測変換エンジンにしろ、バックに単語や文法的なセオリーなどの、

    音声の経験則から頻度などの

    文脈などさまざまな状態での、それぞれの出現確率的パラメータを

    音声認識エンジン内に、持っているように使わせていただいていて、からくりを感じています。

    その文脈で上位の出現率のなかで、音声プロファイル(録音データ)や、もともと持っている

    音声認識エンジンの、音声のデータと比較して悩み、表引きやさまざまなアルゴリズムで

    多数決をしていような感覚を、

    使っていて感覚的に感じした。

    しかし、今回、A~Zという、アルファベットの単体ため、

    AppleとAと比較した場合、Aは、Appleに比較して、文字列の並びや音声のユニークさにかけ、

    音声認識エンジンにも、組み込まれている

    予測変換的なからくりが、生かせないのだと感じています。

    えー=A,え、えー、などいろんなもので、音声認識エンジンは、悩んでいる感じが感じ取れます。

    ↑すいません。上記は、音声認識エンジンを、擬人化した、あくまでも自分が使って感じた

    印象です。

    /////////////////////////////////////////////////////////////////////////////////

    まずは、おすすめいただいたエンジンも調べさせていただき、どちらかのエンジンで、

    どうしても認識しない、例えば、DとTで、どちらかに引き寄せられて、認識される

    アルファベットは、D=でずにー、でー、

               T=てぃふぁにー、てー、てぃー、てれび

    などの、一般的に知られている、言葉や単語で、入力いただく

    インターフェースで、苦肉の策で実験させていただきます。

    ありがとうございます。

    /////////////////////////////////////////////////////////////////////////////////

    このインターフェースは、ユニバーサルデザインにつながるので、

    皆様のアイデアを、世界のいろんな人が自由に使えるように、

    寄付していただけると、皆さんが助かります。

    2015年10月12日 23:39
  • おはようございます。最初に質問を記入しました長谷川浩之です。

    /////////////////////////////////////////////////////////////////////////////////

    自分が、情報をゲットできていないだけの可能性ありますが、

    以下は、音声認識エンジン(聞く)でなく、音声合成エンジン(話す)のように感じました。

    もし、違っていましていましたら、ご指摘と参考情報URLを頂けますと助かります。

    Open JTalkやNVDA

    /////////////////////////////////////////////////////////////////////////////////

    2015年10月12日 23:48
  • フォーラム オペレーターの星 睦美です。

    スレッドの流れから今回の質問に関連したアドバイスを得やすいのではないかと思いますので、後ほどWindows クライアント開発フォーラムに質問を移動させていただきます。


    フォーラム オペレーター 星 睦美 - MSDN Community Support

    2015年10月13日 1:24
  • 最初に質問を記入しました長谷川浩之です。

    Windowsに、内蔵の音声認識エンジンの使いこなしテクニックや工夫の話題のため、

    扱う開発環境は、たまたまVC#で、原理試作を記述しているだけで、

    開発環境の言語は、制約は特にありません。

    事務局さんがおっしゃるように、

    Windowsの場所に引っ越したほうが多くの人にアイデアいただけるかもしれません。

    キーワードは、Windows 音声認識エンジン SAPI5.4 無料 Windows音声認識エンジン8.0 

    などになります。

    2015年10月13日 4:27
  • 失礼しました。Open JTalkは音声合成エンジンでしたね。音声認識エンジンということなら、Juliusというのがあるようです。OSはWindows,Mac,Linuxの各OSで使えるようです。

    http://julius.osdn.jp/

    JuliusLibというのを使えば、C/C++言語で開発が行えるようです。ただ、Visual C++で開発出来るかどうかは、私は試したことが無いので、わかりかねます。詳細は公式サイトを参照してください。

    Juliusで音声認識をし、Open JTalkで音声合成をする…のような開発も出来るようですね。Raspberry Piで構築する開発例も見かけました。興味がおありでしたら以下のサイトを御覧ください。

    http://qiita.com/AKN619/items/38caa29d6346d7b61132

    2015年10月13日 9:09
  • 最初に質問を記入しました長谷川浩之です。

    お忙しいところ、情報の寄付いただきありがとうございます。

    現在、エディタ的には、VB6.0とVC#で記述しています。

    Juliusも、表面上調べていたのですが、音声認識エンジンをインストールまでして、

    Julius for SAPI的な使い方がいまいちわからず状態でした。

    どこかで、またためさせていただきます。

    偶然、個人的興味で、自費でRaspberry Pi2を持っています。

    (いつか用途があれば家でほぼやりこみ仕事で、提案して気軽に使える状態にする為に)

    組み込み用のWindows10が、無料で入れられるために買いました、確かに、これにも音声認識エンジンや、

    音声合成エンジンがWindows7,8などと同様な物が、省かれてなければ、もしかしたら、

    組み込まれているかも知れませんね。そしたら、6000円程度のマイコンボードで音声できっかけつくったり、

    しゃべらせることも可能になるかもしれませんね。LANコネクタもあるから、周りの世界とネット連動させながら。

    Windows 10 IoT Core の詳しい内蔵の機能は、まだ調べ切れていません。

    http://japan.zdnet.com/article/35063968/

    ありがとうございます。

    今現在は、苦肉の策で、(音声)くりすます ⇒ (画面表示デモ)X 

    という方法で、録音などして、引っかかるように調整中です。えっくすでは、うまく認識される率が、50%以下です。

    ユニークな、文字列が、認識しやすい状態です。


    2015年10月14日 1:01
  • 最初に質問を記入しました長谷川浩之です。

    下の、1)2)条件変更で、アルファベットそのものの、日本語発音で
    認識率が改善傾向です。
    2)のほうが効いている傾向です。なぜならば、比較的静かな場所で
    従来のマイクで行なうと余り改善傾向が見えないためです。
    定量的でなく定性的な表現ですいません。

    とはいえ、周りは静かなほうがいいことは、当時展示品で

    工賃込み20万円だったDVD音声カーナビを1999年モデル

    あたりを使ってきた経験からも感じています。

    以下のハードの変化点が、
    これらが、改善の方向に寄与している可能性あります。
    このマイクで、音声プロファイルも、録音をしなおしました。
    V,W,X,で行い改善見られました。
    N数が少ないため、更に追加で、アルファベット日本語発音で、
    実験行ないます。

    ・あらかじめPC筐体の外でA/D変換する事
    ・周波数の3[dB]おちあたりが、20[kHz](HS-HP20は、10[kHz])

    PCは、VAIO TYPE G シリーズの G3(指紋認証)モデル

    1)まわりに話し声のある事務所でのプログラミング・サンプリング
      ⇒比較的静かな環境。
       (しかし、工場なため遠くで、ファンの音とか
         耳には聞こえています。まわりでの話し声はなくなりました。)
    2)マイクの変更
      ヘッドセット HS-HP20
      ⇒パラボラ風マイクMMP-04と、オーディオ信号/USB変換器 PL-US35-AP

    3)数字モード、アルファベットモード、など、モードごとにGrammar を定義を

      チェックボックスによって、消したり必要なものだけLOADして、

      アルファベットのときに、数字のたとえば、

      アルファベットのH(えっち)発音 ⇒ 1(いち) に引き寄せられ、認識される

      現状を回避しています。

      ソースは、後ほど、皆さん使っていただけるように、夜自宅から、アップにて、公開させていただきます。

      (小学生の夏休み冬休みの工作の宿題に、一つのプログラム部品として、

       創造的で実用的なアプリやセット向けに、使っていただき、学校の先生を

       驚かせていただきたいと個人的には思っています。)

    以上です。
    /////////////////////////////////////////////////////////////


    • 編集済み pokepa1001 2015年10月15日 1:26 誤記修正
    2015年10月15日 1:24
  • 最初に質問を記入しました、早期退職転職組の、長谷川浩之です。

    これまでの記入の他のこつは、

    音声プロファイル(録音)を、

    ”えっくす”⇒音声認識⇒コードで変換⇒”X”

    このように、例えばしたいとき、

    ”えっくす”を、(イメージしていただきたいのですが)

    スーパースローカメラで撮影して、

    再生した時の音声をイメージしてゆっくり、録音したほうが

    いいという傾向も感じています。

    フーリエ変換のように、横軸周波数、縦軸パワーのような

    変換をして数値化とかで似てる度合検索とかでなく、

    波形(振幅、周波数、形などなど)、計算力で、

    比較してやっているような気がします。

    いずれにせよ、両者も、文字と文字の間は、

    アルゴリズムが検出するので、ゆっくりお話したほうが、

    切れ目がどこかわかりやすいのだと、思われます。

    上記にも書きましたが、もちろん、周囲の雑音は、

    最初の録音には、認識率低下傾向になります。

    今自分は、Win7 Pro. Visual Studio Pro. C#

    プリAD変換してUSBに変換するアイテムを

    使用して、マイク部分は、~20[kHz]のパラボラ風な

    見た目のマイクを、DVDオーディオレベルのサンプリング

    周波数で取り込みを行っております。

    0-9は、実用的に、音声認識できていますが、

    A-Zは、調整してもストライクゾーンが小さく

    キーワードで、入力などの方法で、調整中です。

    (自分以外の声での認識率は、定量的な実験出来ていません。)

    本当に、実用的に使えるためにな、何かさらに、

    アイデアが必要と感じています。

    現状は、”どらえもん”⇒音声認識⇒コードで変換⇒”D"

    現状は、”くりすます”⇒音声認識⇒コードで変換⇒”X"

    不思議なことに、WinX VB6.0 Speech API 6.1 (SAPI6.1)

    の時は、”えっくす”、”でぃー”でも、認識出来ていた傾向です。

    Windows音声認識エンジン8.0(SAPI5.4)

    は、(PCのハード環境が違うので、単純に比較したらダメですが)

    うまく、アルファベットの認識率を高めにくいのが現状です。

    また、ノウハウ記入させていただきます。

    以上です。

    2015年10月21日 0:04
  • 最初に質問を記入しました、早期退職転職組の、長谷川浩之です。

    以下、Android端末などでの、googleグループさんの、音声認識の方法です。

    2013年の記事です。 今回自分が与えられているミッションは、

    ネットワーク環境のないところで、音声認識を動作させることです。

    0-9、A-Z

    これを、Googleグループさんの、Webアプリ(無料、ただし、ネットワーク環境必要)

    https://dictanote.co/

    などでの、実験は、認識率高い、

    ”あるふぁべっとのえっくす”とはなすと、文字列の流れから、空気にあった物を選ぶ

    予測変換的な、エンジンも併用されているものと、使う立場からの勝手な想像ですが、

    からくりを感じます。

    ”えっくす” だけでも、”X"が入力されました。(何度か使ったので、すでに学習の結果かもしれませんが)

    ”でぃー”とはなすと、”lee”となりました。

    ”あるふぁべっとのでぃー”と話すと、”アルファベットのd”と入力されました。

    その後、”でぃー”とはなすと、”d"と表示しています。 出現確率のパラメータの数値が、

    変更され、候補としてトップに上がるような仕掛けで、学習しているっぽくなっているように感じます。

    予測変換的なからくりが入っているような感じがします。

    Windows音声認識エンジン8.0(SAPI5.4)と違い、ネットワーク先のサーバーでの音声認識処理のため

    Windowsタスクマネージャーで、CPU使用率を見ても、音声認識処理による率のアップは、感じません。

    通信しないといけないのに、素早いです。このような形で、すでに出ているのかもしれませんが、

    ドラえもんの翻訳こんにゃくのように、ほぼ同時通訳をサーバー処理で、できるチャットでなく、

    電話的端末を使い電話や、観光で来られた方とお話するのが、普通に

    なるのかもしれません。PSPであったシャベリンガルのもっと、実用版で、はやり言葉もすぐ対応。

    現状、世界8箇所(2013年の方式で、現在の方法は、わかりません)のサーバーは、

    googleグループさんの音声認識APIが、無料公開されていると、仮定しても

    使えないミッションを頂いているので、現状で工夫するか、Windows10で、無料で

    使える音声認識エンジンが、何か、改善されていることあれば、そちらで、

    達成するというアイデアしか、今、この瞬間は浮かんでいません。

    http://wired.jp/2013/02/20/android-neural-network/ より、抜粋記事が以下。

    ユーザーがAndroidの音声認識ソフトに話しかけるとき、ユーザーの音声スペクトルは細かく切り刻まれ、世界中に広がるグーグルのサーヴァーネットワークの8つのコンピューターに送られる。その後、ヴァンホウケ氏らが開発したニューラルネットワークモデルを利用して、この音声コマンドは処理される。このような大規模な分散型の高速処理は、グーグルがもっとも得意とするところだが、同社はその方法を見つけ出すために、現代のデータセンターに革新をもたらしたジェフ・ディーンらのチームに力を借りた。



    • 編集済み pokepa1001 2015年10月21日 1:31 誤記修正
    2015年10月21日 1:13
  • 最初に質問を記入しました、早期退職転職組の、長谷川浩之です。

    上記でも、すでに同じようなことを書いていますが、

    やはり効果あることをもう一度書きます。

    <INPUT情報の改善>

    アナログ電子回路的に見ますと、パソコンはたくさんの雑音源と考えられ、

    アナログオーディオ信号->USB変換機器を使って

    とりこんだほうが、体感的にも雑音が減っているように感じました。

    以下のサイトの記事もご参考にしてください。

    http://microphone-noise.info/%E3%83%9E%E3%82%A4%E3%82%AF%E9%9F%B3%E5%A3%B0%E3%81%AE%E3%83%8E%E3%82%A4%E3%82%BA%E3%82%92%E6%B8%9B%E3%82%89%E3%81%99%E6%96%B9%E6%B3%95/

      <音声の辞書的データの改善>

    多分メモリにLOADされる音声プロファイル(録音)データには限りあり、また、似たものがあると

    どれが近いか迷いご認識に繋がるのだと思います。

    自分は、0-9のモード、A-Zのモード、その他複数のモードにわけて、

    チェックボックスや、ラジオボタンで、人が切り替えたら、

    一旦クリアしてから、LOADし直すようにしてみました。

    以下の文字列のうち結構な数を、音声プロファイルとして、録音しています。

    これらのように、LOADし直す理由は、具体的に体感したことでご説明しますと、

    例えばですが、

    1=”いち”と人は思って発音しても、音声認識的には、”えっち”,"えち”と認識して、Hとなったり、

    9=”きゅう”と思って発音しても、”きゅー”と認識して、Qとなったりします。

    短い、単語だけの発音だと、どうとでも聞こえるので、

    (人同士の会話でも、電話越しに、英数字の文字列伝えるのは、マイクロソフトの、Mですよねとか、

      言いあって、伝えないと、違う文字に認識されるのと同じようなことが置きます。)

    逆に、

    今日の天気は雨ですね。 というよな、発音のほうが、からくり的に違う文字列に

    ご認識されるのは少ないと思われます。内部のからくりで、スマホなどでもあるような

    予測変換機能が内部で支援しているつくりになっているのだと個人的には想像しています。

                    recognizer = null;
                    //音声認識エンジン「SpeechRecognitionEngine 」を作成
                    recognizer = new SpeechRecognitionEngine();
                    /////////////////////////////////////////////////////////////////////////////
                    //文法ファイルに、位置します。文法ファイル方式と、コード内に直接記述の2通りの方法があるようです。
                    //1
                    recognizer.LoadGrammar(new Grammar(new GrammarBuilder("うぃち")));
                    recognizer.LoadGrammar(new Grammar(new GrammarBuilder("いち")));
                    //recognizer.LoadGrammar(new Grammar(new GrammarBuilder("わん")));
                    //2
                    recognizer.LoadGrammar(new Grammar(new GrammarBuilder("に")));
                    recognizer.LoadGrammar(new Grammar(new GrammarBuilder("にー")));
                    recognizer.LoadGrammar(new Grammar(new GrammarBuilder("にい")));
                    recognizer.LoadGrammar(new Grammar(new GrammarBuilder("つー")));
                    recognizer.LoadGrammar(new Grammar(new GrammarBuilder("にぃ")));
                    //3
                    recognizer.LoadGrammar(new Grammar(new GrammarBuilder("さん")));
                    recognizer.LoadGrammar(new Grammar(new GrammarBuilder("あん")));
                    recognizer.LoadGrammar(new Grammar(new GrammarBuilder("さ")));
                    recognizer.LoadGrammar(new Grammar(new GrammarBuilder("さあ")));   

         (文字数制限より、省略)...

          /////////////////////////////////////////////////////////////////////////////
                    //音声認識成功の関数「SpeechRecognized 」 を追加
                    recognizer.SpeechRecognized += _recognizeSpeechAndWriteToConsole_SpeechRecognized;
                    //音声認識失敗の関数「SpeechRecognized 」 を追加
                    recognizer.SpeechRecognitionRejected += _recognizeSpeechAndWriteToConsole_SpeechRecognitionRejected;
                    recognizer.SetInputToDefaultAudioDevice(); // set the input to the default audio device
                    recognizer.RecognizeAsync(RecognizeMode.Multiple); // recognize speech asynchronous

            

    現状の結論としては、0-9は実用レベルですが、

    A-Zのアルファベットでは、自分の声だけでも認識率は、実用的に、製品に組み込むのは

    どうかなというレベルに感じています。

    でんじろうさんの実験や、学校の学生実験などで、音声認識を体感する場面なら、

    使えると思われます。

    現状すいませんが、このような状況です。

    windows音声認識エンジン8.0の能力は、引き出していて、

    実質数日はこの改善作業は、停止させていただいております。

    後勘違いしていたのですが、自分のコード的な書き方では、

    SAPI 5.4を使って内容らしいです。

    純粋に、windows音声認識エンジン8.0を使っているようです。

    横長の楕円の、音声認識エンジンのユーザーインターフェースは、出てこないようになっています。

    プロジェクトごとアップできそうなら、後日、アップさせていただきます。皆さん自由に実験できるように。

    以上です。

    2015年11月2日 10:17
  • 最初に質問を記入しました、早期退職転職組の、長谷川浩之です。

    ////////////////////////////////////////

    マイクロソフト日本法人の関係者の方から、

    Windows 10 内臓の 音声アシスタント

    Cortana(コルタナ)が、2015.11.16あたりから、

    正式に日本語対応リリースとのことでした。

    ////////////////////////////////////////

    本来ネットワークを必要としますが、ネットワーク使わないモードも存在するとのことでした。

    自前のWindows8.1端末を、Windows10に無料アップデートして、

    実験してみます。コルタナの音声認識エンジンは、

    これまで内蔵のWindows音声認識エンジン8.0という名称のものとは

    異なる物とのことです。これを、Visual Studio Pro.2013 C#

    あたりで、音声認識エンジンとして、ネットワーク使わないで、つかう

    記述方法などこれから調べさせていただきます。

    ////////////////////////////////////////

    上記で、Windows音声認識エンジン8.0を、つかう

    原理試作的に、作成したC#2013のプロジェクトを広く実験で使用していただけるように

    アップしようと思いましたが、このサイトはその仕組みないのか、自分の視野が狭いのか

    見つけられていないので、見つかったときに、自由に使っていただく為にアップさせていただきます。

    以上です。

    2015年11月12日 0:50
  • 最初に質問を記入しました、早期退職転職組の、長谷川浩之です。

    ////////////////////////////////////////

    Windows 7 pro.上で、記述したプロジェクトファイルを

    以下の場所に公開させていただきました。

    Windws XP 上で書いたものも、近日

    同じ場所に添付ファイルとして、インストールファイルを

    ぶら下げさせていただきます。

    小学生時代プログラミングの本で情報知った恩返しに

    この場をお借りして公開させていただきます。

    これに、インスパイアされいいアイデアや方法を見つけた方は

    もしよければ、自分にも教えて下さい。

    ////////////////////////////////////////

    https://code.msdn.microsoft.com/Windows-Voice-Recognition-b7e65602

    ////////////////////////////////////////

    Cortana(コルタナ)さんを、音声認識エンジンの部分だけ

    ネットワーク使わないモードで、応用する方向はこれから調査して、

    サンプル書けたら公開させていただきます。

    先にかけた方は教えて下さい。


    • 編集済み pokepa1001 2015年11月13日 2:46 追記
    2015年11月13日 2:44
  • 最初に質問を記入しました、早期退職転職組の、長谷川浩之です。

    ////////////////////////////////////////

    自前のVAIO FIT13Aを、

    Windows 10に

    アップデートしてみました。

    まずは、Cortanaを

    ごく一般的な使い方で体験してみることにしました。

    上記までの、音声コマンド風の使い方でなく、

    ディクテーション的な使い方です。

    Cortanaさんのマイク設定が最適に

    追い込む必要あるかもしれませんが、

    現状、意図する言葉と同じように、

    Siriやgoogle音声入力と比較して、

    もう少しと感じる部分が多々あるような

    気がしています。

    Windows音声認識エンジン8.0の

    ように、Cortanaのトレーニングは、

    ないのだと思い込んでいます。

    まずは、Cortanaを体験して、

    これがネットワーク無しで、

    動作しつつ、VisualStudio C#などから、

    音声認識エンジンの部分だけ、1つの

    機能として動作するのか調べます。

    しかし、ネットワークつながった段階で、

    これまでの、音声コマンド風の文字も

    うまく拾えなければ、それ以前と判断しようと

    考えています。

    どなたか、すでに、これらを把握されている方が

    おられましたら教えてください。

    また、わかり次第追記させていただきます。

    ////////////////////////////////////////

    2015年11月27日 0:54
  • 最初に質問を記入しました、早期退職転職組の、長谷川浩之です。

    ////////////////////////////////////////

    マイクロソフトグループ 日本法人様の関連部署様より

    Cortanaの音声認識エンジン部分のみを、ネットワーク環境なしの

    スタンドアロン状態にして、

    Windows音声認識エンジン8.0のように、

    使うサンプルプログラムに一番近い情報のURLなどは、

    以下です。

    自分は、理解力が低いのか、まだ、どのように記述すれば、

    Cornanaの音声認識エンジン部分のみを、C#にて

    記述できるのか、具体的なコードかけていません。

    ※もし、わかる方おられれば、記述して公開していただけるか、

    お勧めURL(日本語、英語)を貼り付けていただけると助かります。

    ////////////////////////////////////////

     Microsoft Cortana - Windows アプリの開発

    https://na01.safelinks.protection.outlook.com/?url=https%3a%2f%2fdev.windows
    .com%2fja-jp%2fcortana&data=01%7c01%7cnaokik%40064d.mgd.microsoft.com%7c2b20
    344a87e64038c95308d2f78757ce%7c72f988bf86f141af91ab2d7cd011db47%7c1&sdata=hD
    Q0pjF5vsmagG3ZusSn3b7G3iWjUyYIJlo1s0WssRk%3d

      Cortana の操作

    https://na01.safelinks.protection.outlook.com/?url=https%3a%2f%2fmsdn.micros
    oft.com%2fja-jp%2flibrary%2fwindows%2fapps%2fxaml%2fmt185598.aspx&data=01%7c
    01%7cnaokik%40064d.mgd.microsoft.com%7c2b20344a87e64038c95308d2f78757ce%7c72
    f988bf86f141af91ab2d7cd011db47%7c1&sdata=%2b16b9rs8o1MEkApmIZ1rIpI%2f3EKlaRD
    nMu0oc2w8gzY%3d

    ////////////////////////////////////////

    以上です。


    • 編集済み pokepa1001 2015年12月4日 1:34 説明追記
    2015年12月4日 1:33
  • 上記で紹介いただいたURLが無効なリンクになっております。

    私のほうでタイトルから検索したページはこちらです。

    ・Microsoft Cortana - Windows アプリの開発:
    https://dev.windows.com/ja-jp/cortana

    ・Cortana の操作 - Windows app development - MSDN:
    https://msdn.microsoft.com/ja-jp/library/windows/apps/mt185598.aspx?f=255&MSPPError=-2147217396

    以下のCortana 関連のMSDN ブログがありますのでご参考になりましたら幸いです。

    ・MSDN Blogs  >  Visual Studio 日本チーム ブログ  > Cortana を使用したユーザーとの関係構築 (Windows 10 by 10)
    http://blogs.msdn.com/b/visualstudio_jpn/archive/2015/11/02/cortana-windows-10-by-10.aspx


    フォーラム オペレーター 星 睦美 - MSDN Community Support


    • 編集済み 星 睦美 2015年12月4日 1:55 編集
    2015年12月4日 1:55
  • 最初に質問を記入しました、早期退職転職組の、長谷川浩之です。

    ////////////////////////////////////////

    ありがとうございます。

    いろんな業務の合間に、

    一日のほんの少しの時間や、やらない日もありましたが、行き詰っていました。

    ////////////////////////////////////////

    いただいたURLをひもとき、具体的なC#コードにて、

    Cortanaの音声認識エンジン部分のみを、まるで、Windows音声認識エンジン8.0のように

    使えるサンプルコードを書いて動かせるようにしてみます。

    Windows音声認識エンジン8.0の認識率以上に、0-9、A-Zを認識できることを

    判断基準とさせていただきます。

    ////////////////////////////////////////

    2015年12月10日 2:19
  • pokepa1001 さん、返信ありがとうございます。
    スレッドの内容がCortana を利用した開発に展開していますので、興味や実際にCortana を利用した開発を行っているユーザーの目につきやすいように、スレッドのタイトルを例えば「オフラインのWindows10 Cortana で音声認識を実現する方法」というように変更してみてはいかがでしょうか。タイトルの変更は、最初のスレッドの [編集] からできます。(もし変更できない場合には返信でお知らせいただければオペレーターのほうで変更いたします。)


    フォーラム オペレーター 星 睦美 - MSDN Community Support

    2015年12月10日 2:41
  • 最初に質問を記入しました、早期退職転職組の、長谷川浩之です。

    ////////////////////////////////////////

    情報ありがとうございます。

    MSDNサブスクリプト、サポートの方からいただいたURLと

    ほぼ同じでした。

    自分はこれでは、自分の理解力が足らないのでしょうが、よくわからないのが現状です。

    3個目のURLでも、Cortana経由で、○○する的な説明でした。

    Visual Studio C#上で、プログラミングする方法へまでは、

    自分はわかりませんでした。(そういう情報と違うような気がしています。)

    どなたか情報お持ちの方、具体的なサンプルコードをすでに把握されている方は、

    日本でも数名はおられると思われますので、

    情報をいただけますと助かります。

    もしくは、これらのURLで、C#上で音声認識エンジンとして、利用する具体的なコードが

    書ける情報があるなら、ご指摘いただけますと助かります。

    ////////////////////////////////////////

    上記で紹介いただいたURLが無効なリンクになっております。

    私のほうでタイトルから検索したページはこちらです。

    ・Microsoft Cortana - Windows アプリの開発:
    https://dev.windows.com/ja-jp/cortana

    ・Cortana の操作 - Windows app development - MSDN:
    https://msdn.microsoft.com/ja-jp/library/windows/apps/mt185598.aspx?f=255&MSPPError=-2147217396

    以下のCortana 関連のMSDN ブログがありますのでご参考になりましたら幸いです。

    ・MSDN Blogs  >  Visual Studio 日本チーム ブログ  > Cortana を使用したユーザーとの関係構築 (Windows 10 by 10)
    http://blogs.msdn.com/b/visualstudio_jpn/archive/2015/11/02/cortana-windows-10-by-10.aspx


    フォーラム オペレーター 星 睦美 - MSDN Community Support



    2015年12月10日 2:45
  • 最初に質問を記入しました、早期退職転職組の、長谷川浩之です。

    ////////////////////////////////////////

    前回いただいたURLのうち3つ目をもう少し熟読させていただきます。

    自分は業務でプログラミングや電子回路設計は、就職年数の実質20%程度しか実質なく、

    まったく関係ない部署で、家で独学で勉強(電気系学科や、情報系学科は卒業していますが)

    や実験のため、年齢の割には、力不足を感じています。

    下のほうに、CortanaのUI経由での、動作させるサンプルコードがあります。

    自作のソフトでは、これはいらないのですが、あっても、自作ソフトに影響なければOKです。

    Windows音声認識エンジン8.0よりも、0-9、A-Zを認識する率がよくなることが条件、

    ネットワーク環境ないところでも動く設定を見つけることが必要。

    この、コンセプトで何とかサンプルコード公開まで、がんばります。

    <ちょっと雑談>

    話はそれますが、Sharp COCOROBO(お掃除ロボット) RX-V200を

    独身ですが、2階建ての家用に、2台購入し、

    家がきれいになり、とてもいい商品だと自分は感じています。

    ちなみに、これも、音声認識技術でお話で、『きれいにして』

    と話すと、『わかった』と答えてLEDが点滅して喜んで掃除しだします。

    無線LAN対応で、ネットワーク越しに調べて天気なども答えたり、

    スマートフォントのカメラなどと連動して制御するAPIも公開されていて、

    スマートフォンのカメラに移ったボールを追いかけて動いたり、

    AIBOっぽいボール追いかけができるようです。

    RX-V200自体にカメラ搭載で、外出先から、4方向の静止画を、一旦50cm程度前に出て

    回転して撮影し、送ってくれるようです。

    赤外線送受信モジュールも搭載で、赤外線リモコンで操作の家電も

    外出先から、遠隔操作できるようです。

    ////////////////////////////////////////

    ・MSDN Blogs  >  Visual Studio 日本チーム ブログ  > Cortana を使用したユーザーとの関係構築 (Windows 10 by 10)
    http://blogs.msdn.com/b/visualstudio_jpn/archive/2015/11/02/cortana-windows-10-by-10.aspx

    ////////////////////////////////////////

    以上です。


    • 編集済み 星 睦美 2015年12月11日 2:17 広告とみなされる可能性がありますので削除させていただきました。
    2015年12月11日 1:32
  • 最初に質問を記入しました、早期退職転職組の、長谷川浩之です。

    ////////////////////////////////////////

    前回いただいたURLのうち3つ目をもう少し熟読させていただきます。

    ////////////////////////////////////////

    いただいたURL

    ・MSDN Blogs  >  Visual Studio 日本チーム ブログ  > Cortana を使用したユーザーとの関係構築 (Windows 10 by 10)
    http://blogs.msdn.com/b/visualstudio_jpn/archive/2015/11/02/cortana-windows-10-by-10.aspx

    ////////////////////////////////////////

    ↓ここから、つながっていたURL

    これらも見て勉強中です。

    https://code.msdn.microsoft.com/Voice-Commands-Quickstart-64ce68ce#content

    http://sssslide.com/www.slideshare.net/maruyama097/ss-53314018

    いただいたURL参照先の文書に、以下の記述がありました。。

    これを、C#などに書いていくとサンプルコードができるのかと思い調査中です。


    private Windows.ApplicationModel.VoiceCommands.VoiceCommnadDefinition.VoiceCommandSet commandSetEnUs;
     
    if (Windows.ApplicationModel.VoiceCommands.VoiceCommandDefinitionManager.InstalledCommandSets.TryGetValue("AdventureWorksCommandSet_en-us", out commandSetEnUs))
    {
      // このコードは目的地リストをすべて置き換えます。
      await commandSetEnUs.SetPhraseListAsync("destination", new string[] {"Chicago", "Seattle", "New York", "Phoenix"});
    }

    C#.NET に以下を入力して、名前空間として認識されるのか、

    試してみようと考えています。

    自分は理解力低いので、URLを読みながら、実際に記述して、命令として、Visual Studioに

    打ち込み、どうなるのか見ながらでないと読んでいるだけでは、理解できなく眠くなります。

    Windows.ApplicationModel.VoiceCommands.VoiceCommnadDefinition.

    また何かわかってきたら公開させていただきます。

    以上です。

    2015年12月11日 2:24
  • 最初に質問を記入しました、早期退職転職組の、長谷川浩之です。

    ////////////////////////////////////////

    前回いただいたURLのうち3つ目をもう少し熟読させていただいた結果、

    いろんなURLに飛んでいくことになります。

    ////////////////////////////////////////

    その中で、以下が、具体的に

    手順を記述されているように感じます。

    この後、自分も家に帰って、夜や土日しか時間取れないため、

    実際に手を動かして、C#に記述して命令として

    認識されるのか、名前空間を手動で追加しないといけないのか、

    Windows10にアップデートしたばかりの、元Windows8端末で

    実験してみたいと考えています。

    https://msdn.microsoft.com/ja-jp/library/dn974228.aspx

    日記や、作業履歴のようなスタイルとなりましたが、皆様の商品開発や趣味、

    学校での講義の、材料などにお役に立てればと思います。

    以上です。



    • 編集済み pokepa1001 2015年12月11日 2:56 漢字変換ミス修正
    2015年12月11日 2:55
  • 最初に質問を記入しましたものです。

    業務の重要度より、音声認識のCortanaのネットワーク使わずの前提で

    音声認識エンジン部分を、VisualStudioなどとやり取りさせる検討は、しばらく後回しにさせていただきます。

    どなたか、C#などでの、サンプルコードお持ちの方や、参考 おすすめ URL ご存知の方は、

    掲示板に書き込みいただけると助かります。

    0-9 や A-Z を認識させるコード

    Windows10 上 C# などで、サンプルコードをお願いいたします。

    2016年1月14日 0:10