Я даже пытался следовать рекомендациям, представленным в соответствующем сообщении о переполнении стека Здесь
К сожалению, даже после выполнения этих рекомендаций результат тот же.
Код: Выделить всё
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
*************************
initSpeechRecognition(this);
speech.setRecognitionListener(this);
recognizerIntent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
recognizerIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_PREFERENCE, "en");
recognizerIntent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE, this.getPackageName());
recognizerIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
recognizerIntent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE, this.getPackageName());
}
Код: Выделить всё
public void initSpeechRecognition(Activity activity) {
String recognitionServiceName = getAvailableVoiceRecognitionService(activity);
if (recognitionServiceName == null)
return;
speech = SpeechRecognizer.createSpeechRecognizer(activity,
ComponentName.unflattenFromString(recognitionServiceName));
Log.i("TEST", recognitionServiceName);
}
public static String getAvailableVoiceRecognitionService(Activity activity) {
final List services = activity.getPackageManager().queryIntentServices(
new Intent(RecognitionService.SERVICE_INTERFACE), 0);
String recognitionServiceName = null;
for (final ResolveInfo info : services) {
String packageName = info.serviceInfo.packageName;
String serviceName = info.serviceInfo.name;
String testRecognitionServiceName = packageName + "/" + serviceName;
ServiceConnection connection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
Log.i("TEST", name + "::" + service);
}
@Override
public void onServiceDisconnected(ComponentName name) {
Log.i("TEST", name + "::Disconnected");
}
};
Intent serviceIntent = new Intent(RecognitionService.SERVICE_INTERFACE);
ComponentName recognizerServiceComponent = ComponentName.unflattenFromString(testRecognitionServiceName);
if (recognizerServiceComponent != null) {
serviceIntent.setComponent(recognizerServiceComponent);
try {
boolean isServiceAvailableToBind = activity.bindService(serviceIntent, connection, Context.BIND_AUTO_CREATE);
if (isServiceAvailableToBind) {
activity.unbindService(connection);
recognitionServiceName = testRecognitionServiceName;
break;
}
} catch (SecurityException e) {
e.printStackTrace();
}
}
}
return recognitionServiceName;
}
Код: Выделить всё
@Override
public void onBeginningOfSpeech() {
Log.i(VOICE_RECOGNITION, "onBeginningOfSpeech");
}
@Override
public void onBufferReceived(byte[] buffer) {
Log.i(VOICE_RECOGNITION, "onBufferReceived: " + Arrays.toString(buffer));
}
@Override
public void onEndOfSpeech() {
Log.i(VOICE_RECOGNITION, "onEndOfSpeech");
}
@Override
public void onError(int errorCode) {
String errorMessage = getErrorText(errorCode);
Log.d(VOICE_RECOGNITION, "FAILED " + errorMessage);
}
@Override
public void onEvent(int arg0, Bundle arg1) {
Log.i(VOICE_RECOGNITION, "onEvent");
}
@Override
public void onPartialResults(Bundle arg0) {
Log.i(VOICE_RECOGNITION, "onPartialResults");
}
@Override
public void onReadyForSpeech(Bundle arg0) {
Log.i(VOICE_RECOGNITION, "onReadyForSpeech");
}
@Override
public void onResults(Bundle results) {
Log.i(VOICE_RECOGNITION, "onResults");
ArrayList matches = results.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION);
StringBuilder text = new StringBuilder();
assert matches != null;
for (String result : matches) text.append(result).append("\n");
audioToText.add(text.toString());
Log.i(VOICE_RECOGNITION, String.valueOf(audioToText));
}
@Override
public void onRmsChanged(float rmsdB) {
Log.i(VOICE_RECOGNITION, "onRmsChanged: " + rmsdB);
}
public static String getErrorText(int errorCode) {
String message;
switch (errorCode) {
case SpeechRecognizer.ERROR_AUDIO:
message = "Audio recording error";
audioToText.add("audio recording error");
break;
case SpeechRecognizer.ERROR_CLIENT:
message = "Client side error";
audioToText.add("client side error");
break;
case SpeechRecognizer.ERROR_INSUFFICIENT_PERMISSIONS:
message = "Insufficient permissions";
audioToText.add("insufficient permissions");
break;
case SpeechRecognizer.ERROR_NETWORK:
message = "Network error";
audioToText.add("network error");
break;
case SpeechRecognizer.ERROR_NETWORK_TIMEOUT:
message = "Network timeout";
audioToText.add("network timeout");
break;
case SpeechRecognizer.ERROR_NO_MATCH:
message = "No match";
audioToText.add("no audio detected");
break;
case SpeechRecognizer.ERROR_RECOGNIZER_BUSY:
message = "RecognitionService busy";
audioToText.add("recognition service busy");
break;
case SpeechRecognizer.ERROR_SERVER:
message = "error from server";
audioToText.add("error from server");
break;
case SpeechRecognizer.ERROR_SPEECH_TIMEOUT:
message = "No speech input";
audioToText.add("no speech input");
break;
default:
message = "Didn't understand, please try again.";
audioToText.add("no audio detected");
break;
}
return message;
}
вот еще мой часть журнала, которая активируется, когда приложение начинает прослушивать речь
Код: Выделить всё
2023-08-25 12:07:55.696 31209-31209 Voice Recognition I onReadyForSpeech
2023-08-25 12:07:55.730 31209-31209 Voice Recognition I onRmsChanged: -2.0
2023-08-25 12:07:58.091 31209-31209 Voice Recognition D FAILED No match
Может ли кто-нибудь дать представление об этом вопросе или предложить потенциальные решения? Ваша помощь будет безмерно признательна.
Подробнее здесь: https://stackoverflow.com/questions/769 ... android-13