使用PocketSphinx识别多个关键字

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (98)

我已经安装了PocketSphinx演示程序,它在Ubuntu和Eclipse下工作正常,但尽管我尝试了解如何添加对多个单词的识别。

我想要的只是让代码识别单个单词,然后我可以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/

必须选择阈值以避免误报。

用户回答回答于

我开发了以下可以正常工作的代码,除非它们在列表中,否则不会识别单词。您可以直接复制并粘贴到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分,所以我现在可以停止工作。结果。

扫码关注云+社区

领取腾讯云代金券