Java Sphinx“回答自己”

时间:2014-02-03 02:55:37

标签: java sphinx4

我遇到了用于Java的Sphinx语音识别库的问题。我用它来获取输入并处理它。我第一次得到输入,它的工作原理。第二次,它在我有机会谈话之前立即回答。在那之后,它继续回答自己。我尝试在每次输入之前分配并在每次输入后解除分配,但这似乎不起作用。我该怎么办?


代码

这是处理输入的方法:

public void getInput() {
        if (using) return;

        using = true;

        if (!allocated) {
            JTalk.speak("Please hold.");

            recognizer.allocate();
            allocated = true;
        }

        JTalk.speak("Speak now.");

        Result result = recognizer.recognize();

        if (result != null) {
            String resultText = result.getBestFinalResultNoFiller();

            JDispatcher.getInstance().matchInput(resultText);
        }

        else {
            JTalk.speak("Try again.");
        }

        using = false;
    }

您需要了解的内容:

  • 这是从MouseListener TrayIcon调用的。
  • speak(String)say <text>运行Runtime
  • matchInput(String)遍历数组中所有已注册的侦听器并测试匹配。

更新2

根据Nikolay Shmyrev的回答,我尝试在构造函数中分配麦克风,然后在getInput()中的适当时间启动,然后停止麦克风。

这是SphinxBridge类:

public class SphinxBridge {

    private ConfigurationManager cm;
    private Recognizer recognizer;
    private Microphone microphone;
    private boolean using = false;

    public SphinxBridge() {
        this.cm = new ConfigurationManager(SphinxBridge.class.getResource("input.config.xml"));
        this.recognizer = (Recognizer) cm.lookup("recognizer");
        this.microphone = (Microphone) cm.lookup("microphone");

        recognizer.allocate();
    }

    public void getInput() {
        if (using) return;

        using = true;

        if (!microphone.startRecording()) {
            JTalk.speak("Cannot start microphone.");
            return;
        }

        JTalk.speak("Speak now.");

        Result result = recognizer.recognize();

        if (result != null) {
            String resultText = result.getBestFinalResultNoFiller();

            JDispatcher.getInstance().matchInput(resultText);
        }

        else {
            JTalk.speak("Try again.");
        }

        microphone.stopRecording();

        using = false;
    }
}

然而,这仍然不起作用。第一,它工作正常。但是,对于以后的所有时间,它会同时显示Speak nowTry again


解决方案:

从上面的代码中,我只是添加了

    microphone.clear();

在开始录制的行上方。

1 个答案:

答案 0 :(得分:4)

您需要了解麦克风的工作原理。它只运行一个线程并存储记录在缓冲区中的所有音频。因此,当您播放回复时,它也会存储在缓冲区中进行处理。

在播放TTS回复时,您需要致电microphone.stopRecording()以停止麦克风录音。

此外,您需要在调用microphone.clear()之前致电startRecording以清除之前录制的数据。此类数据仍驻留在输入缓冲区中。

要从配置中获取麦克风组件,您可以使用以下内容:

 ConfigurationManager cm;
 ....
 microphone = (Microphone) cm.lookup("microphone");