2016-03-03 4 views
0

hypothesis.getHypstr() всегда одно значение, даже после того, как я меняю ключевое слово!onPartialResult всегда одно значение, даже после того, как я изменил ключевое слово?

Я использую pocketsphinx для распознавания речи, и я позволяю пользователю изменять то, что нужно слушать. Это значение сохраняется в моих общих настройках. Моя проблема заключается в том, что hypothesis.getHypstr() вызывается только при разговоре предыдущего ключевого слова.

Например:

Если установлено значение по умолчанию для ключевых слов (апельсинов и радугу), то распознавание работает отлично. Но, если пользователь меняет его на «привет компьютер», тогда метод onPartialResult по-прежнему вызывается только тогда, когда пользователь говорит привет, и hypothesis.getHypstr() все еще апельсины и радуги.

OnCreate:

try { 
      Assets assets = new Assets(MyService.this); 
      File assetDir = assets.syncAssets(); 
      setupRecognizer(assetDir); 

      Log.v(TAG, "SET UP DIRECTORIES STARTING LISTENING!"); 
      mSpeechRecognizer.startListening("usersKeyword"); 

     } catch (IOException e) { 
      e.printStackTrace(); 
      Log.v(TAG, e.toString()); 
     } 

setupRecognizer()

public void setupRecognizer(File sphinxDir) { 

    try { 
     mSpeechRecognizer = defaultSetup() 
       .setAcousticModel(new File(sphinxDir, "en-us-ptm")) 
       .setDictionary(new File(sphinxDir, "cmudict-en-us.dict")) 
       .setBoolean("-allphone_ci", true) 
       .setKeywordThreshold(1e-40f) 
       .getRecognizer(); 

    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    mSpeechRecognizer.addListener(this); 
    mSpeechRecognizer.addKeyphraseSearch("usersKeyword", keyword.getString("keyword", "oranges and rainbows")); 

} 

onPartialResult:

@Override 
public void onPartialResult(Hypothesis hypothesis) { 

    if (hypothesis == null) { //no one spoke 
     return; 
    } 
    String text = hypothesis.getHypstr(); 
    Log.v(TAG, "TEXT: " + text + "hypothesis.getHypstr: " + hypothesis.getHypstr()); 

    if (text.equals(keyword.getString("keyword", "oranges and rainbows"))) { //Only happens when text is oranges and rainbows, even after changing preference value!!! 

     Log.v(TAG, "Heard user keyword!"); 

     mSpeechRecognizer.cancel(); 
     mSpeechRecognizer.startListening("usersKeyword"); 

    } 

} 

Почему hypothesis.getHypstr() всегда только одно значение, даже после того, как я изменяю значение addKeyphraseSearch?

Спасибо,

Ruchir

EDIT: Я на самом деле остановить и запустить службу каждый раз, когда пользователь изменяет свой вклад, и поэтому onCreate() называется каждый раз, когда пользователь изменяет свои данные.

ПОЛНЫЙ КОД:

https://gist.github.com/anonymous/47efc9c1ca08d808e0be

+0

Вам нужно показать полный код, а не только его части. –

+0

@NikolayShmyrev Проблема заключается в том, что 'hypology.getHypstr();' всегда «апельсины и радуги», даже после того, как я изменил ключевое слово users. –

+0

@NikolayShmyrev Возможно, мне нужно удалить все файлы активов до их создания?Есть что-то вроде метода 'assets.deleteSync'? –

ответ

0

Вам не нужно уничтожать службу, вы создаете ее один раз с помощью onCreate.

Вы можете задать команду в onStartCommand:

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    recognizer.cancel(); 
    recognizer.addKeyphraseSearch("usersKeywords", intent.getStringExtra("keyword");); 
    recognizer.startListening("usersKeywords"); 
} 

От другого класса, который является пользователем услуги запуске службы с целью:

Intent i = new Intent(this, MyService); 
i.putExtra("keyword", "hello"); 
startService(i); 

Для получения более подробной информации читайте documentation

0

Вам нужно позвонить mSpeechRecognizer.addKeyphraseSearch() каждый раз, когда вы хотите изменить ключевую фразу.

+0

Но у меня есть 'mSpeechRecognizer.addKeyphraseSearch (" usersKeyword ", keyword.getString (" keyword "," oranges and rainbows "));' в моем методе 'setupRecognizer'. Разве это не работает? Спасибо! :) –

+0

Правильно, но вы только вызываете 'setupRecognizer()' один раз. –

+0

Я фактически останавливаю и запускаю службу каждый раз, когда пользователь меняет свой ввод, и поэтому 'onCreate()' вызывается каждый раз, когда пользователь меняет свои данные. Я отредактировал вопрос. Пожалуйста, дайте мне знать, что я должен делать сейчас. Спасибо :) –

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