我正在使用PC onistant,这意味着它应该识别我的声音并提供反馈或做事,反馈应该是计算机生成的声音。 我知道Java内部有一种方法可以实现这一点,例如使用javax.speech。这种声音质量不是很好,但它并不需要各种各样的库,它应该易于使用。我目前有这个原型代码:
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,它应该在我的users目录中。问题是我不知道从哪里获取此文件,或者该文件中应该包含什么内容,任何人都可以帮助我吗?
另外,如果有人能给我发一个好的语音教程的链接会很棒,我在网上搜索但很难找到它!
答案 0 :(得分:4)
我可以通过一些更改修复您的示例。
首先,我在try-catch块的开头添加了这些行:
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();
}
}