Reputation:
I want to use speech recognition in my project and I found this code but when I run it I get an error which is:
run: java.lang.NullPointerException at newpackage.HelloWorld.main(HelloWorld.java:55)
Please could one of you help me in this problem?
This is the server code that I use:
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");
}
}
}
Upvotes: 5
Views: 9861
Reputation: 5813
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)
You'll get a null pointer because even though your else is handling the case when rec
is null, your program continues. You need to return or exit, or something when rec
is null.
Note: Also, I reformatted your code because it's hard to read your if/else. If you're going to use curlies on one branch of your if/else, you should use curlies on both. It makes it more readable.
Edit: Oh yeah, as far as why createRecognizer
is returning null
, I'm afraid I don't know.
Upvotes: 2
Reputation: 21
rewrite the
// Create a recognizer that supports English.
rec = Central.createRecognizer(
new EngineModeDesc(Locale.ENGLISH));
to be as below
SynthesizerModeDesc desc = new SynthesizerModeDesc(
null, // engine name
"general", // mode name
Locale.US, // locale
null, // running
null); // voice
synth = Central.createSynthesizer(desc);
Upvotes: 2