我的语音识别监听器有问题,因为主题建议。 我开始收听后会出现此错误。问题是这样的:Link
回答这个问题:
根据使用SpeechRecognizer生成ERROR_NETWORK(值2),该错误是由Samsungs语音API(由Vlingo提供)引起的。将手机设置中的语音API更改为标准Google API可以解决问题。
我可以补充一点,我使用三星Galaxy S4(显然Vlingo识别器未经检查)
好的......我的代码:
SpeechRecognizerService.java
@Override
public void cancel() {
mAudioManager.setStreamSolo(AudioManager.STREAM_VOICE_CALL, false);
mSpeechRecognizer.cancel();
listener.setListening(false);
}
@Override
public void listen() {
mAudioManager.setStreamSolo(AudioManager.STREAM_VOICE_CALL, true);
if (!listener.isListening()) {
mSpeechRecognizer.startListening(mSpeechRecognizerIntent);
listener.setListening(true);
}
}
@Override
public void repeat() {
mSpeechRecognizer.cancel();
mSpeechRecognizer.startListening(mSpeechRecognizerIntent);
listener.setListening(true);
}
SpeechRecognizerIntent
public Intent getSpeechIntent() {
Intent mSpeechRecognizerIntent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
mSpeechRecognizerIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_PREFERENCE, "pl");
mSpeechRecognizerIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,
RecognizerIntent.LANGUAGE_MODEL_WEB_SEARCH);
mSpeechRecognizerIntent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE, Config.getContext().getPackageName());
mSpeechRecognizerIntent.putExtra(RecognizerIntent.EXTRA_MAX_RESULTS, 3);
mSpeechRecognizerIntent.putExtra(RecognizerIntent.EXTRA_WEB_SEARCH_ONLY, true);
mSpeechRecognizerIntent.putExtra(RecognizerIntent.EXTRA_SPEECH_INPUT_MINIMUM_LENGTH_MILLIS, 100);
return mSpeechRecognizerIntent;
}
SpeechRecognizerListener
@Override
public void onBeginningOfSpeech() {
Log.i(TAG, "on begining");
}
@Override
public void onBufferReceived(byte[] buffer) {
}
@Override
public void onEndOfSpeech() {
Log.i(TAG, "on end");
}
@Override
public void onError(int error) {
Log.i(TAG, error + "");
service.repeat();
}
@Override
public void onEvent(int eventType, Bundle params) {
}
@Override
public void onPartialResults(Bundle partialResults) {
}
@Override
public void onReadyForSpeech(Bundle params) {
Log.i(TAG, "on ready for speech");
}
@Override
public void onResults(Bundle results) {
Log.i(TAG, "on results");
service.manageResults(results);
service.cancel();
}
@Override
public void onRmsChanged(float rmsdB) {
}
LogCat正常工作时
01-18 12:56:08.827: I/SPEECH LISTENER(602): on ready for speech
01-18 12:56:09.538: I/SPEECH LISTENER(602): on begining
01-18 12:56:10.969: I/SPEECH LISTENER(602): on end
01-18 12:56:11.670: I/SPEECH LISTENER(602): on results
01-18 12:56:11.740: I/SPEECH LISTENER(602): on end
这里工作正常,但为什么"结束"触发两次?
触发错误时的LogCat
01-18 13:00:42.694: I/SPEECH LISTENER(3202): on ready for speech
01-18 13:00:42.694: I/SPEECH LISTENER(3202): 2
01-18 13:00:42.704: I/SPEECH LISTENER(3202): on ready for speech
01-18 13:00:42.704: I/SPEECH LISTENER(3202): 2
01-18 13:00:43.185: I/SPEECH LISTENER(3202): on ready for speech
01-18 13:00:43.415: I/SPEECH LISTENER(3202): on ready for speech
01-18 13:00:43.415: I/SPEECH LISTENER(3202): 2
01-18 13:00:43.425: I/SPEECH LISTENER(3202): on ready for speech
01-18 13:00:43.425: I/SPEECH LISTENER(3202): 2
01-18 13:00:43.625: I/SPEECH LISTENER(3202): on ready for speech
01-18 13:00:43.975: I/SPEECH LISTENER(3202): on ready for speech
01-18 13:00:43.975: I/SPEECH LISTENER(3202): 2
01-18 13:00:43.985: I/SPEECH LISTENER(3202): on ready for speech
01-18 13:00:43.985: I/SPEECH LISTENER(3202): 2
01-18 13:00:44.176: I/SPEECH LISTENER(3202): on ready for speech
01-18 13:00:46.548: I/SPEECH LISTENER(3202): on begining
01-18 13:00:47.979: I/SPEECH LISTENER(3202): on end
01-18 13:00:49.060: I/SPEECH LISTENER(3202): on results
01-18 13:00:49.190: I/SPEECH LISTENER(3202): on end
2表示触发错误(2 - ERROR_NETWORK)
Android Manifest.xml - 权限
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.INTERNET" />
我还尝试使用我的SpeechRecognizer作为singleton,就像stackoverflow建议的人一样,但它什么都没改变
我还可以补充一点,因为我的语言(波兰语)还不支持我无法使用离线识别。