我正在尝试在Pocket Sphinx Library
.
我的方法是,
我刚刚下载了他们的 Android 演示项目。在 Eclipse 中导入它,进行干净构建并在设备上运行它。它运行成功。
在此之后,我将libs
文件夹从演示项目复制到我自己的项目中。我复制了我自己项目中的assets
文件夹内容。然后我根据这篇文章编辑了文件内容。digits.gram
然后Listener
在我的活动中实现并添加addKeywordSearch
到它。
我的问题:
这种方法在我们自己的项目中实现这个库是否正确?我们可以复制粘贴所有文件,
.gram
根据需要修改文件并运行它吗?还是我们需要做一些其他的步骤来生成.gram
文件?当我尝试使用上述方法时,项目在设备上成功运行了几次。但在那之后它开始显示以下错误。
E/cmusphinx(10470): ERROR: "kws_search.c", line 158: The word '/1e-20/' is missing in the dictionary E/AndroidRuntime(10470): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.uwemo.myvdemo/com.uwemo.myvdemo.MainActivity}: java.lang.RuntimeException: Decoder_setSearch returned -1
但是/1e-20/
存在于我的digits.gram
文件中。
digits.gram文件内容:
up /1e-20/
down /1e-15/
left /1e-15/
right /1e-15/
here /1e-15/
我注意到一件事,当我对 Pocket Sphinx 的演示项目进行干净构建并运行它时,它会重新创建
digits.gram.md5
文件。但是当我将所有内容复制粘贴到我自己的项目中并进行 cleant-build 时,这些文件并没有重新创建。这是正常的吗?我们项目中的所有文件是否需要像演示项目中一样?或者我可以从我自己的项目中删除一些未使用的文件吗?任何必要文件的列表(在资产文件夹或库或其他文件中)都将非常有帮助。
请让我知道我应该用什么方法在我自己的项目中成功实施它。
我的活动代码
public class MainActivity extends Activity implements RecognitionListener{
private static final String DIGITS_SEARCH = "digits";
private SpeechRecognizer recognizer;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
try
{
Assets assets = new Assets(MainActivity.this);
File assetDir = assets.syncAssets();
setupRecognizer(assetDir);
Toast.makeText(getApplicationContext(), "Speech Recognizer Started", Toast.LENGTH_SHORT).show();
}
catch (IOException e){
e.printStackTrace();
}
}
@Override
public void onBeginningOfSpeech() {
// TODO Auto-generated method stub
}
@Override
public void onEndOfSpeech() {
// TODO Auto-generated method stub
reset();
}
@Override
public void onPartialResult(Hypothesis arg0) {
// TODO Auto-generated method stub
}
@Override
public void onResult(Hypothesis hypothesis) {
// TODO Auto-generated method stub
if (hypothesis != null){
String text = hypothesis.getHypstr();
Toast.makeText(getApplicationContext(), "you got ::"+text, Toast.LENGTH_SHORT).show();
}
}
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);
reset();
}
private void reset(){
recognizer.stop();
recognizer.startListening(DIGITS_SEARCH);
}
}
我的项目结构如下