2014-10-02 79 views
1

我面临着一些例外下面的代码:异常在Java中的语音识别

import java.io.FileReader; 
    import java.io.IOException; 
    import java.util.Locale; 
    import javax.speech.AudioException; 
    import javax.speech.Central; 
    import javax.speech.EngineException; 
    import javax.speech.EngineModeDesc; 
    import javax.speech.EngineStateError; 
    import javax.speech.recognition.GrammarException; 
    import javax.speech.recognition.Recognizer; 
    import javax.speech.recognition.Result; 
    import javax.speech.recognition.ResultAdapter; 
    import javax.speech.recognition.ResultEvent; 
    import javax.speech.recognition.ResultToken; 
    import javax.speech.recognition.RuleGrammar; 

    public class HelloWorld extends ResultAdapter { 

     static Recognizer rec; 

     // Receives RESULT_ACCEPTED event: print it, clean up, exit 
     @Override 
     public void resultAccepted(ResultEvent e) { 
      Result r = (Result) (e.getSource()); 
      ResultToken tokens[] = r.getBestTokens(); 

      for (int i = 0; i < tokens.length; i++) { 
       System.out.print(tokens[i].getSpokenText() + " "); 
      } 
      System.out.println(); 

      try { 
       // Deallocate the recognizer and exit 
       rec.deallocate(); 
      } catch (EngineException | EngineStateError ex) { 
       System.out.println(ex.toString()); 
      } 
      System.exit(0); 
     } 

     public static void main(String args[]) { 
      try { 
       // Create a recognizer that supports English. 
       rec = Central.createRecognizer(
         new EngineModeDesc(Locale.ENGLISH)); 

       // Start up the recognizer 
       rec.allocate(); 

       // Load the grammar from a file, and enable it 
       FileReader reader = new FileReader(args[0]); 
       RuleGrammar gram = rec.loadJSGF(reader); 
       gram.setEnabled(true); 

       // Add the listener to get results 
       rec.addResultListener(new HelloWorld()); 

       // Commit the grammar 
       rec.commitChanges(); 

       // Request focus and start listening 
       rec.requestFocus(); 
       rec.resume(); 
      } catch (IllegalArgumentException | EngineException | SecurityException | GrammarException | IOException | AudioException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 

例外: - 在Demo5.HelloWorld.main(的HelloWorld 异常线程 “main” 显示java.lang.NullPointerException 。的java:55) Java结果:1个

异常在此行​​中发生(第55行):

// Start up the recognizer 
rec.allocate(); 
+0

哪里是代码中的第55行? – 2014-10-02 03:26:36

+0

为什么你定义这个变量是静态的?静态识别器rec; – 2014-10-02 03:31:35

+0

我试图让这个变量(静态识别器rec;)非静态,但它仍然抛出相同的异常。 – King 2014-10-02 03:35:58

回答

0

Recognizer显示为空。看到这一行:

rec = Central.createRecognizer(new EngineModeDesc(Locale.ENGLISH)); 

docs表明,这是与你正在为createRecognizer参数一个问题:如果没有与所需的性质该方法返回null没有识别器

至于解决null识别器的原因,第二个答案this question可能会有所帮助。

+0

如果你的意思是defiening变量,他已经这样做了,而且类型是静态的 – 2014-10-02 03:33:12

+0

不,这个异常发生在他分配'rec'后立即发生'Central.createRecognizer(new EngineModeDesc(Locale.ENGLISH))的值。 '。问题在于对'createRecognizer'的调用。 – deyur 2014-10-02 03:38:17

+0

你如何建议解决这个问题? – 2014-10-02 03:38:53