import java.util.*;
import javax.speech.*;
import javax.speech.synthesis.*;





// Adapted from "Simply Java Programming"
// by Deitel and Deitel, page 820
// Updated: Sunday 11th November 2007, 14:04 PT

// Note - this file has been documented for javadoc
// see www.annedawson.com/javadoc.htm for details






/**
This ia a class which provides the conversion of a 
string of text to speech (TTS) using the FreeTTS Speech API.
*/
public class Speaker implements Speaks
{
   // Synthesizer to speak text
   private Synthesizer speechSynthesizer;

   
   // no-argument constructor
   public Speaker()
   {
      // initialize Synthesizer 
      try
      {
         // create SynthesizerModeDesc for FreeTTS synthesizer.
         SynthesizerModeDesc descriptor = new SynthesizerModeDesc(
            "Unlimited domain FreeTTS Speech Synthesizer " + 
            "from Sun Labs", null, Locale.US, Boolean.FALSE, null ); 

         // create a Synthesizer 
         speechSynthesizer = Central.createSynthesizer( descriptor );
 
         // Synthesizer created successfully
         if ( speechSynthesizer != null )
         {
            // prepare synthesizer to speak
            speechSynthesizer.allocate();
            speechSynthesizer.resume();
	    
            // get synthesizer properties
            SynthesizerProperties properties =
               speechSynthesizer.getSynthesizerProperties();

            // set up speaking rate
            properties.setSpeakingRate( 100.0f );
	    
         } // end if
	     else
         {
            System.err.println( "Synthesizer creation failed." );
	        System.exit( 1 );
         }

      } // end try

      catch ( Exception myException ) 
      {
         myException.printStackTrace();
      }

      
    } // end constructor

	/**
	 Converts a string of text to speech.
	 @param textToSpeak the text to be spoken
	*/
	public void speak(String textToSpeak)
	{
		speechSynthesizer.speakPlainText( textToSpeak, null );	
	}
	
    /**
	 Deallocates speechSynthesizer object.
	*/
	public void Deallocate()
    {
       try
       {
  			
  			//http://pixel.recoil.org/java/jspeechlib/ResourceManagement.html
  			// Wait till speaking is done
            speechSynthesizer.waitEngineState(Synthesizer.QUEUE_EMPTY);

   			speechSynthesizer.deallocate();
   			return;
  		}
  		catch (Exception e)
  		{
      		e.printStackTrace();
  		}
 	}


 	
 	/**
	 main method to test the class
	*/
 	public static void main(String args[])
	{
		Speaker s = new Speaker();
		String sentence;
		char ans = 'y';
		while (ans != 'n')
		{
			//sentence = "Please enter some text";
			//s.speak(sentence);
			System.out.println("\n\nPlease enter some text...\n\n");
			sentence = SpeakerHelper.readLine();
	    	s.speak(sentence);
	    	//sentence = "Do you want to enter more text?";
	    	System.out.println("\n\nDo you want to enter more text? (y/n)");
	    	//s.speak(sentence);
	    	ans = SpeakerHelper.readLineNonwhiteChar();
	    }
	    //sentence = "Thank you for using this program";	
        System.out.println("\n\nThank you for using this program...\n\n");  
        //s.speak(sentence);             
        s.Deallocate();       
	}
	
} // end class Speaker

