java - 线程 "AWT-EventQueue-0"javax.speech.EngineStateError : Invalid EngineState 中的异常

标签 java speech-recognition

您好,我在我的应用程序中使用 VOCE 库(使用 freeTTS 和 Sphinx4),因为我需要语音合成和语音识别。

这是我的语音识别代码

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

我从另一个名为 StartApplication 的 Java 应用程序调用它,在此我不断检查 count 的值是否已更改为 0 或 1,如果不是,则调用 main 方法。

但是当我说登录时它被识别并且计数的值被更改为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);}
}

为了避免这种情况,我删除了这个 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.'

如何解决这个问题?

最佳答案

使用 CMU Sphinx(在 VOCE 中可用),不能同时使用语音界面进行阅读和写作。一旦接口(interface)被打开用于读取,它应该被销毁以便能够再次打开它用于写入,反之亦然。因此错误,

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

Cannot start microphone

关于java - 线程 "AWT-EventQueue-0"javax.speech.EngineStateError : Invalid EngineState 中的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36237509/

相关文章:

android - Android-如何在语音识别事件中关闭声音?

python - 如何解决 #issue 400 指定 FLAC 编码来匹配文件头?

python - 语音识别,断言错误 "Source must be an audio source"

java - BeanMap 到 HashMap 的转换?

java - Jackson:如何在序列化过程中对 JsonNode 进行后处理?

java - 如何挑出表格中的一个单元格?

c# - 没有语法 C# 的语音识别 API

java - 转换为原始类型的奇怪 Java 行为

java - 强制关闭!!用于分配 RGB 值 0-255 中的随机颜色的按钮

speech-recognition - INVALID_ARGUMENT : Request payload size exceeds the limit: 10485760 bytes