Ключевое слово не определяется с помощью pocketsphinx на Android

Может ли кто-нибудь объяснить мне, как я могу преобразовать свою речь в текст с помощью pocketsphinx? Я пробую это:

import com.example.speechtutor.SpeechRecognizerRecorder;
import com.example.speechtutor.SpeechRecognizerRecorderSetup;
import edu.cmu.pocketsphinx.Hypothesis;
import edu.cmu.pocketsphinx.RecognitionListener;
import static edu.cmu.pocketsphinx.Assets.syncAssets;

public class SpeakActivity extends Activity implements RecognitionListener {


SpeechRecognizerRecorder recognizer;

private File appDir;

 String filePath;

 private static final String KWS_SEARCH_NAME = "wakeup";
 private static final String FORECAST_SEARCH = "forecast";
 private static final String DIGITS_SEARCH = "digits";
 private static final String MENU_SEARCH = "menu";
 private static final String KEYPHRASE = "hello";


 @Override
 public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_speak);

try {
    Log.d("Tag","before trying to sync assets");
    appDir = syncAssets(getApplicationContext());
} catch (IOException e) {
    throw new RuntimeException("failed to synchronize assets", e);
}

Log.d("TAG","before recognizer instantiaiton");
recognizer = SpeechRecognizerRecorderSetup.defaultSetup()
           .setAcousticModel(new File(appDir, "models/hmm/en-us-semi"))
           .setDictionary(new File(appDir, "models/lm/cmu07a.dic"))
           .setRawLogDir(appDir)
           .setKeywordThreshold(200)
           .setAudioStorageDirectory("SpeechTutor")
           .getRecognizer();




filePath = recognizer.getAudioStorageFilePath();

    recognizer.addListener(this);
    // Create keyword-activation search.
    File fillers = new File(appDir, "models/grammar/menu.gram");
    recognizer.addKeywordSearch(KWS_SEARCH_NAME, fillers.getPath());
    // Create grammar-based searches.
    //File menuGrammar = new File(appDir, "models/grammar/menu.gram");
    //recognizer.addGrammarSearch(MENU_SEARCH, menuGrammar);
    File digitsGrammar = new File(appDir, "models/grammar/digits.gram");
    recognizer.addGrammarSearch(DIGITS_SEARCH, digitsGrammar);
    // Create language model search.
    //digitsGrammar.File languageModel = new File(appDir, "models/lm/weather.dmp");
    //recognizer.addNgramSearch(FORECAST_SEARCH, languageModel);

    recognizer.startListening(KEYPHRASE);


}

    @Override
public void onPartialResult(Hypothesis arg0) {
       String text = results.getHypstr();

    Log.d("Spoken text",text);  
   }

    @Override
public void onBeginningOfSpeech() {
    }

}

Этот код работает без ошибок, но вызывает onPartialResult, когда я говорю "привет". Мое приложение должно преобразовывать каждый голос в текст. Пожалуйста, дайте мне образец.


person Manian Rezaee    schedule 28.06.2014    source источник
comment
Я так доволен, что нашел иранского разработчика, который делает карманного сфиникса. шома ветчина быть донбл рахи барай тариф привет будин. мише лотфан фарайандешо манам начинай? kheyli поиск kardam o rahhaye zyadi emtehan kardam vali javab nadadan. stackoverflow.com/q/37629636/3671748   -  person Mina Dahesh    schedule 04.06.2016


Ответы (1)


Ваш код содержит несколько проблем. Попробуйте пороговые значения ключевых слов как 1e-60, 1e-40, 1e-20, 1e-10, но уж точно не 200 в этой строке:

       .setKeywordThreshold(200)

Если вы собираетесь искать только ключевое слово, вам не нужна эта строка с грамматикой:

File digitsGrammar = new File(appDir, "models/grammar/digits.gram");
recognizer.addGrammarSearch(DIGITS_SEARCH, digitsGrammar);

Эта часть также не выглядит разумной. Поиск по ключевым словам принимает список слов для поиска по одному в строке, а не menu.gram файла

File fillers = new File(appDir, "models/grammar/menu.gram");
recognizer.addKeywordSearch(KWS_SEARCH_NAME, fillers.getPath());

