2008-11-29 8 views
4

Étant donné le code suivant,Comment ajouter des mots à une grammaire déjà chargée à l'aide System.Speech et SAPI 5.3

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); 

Comment puis-je ajouter des mots supplémentaires à la grammaire chargée? Je sais que ceci peut être réalisé à la fois en code natif et en utilisant l'interop de SpeechLib, mais je préfère utiliser la bibliothèque gérée.

Mise à jour: Ce que je veux réaliser, ce n'est pas avoir à charger une grammaire entière à plusieurs reprises à cause de changements individuels. Pour les petites grammaires je suis arrivé de bons résultats en appelant

_recognition.RequestRecognizerUpdate() 

et faire ensuite le déchargement de la vieille grammaire et le chargement d'une grammaire reconstruite en cas:

void Recognition_RecognizerUpdateReached(object sender, RecognizerUpdateReachedEventArgs e) 

Pour les grandes grammaires cela devient trop cher.

Répondre

1

Il semble que vous ayez besoin d'utiliser une certaine indirection, via la référence d'une règle de grammaire. Cela peut être fait avec la méthode GrammarBuilder.AppendRuleReference. Il pourrait être plus facile de tester d'abord vos grammaires avec certains fichiers de grammaire SRGS. Le principe est que vous chargez une grande grammaire principale contenant des références, des grammaires de listes de mots spécifiques à l'utilisateur, que vous chargez dynamiquement. Voir http://www.w3.org/TR/speech-grammar/#S2.2 pour le format srgs et http://msdn.microsoft.com/en-us/library/system.speech.recognition.grammarbuilder.appendrulereference.aspx pour la version programmatique.

+0

Je ne suis pas sûr que je suis. Disons que j'ajoute une référence à une grammaire externe comme décrit dans AppendRuleReference. Une fois cette grammaire référencée chargée, son contenu change. Comment puis-je mettre à jour le moteur de reconnaissance vocale pour utiliser la grammaire modifiée? (sans le recharger bien sûr) –

+0

Vous devez _do_ recharger la grammaire _referenced_, mais pas la grammaire principale. Cela devrait être une opération de chargement/déchargement beaucoup plus petite. Si les différences par utilisateur sont grandes, l'autre option consisterait à les charger toutes, puis à les activer/désactiver à la volée. –

+0

Je vais essayer de donner un exemple. Ouvrez le mot et commencez à taper. Chaque phrase ajoutée/supprimée/modifiée doit être ajoutée/supprimée/modifiée (= supprimer, puis ajouter) à la grammaire. Je dois supporter de gros fichiers. (où je définis grand comme rendant le rechargement notable) –

1

Une alternative, si vous avez de très grandes grammaires, serait d'utiliser l'option de grammaire de dictée. Il existe une grammaire de dictée standard, mais vous pouvez également spécifier la vôtre. Voir http://msdn.microsoft.com/en-us/library/system.speech.recognition.dictationgrammar.aspx, et c'est constructeur.

Vous ne souhaitez pas mettre à jour ce. Il contient tous les mots possibles.

+0

La grammaire de dictée ne fonctionnera pas car j'ai besoin de plus de contexte. L'échantillon que j'ai donné dans un commentaire précédent sur les expressions de frappe dans le mot est simplifié à l'extrême. La grammaire est assez complexe. De toute façon, merci pour votre contribution. –

1

En SAPI natif, j'utiliserais ISpGrammarBuilder2 :: AddTextSubset().

+0

Merci. Je vais jeter un oeil et voir si j'ai accès à AddTextSubset(). Peut-être à travers la réflexion. –

Questions connexes