4

次のコードを考えると、

Choices choices = new Choices();
choices.Add(new GrammarBuilder(new SemanticResultValue("product", "<product/>")));

GrammarBuilder builder = new GrammarBuilder();
builder.Append(new SemanticResultKey("options", choices.ToGrammarBuilder()));

Grammar grammar = new Grammar(builder) { Name = Constants.GrammarNameLanguage};
grammar.Priority = priority;

_recognition.LoadGrammar(grammar);

読み込まれた文法に単語を追加するにはどうすればよいですか? これは、ネイティブ コードと SpeechLib 相互運用機能の両方を使用して実現できることはわかっていますが、私はマネージ ライブラリを使用することを好みます。

更新:私が達成したいのは、個々の変更のために文法全体を繰り返しロードする必要がないことです。小さな文法の場合、私は呼び出すことで良い結果を得ました

_recognition.RequestRecognizerUpdate()

そして、イベントで古い文法のアンロードと再構築された文法のロードを行います:

void Recognition_RecognizerUpdateReached(object sender, RecognizerUpdateReachedEventArgs e)

大規模な文法の場合、これはコストがかかりすぎます。

4

3 に答える 3

1

ネイティブSAPIでは、ISpGrammarBuilder2 :: AddTextSubset()を使用します。

于 2009-09-17T22:29:27.493 に答える
1

文法が非常に大きい場合は、ディクテーション文法オプションを使用することもできます。標準の口述文法がありますが、独自の文法を指定することもできます。http://msdn.microsoft.com/en-us/library/system.speech.recognition.dictationgrammar.aspxを参照してください。これはコンストラクターです。

あなたはこれを更新しません。考えられるすべての単語が含まれています。

于 2009-03-16T23:51:26.793 に答える
1

文法規則の参照を介して、何らかの間接化を使用する必要があるようです。これは GrammarBuilder.AppendRuleReference メソッドで行うことができます。最初にいくつかの SRGS 文法ファイルを使用して文法をテストする方が簡単な場合があります。

原則は、いくつかの参照を含む主要な大きな文法を、動的にロードするより小さなユーザー固有の単語リスト文法にロードすることです。

srgs 形式についてはhttp://www.w3.org/TR/speech-grammar/#S2.2http://msdn.microsoft.com/en-us/library/system.speech.recognition.grammarbuilderを参照してください。プログラム バージョンの.appendrulereference.aspx

于 2009-03-16T16:53:55.720 に答える