Если вы собираетесь искать только по одному ключевому слову, нет необходимости добавлять поиск по ключевым словам, вы просто добавляете поиск по ключевой фразе для этой фразы.

 recognizer.addKeyphraseSearch(KWS_SEARCH_NAME, "hello");

Чтобы начать именованный поиск, вы указываете его имя, а не само ключевое слово:

 recognizer.startListening(KWS_SEARCH_NAME);

Правильный код должен выглядеть так:

import com.example.speechtutor.SpeechRecognizerRecorder;
import com.example.speechtutor.SpeechRecognizerRecorderSetup;
import edu.cmu.pocketsphinx.Hypothesis;
import edu.cmu.pocketsphinx.RecognitionListener;
import static edu.cmu.pocketsphinx.Assets.syncAssets;

public class SpeakActivity extends Activity implements RecognitionListener {

 SpeechRecognizerRecorder recognizer;

 private File appDir;

 private static final String KWS_SEARCH_NAME = "wakeup";
 private static final String KEYPHRASE = "hello";


 @Override
 public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_speak);

    try {
       Log.d("Tag","before trying to sync assets");
         appDir = syncAssets(getApplicationContext());
    } catch (IOException e) {
         throw new RuntimeException("failed to synchronize assets", e);
    }

Log.d("TAG","before recognizer instantiaiton");
recognizer = SpeechRecognizerRecorderSetup.defaultSetup()
           .setAcousticModel(new File(appDir, "models/hmm/en-us-semi"))
           .setDictionary(new File(appDir, "models/lm/cmu07a.dic"))
           .setRawLogDir(appDir)
           .setKeywordThreshold(1e-40)
           .setAudioStorageDirectory("SpeechTutor")
           .getRecognizer();


    recognizer.addListener(this);
    recognizer.addKeyphraseSearch(KWS_SEARCH_NAME, KEYPHRASE);
    recognizer.startListening(KWS_SEARCH_NAME);
}

    @Override
    public void onPartialResult(Hypothesis hyp) {
        if (hyp == null)
             return;
        // Restart the recognition if keyword is found
        String text = hyp.getHypstr();
        Log.d("Spoken text",text);  
        recognizer.cancel();
        recognizer.startSearch(KWS_SEARCH_NAME);
   }
}
person Nikolay Shmyrev    schedule 28.06.2014
comment
Спасибо за ответ. Но в журнале по-прежнему ничего не появляется, кроме «привет». Можете ли вы привести полный пример? или проект Eclipse. - person Manian Rezaee; 28.06.2014
comment
Смотри, RecognizerListener API Google слушает каждый голос, но это приложение слушает только приветственное слово. Это моя проблема. Видно, вы специалист в этом вопросе. - person Manian Rezaee; 28.06.2014
comment
Нет, Google API не слушает все подряд. Их модель обучается на веб-запросах. - person Nikolay Shmyrev; 28.06.2014
comment
Я получил ответ. Спасибо - person Manian Rezaee; 03.07.2014
comment
Как вы решили проблему Акбар? У меня похожая проблема. Я не вижу, как добавить несколько слов... - person Pixel; 09.09.2014
comment
String text = results.getHypstr();' in last method, does it means String text = arg0.getHypstr();` ???? - person Lucifer; 27.01.2015
comment
в моем случае он печатает слова из digits.gram ничего не говоря. что делать, пожалуйста, помогите. - person Mansuu....; 28.03.2016
comment
Я ответил вам здесь sourceforge.net/p /cmusphinx/обсуждение/распознавание речи/ - person Nikolay Shmyrev; 28.03.2016
comment
можем ли мы использовать слова местного языка для распознавания речи? - person Mansuu....; 30.03.2016
comment
Николай, я использовал .setKeywordThreshold(1e-40), но он продолжает выдавать ложные распознания. Нужно ли снизить порог, чтобы уменьшить количество ложных тревог? Прямо сейчас, даже если я не произношу ключевое слово, оно все равно срабатывает как ключевое слово. Должен ли я уменьшить порог до 1e-30 или повысить порог до 1e-50? Спасибо - person Ruchir Baronia; 04.05.2016