2016-09-25 2 views
1

Salut je suis en train de développer un programme qui est censé reconnaître ma voix, puis écrire ce qu'il entend, mais quand je lance le code et je clique sur le buttun pour démarrer le recEngine, il dit que "Une exception non gérée de type 'System.NullReferenceException' s'est produite dans System.Speech.dll", et dans les astuces, il est possible que la variable était null avant. Mais j'ai réglé la variable avant ou je fais quelque chose de mal.NullReferenceException lors du démarrage de Recognizer avec RecognizeAsync

Voici le code

using System; 
using System.Windows.Forms; 
using System.Speech.Recognition; 

namespace Voice_Recognition 
{ 
    public partial class Form1 : Form 
    { 
     SpeechRecognitionEngine recEngine = new SpeechRecognitionEngine(); 

     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void BtnEnable_Click(object sender, EventArgs e) 
     { 

Ceci est la ligne où l'erreur shos vers le haut.

  recEngine.RecognizeAsync(RecognizeMode.Multiple); 
      // BtnEnable.Enabled = false; 
      BtnDisable.Enabled = true; 
     } 

     private void Form1_Load(object sender, EventArgs e) 
     { 
      Choices commands = new Choices(); 
      commands.Add(new string[] { "say hello", "print my name" }); 
      GrammarBuilder Gbuilder = new GrammarBuilder(); 
      Gbuilder.Append(commands); 
      Grammar grammar = new Grammar(Gbuilder); 
      recEngine.LoadGrammarAsync(grammar); 
      recEngine.SetInputToDefaultAudioDevice(); 
      recEngine.SpeechRecognized += recEngine_SpeechRecognized; 
     } 

     private void recEngine_SpeechRecognized(object sender, SpeechRecognizedEventArgs e) 
     { 
      switch (e.Result.Text) 
      { 
       case "say hello": 
        Log.Text += "\nHello"; 
        break; 
       case "print my name": 
        Log.Text += "\nMyname"; 
        break; 

      } 
     } 

     private void BtnDisable_Click(object sender, EventArgs e) 
     { 
      BtnEnable.Enabled = true; 
      BtnDisable.Enabled = false; 
      recEngine.RecognizeAsyncStop(); 
     } 
    } 
} 

Dans le menu des conseils, il dit:

-Check pour déterminer si l'objet était nul avant d'appeler la méthode

-Utiliser le mot clé « nouveau » pour créer une instance d'objet

Merci à l'avance

Répondre

1

Un couple de choses qui ont l'air bizarre:

  • utilisation recEngine.SpeechRecognized += new EventHandler<SpeechRecognizedEventArgs>(recEngine_SpeechRecognized); au lieu de recEngine.SpeechRecognized += recEngine_SpeechRecognized;

  • Il est possible que la grammaire n'a pas terminé son chargement au moment où vous commencez la reconnaissance; utilisez LoadGrammar au lieu de LoadGrammarAsync (ou ajoutez un gestionnaire pour LoadGrammarCompleted). J'ai toujours trouvé utile de spécifier explicitement le cultureinfo pour le Recognizer (et la grammaire), car cela évite les malentendus sur la langue utilisée.