Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/197.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 带单词识别的SpeechRecognitionService_Java_Android_Android Service_Android Speech Api - Fatal编程技术网

Java 带单词识别的SpeechRecognitionService

Java 带单词识别的SpeechRecognitionService,java,android,android-service,android-speech-api,Java,Android,Android Service,Android Speech Api,我想题目不清楚。在我的项目中,我想要一个在后台运行的服务,当用户说“hello phone”或一些单词/短语时,我的应用程序开始识别声音。事实上,它“工作”,但不是在正确的方式。。。我有一个服务,该服务检测语音 public class SpeechActivationService extends Service { protected AudioManager mAudioManager; protected SpeechRecognizer mSpeechRecognizer;

我想题目不清楚。在我的项目中,我想要一个在后台运行的服务,当用户说“hello phone”或一些单词/短语时,我的应用程序开始识别声音。事实上,它“工作”,但不是在正确的方式。。。我有一个服务,该服务检测语音

public class SpeechActivationService extends Service
    {
protected AudioManager mAudioManager; 
protected SpeechRecognizer mSpeechRecognizer;
protected Intent mSpeechRecognizerIntent;
protected final Messenger mServerMessenger = new Messenger(new IncomingHandler(this));
protected boolean mIsListening;
protected volatile boolean mIsCountDownOn;

static String TAG = "Icaro";

static final int MSG_RECOGNIZER_START_LISTENING = 1;
static final int MSG_RECOGNIZER_CANCEL = 2;

private int mBindFlag;
private Messenger mServiceMessenger;

@Override
public void onCreate()
{
    super.onCreate();
    mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE); 
    mSpeechRecognizer = SpeechRecognizer.createSpeechRecognizer(this);
    mSpeechRecognizer.setRecognitionListener(new SpeechRecognitionListener());
    mSpeechRecognizerIntent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
    mSpeechRecognizerIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,
                                     RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
    mSpeechRecognizerIntent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE,
                                     this.getPackageName());

    //mSpeechRecognizer.startListening(mSpeechRecognizerIntent);
}

protected static class IncomingHandler extends Handler
{
    private WeakReference<SpeechActivationService> mtarget;

    IncomingHandler(SpeechActivationService target)
    {
        mtarget = new WeakReference<SpeechActivationService>(target);
    }


    @Override
    public void handleMessage(Message msg)
    {
        final SpeechActivationService target = mtarget.get();

        switch (msg.what)
        {
            case MSG_RECOGNIZER_START_LISTENING:

                if (Build.VERSION.SDK_INT >= 16);//Build.VERSION_CODES.JELLY_BEAN)
                {
                    // turn off beep sound  
                    target.mAudioManager.setStreamMute(AudioManager.STREAM_SYSTEM, true);
                }
                 if (!target.mIsListening)
                 {
                     target.mSpeechRecognizer.startListening(target.mSpeechRecognizerIntent);
                     target.mIsListening = true;
                    Log.d(TAG, "message start listening"); //$NON-NLS-1$
                 }
                 break;

             case MSG_RECOGNIZER_CANCEL:
                  target.mSpeechRecognizer.cancel();
                  target.mIsListening = false;
                  Log.d(TAG, "message canceled recognizer"); //$NON-NLS-1$
                  break;
         }
   } 
} 

// Count down timer for Jelly Bean work around
protected CountDownTimer mNoSpeechCountDown = new CountDownTimer(5000, 5000)
{

    @Override
    public void onTick(long millisUntilFinished)
    {
        // TODO Auto-generated method stub

    }

    @Override
    public void onFinish()
    {
        mIsCountDownOn = false;
        Message message = Message.obtain(null, MSG_RECOGNIZER_CANCEL);
        try
        {
            mServerMessenger.send(message);
            message = Message.obtain(null, MSG_RECOGNIZER_START_LISTENING);
            mServerMessenger.send(message);
        }
        catch (RemoteException e)
        {

        }
    }
};

