0

使用 JSAPI 运行基本 HelloWorld 程序时,显示错误“java.lang.NullPointerException at HelloWorld.main(HelloWorld.java:11)”

以下是代码:

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。

请帮我 !!:(

4

3 回答 3

2

来自javadocsCentral.createSynthesizer:_

返回:与所需属性匹配的 Synthesizer,如果没有可用属性,则返回 null

显然,没有可用的。也许尝试Locale.US可能会产生一个有效的SynthesizerModeDesc

编辑以回应评论:说真的,我从来没有使用过这个东西......但我实际上正在阅读我们在这里进行的javadocs。您正在使用的构造函数 ( new SynthesizerModeDesc(Locale.ENGLISH)) 说,

“为语言环境构造一个 EngineModeDesc。引擎名称、模式名称和运行设置为空”。

从“然后我想使用它”的角度来看,这听起来并不好。还有另一个构造函数允许您设置这些选项,以及设置它们的方法。

于 2012-02-04T21:14:35.067 回答
1

似乎是这里讨论的解决方案

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

你确定你已经这样做了“顺便说一句,我假设你正在使用 freetts 并将“speech.properties”文件复制到你的 jdk 目录中”?

于 2012-02-05T18:53:30.050 回答
0

您必须确保在构建路径中包含“jsapi.jar”、“freetts.jar”和“jreetts-jsapi10.jar”。如果你的 freetts 目录中没有这些,你必须进入 lib 子目录并启动 jsapi.exe。并确保您已将“speech.properties”复制到您的 C:Users/"yourUserNameHere" 目录中。希望有帮助

于 2013-09-10T22:05:35.413 回答