Есть ли способ использовать API распознавания речи Android для вывода true/false, даже если телефон выключен?

#java #android #machine-learning #speech-recognition #feature-engineering

Вопрос:

Я пытаюсь обнаружить речь для функции в алгоритме машинного обучения, но мне трудно запускать API распознавания речи в фоновом режиме и при выключенном телефоне. Я попытался поместить распознаватель речи в службу, однако служба отключается и сообщает об этой ошибке:

E/ActivityThread: Сервис com.test.распознавание речи.Услуги.SpeechDetectionService допустил утечку подключения к сервису android.speech.Распознаватель речи$Соединение@914d0fc, которое изначально было привязано здесь android.app.serviceconnectionleak: Сервис com.test.распознавание речи.Услуги.SpeechDetectionService допустил утечку подключения к сервису android.speech.Распознаватель речи$Соединение@914d0fc, которое изначально было привязано здесь, в android.app.LoadedApk$ServiceDispatcher.(Загруженный файл. java:1835) в android.app.Загруженный файл.getServiceDispatcherCommon(загруженный файл.java:1707) в android.app.LoadedApk.getServiceDispatcher(загруженный файл. java:1686) в android.app.ContextImpl.bindServiceCommon(ContextImpl.java:1819) в android.app.ContextImpl.bindService(ContextImpl.java:1749) в android.content.ContextWrapper.bindService(ContextWrapper.java:756) в android.речь.Распознаватель речи.Поразительное(распознаватель речи.java:286) в com.test.распознавание речи.Услуги.SpeechDetectionService$1.запустите(SpeechDetectionService.java:56) в android.os.Обработчик.Обратный вызов(Обработчик.java:938) в android.os.Обработчик.Отправка сообщений(Обработчик.java:99) в android.os.Петлитель.цикл(Петлитель.java:223) в android.app.ActivityThread.main(ActivityThread.java:7664) в java.lang.reflect.Метод.вызов(собственный метод) в com.android.internal.os.RuntimeInit$MethodAndArgsCaller.выполнить(RuntimeInit.java:592) в com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)

Мне нужно, чтобы приложение отслеживало, обнаруживало ли оно речь каждую минуту каждые десять минут или около того.

Вот это MainActivity.java и SpeechDetectionService.java код:

Основная Деятельность:

 public class MainActivity extends AppCompatActivity {
// Create speechRecognizer object
private SpeechRecognizer speechRecognizer;
public static final Integer RecordAudioRequestCode = 1;

private static final String TAG = MainActivity.class.getSimpleName();

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // Check if permissions have been granted
    if (ContextCompat.checkSelfPermission(this, Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED) {
        checkPermission();
    }
}

@Override
protected void onStart() {
    super.onStart();
    Log.d(TAG, "onStart:start SpeechDetectionService");
    startService(new Intent(this, SpeechDetectionService.class));
}

// Permission check function
private void checkPermission() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.RECORD_AUDIO},RecordAudioRequestCode);
    }
}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if (requestCode == RecordAudioRequestCode amp;amp; grantResults.length > 0) {
        if(grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            Toast.makeText(this, "Permission Granted", Toast.LENGTH_SHORT).show();
        }
    }
}
 

Служба распознавания речи:

 public class SpeechDetectionService extends Service {
private static final String TAG = SpeechDetectionService.class.getSimpleName();

private SpeechRecognizer speechRecognizer;

@Nullable
@Override
public IBinder onBind(Intent intent) {
    Log.d(TAG, "onBind()");
    return null;
}

@Override
public void onCreate() {
    super.onCreate();
    Log.d(TAG, "onCreate()");


}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    super.onStartCommand(intent, flags, startId);
    Log.d(TAG, "onStartCommand");


    speechRecognizer = SpeechRecognizer.createSpeechRecognizer(this);

    final Intent speechRecognizerIntent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
    speechRecognizerIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
    speechRecognizerIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, Locale.getDefault());



    final Handler handler = new Handler();
    final int delay = 10000;
    handler.postDelayed(new Runnable() {
        public void run() {
            speechRecognizer.startListening(speechRecognizerIntent);
            handler.postDelayed(this, delay);

        }
    }, delay);

    speechRecognizer.setRecognitionListener(new RecognitionListener() {
        @Override
        public void onReadyForSpeech(Bundle params) {

        }

        @Override
        public void onBeginningOfSpeech() {

        }

        @Override
        public void onRmsChanged(float rmsdB) {

        }

        @Override
        public void onBufferReceived(byte[] buffer) {

        }

        @Override
        public void onEndOfSpeech() {

        }

        @Override
        public void onError(int error) {

        }

        @Override
        public void onResults(Bundle results) {

        }

        @Override
        public void onPartialResults(Bundle partialResults) {

        }

        @Override
        public void onEvent(int eventType, Bundle params) {

        }
    });
    return START_STICKY;
}
 

Комментарии:

1. Вы имеете в виду, когда телефон выключен (выключен) или приложение закрыто?

2. Когда экран выключен и когда пользователь закрывает приложение, а не когда телефон выключен.

3. Вы можете использовать фоновую службу; взгляните на это и на это .

4. У меня есть служба распознавания речи, и она будет работать в фоновом режиме, однако API распознавания речи остановится сам по себе, как только приложение будет закрыто. Есть ли что-то, чего мне не хватает в API, что мешает ему работать в фоновом режиме?