2012-12-30 107 views
1

我正在研究PC asistant,这意味着它应该识别我的声音并提供反馈或做事情,反馈应该是计算机生成的语音。 我知道在Java本身内部有一种方法可以实现这一点,例如使用javax.speech。这种声音的质量并不高,但它不需要各种库,应该很容易使用。目前,我有这个原型代码:Java TTS(文本到语音)speech.properties文件

public static void speech(String text) { 
     if(text.trim() == "") 
      return; 

     String voiceName = "kevin16"; 

     try { 
      SynthesizerModeDesc desc = new SynthesizerModeDesc(null, "general", Locale.US, null, null); 
      Synthesizer synth = Central.createSynthesizer(desc); 
      synth.allocate(); 
      synth.resume(); 
      desc = (SynthesizerModeDesc) synth.getEngineModeDesc(); 
      Voice[] voices = desc.getVoices(); 
      Voice voice = null; 
      for(Voice entry : voices) { 
       if(entry.getName().equals(voiceName)) { 
        voice = entry; 
        break; 
       } 
      } 
      synth.getSynthesizerProperties().setVoice(voice); 
      synth.speakPlainText(text, null); 
      synth.waitEngineState(Synthesizer.QUEUE_EMPTY); 
      synth.deallocate(); 

     } catch(Exception ex) { 
      String message = " missing speech.properties in " + System.getProperty("user.home") + "\n"; 
      System.out.println("" + ex); 
      System.out.println(message); 
      ex.printStackTrace(); 
     } 
    } 

来源:converting text to speech java code

当我执行的代码将会导致错误,那是因为没有找到该文件speech.properties,它应该是在我的用户目录。问题是我不知道从哪里得到这个文件,或者该文件应该包含哪些内容,任何人都可以帮助我?

此外,如果有人能够给我发送一个好的语音教程的链接,我会搜索网页,但很难找到!

回答

4

我可以通过一些更改来修复您的示例。

首先,我在你的try-catch块的beggining添加这些行:

 System.setProperty("FreeTTSSynthEngineCentral", "com.sun.speech.freetts.jsapi.FreeTTSEngineCentral"); 
     System.setProperty("freetts.voices", "com.sun.speech.freetts.en.us.cmu_us_kal.KevinVoiceDirectory"); 
     Central.registerEngineCentral("com.sun.speech.freetts.jsapi.FreeTTSEngineCentral"); 

这些线路绕过那个讨厌的speech.properties文件的需要。

其次,语音的名称是“kevin16”,而不是“kelvin16”。

三,我将synth.resume()移至synth.getSynthesizerProperties().setVoice(voice)后面。这是因为如果没有预定义的声音,它就无法开始说话。

第四,你的if(text.trim() == "")是坏的,因为使用==比较字符串不是一个好主意。

下面是结果代码:

public static void speech(String text) { 
    if (text == null || text.trim().isEmpty()) return; 

    String voiceName = "kevin16"; 

    try { 
     System.setProperty("FreeTTSSynthEngineCentral", "com.sun.speech.freetts.jsapi.FreeTTSEngineCentral"); 
     System.setProperty("freetts.voices", "com.sun.speech.freetts.en.us.cmu_us_kal.KevinVoiceDirectory"); 
     Central.registerEngineCentral("com.sun.speech.freetts.jsapi.FreeTTSEngineCentral"); 

     SynthesizerModeDesc desc = new SynthesizerModeDesc(null, "general", Locale.US, null, null); 

     Synthesizer synth = Central.createSynthesizer(desc); 
     synth.allocate(); 
     desc = (SynthesizerModeDesc) synth.getEngineModeDesc(); 
     Voice[] voices = desc.getVoices(); 
     Voice voice = null; 
     for (Voice entry : voices) { 
      if(entry.getName().equals(voiceName)) { 
       voice = entry; 
       break; 
      } 
     } 
     synth.getSynthesizerProperties().setVoice(voice); 
     synth.resume(); 
     synth.speakPlainText(text, null); 
     synth.waitEngineState(Synthesizer.QUEUE_EMPTY); 
     synth.deallocate(); 

    } catch(Exception ex) { 
     String message = " missing speech.properties in " + System.getProperty("user.home") + "\n"; 
     System.out.println("" + ex); 
     System.out.println(message); 
     ex.printStackTrace(); 
    } 
} 
相关问题