从您通过startActivityForResult()调用它之前,Google语音搜索会有很长的延迟,直到显示对话框,准备好发表演讲。
这要求用户在说话之前始终查看屏幕,等待显示对话框。
所以我想通过实现RecognitionListener并在onReadyForSpeech()中发出DTMF音来生成声音信号而不是对话框,如下面的代码片段所示:
@Override
public void onReadyForSpeech(Bundle params) {
Log.d(LCTAG, "Called when the endpointer is ready for the user to start speaking.");
mToneGenerator.startTone(ToneGenerator.TONE_DTMF_1);
try {
Thread.sleep(50);
} catch (InterruptedException e) {
Log.e(LCTAG, "InterruptedException while in Thread.sleep(50).");
e.printStackTrace();
} // SystemClock.sleep(50);
mToneGenerator.stopTone();
}
音调听起来很漂亮但是......它也被麦克风“听到”,到达语音识别服务并且总是产生识别错误 ERROR_NO_MATCH 。 / p>
有办法解决这个问题吗?
答案 0 :(得分:5)
这是一个随机的想法,它可能不起作用。
您可以尝试在播放音调时禁用麦克风(可能通过AudioManager.setMicrophoneMute
)吗?
答案 1 :(得分:1)
这是我的代码,它适用于RecognitionListener的onReadyForSpeech()回调。
private void playSpeechReadyTone(){
audioManager.setMicrophoneMute(true);
MediaPlayer mediaPlayer = MediaPlayer.create(JarvisService.this, R.raw.doublebeep);
mediaPlayer.setOnCompletionListener(new OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer arg0) {
audioManager.setMicrophoneMute(false);
}
});
mediaPlayer.start();
}
答案 2 :(得分:0)
我担心没有一种简单而干净的方法可以做到这一点。正如srf指定的那样,你不应该依赖AudioManager.setMicrophoneMute(boolean),所以,AFAIK,可能的是:
在调用SpeechRecognizer.startListening(意图)之前播放音频文件:
final MediaPlayer mediaPlayer = MediaPlayer.create(JarvisService.this, R.raw.doublebeep);
mediaPlayer.setOnCompletionListener(new OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer player) {
player.release();
// Safety start Speech Recognizer
mSpeechRecognizer.startListening(getSpeechRecognizerIntent());
}
});
mediaPlayer.start();
然而,这个解决方案有一个问题......如果在调用RecognitionListener.onReadyForSpeech之前可能会收到RecognitionListener.onError(int error),那么在这种情况下,你每次都会发出一声嘟嘟声(这会发生,例如,如果您未连接到Internet并且语音识别配置为在线工作)! 此外,您应该管理在音频(双重)播放期间取消语音识别过程的情况。
另请注意,正如Google doc所说:
另请注意,某些值可能会导致意外或意外结果 - 谨慎使用!此外,根据识别器实现,这些值可能无效。