动机和背景故事(无需阅读可选):
我有一段有效的代码,可以同时使用Pocket sphnix和谷歌识别器,以便同时支持基于菜单的语音导航和文本的连续播放。
因此,如果用户使用的单词与菜单项匹配,则用户代码将使用他们的语音导航应用程序:
“好了,开始x” “好原子,停止x” “好吧,做z”
注意:PocketSphinx找到了“ Ok atom”触发短语,然后取消了杀死的PocketSphinx,并且由于具有更好的准确性,Google语音用于更长的短语。
如果识别器不匹配,它将开始连续语音朗读到像聊天机器人一样发送到后端的文本(由Google语音处理):
“嗨,我叫格林·拇指博士。 “今晚吃什么...。”
如果沉默了10秒钟,谷歌语音将被取消,而PocketSphinx将再次针对关键字/唤醒词触发器=“好原子”启动
**一切正常,直到后端应用程序也需要实际的原始音频字节为止。我在整个stackoverflow上进行了搜索,没有一个解决方案有效,或者对于我的项目来说是切合实际的。
然后,我发现PocketSphinx可以将原始数据还给您,因此我不得不考虑Google语音,仅使用PocketSphinx **
实际问题:
但是,在重构/删除Google语音识别器并仅使用PocketSphinx之后,由于我需要轻松访问识别的“原始音频字节”,因此PocketSphinx会继续听到其触发词“ ok atom”,而没有听到其他任何词/声音在触发字之前或之后!!
无论我说什么(例如“ hello”,“ hi”,“ 1,2,3”等),它只会听到触发器“ ok atom”,请参阅我的相关代码段:
设置袖口毛孔的AsynTask的代码段:
@Override
protected Exception doInBackground(Void... params) {
try {
SpeechRecognitionService speechService = serviceReference.get();
Assets assets = new Assets(speechService);
File assetDir = assets.syncAssets();
speechService.pocketSphinxRecognizer = defaultSetup()
.setAcousticModel(new File(assetDir, "en-us-ptm"))
.setDictionary(new File(assetDir, "cmudict-en-us.dict"))
// threshold to balance between false +/- (higher is less sensitive, was 1e-45f)
.setKeywordThreshold(1e-30f)
.getRecognizer();
speechService.pocketSphinxRecognizer.addListener(listener);
// create keyword-activation search
speechService.pocketSphinxRecognizer.addKeyphraseSearch(KWS_SEARCH, KEYPHRASE);
} catch (IOException e) {
return e;
}
return null;
}
袖珍毛孔生命周期方法的代码段:
private String KWS_SEARCH = "ok atom";
private void switchSearch(String searchName) {
pocketSphinxRecognizer.stop();
if (searchName.equals(KWS_SEARCH))
pocketSphinxRecognizer.startListening(searchName);
else
pocketSphinxRecognizer.startListening(searchName, 10000);
}
private class PocketSphinxRecognitionListener implements edu.cmu.pocketsphinx.RecognitionListener {
@Override
public void onPartialResult(Hypothesis hypothesis) {
try {
if (hypothesis != null) {
String cmd = hypothesis.getHypstr();
Log.d(TAG, "onPartialResult:" + cmd);
if (cmd.equalsIgnoreCase(KWS_SEARCH))
{
handleResults(cmd);
}
else
{
sendToBacknedForProcessing(cmd);
}
}
}
catch (NullPointerException exc)
{
exc.printStackTrace();
}
}
@Override
public void onBeginningOfSpeech() {}
@Override
public void onEndOfSpeech() {
if (!pocketSphinxRecognizer.getSearchName().equals(KWS_SEARCH))
{
switchSearch(KWS_SEARCH);
}
}
@Override
public void onResult(Hypothesis hypothesis) {
if (hypothesis != null) {
String cmd = hypothesis.getHypstr();
Log.d(TAG, "onResult:" + cmd);
sendToBacknedForProcessing(cmd);
}
}
@Override
public void onError(Exception e) {
Log.e(TAG, "Pocketsphinx encounted an exception: " + e.getMessage());
}
@Override
public void onTimeout() {
switchSearch(KWS_SEARCH);
}
}
我实际上是逐步地浏览了这篇热门文章(https://www.guidearea.com/pocketsphinx-continuous-speech-recognition-android-tutorial/),但仍然没有正确的结果。
我想做的是支持两种模式:语音模式(如果识别出正确的单词),否则会持续发送到后端的文本。
感谢一百万!