运行时错误 - JSAPI HelloWorld程序

时间:2012-02-04 21:10:05

标签: java nullpointerexception runtime-error jsapi speechsynthesizer

在使用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。

请帮帮我!! :(

3 个答案:

答案 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”目录中。希望有所帮助