Reputation: 3238
I'm working on a PC asistant, which means it should recognize my voice and give feedback or do things, the feedback should be a computer generated voice. I know there's a way inside Java itself to achieve this, using javax.speech for example. This voice isn't really of good quality, but it's doesn't require all kinds of libraries and it should be easy to use. I currently have this prototype code:
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();
}
}
From: converting text to speech java code
When I execute the code it causes an error, that's because the file speech.properties is not found, it should be in my users directory. The problem is that I don't know where to get this file from, or what should be in this file, could anyone help me?
Also, it would be great if anyone could send me a link to a good speech tutorial, I searched the web but it's hard to find!
Upvotes: 1
Views: 4471
Reputation: 14583
I could fix your example with just a few changes.
First, I Added these lines in the beggining of your try-catch block:
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");
These lines bypass the need for that pesky speech.properties file.
Second, the voice name is "kevin16
", not "kelvin16
".
Third, I moved the synth.resume()
to after the synth.getSynthesizerProperties().setVoice(voice)
line. This is because it can't start talking anything without a predefined voice.
Forth, your if(text.trim() == "")
is bad because comparing Strings using ==
is not a good idea.
Here is the resulting code:
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();
}
}
Upvotes: 4