1

私は、口頭でコマンドを発行できるマイクをアパートに設置するという個人的なプロジェクトに取り組んでいます。これを実現するために、私は Microsoft Speech API を使用してきました。具体的には、C# の System.Speech.Recognition の RecognitionEngine を使用しています。次のように文法を構築します。

// validCommands is a Choices object containing all valid command strings
// recognizer is a RecognitionEngine
GrammarBuilder builder = new GrammarBuilder(recognitionSystemName);
builder.Append(validCommands);
recognizer.SetInputToDefaultAudioDevice();
recognizer.LoadGrammar(new Grammar(builder));
recognizer.RecognizeAsync(RecognizeMode.Multiple);

// etc ...

これは、実際にコマンドを与える場合にはかなりうまくいくようです。私のコマンドの 1 つをまだ誤認していません。残念ながら、ランダムな会話をコマンドとして拾う傾向もあります! コマンドChoicesオブジェクトの前に「名前」(認識システム名) を付けることで、これを改善しようとしました。奇妙なことに、これは役に立たないようです。あらかじめ決められた一連のコマンド フレーズに制限しているので、音声が文字列ではないかどうかを検出できると考えていたでしょう。私の推測では、すべてのサウンドがコマンドであると想定し、コマンド セットから最適なものを選択していると思われます。このシステムを改善して、このシステムに向けられていない会話がトリガーされないようにするためのアドバイスは非常に役に立ちます。

編集:名前認識エンジンを別の SpeechRecognitionEngine に移動しましたが、精度はひどいです。精度を調べるために書いたテストコードを次に示します。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Speech.Recognition;

namespace RecognitionAccuracyTest
{
    class RecognitionAccuracyTest
    {
        static int recogcount;
        [STAThread]
        static void Main()
        {
            recogcount = 0;
            System.Console.WriteLine("Beginning speech recognition accuracy test.");

            SpeechRecognitionEngine recognizer;
            recognizer = new SpeechRecognitionEngine(new System.Globalization.CultureInfo("en-US"));
            recognizer.SetInputToDefaultAudioDevice();
            recognizer.LoadGrammar(new Grammar(new GrammarBuilder("Octavian")));
            recognizer.SpeechHypothesized += new EventHandler<SpeechHypothesizedEventArgs>(recognizer_SpeechHypothesized);
            recognizer.SpeechRecognized += new EventHandler<SpeechRecognizedEventArgs>(recognizer_SpeechRecognized);
            recognizer.RecognizeAsync(RecognizeMode.Multiple);

            while (true) ;
        }

        static void recognizer_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
        {
            System.Console.WriteLine("Recognized @ " + e.Result.Confidence);
            try
            {
                if (e.Result.Audio != null)
                {
                    System.IO.FileStream stream = new System.IO.FileStream("audio" + ++recogcount + ".wav", System.IO.FileMode.Create);
                    e.Result.Audio.WriteToWaveStream(stream);
                    stream.Close();
                }
            }
            catch (Exception) { }
        }

        static void recognizer_SpeechHypothesized(object sender, SpeechHypothesizedEventArgs e)
        {
            System.Console.WriteLine("Hypothesized @ " + e.Result.Confidence);
        }
    }
}

名前が "Octavian" の場合、"Octopus"、"Octagon"、"Volkswagen"、"Wow, really?" などを認識します。関連するオーディオ クリップの違いがはっきりと聞こえます。これをひどくしないようにするためのアイデアは素晴らしいでしょう。

4

4 に答える 4

2

「バトラー」や「Siri」など、システムへのコマンドを区別するためのフレーズが必要です。それで、「バトラー、テレビをつけて」と言うでしょう。これを文法に組み込むことができます。

コマンドを認識する前に開始句を必要とする単純な文法の例を次に示します。セマンティックな結果を使用して、発言内容を理解できるようにします。この場合、ユーザーは「開く」または「開けてください」または「開けますか」と言う必要があります。

    private Grammar CreateTestGrammar()
    {
        // item
        Choices item = new Choices();
        SemanticResultValue itemSRV;
        itemSRV = new SemanticResultValue("I E", "explorer");
        item.Add(itemSRV);
        itemSRV = new SemanticResultValue("explorer", "explorer");
        item.Add(itemSRV);
        itemSRV = new SemanticResultValue("firefox", "firefox");
        item.Add(itemSRV);
        itemSRV = new SemanticResultValue("mozilla", "firefox");
        item.Add(itemSRV);
        itemSRV = new SemanticResultValue("chrome", "chrome");
        item.Add(itemSRV);
        itemSRV = new SemanticResultValue("google chrome", "chrome");
        item.Add(itemSRV);
        SemanticResultKey itemSemKey = new SemanticResultKey("item", item);

        //build the permutations of choices...
        GrammarBuilder gb = new GrammarBuilder();
        gb.Append(itemSemKey);


        //now build the complete pattern...
        GrammarBuilder itemRequest = new GrammarBuilder();
        //pre-amble "[I'd like] a"
        itemRequest.Append(new Choices("Can you open", "Open", "Please open"));

        itemRequest.Append(gb);

        Grammar TestGrammar = new Grammar(itemRequest);
        return TestGrammar;
    }

次に、次のような方法で音声を処理できます。

RecognitionResult result = myRecognizer.Recognize();

次のようなセマンティックな結果を確認します。

if(result.Semantics.ContainsKey("item"))
{
   string s = (string)result.Semantics["item"].Value;
}
于 2011-11-01T13:07:56.443 に答える
1

私も同じ問題を抱えています。Microsoft Speech Platform を使用しているため、精度などが多少異なる場合があります。

Claire を起床コマンドとして使用していますが、Claire としても別の単語を認識するのは事実です。問題は、エンジンがあなたの話し声を聞いて、最も近い一致を検索することです。

これに対する本当に良い解決策は見つかりませんでした。Confidence フィールドを使用して、認識された音声をフィルタリングしてみることができます。しかし、私が選んだ認識エンジンではあまり信頼できません。認識したいすべての単語を 1 つの大きな SRGS.xml に入れ、繰り返し値を 0 ~ に設定するだけです。Claire が最初の単語であるため、認識された文のみを受け入れます。しかし、この解決策は、私が望むほどうまく機能しないため、私が望むものではありませんが、それでも少し改善されています.

私は現在それで忙しいので、進行状況に応じてより多くの情報を投稿します.

編集 1: Dims のコメントとして: SRGS Grammar で「ガベージ」ルールを追加することは可能です。あなたはそれを調べたいかもしれません。 http://www.w3.org/TR/speech-grammar/

于 2011-11-03T08:43:13.237 に答える
0

原則として、文法または辞書のいずれかを更新して、そこに「空」または「何でも」エントリを含める必要があります。

于 2011-10-31T17:31:22.800 に答える
0

使用したい文法を作成/ロードする前に UnloadAllGrammars() を実行するだけでよいということは可能ですか?

于 2012-03-02T16:11:27.493 に答える