У меня возникла проблема с библиотекой распознавания голоса Sphinx для Java. Я использую его для ввода и обработки. В первый раз, когда я получаю ввод, он работает. Во второй раз он сразу отвечает на вопрос, прежде чем у меня появится возможность поговорить. После этого он просто продолжает отвечать сам. Я пробовал выделять перед каждым входом и освобождать после каждого входа, но это, похоже, не работает. Что я могу сделать?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)
выполняет итерацию по всем зарегистрированным слушателям в массиве и тесты на совпадения.
Update 2:
Согласно ответу Николая Шмырёв, я попытался выделить микрофон в конструкторе и запуска, затем остановка, микрофон в нужное время в 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();
выше линии, которая начинает запись.
обмена код может помочь. – BevynQ
Добавлено. Я не изначально делился кодом, потому что я подумал, что это была ошибка Sphinx, которая была известна или у кого-то было быстрое решение. Теперь я понимаю, что должен был добавить его в первую очередь. Сожалею. – nrubin29
@ nrubin29 вы можете поделиться своим проектом, пожалуйста, – Abderrahim