Android SpeechRecognizer-Netzwerkfehler
Ich versuche, in Android 4.4 eine kontinuierliche Spracherkennung zu erstellen, indem ich die gesprochenen Wörter in einer Textansicht wie ein Diktat anzeige. Ich folgte mehreren Tutorials, wiehttps://github.com/fcrisciani/android-speech-recognition/blob/master/VoiceRecognition/src/com/speech/fcrisciani/voicerecognition/ContinuousDictationFragment.java, oderGibt es eine Möglichkeit, die SpeechRecognizer-API direkt für die Spracheingabe zu verwenden? und implementierte die folgende Version:
import java.util.ArrayList;
import android.app.Activity;
import android.content.Intent;
import android.graphics.PorterDuff;
import android.os.Bundle;
import android.speech.RecognitionListener;
import android.speech.RecognizerIntent;
import android.speech.SpeechRecognizer;
import android.view.KeyEvent;
import android.view.View;
import android.widget.ImageButton;
import android.widget.TextView;
public class VoiceReadActivity extends Activity {
private ImageButton mButtonSpeech;
private TextView mTextView;
private SpeechRecognizer mSpeechRecognizer = null;
private SpeechRecognizer getSpeechRecognizer() {
if (mSpeechRecognizer == null) {
mSpeechRecognizer = SpeechRecognizer.createSpeechRecognizer(this);
mSpeechRecognizer.setRecognitionListener(new RecognitionListener() {
@Override
public void onReadyForSpeech(Bundle params) {
mButtonSpeech.getBackground().setColorFilter( 0xFFFF0000, PorterDuff.Mode.MULTIPLY );
}
@Override
public void onBeginningOfSpeech() {
mTextView.append( "BEGINNING TO HEAR..." );
mButtonSpeech.getBackground().setColorFilter( 0xFFFFFFFF, PorterDuff.Mode.MULTIPLY );
}
@Override
public void onBufferReceived(byte[] buffer) {}
@Override
public void onEndOfSpeech() {
mTextView.append( "STOP HEARING..." );
mButtonSpeech.getBackground().setColorFilter( 0xFF00FFFF, PorterDuff.Mode.DST );
}
@Override
public void onError(int error) {
String message;
boolean restart = true;
switch (error)
{
case SpeechRecognizer.ERROR_AUDIO:
message = "Audio recording error";
break;
case SpeechRecognizer.ERROR_CLIENT:
message = "Client side error";
restart = false;
break;
case SpeechRecognizer.ERROR_INSUFFICIENT_PERMISSIONS:
message = "Insufficient permissions";
restart = false;
break;
case SpeechRecognizer.ERROR_NETWORK:
message = "Network error";
break;
case SpeechRecognizer.ERROR_NETWORK_TIMEOUT:
message = "Network timeout";
break;
case SpeechRecognizer.ERROR_NO_MATCH:
message = "No match";
break;
case SpeechRecognizer.ERROR_RECOGNIZER_BUSY:
message = "RecognitionService busy";
break;
case SpeechRecognizer.ERROR_SERVER:
message = "error from server";
break;
case SpeechRecognizer.ERROR_SPEECH_TIMEOUT:
message = "No speech input";
break;
default:
message = "Not recognised";
break;
}
mTextView.append("onError code:" + error + " message: " + mes sage);
if (restart) {
getSpeechRecognizer().cancel();
startVoiceRead();
}
}
@Override
public void onEvent(int eventType, Bundle params) {}
@Override
public void onPartialResults(Bundle partialResults) {}
@Override
public void onResults(Bundle results) {
ArrayList<String> text = results.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION);
mTextView.append(text.get(0));
mTextView.append( ". " );
startVoiceRead();
}
@Override
public void onRmsChanged(float rmsdB) {}
});
}
return mSpeechRecognizer;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mButtonSpeech = (ImageButton)findViewById(R.id.button_speech);
mTextView = (TextView)findViewById(R.id.text_slave);
mButtonSpeech.setOnClickListener( new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mSpeechRecognizer == null) {
startVoiceRead();
} else {
stopVoiceRead();
}
}
});
}
public void startVoiceRead() {
Intent speechIntent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
speechIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
getSpeechRecognizer().startListening(speechIntent);
mButtonSpeech.getBackground().setColorFilter( 0xFFFFFF00, PorterDuff.Mode.MULTIPLY );
}
public void stopVoiceRead() {
if (mSpeechRecognizer != null) {
mSpeechRecognizer.destroy();
mSpeechRecognizer = null;
}
mButtonSpeech.getBackground().setColorFilter( 0xFFFFFFFF, PorterDuff.Mode.DST);
}
}
Ich habe meinem Android-Manifest bereits Berechtigungen hinzugefügt:
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
<uses-permission android:name="android.permission.INTERNET"/>
Das Problem ist, dass der RecognitionListener wie onBeginningOfSpeech () durchschnittlich jedes dritte Mal zufällig aufgerufen wird, wenn ich ihn durch Drücken einer Taste aktivieren möchte. Weiterhin erhalte ich keine Ergebnisse, aber ErrorCode 2: Netzwerkfehler, wenn der RecognitionListener aktiviert ist. Obwohl ich den Tutorials gefolgt bin, konnte ich den Unterschied nicht erkennen, sodass mein Code bis jetzt nicht funktionierte. Meine LogCat-Ausgabe löst beim Drücken der Taste die folgenden Fehler aus:
07-04 10:20:22.714: E/DatabaseUtils(869): Writing exception to parcel
07-04 10:20:22.714: E/DatabaseUtils(869): java.lang.SecurityException: Permission Denial: get/set setting for user asks to run as user -2 but is calling from user 0; this requires android.permission.INTERACT_ACROSS_USERS_FULL
07-04 10:20:22.714: E/DatabaseUtils(869): at com.android.server.am.ActivityManagerService.handleIncomingUser(ActivityManagerService.java:14614)
07-04 10:20:22.714: E/DatabaseUtils(869): at android.app.ActivityManager.handleIncomingUser(ActivityManager.java:2258)
07-04 10:20:22.714: E/DatabaseUtils(869): at com.android.providers.settings.SettingsProvider.call(SettingsProvider.java:663)
07-04 10:20:22.714: E/DatabaseUtils(869): at android.content.ContentProvider$Transport.call(ContentProvider.java:325)
07-04 10:20:22.714: E/DatabaseUtils(869): at android.content.ContentProviderNative.onTransact(ContentProviderNative.java:275)
07-04 10:20:22.714: E/DatabaseUtils(869): at android.os.Binder.execTransact(Binder.java:404)
07-04 10:20:22.714: E/DatabaseUtils(869): at dalvik.system.NativeStart.run(Native Method)
07-04 10:20:22.714: W/ActivityManager(869): Permission Denial: get/set setting for user asks to run as user -2 but is calling from user 0; this requires android.permission.INTERACT_ACROSS_USERS_FULL
07-04 10:20:22.734: E/VoiceEngineWrapper(16366): getInstance() : get existed VoiceEngine
07-04 10:20:22.734: E/VSG(16366): VSG: speechEndpointTimeout = 1500
07-04 10:20:22.734: E/VSG(16366): VSG: DEFAULT_ENDPOINT_MEDIUM is 1750
07-04 10:20:22.734: E/VSG(16366): VSG: Not using dynamic HANGOVER ... speechEndpointTimeout is 1500
07-04 10:20:22.734: E/VSG(16366): VSG: SHORT = 400
07-04 10:20:22.734: E/VSG(16366): VSG: MEDIUM = 750
07-04 10:20:22.734: E/VSG(16366): VSG: MEDIUM_LONG = 1250
07-04 10:20:22.734: E/VSG(16366): VSG: LONG = 1750
07-04 10:20:22.734: E/VSG(16366): VSG: LONG_LONG = 2250
Aber auch wenn ich hinzufüge
<uses-permission android:name="android.permission.INTERACT_ACROSS_USERS_FULL"/>
Die oben beschriebenen Probleme treten weiterhin auf.
Vielen Dank, dass Sie sich die Zeit genommen haben, uns zu helfen. Dies war eine Hürde, die ich noch nicht überwinden konnte.