C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

音声認識の「System.Speech」使用方法について

[トピック内 2 記事 (1 - 2 表示)]  << 0 >>

■89756 / inTopicNo.1)  音声認識の「System.Speech」使用方法について
  
□投稿者/ 河童 (40回)-(2018/12/20(Thu) 19:25:42)

分類:[C#] 

いつも大変お世話になっております。

音声認識の「System.Speech」使用方法について
教えてください。

環境:Windows7 32bit VS2010

下記アドレスのサンプルを参考にしました。
https://qiita.com/u_e_d_a_/items/98991bf3f19f3a6cf0cb

デバッグではエラーは発生していません。

既定のマイクは、「Bluetooth Audio」を設定しており
ペアリングはできています。

「Grammar.txt」は、指定したフォルダに存在しています。

分からないことは、
イベント「SpeechRecognized」が発生するタイミングです。

// 非同期で認識開始
this.Engine.RecognizeAsync(RecognizeMode.Multiple);
の後に音声の認識が始まると思うのですが、
正常に認識されているか調べる方法はありませんか?


よろしくお願いいたします。


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.IO;
using System.Text;
using System.Windows.Forms;

using System.Speech;
using System.Speech.Recognition;
using SpeechLib; //ver11

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {


        /// <summary>
        /// 音声認識エンジン
        /// </summary>
        public SpeechRecognitionEngine Engine;

        // コンストラクタ
        public Form1()
        {
            InitializeComponent();

            // 音声認識の設定
            StartRecognition();

            // 音声入力のチェックボックス
            this.checkBoxVoiceInput.Checked = true;

        }

        /// <summary>
        /// 音声認識のイベントハンドラ。
        /// </summary>
        /// <param name="sender">イベントソース</param>
        /// <param name="e">イベントデータ</param>
        private void SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
        {
            // 生データを表示
            string recognitionWord = e.Result.Text;
            this.label.Text = "認識結果:" + recognitionWord;

            if (e.Result.Confidence >= 0.5)
            {
                if (recognitionWord == "音声認識ON")
                {
                    this.checkBoxVoiceInput.Checked = true;
                }
                else if (recognitionWord == "音声認識OFF")
                {
                    this.checkBoxVoiceInput.Checked = false;
                }
                else
                {
                    if (this.checkBoxVoiceInput.Checked)
                    {
                        // 音声認識データをテキストボックスに反映
                        this.textBox.Text += recognitionWord;
                    }
                }
            }
        }

        /// <summary>
        /// 保存ボタンのイベントハンドラ。
        /// </summary>
        /// <param name="sender">イベントソース</param>
        /// <param name="e">イベントデータ</param>
        private void buttonSave_Click(object sender, EventArgs e)
        {
            var dialog = new SaveFileDialog();
            dialog.Filter = "すべてのファイル(*.*)|*.*";
            if (dialog.ShowDialog() == DialogResult.OK)
            {
                CreateFile(dialog.FileName, this.textBox.Text, false);
            }
        }

        /// <summary>
        /// クリアボタンのイベントハンドラ。
        /// </summary>
        /// <param name="sender">イベントソース</param>
        /// <param name="e">イベントデータ</param>
        private void buttonClear_Click(object sender, EventArgs e)
        {
            this.textBox.Text = null;
        }

        /// <summary>
        /// 音声認識の設定
        /// </summary>
        private void StartRecognition()
        {
            try
            {
                // 音声認識エンジンの設定
                this.Engine = new SpeechRecognitionEngine(Application.CurrentCulture);

                // 既存のオーディオデバイスをデフォルトの入力とする
                this.Engine.SetInputToDefaultAudioDevice();

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

                string grammarPath = Path.Combine(Path.GetDirectoryName(Application.ExecutablePath), "Grammar.txt");
                if (File.Exists(grammarPath))
                { // 文法ファイルが存在する場合
                    var choices = new Choices();
                    foreach (string line in ReadFile(grammarPath, "#"))
                    {
                        choices.Add(line);
                    }
                    var grammar = new Grammar(choices.ToGrammarBuilder());
                    this.Engine.LoadGrammar(new Grammar(choices.ToGrammarBuilder()));
                }
                else
                {
                    this.Engine.LoadGrammarAsync(new DictationGrammar());
                }

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

            }
            catch (Exception)
            {
                // 音声認識の設定に失敗
                MessageBox.Show("音声認識の設定に失敗しました。", "音声認識", MessageBoxButtons.OK,
                    MessageBoxIcon.None, MessageBoxDefaultButton.Button1, MessageBoxOptions.DefaultDesktopOnly);

                // チェックボックス(音声入力)を非活性
                this.checkBoxVoiceInput.Enabled = false;

                // 音声認識エンジンのオブジェクトを解放
                this.Engine.Dispose();

                // 音声認識エンジンを初期化
                this.Engine = null;
            }
        }

        /// <summary>
        /// ファイル読込み。
        /// </summary>
        /// <param name="path">ファイルパス</param>
        /// <param name="comment">コメント文字</param>
        /// <returns>読込み結果リスト</returns>
        public static List<string> ReadFile(string path, string comment)
        {
            //コメント以外の行を取得
            var lines = File.ReadAllLines(path, Encoding.Default)
                .Where(line => !line.StartsWith(comment)).ToList();

            return lines;
        }

        /// <summary>
        /// ファイル作成。
        /// </summary>
        /// <param name="path">ファイルパス</param>
        /// <param name="data">書き込みデータ</param>
        /// <param name="appendFlg">追記可否フラグ(true:追記,false:上書き)</param>
        public static void CreateFile(string path, string data, bool appendFlg)
        {
            // ファイルを作成するフォルダが存在するかチェック
            // 存在しない場合は、フォルダを作成
            string dirPath = Path.GetDirectoryName(path);
            if (!Directory.Exists(dirPath))
            {
                Directory.CreateDirectory(dirPath);
            }

            //指定ファイルに内容を書き込む
            if (appendFlg)
            {
                //ファイルの末尾に書き加える
                File.AppendAllText(path, data, Encoding.Default);
            }
            else
            {
                //ファイルを上書きする
                File.WriteAllText(path, data, Encoding.Default);
            }

            return;
        }

    }
}

引用返信 編集キー/
■89763 / inTopicNo.2)  Re[1]: 音声認識の「System.Speech」使用方法について
□投稿者/ 河童 (41回)-(2018/12/21(Fri) 10:59:21)
申し訳ありませんでした。

マイクの設定がうまくいっていなかったようです。

解決しました。

音声入力について、
認識の精度を上げるために何をすれば良いのか
アドバイスいただけたら嬉しいです。

解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