【问题标题】:Java Sphinx "Answers Itself"Java Sphinx“自己回答”
【发布时间】:2014-02-03 02:55:36
【问题描述】:

我在使用 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)Runtime 运行 say <text>
  • 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();

在开始录制的那一行之上。

【问题讨论】:

  • 分享代码可能会有所帮助。
  • 已添加。我最初没有共享代码,因为我认为这可能是已知的 Sphinx 错误,或者有人有一个快速的解决方案。我现在意识到我应该首先添加它。对不起。
  • @nrubin29 你能分享你的项目吗
  • @Abderrahim 我不认为我有这个代码了。如果您遇到类似的问题,我可以尽力帮助您。

标签: java sphinx4


【解决方案1】:

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

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

另外你需要在startRecording调用之前调用microphone.clear()来清除之前记录的数据。此类数据仍驻留在输入缓冲区中。

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

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

【讨论】:

  • 好的,这是一个正确的方向。您可能还需要调用mic.clear() 来清除它记录的数据。你可以在mic.startRecording()之前做。
  • 非常感谢!在我startRecording() 解决问题之前调用clear()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-14
  • 2023-03-06
  • 2018-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多