#java #android #service #speech-recognition
#java #Android #Обслуживание #распознавание речи
Вопрос:
Я хочу разрабатывать приложение, которое слушает пользователя каждый раз, когда и когда ключевое слово говорит, что что-то делает.
для этого я использовал vosk-api
Я объявляю IntentService
. в настоящее время, когда пользователь нажимает на swich botton в нижней навигации, служба останавливается. Как я могу постоянно запускать службу в фоновом режиме, например ok google
? код:
public class MainActivity extends AppCompatActivity {
private static final int PERMISSIONS_REQUEST_RECORD_AUDIO = 1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Check if user has given permission to record audio
int permissionCheck = ContextCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.RECORD_AUDIO);
if (permissionCheck != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.RECORD_AUDIO}, PERMISSIONS_REQUEST_RECORD_AUDIO);
return;
}
}
@Override
public void onRequestPermissionsResult(int requestCode,
@NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == PERMISSIONS_REQUEST_RECORD_AUDIO) {
if (grantResults.length > 0 amp;amp; grantResults[0] == PackageManager.PERMISSION_GRANTED) {
Intent intent = new Intent(this, MyIntentService.class);
startService(intent);
} else {
Log.e("MainActivity", "RECORD_AUDIO not allowed");
}
}
}
public class MyIntentService extends IntentService {
private SpeechService speechService;
private Model model;
public MyIntentService() {
super("MyIntentService");
}
@Override
protected void onHandleIntent(@Nullable Intent intent) {
initRecognizer();
speechService.addListener(new RecognitionListener() {
@Override
public void onPartialResult(String s) {
Log.d("MyIntentService", s "n");
if (s.contains("me"))
Toast.makeText(getApplicationContext(), "coollll!!", Toast.LENGTH_SHORT).show();
}
@Override
public void onResult(String s) {
Log.d("MyIntentService", s "n");
if (s.contains("me"))
Toast.makeText(getApplicationContext(), "coollll!!", Toast.LENGTH_SHORT).show();
}
@Override
public void onError(Exception e) {
Log.d("MyIntentService", "Error");
}
@Override
public void onTimeout() {
speechService.cancel();
speechService = null;
Log.d("MyIntentService", "onTimeout");
}
});
speechService.startListening();
}
public void initRecognizer(){
Assets assets;
try {
assets = new Assets(getApplicationContext());
File assetDir = assets.syncAssets();
model = new Model(assetDir.toString() "/model-android");
KaldiRecognizer rec = new KaldiRecognizer(model, 16000.0f);
speechService = new SpeechService(rec, 16000.0f);
} catch (IOException e) {
e.printStackTrace();
}
}
}
Спасибо!
Ответ №1:
Я сделал это, создав службу переднего плана, которая реализует RecognitionListener
. Но я начал с vosk
демонстрационного приложения.
Я вызываю initModel()
внутри onCreate
метода в службе. При обратном initModel
вызове метода я вызываю recognizeMicrophone
метод, который такой же, как в демонстрационном приложении.