我遇到了用于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;
}
Run Code Online (Sandbox Code Playgroud)
你需要知道的:
MouseListenerfor a 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;
}
}
Run Code Online (Sandbox Code Playgroud)
但是,这仍然不起作用.第一,它工作正常.然而,对于所有随后的时间,它说Speak now,并Try again在同一时间.
解:
从上面的代码,我只是添加
microphone.clear();
Run Code Online (Sandbox Code Playgroud)
在开始录制的行之上.
您需要了解麦克风的工作原理。它只是运行一个线程并将所有录制的音频存储到缓冲区中。因此,当您播放回复时,它也会存储到缓冲区中进行处理。
microphone.stopRecording()当您播放 TTS 回复时,您需要拨打电话来停止麦克风录音。
另外,您需要在调用microphone.clear()前调用startRecording以清除之前记录的数据。此类数据仍然驻留在输入缓冲区中。
要从配置中获取麦克风组件,您可以使用以下命令:
ConfigurationManager cm;
....
microphone = (Microphone) cm.lookup("microphone");
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
797 次 |
| 最近记录: |