1

シナリオ :

私は2つのコマンドを持っています。

1) Google で「ここに任意の単語」を検索します。

2) アプリケーションを開く「ここに任意の単語」

問題 :

「Google で検索」の後の単語は何でもかまいませんが、IF ステートメントに何を書くかをどうやって知ることができるのでしょうか?

定義済みの文章を使用すると、次のように簡単に実行できます

void Engine_SpeechRecognized (object sender, SpeechRecognizedEventsArgs e)
{
    if (e.Result.Text == "Search Google Stackoverflow")
    {
       Search("Stackoverflow");
    }
}

しかし、今は事前に定義されていないので、IF ステートメントの条件に何を書けばよいのでしょうか? これができるわけではないのですが、

if (e.Result.Text == "Search Google" + e.Result.Text)
{
    Search(e.Result.Text);
}

それで、どうやってそれをするつもりですか?コマンドが 1 つしかなく、アクションを 1 つだけ実行する必要がある場合、これは簡単です。デフォルトのアクションを Search() として設定するだけで済みますが、状況は異なります。

これが私のコードです(1つのコマンドとアクションのみの場合、2つ以上が必要です)* System.Speechの使用

public MainWindow() 
{ 
    InitializeComponent(); 
    builder.Append("search google for"); builder.AppendDictation();

    Grammar grammar = new Grammar(builder);
    grammar.Name = ("Google Searching");

    engine.LoadGrammarAsync(grammar);
    engine.SetInputToDefaultAudioDevice();
    engine.SpeechRecognized += new EventHandler<SpeechRecognizedEventArgs>(Engine_SpeechRecognized);
    engine.RecognizeAsync(RecognizeMode.Multiple);
}

string result;
void Engine_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
{
    txtSpeech.Text = e.Result.Text;
    ExtractKeywords(e.Result.Text);

    OpenApp("https://www.google.com/#q=" + result);
}
4

2 に答える 2

3

このような場合、RecognizedPhrase.Wordsプロパティから目的のフレーズを引き出すことができます。の最初の 3 つの単語はresult.text「Google で検索」にresult.words[3]..results.words[result.words.count-1]なるため、検索するフレーズが含まれます。

それらを連結して、すぐに使用できます。

複数のアクションをサポートするには、Grammar.Nameプロパティを使用して、実行するコマンドを指定します。

void Engine_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
{
    txtSpeech.Text = e.Result.Text;
    ExtractKeywords(e.Result.Text);

    if (e.Result.Grammar.Name.Equals("Google Search"))
    {
         OpenApp("www.google.com", result);
    }
    else if (e.Result.Grammar.Name.Equals("StackOverflow Search"))
    {
         OpenApp("www.stackoverflow.com", result);
    }
    // etc...
}
于 2013-10-28T06:09:52.923 に答える
1

コマンドを示すキーと、実行するコマンドを保持する匿名メソッドを備えた辞書を使用できます。パフォーマンスのために、辞書を静的にリファクタリングし、一度だけインスタンス化することをお勧めしますが、これにより一般的なアイデアが得られます。

void Engine_SpeechRecognized (object sender, SpeechRecognizedEventsArgs e)
{
    var commands = new Dictionary<string, Action<string>>();
    commands.Add(
         "search google", 
         (arg) => { Search(arg);  }) ;
    commands.Add(
         "open application", 
         (arg) => { OpenApp( "https://www.google.com/#q=" + arg);  }) ;

    foreach(var command in commands.Keys)
    {
       if (e.Result.Text.StartsWith(command))
       {
          Action(command, e.Result.Text, commands[command]);
       }
    }
}

/* helper for getting one point for an arguments extractor */
static void Action(string cmd,string all, Action<string> act)
{
    string args = all.Replace(cmd,"");
    act(args);
}
于 2013-10-27T15:36:34.190 に答える