如何在后台一直运行监听和识别服务android



我想开发一个应用程序,每当关键字说要做某事时,都要向用户报告
为此,我使用了vosk-api
我声明了IntentService。目前,当用户点击底部导航中的swichbotton时,服务将停止。我怎么能一直在后台运行服务,比如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 && 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();
}
}

}

谢谢!

我通过创建一个实现RecognitionListener的前台服务来实现这一点。但我是从vosk演示应用程序开始的。

我在服务中的onCreate方法内部调用initModel()。在initModel方法的回调中,我调用了与演示应用程序中相同的recognizeMicrophone方法。

最新更新