|
分類:[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;
}
}
}
|