Я пытаюсь заставить распознавание речи работать для моего приложения Android 2.3.3, но чего-то фундаментального не хватает.
Во-первых, в верхней части моего файла AndroidManifest.xml
у меня есть:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.myuser.myapp">
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
... remainder omitted for brevity
Что, полагаю, должно побуждать Android спрашивать конечного пользователя, хотят ли они предоставить моему приложению разрешение на использование микрофона при его запуске (если нет, поправьте меня!) ...
Затем у меня есть Activity
, который содержит все необходимые возможности распознавания речи моего приложения. По сути, я хочу, чтобы приложение обнаруживало, когда кто-то произносит вслух "Go":
public class SpeechActivity extends AppCompatActivity implements RecognitionListener {
private SpeechRecognizer speechRecognizer;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_speech);
int check = ContextCompat.checkSelfPermission(this, android.Manifest.permission.RECORD_AUDIO);
if(check != PackageManager.PERMISSION_GRANTED) {
throw new RuntimeException("Ya can't do that now, ya here.");
}
speechRecognizer = SpeechRecognizer.createSpeechRecognizer(this);
speechRecognizer.setRecognitionListener(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, "voice.recognition.test");
speechIntent.putExtra(RecognizerIntent.EXTRA_MAX_RESULTS, 5);
speechRecognizer.startListening(speechIntent);
Log.i("SpeechActivity", "Speech Recognizer is listening");
}
@Override
public void onReadyForSpeech(Bundle bundle) {
}
@Override
public void onBeginningOfSpeech() {
}
@Override
public void onRmsChanged(float v) {
}
@Override
public void onBufferReceived(byte[] bytes) {
}
@Override
public void onEndOfSpeech() {
}
@Override
public void onError(int i) {
}
@Override
public void onResults(Bundle bundle) {
Log.i("SpeechActivity", "Speech was detected...");
String spoken = "";
ArrayList<String> data = bundle.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION);
for (int i = 0; i < data.size(); i++) {
spoken += data.get(i);
}
Log.i(this.getClass().getName(), String.format("The word \"%s\" was detected.", spoken));
if(spoken.equalsIgnoreCase("go")) {
doSomething();
}
}
@Override
public void onPartialResults(Bundle bundle) {
}
@Override
public void onEvent(int i, Bundle bundle) {
}
}
Я запускаю приложение на своем Samsung Galaxy S7 Edge, подключая телефон к ноутбуку (через USB), нажимая кнопку Запустить (приложение) в Android Studio и выбирая свой телефон в качестве подключенного устройства.
Когда приложение запускается на моем телефоне, первое, что я замечаю, это то, что оно не предлагает мне принять/отклонить разрешение приложения на использование микрофона. неправильно.
Но затем, когда я перехожу к экрану SpeechActivity/activity_speech.xml
, я получаю:
Когда это запускается, я получаю:
FATAL EXCEPTION: main
Process: com.example.myuser.myapp, PID: 9585
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.myuser.myapp/com.example.myuser.myapp.SpeechActivity}: java.lang.RuntimeException: Ya can't do that now, ya here.
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2947)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3008)
at android.app.ActivityThread.-wrap14(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1650)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6688)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1468)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1358)
Caused by: java.lang.RuntimeException: Ya can't do that now, ya here.
at com.example.myuser.myapp.SpeechActivity.onCreate(SpeechActivity.java:43)
at android.app.Activity.performCreate(Activity.java:6912)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1126)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2900)
Возможно ли, что мне нужно загрузить и установить плагин или APK, чтобы распознавание речи работало? Почему мое приложение не запрашивает разрешение на использование микрофона моего телефона? Как распознаватель речи запускается/слушает, но потом вообще не улавливает речь?