@Override
public int onStartCommand (Intent intent, int flags, int startId) 
{
    //mSpeechRecognizer.startListening(mSpeechRecognizerIntent);
    try
    {
        Message msg = new Message();
        msg.what = MSG_RECOGNIZER_START_LISTENING; 
        mServerMessenger.send(msg);
    }
    catch (RemoteException e)
    {

    }
    return  START_NOT_STICKY;
}

@Override
public void onDestroy()
{
    super.onDestroy();

    if (mIsCountDownOn)
    {
        mNoSpeechCountDown.cancel();
    }
    if (mSpeechRecognizer != null)
    {
        mSpeechRecognizer.destroy();
    }
}

protected class SpeechRecognitionListener implements RecognitionListener
{

    @Override
    public void onBeginningOfSpeech()
    {
        // speech input will be processed, so there is no need for count down anymore
        if (mIsCountDownOn)
        {
            mIsCountDownOn = false;
            mNoSpeechCountDown.cancel();
        }               
        Log.d(TAG, "onBeginingOfSpeech"); //$NON-NLS-1$
    }

    @Override
    public void onBufferReceived(byte[] buffer)
    {
        String sTest = "";
    }

    @Override
    public void onEndOfSpeech()
    {
        Log.d("TESTING: SPEECH SERVICE", "onEndOfSpeech"); //$NON-NLS-1$
     }

    @Override
    public void onError(int error)
    {
        if (mIsCountDownOn)
        {
            mIsCountDownOn = false;
            mNoSpeechCountDown.cancel();
        }
         Message message = Message.obtain(null, MSG_RECOGNIZER_START_LISTENING);
         try
         {
             mIsListening = false;   
             mServerMessenger.send(message);
         }
         catch (RemoteException e)
         {

         }
         Log.d(TAG, "error = " + error); //$NON-NLS-1$
    }

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

    }

    @Override
    public void onPartialResults(Bundle partialResults)
    {

    }

    @Override
    public void onReadyForSpeech(Bundle params)
    {
        if (Build.VERSION.SDK_INT >= 16);//Build.VERSION_CODES.JELLY_BEAN)
        {
            mIsCountDownOn = true;
            mNoSpeechCountDown.start();
            mAudioManager.setStreamMute(AudioManager.STREAM_SYSTEM, false);
        }
        Log.d("TESTING: SPEECH SERVICE", "onReadyForSpeech"); //$NON-NLS-1$
    }

    @Override
    public void onResults(Bundle results)
    {
        ArrayList<String> data = results.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION);
        Log.d(TAG, (String) data.get(0));

        //mSpeechRecognizer.startListening(mSpeechRecognizerIntent);

        mIsListening = false;
        Message message = Message.obtain(null, MSG_RECOGNIZER_START_LISTENING);
        try
        {
               mServerMessenger.send(message);
        }
        catch (RemoteException e)
        {

        }

        Log.d(TAG, "onResults"); //$NON-NLS-1$
    }

    @Override
    public void onRmsChanged(float rmsdB)
    {

    }
}

@Override
public IBinder onBind(Intent arg0) {
    // TODO Auto-generated method stub
    return null;
}
}
它检测到语音输入…而且太多!!!每次它检测到什么东西,它就是一个“bip”。太多的bips!!这很令人沮丧。。我只想当我说“hello phone”或“start”或某个特定的词时它才开始!!我试着看这个,但实际上我不知道如何使用这个库。我试着看这个问题,但我不太明白我该怎么办。。无论如何,我已经导入了
gast
库。。我只需要知道如何使用它。有人能一步一步地帮我吗?谢谢

使用setStreamSolo(AudioManager.STREAM\u VOICE\u CALL,true)代替setStreamMute。记住添加setStreamSolo(AudioManager.STREAM\u VOICE\u CALL,false),以防MSG\u识别器\u取消

Intent i = new Intent(context, SpeechActivationService.class);
startService(i);