3 回答
![?](http://img1.sycdn.imooc.com/54584c9c0001489602200220-100-100.jpg)
TA贡献1796条经验 获得超4个赞
这是Google'Now'V6.0.23。*版本的一个错误,并且在最新的V6.1.28。*中仍然存在。
自V5.11.34。*版本发布以来,Google的实施SpeechRecognizer一直受到bug困扰。
您可以使用此要旨来复制其中的许多内容。
您可以使用此BugRecognitionListener来解决其中的一些问题。
我已经直接向Now团队报告了这些内容,因此他们知道了,但是目前还没有任何修复的方法。Google Now没有外部错误跟踪器,因为它不是AOSP的一部分,所以恐怕您无济于事。
正如您正确指出的那样,您详细介绍的最新错误几乎使它们的实现无法使用,从而忽略了用于控制语音输入时序的参数。根据文档:
此外,根据识别器的实现,这些值可能不会起作用。
这是我们应该期待的……
如果您不讲话或发出任何可检测的声音,则识别将无限期继续。
我目前正在创建一个项目来复制此新错误以及所有其他错误,我将继续转发并在此处链接。
编辑 -我希望我可以创建一种变通办法,使用部分或不稳定结果的检测作为触发来知道用户仍在讲话。他们停止后,我可以recognizer.stopListening()在设定的时间段后手动致电。
不幸的是,stopListening()它也被破坏了并且实际上并没有停止识别,因此没有解决方法。
围绕上述尝试破坏销毁识别器并仅依靠部分结果直到该点(未销毁销毁识别onResults()器时)都无法产生可靠的实现,除非您只是使用关键字spotting即可。
在Google修复此问题之前,我们无能为力。您唯一的出路是给apps-help@google.com发送电子邮件,报告问题,并希望他们收到的数量能对他们有所帮助。
![?](http://img1.sycdn.imooc.com/54586453000163bd02200220-100-100.jpg)
TA贡献1852条经验 获得超7个赞
注意!这仅在在线模式下有效。 启用听写模式并禁用部分结果:
intent.putExtra("android.speech.extra.DICTATION_MODE", true);
intent.putExtra(RecognizerIntent.EXTRA_PARTIAL_RESULTS, false);
在听写模式下,speechRecognizer仍会调用,onPartialResults()但是您应该将部分作为最终结果。
![?](http://img1.sycdn.imooc.com/54586870000183e302200220-100-100.jpg)
TA贡献1862条经验 获得超7个赞
更新:
万一有人在设置语音识别时遇到麻烦,您可以使用Droid语音库,该库是我为克服android中的语音超时问题而构建的。
我的应用完全依赖语音识别功能,而Google投下了炸弹。根据事物的外观,我相信至少在不久的将来不会解决此问题。
就目前而言,我确实找到了一种解决方案,可以让Google语音识别按预期提供语音结果。
注意:此方法与上述解决方案略有不同。
此方法的主要目的是确保用户说出的整个单词都在onPartialResults()处捕获。
在正常情况下,如果用户在给定的情况下说出多个单词,则响应时间太快,部分结果将常常不是只得到第一个单词,而是得到全部结果。
因此,为确保每个单词都被onPartialResults()捕获,引入了一个处理程序来检查用户暂停延迟,然后过滤结果。还要注意,来自onPartialResults()的结果数组将经常只有一个项目。
SpeechRecognizer userSpeech = SpeechRecognizer.createSpeechRecognizer(this);
Intent speechIntent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
speechIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
speechIntent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE, this.getPackageName());
speechIntent.putExtra(RecognizerIntent.EXTRA_PARTIAL_RESULTS, true);
speechIntent.putExtra(RecognizerIntent.EXTRA_MAX_RESULTS, ModelData.MAX_VOICE_RESULTS);
Handler checkForUserPauseAndSpeak = new Handler();
Boolean speechResultsFound = false;
userSpeech.setRecognitionListener(new RecognitionListener(){
@Override
public void onRmsChanged(float rmsdB)
{
// NA
}
@Override
public void onResults(Bundle results)
{
if(speechResultsFound) return;
speechResultsFound = true;
// Speech engine full results (Do whatever you would want with the full results)
}
@Override
public void onReadyForSpeech(Bundle params)
{
// NA
}
@Override
public void onPartialResults(Bundle partialResults)
{
if(partialResults.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION).size() > 0 &&
partialResults.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION).get(0) != null &&
!partialResults.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION).get(0).trim().isEmpty())
{
checkForUserPauseAndSpeak.removeCallbacksAndMessages(null);
checkForUserPauseAndSpeak.postDelayed(new Runnable()
{
@Override
public void run()
{
if(speechResultsFound) return;
speechResultsFound = true;
// Stop the speech operations
userSpeech.destroy();
// Speech engine partial results (Do whatever you would want with the partial results)
}
}, 1000);
}
}
@Override
public void onEvent(int eventType, Bundle params)
{
// NA
}
@Override
public void onError(int error)
{
// Error related code
}
@Override
public void onEndOfSpeech()
{
// NA
}
@Override
public void onBufferReceived(byte[] buffer)
{
// NA
}
@Override
public void onBeginningOfSpeech()
{
// NA
}
});
userSpeech.startListening(speechIntent);
- 3 回答
- 0 关注
- 947 浏览
添加回答
举报