1

私はプログラミングの初心者であり、音声認識を使用して言おうとしたことを示すメッセージボックスを表示する簡単なアプリケーションを構築しようとしています。問題は、初めて「こんにちは」と言ったとき、たとえば、メッセージボックスが表示されないことです。もう一度試すと、正しいメッセージボックスが表示されます。3回目に「こんにちは」と言うと、2つのメッセージボックスが表示されます。4回目は、3つのメッセージボックスなどです。誰かがこの問題を手伝うことができますか?

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

namespace Voices
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private SpeechRecognitionEngine sre;

        private void Form1_Load(object sender, EventArgs e)
        {
            sre = new SpeechRecognitionEngine();
            sre.SetInputToDefaultAudioDevice();

            Choices commands = new Choices();
            commands.Add(new string[] { "hello" });

            GrammarBuilder gb = new GrammarBuilder();
            gb.Append(commands);

            Grammar g = new Grammar(gb);
            sre.LoadGrammar(g);

            sre.RecognizeAsync(RecognizeMode.Multiple);


            sre.SpeechRecognized += (s, args) =>
            {
                foreach (RecognizedPhrase phrase in args.Result.Alternates)
                {
                    if (phrase.Confidence > 0.9f)
                        sre.SpeechRecognized += new EventHandler<SpeechRecognizedEventArgs>(sre_SpeechRecognized);
                }
            };

        }

        void sre_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
        {
            switch (e.Result.Text)
            {
                case "hello":
                    MessageBox.Show(e.Result.Text);                    
                    break;
            }
        }       
    }
}
4

2 に答える 2

4

インラインイベントハンドラー(in Form_Load)は、何かを言うたびに新しいイベントハンドラーを追加しています。

于 2012-11-28T16:48:41.167 に答える
3

次のコードは、複数のメッセージボックスが表示される理由です。

sre.SpeechRecognized += (s, args) =>
{
    foreach (RecognizedPhrase phrase in args.Result.Alternates)
    {
        if (phrase.Confidence > 0.9f)
            sre.SpeechRecognized += new EventHandler<SpeechRecognizedEventArgs>(sre_SpeechRecognized);
    }
};

SpeechRecognizedが発生するたびに、同じイベントハンドラーで同じイベントに登録されます。

イベントに登録するのは1回だけです。

私はあなたがしたいことは次のとおりだと思います:

if (phrase.Confidence > 0.9f)
    sre_SpeechRecognized(s, args);
于 2012-11-28T16:53:01.023 に答える