//----------------------
// Dictation_SSpeech.cs
//----------------------
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Drawing;
//using System.Linq;
using System.Reflection;		//Assemblyを使う為
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Forms;
//using System.Windows.Automation;
//using System.Windows.Controls;
//using System.Windows.Controls.Primitives;
//using System.Windows.Data;
//using System.Windows.Documents;
//using System.Windows.Ink;
//using System.Windows.Input;
//using System.Windows.Markup;
//using System.Windows.Media;
//using System.Windows.Media.Animation;
//using System.Windows.Media.Effects;
//using System.Windows.Media.Imaging;
//using System.Windows.Media.Media3D;
//using System.Windows.Media.TextFormatting;
//using System.Windows.Navigation;
//using System.Windows.Shapes;
//using System.Windows.Shell;
//音声認識エンジン
using System.Speech.Recognition;

namespace Dictation_SSpeech
{
	///////////////////////////
	//エントリーポイントクラス
	///////////////////////////
	class MainApp
	{
//		[STAThread]
		public static void Main()
		{
			Application.Run(new MainWindow());
		}
	}

	public partial class MainWindow : Form
	{
		//MainWindowクラスの変数
		SpeechRecognitionEngine recogEngine;
		TextBox TBox;

		//コンストラクター
		public MainWindow()
		{
			Assembly myOwn = Assembly.GetEntryAssembly();
			this.Icon = Icon.ExtractAssociatedIcon(myOwn.Location);	//プログラムアイコンをフォームにつける
			this.Load += new EventHandler(MainForm_Load);
			this.Text = "MainWindow Name";
			this.ClientSize = new Size(525, 350);
			this.MinimumSize = new Size(525, 350);
			this.BackColor = SystemColors.Window;
		}
		
		//WM_CREATE時処理
		private void MainForm_Load(object sender, EventArgs e)
		{
			//コントロールの設定
			InitializeComponent();
			recogEngine = new SpeechRecognitionEngine();
			// 音声認識が認識処理を終えたときのイベントハンドラを設定する。
			recogEngine.SpeechRecognized += recogEngine_SpeechRecognized;
			// 音声認識が推定処理を終えたときのイベントハンドラを設定する。
			recogEngine.SpeechHypothesized += recogEngine_SpeechHypothesized;
			// SystemSpeech を利用したディクテーションを行う場合には、
			// DictationGrammar (ディクテーション用の辞書) を追加する。
			recogEngine.LoadGrammar(new DictationGrammar());
			try
			{
				// 実行環境の標準の入力を音声認識エンジンの入力とする。
				recogEngine.SetInputToDefaultAudioDevice();
				// 非同期の認識を継続して実行するようにして音声認識を開始する。
				recogEngine.RecognizeAsync(RecognizeMode.Multiple);
				MessageBox.Show("音声認識を開始します", "通知", MessageBoxButtons.OK, MessageBoxIcon.Information);
			}
			catch
			{
				MessageBox.Show("音声標準入力がありません", "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error);
			}
		}

		//コントロールの設定
		public void InitializeComponent()
		{
			//テキストボックス
			TBox = new TextBox();
			//位置
			TBox.Location = new Point(10, 10);
			TBox.Anchor = (AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Bottom | AnchorStyles.Right);
			//サイズ
			TBox.Width = ClientSize.Width - 20;
			TBox.Height = ClientSize.Height - 20;
			//その他
			TBox.Multiline = true;
			TBox.ScrollBars = ScrollBars.Both;
			TBox.WordWrap  = false;
			//FormにTextBoxを追加
			this.Controls.Add(TBox);
		}

		// 推定時の処理
		void recogEngine_SpeechHypothesized(object sender, SpeechHypothesizedEventArgs e)
		{
			this.TBox.Text = "○" + e.Result.Text + "("+ e.Result.Confidence + ")\r\n" + this.TBox.Text;
		}

		// 認識時の処理
		void recogEngine_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
		{
			this.TBox.Text = "●" + e.Result.Text + "(" + e.Result.Confidence + ")\r\n" + this.TBox.Text;
		}

		//終了時処理
		protected override void OnClosed(EventArgs e)
		{
			base.OnClosed(e);
			// 終了時には破棄する。
			recogEngine.Dispose();
		}
	}
}
