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 は正常に動作しているようですが、Central.createSynthesizer 関数にも null を渡そうとしたため (つまり、デフォルト エンジンを取得)、エンジンが検出されていませんが、それでも null が返されています。検出しているエンジンの数を確認しましたが、0 と表示されています。

私を助けてください !!:(

4

3 に答える 3

2

javadocsからCentral.createSynthesizer

戻り値:必要なプロパティに一致するシンセサイザー、または使用可能なプロパティがない場合はnull

どうやら、利用可能なものはありません。おそらく、試してみるとLocale.US有効なものが生成される可能性がありますSynthesizerModeDesc

コメントに応じて編集します。真剣に、私はこれを使用したことがありません...しかし、ここで進むにつれて、実際にjavadocsを読んでいます。使用しているコンストラクター(new SynthesizerModeDesc(Locale.ENGLISH))は、次のように述べています。

「ロケールのEngineModeDescを作成します。エンジン名、モード名、および実行がnullに設定されています」。

それは「そして私はそれを使いたい」という観点からは良く聞こえません。これらのオプションを設定できる別のコンストラクターと、それらを設定するメソッドもあります。

于 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 に答える