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 から a
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 now
、Try again
同時に言う。
解決:
上記のコードから、単純に追加しました
microphone.clear();
録音を開始するラインの上。