!752 // speech libraries! lib 1000722 lib 1000723 lib 1000724 lib 1000730 lib 1000731 lib 1000732 lib 1000726 lib 1000727 import javax.speech.*; import javax.speech.synthesis.*; p { mbrola_debug = true; mbrola("hello"); } sbool mbrola_debug; static Synthesizer mbrola_synth; public static void mbrola(String text) ctex { if (mbrola_synth != null && empty(trim(text))) return; if (mbrola_synth == null) { String voiceName = "mbrola_us1"; 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); if (mbrola_debug) print("Creating synth"); Synthesizer synth = mbrola_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; } } if (mbrola_debug) print("Voice: " + voice); synth.getSynthesizerProperties().setVoice(voice); synth.resume(); } if (mbrola_debug) print("Speaking..."); mbrola_synth.speakPlainText(text, null); if (mbrola_debug) print("Waiting"); long state; int n = 0; while (((state = mbrola_synth.getEngineState()) & Synthesizer.QUEUE_EMPTY) != 0) { sleep(50); if (++n >= 10000/50) { print("Engine state: " + state + ", aborting"); break; } } //mbrola_synth.waitEngineState(Synthesizer.QUEUE_EMPTY); if (mbrola_debug) print("Done"); // keep synth for next time //mbrola_synth.deallocate(); }