2016-03-26 15 views
4

こんにちは私は、音声合成と音声認識の両方が必要なので、アプリケーションでVOCEライブラリ(freeTTSとSphinx4を使用しています)を使用しています。ここでスレッド「AWT-EventQueue-0」の例外javax.speech.EngineStateError:無効なEngineState

は私の音声認識コードは、私は継続的にカウンタの値が0または1に変更されており、そうでない場合はmainメソッドが呼び出されたかどうかを確認してstartApplicationと呼ばれる別のJavaアプリケーションから、これでこれを呼び出す

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); 
     } 
    } 
    } 

ですagian。

にしかし、私は、それが認識され、カウントの値が1に変更されますが、次の例外が

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) 

続いてstartApplicationコードスニペットが生成され、ログイン言う

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これを避ける私はこのvoceを削除しました.SpeechInterface.destroy();私は、これはいくつかの他のアプリケーションから呼び出すとき は、今では次の例外をスローし

'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.' 

これをどのように修正するには?

+0

あなたの主な方法は、すぐに 'SpeechInterface.destroy'を呼んでいます。ここでは何かが間違っているように見えますが、イベントハンドラからmainを呼び出すべきではありませんが、残りのコードは表示されません。 –

+0

さらにコードを追加しました@Jim Garrison – Subhiksh

+0

また私のプログラムでは、これをメソッドとして作成し、マウスをクリックしたときに呼び出されました。同じ例外が生成されます。 @Jim Garrison – Subhiksh

答えて

2

CMU Sphinx(VOCEで使用可能)では、読み書きの両方に同時に音声インターフェイスを使用できません。インターフェイスを読み込み用に開いたら、書き込み用に再度開くことができるようにインターフェイスを破棄しなければなりません。したがって、エラー、

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

Cannot start microphone 
関連する問題