如何将Android SpeechRecognizer作为一项服务使用



我正在尝试将Android语音识别作为一项服务运行。我可以验证是否调用了服务的onCreate()和onStart()方法,但没有调用语音识别方法的回调,尽管我已经正确设置了SpeechRecognizer对象。当语音识别是在活动中而不是在服务中完成时,它似乎可以工作。我如何使它作为一项服务发挥作用?这是一个明显的问题吗?

package net.viralpatel.android.speechtotextdemo;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import android.app.Service;
import android.content.Intent;
import android.os.Bundle;
import android.os.IBinder;
import android.speech.RecognitionListener;
import android.speech.RecognizerIntent;
import android.speech.SpeechRecognizer;
import android.util.Log;
import android.widget.Toast;
public class MyService extends Service implements RecognitionListener {
    private SpeechRecognizer speechRecognizer;
    @Override
    public IBinder onBind(Intent arg0) {
        return null;
    }
    @Override
    public void onCreate() {
        Toast.makeText(this, "My Service Created", Toast.LENGTH_LONG).show();
        Log.d("tag", "onCreate");
        speechRecognizer = SpeechRecognizer.createSpeechRecognizer(getApplicationContext());
        speechRecognizer.setRecognitionListener(this);
        Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
        intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,
                RecognizerIntent.LANGUAGE_MODEL_WEB_SEARCH);
        speechRecognizer.startListening(intent); 
    }
    @Override
    public void onDestroy() {
        Toast.makeText(this, "My Service Stopped", Toast.LENGTH_LONG).show();
        Log.d("tag", "onDestroy");
    }
    @Override
    public void onStart(Intent intent, int startid) {
        Toast.makeText(this, "My Service Started", Toast.LENGTH_LONG).show();
        Log.d("tag", "onStart");
    }
    @Override
     public void onBeginningOfSpeech() {
      Log.d("Speech", "onBeginningOfSpeech");
     }
     @Override
     public void onBufferReceived(byte[] buffer) {
      Log.d("Speech", "onBufferReceived");
     }
     @Override
     public void onEndOfSpeech() {
      Log.d("Speech", "onEndOfSpeech");
     }
     @Override
     public void onError(int error) {
      Log.d("Speech", "onError");
     }
     @Override
     public void onEvent(int eventType, Bundle params) {
      Log.d("Speech", "onEvent");
     }
     @Override
     public void onPartialResults(Bundle partialResults) {
      Log.d("Speech", "onPartialResults");
     }
     @Override
     public void onReadyForSpeech(Bundle params) {
      Log.d("Speech", "onReadyForSpeech");
     }
     @Override
     public void onResults(Bundle results) {
      Log.d("Speech", "onResults");
      ArrayList strlist = results.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION);
      for (int i = 0; i < strlist.size();i++ ) {
       Log.d("Speech", "result=" + strlist.get(i));
      }
      BufferedWriter out;
    try {
        out = new BufferedWriter(new FileWriter("mnt/sdcard/results.txt"));
//        out.write(processor.execute(strlist.get(0).toString()));
          out.write("hello world"); 
    } catch (IOException e) {
        Log.e("Speech",e.toString());
    }
     }
     @Override
     public void onRmsChanged(float rmsdB) {
      Log.d("Speech", "onRmsChanged");
     }
}

您可以这样做:

public class OpenMicService extends Service implements RecognitionListener{
    private static final int VOICE_RECOGNITION_REQUEST_CODE = 1234;
    private SpeechRecognizer speechRecognizer;
    @Nullable
    @Override
    public IBinder onBind(Intent intent) {

        return null;
    }
    @Override
    public int onStartCommand(Intent intent,int flags,int startId) {
        Toast.makeText(this,"start Service.",Toast.LENGTH_SHORT).show();
        speechRecognizer = SpeechRecognizer.createSpeechRecognizer(getApplicationContext());
        speechRecognizer.setRecognitionListener(this);
        Intent voice = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
        voice.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE, getClass()
                .getPackage().getName());
        voice.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,
                RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
        voice.putExtra(RecognizerIntent.EXTRA_MAX_RESULTS, 10);
        speechRecognizer.startListening(voice);
        return START_REDELIVER_INTENT;
    }
    @Override
    public void onDestroy() {
        super.onDestroy();
    }

    @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 results) {
        String wordStr = null;
        String[] words = null;
        String firstWord = null;
        String secondWord = null;
        ArrayList<String> matches = results
                .getStringArrayList(speechRecognizer.RESULTS_RECOGNITION);
        wordStr = matches.get(0);
        words = wordStr.split(" ");
        firstWord = words[0];
        secondWord = words[1];
        if (firstWord.equals("open")) {
            PackageManager packageManager = getPackageManager();
            List<PackageInfo> packs = packageManager
                    .getInstalledPackages(0);
            int size = packs.size();
            boolean uninstallApp = false;
            boolean exceptFlg = false;
            for (int v = 0; v < size; v++) {
                PackageInfo p = packs.get(v);
                String tmpAppName = p.applicationInfo.loadLabel(
                        packageManager).toString();
                String pname = p.packageName;
                //URL urlAddress = urlAddress.toLowerCase();
                tmpAppName = tmpAppName.toLowerCase();
                if (tmpAppName.trim().toLowerCase().equals(secondWord.trim().toLowerCase())) {
                    PackageManager pm = this.getPackageManager();
                    Intent appStartIntent = pm.getLaunchIntentForPackage(pname);
                    if (null != appStartIntent) {
                        try {
                            this.startActivity(appStartIntent);
                        } catch (Exception e) {
                        }
                    }
                }
            }
        } // end of open app code
    }
    @Override
    public void onPartialResults(Bundle bundle) {
    }
    @Override
    public void onEvent(int i,Bundle bundle) {
    }
}

我认为您需要澄清两件事,并可能为您提供解决方法。

  1. 是否已在清单中正确申报服务?我相信这是已经解决的问题。

  2. 语音识别可能无法启动服务的"onCreate"。我也做过类似的实现,但没有成功。您可以尝试将startListening(intent)放在其他方法中,并显式调用它。这对我有效。

如果有帮助,请告诉我。

最新更新