使用PocketSphinx识别多个关键字
我已经安装了PocketSphinx演示程序,它在Ubuntu和Eclipse下工作正常,但尽pipe尝试我不能解决如何添加多个单词的识别。
我只想让代码识别单个单词,然后我可以在代码中switch()
,例如“上”,“下”,“左”,“右”。 我不想识别句子,只是单个单词。
任何帮助,将不胜感激。 我发现其他用户有类似的问题,但目前为止还没有人知道答案。
有一件令我困惑的事情是为什么我们需要使用“唤醒”常数?
private static final String KWS_SEARCH = "wakeup"; private static final String KEYPHRASE = "oh mighty computer"; . . . recognizer.addKeyphraseSearch(KWS_SEARCH, KEYPHRASE);
wakeup
有什么关系呢?
我已经取得了一些进展(?):使用addGrammarSearch
我可以使用一个.gram
文件来列出我的单词,例如up,down,left,right,forwards,backwards
,这似乎工作得很好,如果我只是说那些特定话。 但是,任何其他的词语都会使系统与所说的“最近的”单词相匹配。 理想情况下,我不希望识别出现,如果说话的话不在.gram
文件中…
你可以使用addKeywordSearch
来使用关键字文件。 例如,//中的每个短语的每个词组都有一个阈值
up /1.0/ down /1.0/ left /1.0/ right /1.0/ forwards /1e-1/
必须select阈值以避免误报。
感谢Nikolay的提示(参见上面的回答),我开发了下面的代码,它工作正常,除非列表中的内容不能识别单词。 您可以直接复制并粘贴到PocketSphinxDemo代码的主类中:
public class PocketSphinxActivity extends Activity implements RecognitionListener { private static final String DIGITS_SEARCH = "digits"; private SpeechRecognizer recognizer; @Override public void onCreate(Bundle state) { super.onCreate(state); setContentView(R.layout.main); ((TextView) findViewById(R.id.caption_text)).setText("Preparing the recognizer"); try { Assets assets = new Assets(PocketSphinxActivity.this); File assetDir = assets.syncAssets(); setupRecognizer(assetDir); } catch (IOException e) { // oops } ((TextView) findViewById(R.id.caption_text)).setText("Say up, down, left, right, forwards, backwards"); reset(); } @Override public void onPartialResult(Hypothesis hypothesis) { } @Override public void onResult(Hypothesis hypothesis) { ((TextView) findViewById(R.id.result_text)).setText(""); if (hypothesis != null) { String text = hypothesis.getHypstr(); makeText(getApplicationContext(), text, Toast.LENGTH_SHORT).show(); } } @Override public void onBeginningOfSpeech() { } @Override public void onEndOfSpeech() { reset(); } private void setupRecognizer(File assetsDir) { File modelsDir = new File(assetsDir, "models"); recognizer = defaultSetup().setAcousticModel(new File(modelsDir, "hmm/en-us-semi")) .setDictionary(new File(modelsDir, "dict/cmu07a.dic")) .setRawLogDir(assetsDir).setKeywordThreshold(1e-20f) .getRecognizer(); recognizer.addListener(this); File digitsGrammar = new File(modelsDir, "grammar/digits.gram"); recognizer.addKeywordSearch(DIGITS_SEARCH, digitsGrammar); } private void reset() { recognizer.stop(); recognizer.startListening(DIGITS_SEARCH); } }
你的digits.gram
文件应该是这样的:
up /1e-1/ down /1e-1/ left /1e-1/ right /1e-1/ forwards /1e-1/ backwards /1e-1/
你应该尝试双斜线内的门槛/ /性能,其中1e-1
表示0.1(我认为)。 我认为最高是1.0
。
现在是下午5点30分,所以我现在可以停止工作了。 结果。