Événement de non déclenchement du moteur de reconnaissance vocale dans le service Windows

J’ai donc un service Windows avec reconnaissance vocale mis en œuvre à l’aide du moteur de reconnaissance system.speech. Mon code de reconnaissance vocale fonctionne correctement lorsque je démarre le service mais aucun événement pour les incendies reconnus vocalement. Ce qui est étrange, c’est que si j’exécute exactement le même code, mais dans une console ou une application WPF, le déclenchement d’événements pour la reconnaissance vocale fonctionne parfaitement.
J’ai déjà associé un débogueur à mon processus de service pour vérifier ce qui se passait dans les coulisses. Il semble que le moteur de reconnaissance vocale charge correctement les grammaires, configure son mode pour une écoute continue et configure correctement l’événement reconnu par la parole. Aucune exception n’est levée, donc je ne suis pas trop sûr de ce qui ne va pas ici. Des idées?

Utilisez-vous le microphone ou traitez-vous un fichier WAV? Je ne sais pas comment la plomberie audio fonctionnera dans un service si vous essayez d’utiliser le périphérique audio par défaut. Si vous essayez de convertir des fichiers audio ou un stream, assurez-vous que vous utilisez un programme de reconnaissance InProc.

Si vous créez une application serveur, vous devriez probablement envisager d’utiliser l’API Microsoft.Speech et les enregistreurs de serveur. Voir Quelle est la différence entre System.Speech.Recognition et Microsoft.Speech.Recognition? et le kit de développement logiciel Microsoft Speech Platform – http://www.microsoft.com/en-us/download/details.aspx?id=27226

Si vous essayez d’effectuer une reconnaissance continue sans votre application au premier plan, je pense que le dispositif de reconnaissance partagé peut prendre en charge votre besoin. Le programme de reconnaissance de bureau Microsoft fourni avec Windows 7 et Vista peut fonctionner selon deux modes: inproc ou partagé. Les reconnaisseurs partagés sont utiles sur le bureau, où les commandes vocales sont utilisées pour contrôler les applications ouvertes. Dans System.Speech, vous pouvez utiliser SpeechRecognizer pour accéder au programme de reconnaissance de bureau partagé ou à SpeechRecognitionEngine afin de disposer d’un module de reconnaissance inproc dédié à votre application. Vous pourrez peut-être utiliser le dispositif de reconnaissance partagé pour fournir une reconnaissance continue à votre application, même si celle-ci n’est pas au premier plan.

Il existe un très bon article publié il y a quelques années à l’ adresse http://msdn.microsoft.com/en-us/magazine/cc163663.aspx . C’est probablement le meilleur article d’introduction que j’ai trouvé jusqu’à présent. Ça dit:

… le moteur de reconnaissance peut être instancié dans un autre processus appelé SAPISVR.EXE. Cela fournit un moteur de reconnaissance partagé qui peut être utilisé simultanément par plusieurs applications. Cette conception présente de nombreux avantages. Premièrement, les systèmes de reconnaissance nécessitent généralement beaucoup plus de ressources d’exécution que les synthétiseurs, et le partage d’un système de reconnaissance est un moyen efficace de réduire les frais généraux. Deuxièmement, le dispositif de reconnaissance partagée est également utilisé par la fonctionnalité de parole intégrée de Windows Vista. Par conséquent, les applications qui utilisent la reconnaissance partagée peuvent tirer parti du microphone du système et de l’interface utilisateur de retour. Il n’y a pas de code supplémentaire à écrire, ni de nouvelle interface utilisateur à apprendre pour l’utilisateur.Nouveau SAPI 5.3

SpeechRecognition doit être exécuté sur un thread séparé et passe à OOTB à partir de SpeechRecognitionEngine.

static ManualResetEvent _completed = null; static void Main(ssortingng[] args) { _completed = new ManualResetEvent(false); SpeechRecognitionEngine _recognizer = new SpeechRecognitionEngine(); _recognizer.RequestRecognizerUpdate(); // request for recognizer update _recognizer.LoadGrammar(new Grammar(new GrammarBuilder("test")) Name = { "testGrammar" }); // load a grammar _recognizer.RequestRecognizerUpdate(); // request for recognizer update _recognizer.LoadGrammar(new Grammar(new GrammarBuilder("exit")) Name = { "exitGrammar" }); // load a "exit" grammar _recognizer.SpeechRecognized += _recognizer_SpeechRecognized; _recognizer.SetInputToDefaultAudioDevice(); // set the input of the speech recognizer to the default audio device _recognizer.RecognizeAsync(RecognizeMode.Multiple); // recognize speech asynchronous _completed.WaitOne(); // wait until speech recognition is completed _recognizer.Dispose(); // dispose the speech recognition engine } void _recognizer_SpeechRecognized(object sender, SpeechRecognizedEventArgs e) { if (e.Result.Text == "test") // e.Result.Text contains the recognized text { Console.WriteLine("The test was successful!"); } else if (e.Result.Text == "exit") { _completed.Set(); } } 

Aussi eu un problème similaire quand j’ai utilisé SpeechRecognition et non SpeechRecognitionEngine. ce qui précède est un excellent exemple de l’utilisation + de son écoute pour les événements dans un autre thread. ps: j’ai eu la référence d’un excellent article: Reconnaissance vocale, parole à texte, synthèse vocale et synthèse vocale en C #, amusez-vous 🙂

Avez-vous essayé de configurer le service pour qu’il soit autorisé à interagir avec le bureau?

Image

Je pense que ce paramètre couvre les interactions avec les périphériques d’interface utilisateur, tels que les microphones.