在使用JSAPI运行基本的HelloWorld程序时,它在HelloWorld.main(HelloWorld.java:11)显示错误" java.lang.NullPointerException"
以下是代码:
import javax.speech.*;
import javax.speech.synthesis.*;
import java.util.Locale;
public class HelloWorld {
public static void main(String args[]) {
try {
// Create a synthesizer for English
Synthesizer synth = Central.createSynthesizer(new SynthesizerModeDesc(Locale.ENGLISH));
// Get it ready to speak
synth.allocate();
synth.resume();
// Speak the "Hello world" string
synth.speakPlainText("Hello, world!", null);
// Wait till speaking is done
synth.waitEngineState(Synthesizer.QUEUE_EMPTY);
// Clean up
synth.deallocate();
} catch (Exception e) {
e.printStackTrace();
}
}
}
编辑: 我编辑我的程序:
import javax.speech.*;
import javax.speech.synthesis.*;
import java.util.Locale;
public class HelloWorld {
public static void main(String args[]) {
try {
// Create a synthesizer for English
SynthesizerModeDesc modeDesc = new SynthesizerModeDesc(null,"general",Locale.US,null,null);
System.out.println(modeDesc);
Synthesizer synth = Central.createSynthesizer(modeDesc);
//Synthesizer synth = Central.createSynthesizer(null);
// Get it ready to speak
System.out.println(synth);
synth.allocate();
synth.resume();
// Speak the "Hello world" string
synth.speakPlainText("Hello, world!", null);
// Wait till speaking is done
synth.waitEngineState(Synthesizer.QUEUE_EMPTY);
// Clean up
synth.deallocate();
} catch (Exception e) {
e.printStackTrace();
}
}
}
它正在输出:
javax.speech.synthesis.SynthesizerModeDesc@9304b1
null
java.lang.NullPointerException
at HelloWorld.main(HelloWorld.java:15)
似乎SynthesizerModeDesc工作正常,但它没有检测到任何引擎,因为我尝试将null传递给函数Central.createSynthesizer(即获取默认引擎),但它仍然返回null。我检查了它正在检测的引擎数量,但它显示为0。
请帮帮我!! :(
答案 0 :(得分:2)
来自Central.createSynthesizer
的{{3}}:
返回: 匹配所需属性的Synthesizer,如果没有,则返回null
显然,没有可用的。也许尝试Locale.US
可能会产生有效的SynthesizerModeDesc
编辑以回应评论:说真的,我从来没有使用过这个东西......但我实际上正在读这些javadocs。您正在使用的构造函数(new SynthesizerModeDesc(Locale.ENGLISH)
)表示
"为区域设置构建EngineModeDesc。引擎名称,模式名称和运行设置为null"。
从&#34开始听起来并不好;然后我想用它"透视。还有另一个构造函数允许您设置这些选项,以及设置它们的方法。
答案 1 :(得分:1)
似乎是here
讨论的解决方案Synthesizer synth = Central.createSynthesizer(
new SynthesizerModeDesc(
null, // engine name
"general", // mode name
Locale.US, // locale
null, // running
null) // voice
);
你确定你已经完成了这个“顺便说一下我假设你正在使用freetts并将”speech.properties“文件复制到你的jdk目录中吗?
答案 2 :(得分:0)
你必须确保在你的构建路径中包含'jsapi.jar','freetts.jar'和'jreetts-jsapi10.jar'。如果你的freetts目录中没有那些,你必须进入lib子目录并启动jsapi.exe。并确保将'speech.properties'复制到C:Users /“yourUserNameHere”目录中。希望有所帮助