2014-02-03 2 views
6

У меня возникла проблема с библиотекой распознавания голоса 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(); 

выше линии, которая начинает запись.

+2

обмена код может помочь. – BevynQ

+0

Добавлено. Я не изначально делился кодом, потому что я подумал, что это была ошибка Sphinx, которая была известна или у кого-то было быстрое решение. Теперь я понимаю, что должен был добавить его в первую очередь. Сожалею. – nrubin29

+0

@ nrubin29 вы можете поделиться своим проектом, пожалуйста, – Abderrahim

ответ

4

Вам нужно понять, как работает микрофон. Он просто запускает поток и сохраняет все аудио, записанные в буфер. Поэтому, когда вы воспроизводите ответ, он также сохраняется в буфере для обработки.

Чтобы остановить запись микрофона, вы должны позвонить microphone.stopRecording(), пока вы играете ответ TTS.

Также необходимо позвонить microphone.clear() перед тем, как позвонить startRecording, чтобы стереть данные, которые были ранее записаны. Такие данные все еще находятся во входном буфере.

Чтобы получить компонент микрофона от конфигурации вы можете использовать что-то вроде:

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

Спасибо за помощь. Посмотрите мое второе обновление. – nrubin29

+1

Хорошо, это правильное направление. Возможно, вам также необходимо вызвать microphone.clear(), чтобы очистить данные, которые он записал. Вы можете сделать это до microphone.startRecording(). –

+0

Большое вам спасибо! Вызов 'clear()' перед тем, как я запускаюRecording() 'решил проблему! – nrubin29

Смежные вопросы