#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, что мешает ему работать в фоновом режиме?