6

Java 用の Sphinx 音声認識ライブラリに問題があります。入力を取得して処理するために使用しています。初めて入力を取得すると、機能します。2 回目は、私が話す機会を得る前に、すぐに応答します。その後、それはただ自分自身に答え続けます。すべての入力の前に割り当てを試み、すべての入力の後に割り当てを解除しようとしましたが、うまくいかないようです。私に何ができる?


コード:

これは、入力の取得を処理するメソッドです。

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

知っておくべきこと:

  • これは a から aMouseListenerに対して呼び出されてい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();

録音を開始するラインの上。

4

1 に答える 1