1 package org.wcb.plugins.speech; 2 3 import javax.speech.synthesis.SynthesizerModeDesc; 4 import javax.speech.synthesis.Synthesizer; 5 import javax.speech.Engine; 6 import javax.speech.Central; 7 8 /*** 9 * This library is free software; you can redistribute it and/or 10 * modify it under the terms of the GNU Lesser General Public 11 * License as published by the Free Software Foundation; either 12 * version 2 of the License, or (at your option) any later version. 13 * 14 * This library is distributed in the hope that it will be useful, 15 * but WITHOUT ANY WARRANTY; without even the implied warranty of 16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 17 * Lesser General Public License for more details. 18 * 19 * You should have received a copy of the GNU Lesser General Public 20 * License along with this library; if not, write to the Free Software 21 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 22 * 23 * Project: Home Automation Interface 24 * Filename: $Id: AliceSynthesizerModeDesc.java,v 1.5 2004/02/27 01:29:53 wbogaardt Exp $ 25 * Abstract: Web bean for x10 jsp. 26 * 27 * $Log: AliceSynthesizerModeDesc.java,v $ 28 * Revision 1.5 2004/02/27 01:29:53 wbogaardt 29 * modified classes so they conform to Checkstyle format in readability 30 * 31 * Revision 1.4 2003/12/18 17:35:53 wbogaardt 32 * fixed speech engine issue so that the application does not lock up but will notify user of the need to 33 * install speech.properties file in their home directory. 34 * 35 * Revision 1.3 2003/12/13 05:36:52 wbogaardt 36 * fixed javadoc comments. 37 * 38 * Revision 1.2 2003/12/11 23:10:12 wbogaardt 39 * cleaned up exception handeling and logging of system.out messages 40 * 41 * Revision 1.1 2003/12/11 21:58:42 wbogaardt 42 * added speach synthesizer using java speech api 43 * 44 * 45 * A SynthesizerModeDesc that implements the <code>toString()</code> 46 * method so that it returns the name of the synthesizer. 47 */ 48 public class AliceSynthesizerModeDesc extends SynthesizerModeDesc { 49 50 private Synthesizer synthesizer = null; 51 private boolean synthesizerLoaded = false; 52 53 54 /*** 55 * Constructs a MySynthesizerModeDesc with the attributes from 56 * the given SynthesizerModeDesc. 57 * 58 * @param modeDesc the SynthesizerModeDesc to get attributes from 59 */ 60 public AliceSynthesizerModeDesc(SynthesizerModeDesc modeDesc) 61 { 62 super(modeDesc.getEngineName(), modeDesc.getModeName(), 63 modeDesc.getLocale(), modeDesc.getRunning(), 64 modeDesc.getVoices()); 65 } 66 67 68 /*** 69 * Returns true if the synthesizer is already loaded. 70 * 71 * @return true if the synthesizer is already loaded 72 */ 73 public synchronized boolean isSynthesizerLoaded() 74 { 75 if (synthesizer == null) 76 { 77 return false; 78 } 79 return ((synthesizer.getEngineState() & Engine.ALLOCATED) != 0); 80 } 81 82 83 /*** 84 * Returns a Synthesizer that fits the description of this 85 * MySynthesizerModeDesc. If the synthesize was never loaded, 86 * it is loaded in a separate thread. 87 * 88 * @return a Synthesizer 89 */ 90 public synchronized Synthesizer getSynthesizer() 91 { 92 debugPrint("Found Speech engine: " + getEngineName()); 93 return synthesizer; 94 } 95 96 97 /*** 98 * Creates the Synthesizer and its Monitor. 99 * 100 * @return the created Synthesizer 101 */ 102 public Synthesizer createSynthesizer() 103 { 104 try 105 { 106 debugPrint("Creating " + getEngineName() + "..."); 107 synthesizer = Central.createSynthesizer(this); 108 109 if (synthesizer == null) 110 { 111 debugPrint("Central created null synthesizer"); 112 debugPrint("Check that speech.properties is installed at " + System.getProperty("user.home")); 113 } 114 else 115 { 116 synthesizer.allocate(); 117 synthesizer.resume(); 118 debugPrint("...created monitor"); 119 } 120 } 121 catch (Exception e) 122 { 123 e.printStackTrace(); 124 } 125 finally 126 { 127 return synthesizer; 128 } 129 } 130 131 132 133 /*** 134 * Allocates the synthesizer if it has never been allocated. This 135 * method should be called after method <code>createSynthesizer()</code>. 136 * It spawns a new thread to allocate the synthesizer. 137 * @return the Synthesizer to allow speaking. 138 */ 139 public Synthesizer loadSynthesizer() 140 { 141 try 142 { 143 if (!synthesizerLoaded) 144 { 145 debugPrint("Loading " + getEngineName() + "..."); 146 synthesizerLoaded = true; 147 SynthesizerLoader loader = new SynthesizerLoader(synthesizer); 148 loader.start(); 149 } 150 } 151 catch (Exception e) 152 { 153 e.printStackTrace(); 154 } 155 finally 156 { 157 return synthesizer; 158 } 159 } 160 161 /*** 162 * Returns the name of the Synthesizer. 163 * 164 * @return the name of the Synthesizer 165 */ 166 public String toString() 167 { 168 return getEngineName(); 169 } 170 171 172 /*** 173 * Prints debug statements. 174 * 175 * @param statement debug statements 176 */ 177 private void debugPrint(String statement) 178 { 179 System.out.println(statement); 180 } 181 } 182