我正试图在Pocket Sphinx Library
的帮助下实施语音识别。
我的方法是什么,
我刚下载了他们的Android演示项目。在Eclipse中导入它,干净构建并在设备上运行它。它运行成功。
在此之后,我将libs
文件夹从演示项目复制到我自己的项目中。
我在自己的项目中复制了assets
文件夹内容,因为它是。
然后我根据this post编辑了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
个文件。但是,当我在我自己的项目中复制粘贴并完成其清晰构建时,这些文件不会重新创建。这是正常的吗?
是否有必要在项目中包含项目中的所有文件?或者我可以从自己的项目中删除一些未使用的文件吗?任何必要文件列表(在资产文件夹或库或其他文件中)都非常有帮助。
请让我知道在我自己的项目中应该采用什么方法成功实施它。
我的活动代码
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);
}
}
我的项目结构如下