Exception in thread "AWT-EventQueue-0" javax.speech.EngineStateError: Invalid EngineState

Viewed 246

Hi I'm using VOCE library (uses freeTTS and Sphinx4) in my application as I need both speech synthesis and speech recognition.

Here is my speech recognition code

public class recognitionTest{
public static void main(String argv){

        voce.SpeechInterface.init("C:/Users/NetBeansProjects/src", false, true, 
        "file:/C:/Users/src/grammar", "words");

        System.out.println("This is a speech recognition test. " );

        try{
        String s="";
        s = voce.SpeechInterface.popRecognizedString();
        System.out.println("You said: " + s);

        if(s.equalsIgnoreCase("log in")){
                       StartApplication.count=1;
          }
          else if(s.equalsIgnoreCase("sign up")){
                        StartApplication.count=2;
            }
             else{
                        //do nothing
              }

       voce.SpeechInterface.destroy();
      }
       catch (Exception e)
        {
           System.out.println(e);
        }
    }
   }

I call this from another java application called StartApplication and in this I continuously check whether the value of count has changed to 0 or 1 and if not main method is called agian.

However when I say login it is recognized and the value of count is changed to 1 but the following exception is generated

Exception in thread "AWT-EventQueue-0" javax.speech.EngineStateError: Invalid EngineState: expected=( DEALLOCATED  DEALLOCATING_RESOURCES ) current state=( DEALLOCATED  QUEUE_EMPTY )
at com.sun.speech.engine.BaseEngine.checkEngineState(BaseEngine.java:705)
at com.sun.speech.freetts.jsapi.FreeTTSSynthesizer.cancelAll(FreeTTSSynthesizer.java:238)
at voce.SpeechSynthesizer.destroy(SpeechSynthesizer.java:110)
at voce.SpeechInterface.destroy(SpeechInterface.java:97)
at mailforblind.recognitionTest.main(recognitionTest.java:27)
at mailforblind.StartApplication.mouseClicked(StartApplication.java:174)
at java.awt.Component.processMouseEvent(Component.java:6538)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3324)
at java.awt.Component.processEvent(Component.java:6300)
at java.awt.Container.processEvent(Container.java:2236)
at java.awt.Component.dispatchEventImpl(Component.java:4891)
at java.awt.Container.dispatchEventImpl(Container.java:2294)
at java.awt.Component.dispatchEvent(Component.java:4713)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4888)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4534)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4466)
at java.awt.Container.dispatchEventImpl(Container.java:2280)
at java.awt.Window.dispatchEventImpl(Window.java:2750)
at java.awt.Component.dispatchEvent(Component.java:4713)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758)
at java.awt.EventQueue.access$500(EventQueue.java:97)
at java.awt.EventQueue$3.run(EventQueue.java:709)
at java.awt.EventQueue$3.run(EventQueue.java:703)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86)
at java.awt.EventQueue$4.run(EventQueue.java:731)
at java.awt.EventQueue$4.run(EventQueue.java:729)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:728)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

Following is the StartApplication code snippet,

 public void mouseClicked(MouseEvent e) {
  try{
  while(count==0)
  recognitionTest.main("");

  if(count==1){
      LoginPage.main();
  }
  if(count==2){
      SignUpPage.main();
  }
  }catch(Exception ee){System.out.println(ee);}
}

Inorder to avoid this I removed this voce.SpeechInterface.destroy(); Now when I call this from some other application it throws the following exception

'SEVERE microphone Can't open microphone line with format PCM_SIGNED 16000.0Hz, 16 bit, mono, 2 bytes/frame, big-endian not supported.
 in edu.cmu.sphinx.frontend.util.Microphone:open-microphone
 Cannot start microphone.'

How to fix this?

1 Answers

With CMU Sphinx (available in VOCE) one can't use speech interface at the same time for both reading and writing. Once the interface is opened for reading it should be destroyed to be able to open it again for writing or vice versa. Hence the error,

Invalid EngineState: expected=( DEALLOCATED  DEALLOCATING_RESOURCES ) current state=( DEALLOCATED  QUEUE_EMPTY )

and

Cannot start microphone
Related