распознавание речи в Java - PullRequest
3 голосов
/ 20 апреля 2009

Я хочу использовать распознавание речи в своем проекте, и я нашел этот код, но когда я запускаю его, я получаю сообщение об ошибке:

run: java.lang.NullPointerException
        at newpackage.HelloWorld.main(HelloWorld.java:55)

Может, кто-нибудь из вас поможет мне в этой проблеме?

Код сервера, который я использую:

package newpackage;

import java.util.logging.Level;
import java.util.logging.Logger;
import javax.speech.*;
import javax.speech.recognition.*;
import java.io.FileReader;
import java.util.Locale;

public class HelloWorld extends ResultAdapter {
  static Recognizer rec;

  // Receives RESULT_ACCEPTED event: print it, clean up, exit
  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 ex) {
          Logger.getLogger(HelloWorld.class.getName()).log(Level.SEVERE, null, ex);
    } catch (EngineStateError ex) {
          Logger.getLogger(HelloWorld.class.getName()).log(Level.SEVERE, null, ex);
    }
    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 (Exception e) {
      e.printStackTrace();
          // System.out.println("the problem");
    }
  }
}

Ответы [ 2 ]

2 голосов
/ 29 октября 2011

переписать

// Create a recognizer that supports English.
      rec = Central.createRecognizer(
              new EngineModeDesc(Locale.ENGLISH));

будет как показано ниже

            SynthesizerModeDesc desc = new SynthesizerModeDesc(
            null,          // engine name
            "general",     // mode name
            Locale.US,     // locale
            null,          // running
            null);         // voice

     synth = Central.createSynthesizer(desc);
2 голосов
/ 20 апреля 2009
if (rec != null) {
    System.out.println(rec);
}
else {
    System.out.println("rec is null");   
    // <-- here's your problem.  you need to return, exit, or throw here!
}

// Start up the recognizer
rec.allocate();  // <-- This is the line that's blowing out (I assume)

Вы получите нулевой указатель, потому что, хотя вы еще обрабатываете случай, когда rec равен нулю, ваша программа продолжается. Вам нужно вернуться или выйти, или что-то, когда rec равно нулю.

Примечание: Кроме того, я переформатировал ваш код, потому что трудно прочитать ваш if / else. Если вы собираетесь использовать curlies на одной ветви вашего if / else, вы должны использовать curlies на обеих ветвях. Это делает его более читабельным.

Редактировать: О да, а почему createRecognizer возвращается null, боюсь, я не знаю.

...