import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.net.*; import java.io.*; import java.util.*; import com.sun.speech.freetts.jsapi.*; import javax.speech.*; import javax.speech.synthesis.*; public class Client extends JFrame implements Runnable { private Thread thread = new Thread(this); private boolean running = true; private Socket s = null; private PrintWriter out = null; private BufferedReader in = null; private static String host = "atlas.dsv.su.se"; private static int port = 9494; //4456; private JTextField textField = new JTextField(); private JTextArea textArea = new JTextArea(); private Synthesizer synthesizer = null; public static void main(String args[]) { if(args.length != 0) { host = args[0]; if(args.length != 1) { port = Integer.parseInt(args[1]); } } new Client(); } public Client() { textField.addActionListener(new L2()); getContentPane().add("North", textField); getContentPane().add("Center", new JScrollPane(textArea)); setLocation(420, 0); setSize(400, 200); addWindowListener(new L1()); setVisible(true); try { s = new Socket(host, port); setTitle("CONNECTED TO: " + host + " - ON PORT: " + port); in = new BufferedReader(new InputStreamReader(s.getInputStream())); out = new PrintWriter(s.getOutputStream(), true); } catch (IOException ioe) { System.out.println("COULD NOT CONNECT: "+ ioe); killMe(); } initSpeech(); thread.start(); } public void initSpeech() { try { //Voice kevinHQ = new Voice("kevin16", 1, 2, null); //Voice[] voices = {kevinHQ}; SynthesizerModeDesc desc = new SynthesizerModeDesc(null, "general", Locale.US, Boolean.FALSE, null); FreeTTSEngineCentral central = new FreeTTSEngineCentral(); EngineList list = central.createEngineList(desc); if(list.size() > 0) { EngineCreate creator = (EngineCreate) list.get(0); synthesizer = (Synthesizer) creator.createEngine(); } if (synthesizer == null) { System.err.println("Cannot create synthesizer"); System.exit(1); } synthesizer.allocate(); synthesizer.resume(); } catch (Exception e) { e.printStackTrace(); } } public void run() { String inputLine = ""; while(running) { try { inputLine = in.readLine(); textArea.append(inputLine + "\n"); textArea.setCaretPosition(textArea.getText().length()); synthesizer.speakPlainText(inputLine, null); // Wait till speaking is done synthesizer.waitEngineState(Synthesizer.QUEUE_EMPTY); } catch(Exception e) { System.out.println("Exception generated: " + e); } } } private void sendMessage(String message) { out.println(message); if(message.equals("exit")) killMe(); } private String getHost(Socket s) { try { return(s.getInetAddress().getLocalHost().getHostName()); } catch(UnknownHostException e) { return("unknown"); } } public void killMe() { running = false; dispose(); try { synthesizer.deallocate(); out.close(); in.close(); s.close(); } catch(Exception e) { System.out.println("Exception generated: " + e); } System.exit(1); } class L1 extends WindowAdapter { public void windowClosing(WindowEvent we) { killMe(); } public void windowClosed(WindowEvent we) { System.exit(1); } } class L2 implements ActionListener { public void actionPerformed(ActionEvent ae) { sendMessage(textField.getText()); textField.setText(""); } } }