锐英源软件
第一信赖

精通

英语

开源

擅长

开发

培训

胸怀四海 

第一信赖

当前位置:锐英源 / 开源技术 / C语言开源技术 / 使用PocketSphinx识别多关键字
服务方向
人工智能数据处理
人工智能培训
kaldi数据准备
小语种语音识别
语音识别标注
语音识别系统
语音识别转文字
kaldi开发技术服务
软件开发
运动控制卡上位机
机械加工软件
软件开发培训
Java 安卓移动开发
VC++
C#软件
汇编和破解
驱动开发
联系方式
固话:0371-63888850
手机:138-0381-0136
Q Q:396806883
微信:ryysoft

使用PocketSphinx识别多关键字


提问

我已经安装了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文件中,我不希望发生识别...

回答1

你可以使用addKeywordSearch哪些用途来存放关键短语。例如,每行一个短语,其中包含//中每个短语的阈值

up /1.0/
down /1.0/
left /1.0/
right /1.0/
forwards /1e-1/  

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

没有什么可以更新的,这个文件是用于关键字定位的文件,你不应该添加任何东西。它不是语法文件,语法是不同的。要了解关键字定位,请访问CMUSphinx页面cmusphinx.sourceforge.net/wiki/tutoriallm -  

en-us-ptm是一个声学模型,它不是arpa模型。它是16khz,而不是16位。创建新字典不会提高准确性,但它可能会节省一些内存(约3mb)。

阈值取决于单词,为了获得最佳检测,您需要使用特定于字的阈值。由于单词“forwards”有两个音节,因此很可能需要不同的阈值。如果你愿意,可以使用0.1

回答2

感谢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。

 

谢啦!!这些行产生了差异我没有看到addKeywordSearch(不添加keywordS搜索,复数形式):File digitsGrammar = new File(modelsDir,“grammar / digits.gram”); recognizer.addKeywordSearch(DIGITS_SEARCH,digitsGrammar); } void void reset(){recognizer.stop(); recognizer.startListening(DIGITS_SEARCH); }}

 

我发现了我的错误...我没有使用“addKeywordSearch”,我使用的是addGrammarSearch ...现在我将我的语法文件改为你上面帖子中的所有内容并运行...但不幸的是我仍然得到错误积极的结果......所以,如果我说些什么,即使我说的是完全不同的东西,总会有匹配。

友情链接
版权所有 Copyright(c)2004-2015 锐英源软件

公司注册号:410105000449586 豫ICP备08007559号 最佳分辨率 1024*768

地址:郑州市文化路47号院1号楼4层(47-1楼位于文化路和红专路十字路口东北角,郑州大学工学院招待所南边,工学院科技报告厅西边。)