0

在運行使用JSAPI基本的HelloWorld程序,它顯示錯誤 「顯示java.lang.NullPointerException在HelloWorld.main(HelloWorld.java:11)​​」運行時錯誤 - JSAPI HelloWorld程序

以下是代碼:

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(); 
    } 
} 
} 

和它給輸出:

[email protected] 
null 
java.lang.NullPointerException 
    at HelloWorld.main(HelloWorld.java:15) 

似乎SynthesizerModeDesc工作正常,但它沒有檢測到任何引擎,因爲我試圖將null也傳遞給函數Central.createSynthesizer(即獲取默認引擎),但它仍然返回null。我檢查了它正在檢測的引擎數量,但它顯示0.

請幫助我! :(

+0

這是完整的stacktrace嗎? – 2012-02-04 21:13:50

+0

是的,這是完整的堆棧跟蹤。 – 2012-02-05 05:33:44

回答

2

javadocsCentral.createSynthesizer

返回: 一個合成器匹配所需的性能或零如果沒有可用的

顯然,有沒有提供這或許是Locale.US可能會產生。一個有效的SynthesizerModeDesc

編輯迴應評論:說真的,我從來沒有使用過這個東西......但是當我們沿着這裏走時,我實際上正在閱讀javadoc。您正在使用的構造函數(new SynthesizerModeDesc(Locale.ENGLISH))說,

「構建一個語言環境的EngineModeDesc。引擎名稱,模式名稱和運行設置爲空」。

這聽起來不太好從「然後我想用它」的角度來看。還有另一個構造函數可以讓你設置這些選項,以及設置它們的方法。

+0

Java文檔通常是一個很好的朋友:) – 2012-02-04 21:19:53

+0

我總是愛我一些Javadocs :-D – 2012-02-04 21:21:03

+0

對不起,它寫入「Locale.US」或「Locale.getDefault()」後顯示相同的錯誤「 – 2012-02-04 21:23:34

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「?

+0

如果您解釋解決方案並鏈接到源代碼,您的答案會更好。 – Navarr 2012-02-05 18:57:36

+0

沒錯!我在我的iPhone上,所以輸入很長的解釋很糟糕。 – 2012-02-05 19:46:01

+0

同樣的錯誤。起初,我沒有使用freetts或獅身人面像,但不是我在獅身人面像上試過,但仍然顯示出同樣的錯誤。 – 2012-02-15 07:07:46

0

您必須確保在構建路徑中包含'jsapi.jar','freetts.jar'和'jreetts-jsapi10.jar'。如果你沒有freetts目錄中的文件,你必須進入lib子目錄並啓動jsapi.exe。並確保將'speech.properties'複製到C:Users /「yourUserNameHere」目錄中。希望有幫助