根据Android中源码修改使用Google语音识别,开始识别后每次识别不用重新点击开始。

来源:互联网 发布:sql 合计列字段 编辑:程序博客网 时间:2024/06/06 18:53

Android源码目录 “/android/packages/inputmethods/LatinIME/java/src/com/android/inputmethod/deprecated/voice”中

VoiceInput.java、SoundIndicator.java、RecognitionView.java。

SoundIndicator.java是一个话筒图片更具说话的声音大小显示不同

RecognitionView.java是语音识别界面

VoiceInput.java中有设置监听语音识别的服务,在不同识别状态下RecognitionView的显示


创建一个新工程SpeachRecognition

将RecognitionView.java和SoundIndicator.java复制到工程中。将需要的布局文件Value值和其他资源文件也一并复制到工程中。同时去掉一些不必要的资源文件比如识别界面中不同识别状态的背景色,并修改以上中用到的代码。

最后就是设置语音识别服务和监听识别,主要代码:

语音识别Listener

    private class ImeRecognitionListener implements RecognitionListener    {        // Waveform data        final ByteArrayOutputStream mWaveBuffer = new ByteArrayOutputStream();        int mSpeechStart;        @Override        public void onReadyForSpeech(Bundle noiseParams)        {            mRecognitionView.showListening();        }        @Override        public void onBeginningOfSpeech()        {            mSpeechStart = mWaveBuffer.size();        }        @Override        public void onRmsChanged(float rmsdB)        {            mRecognitionView.updateVoiceMeter(rmsdB);        }        @Override        public void onBufferReceived(byte[] buf)        {            try {                mWaveBuffer.write(buf);            } catch (IOException e) {                // ignore.            }        }        @Override        public void onEndOfSpeech()        {            mState = WORKING;            mRecognitionView.showWorking(mWaveBuffer, mSpeechStart, mWaveBuffer.size());        }        @Override        public void onError(int errorType)        {            mState = ERROR;            switch (errorType) {                case SpeechRecognizer.ERROR_AUDIO:                    // mISpeechRecognize.setRecognizeResult("录音出错");                    Log.d("error", "录音出错");                    break;                case SpeechRecognizer.ERROR_CLIENT:                    // mISpeechRecognize.setRecognizeResult("客户端错误");                    Log.d("error", "客户端错误");                    break;                case SpeechRecognizer.ERROR_INSUFFICIENT_PERMISSIONS:                    // mISpeechRecognize.setRecognizeResult("权限不足");                    Log.d("error", "权限不足");                    break;                case SpeechRecognizer.ERROR_NETWORK:                    // mISpeechRecognize.setRecognizeResult("网络连接错误");                    Log.d("error", "网络连接错误");                    break;                case SpeechRecognizer.ERROR_NETWORK_TIMEOUT:                    // mISpeechRecognize.setRecognizeResult("网络连接超时");                    Log.d("error", "网络连接超时");                    break;                case SpeechRecognizer.ERROR_NO_MATCH:                    // mISpeechRecognize.setRecognizeResult("无法识别");                    Log.d("error", "无法识别");                    break;                case SpeechRecognizer.ERROR_RECOGNIZER_BUSY:                    // mISpeechRecognize.setRecognizeResult("服务繁忙");                    Log.d("error", "服务繁忙");                    break;                case SpeechRecognizer.ERROR_SERVER:                    // mISpeechRecognize.setRecognizeResult("服务器错误");                    Log.d("error", "服务器错误");                    break;                case SpeechRecognizer.ERROR_SPEECH_TIMEOUT:                    // mISpeechRecognize.setRecognizeResult("没有语音输入");                    Log.d("error", "没有语音输入");                    break;            }            destroy();            startListening();        }        @Override        public void onResults(Bundle resultsBundle)        {            List<String> results = resultsBundle                    .getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION);            // VS Market update is needed for IME froyo clients to access the alternatesBundle            mState = DEFAULT;            mISpeechRecognize.setRecognizeResult(results.get(0));            destroy();            startListening();        }        @Override        public void onPartialResults(final Bundle partialResults)        {        }        @Override        public void onEvent(int eventType, Bundle params)        {        }    }

开始监听:

    private void startListening()    {        mRecognitionListener = new ImeRecognitionListener();        mSpeechRecognizer = SpeechRecognizer.createSpeechRecognizer(mContext);        mSpeechRecognizer.setRecognitionListener(mRecognitionListener);        mState = LISTENING;        mRecognitionView.showInitializing();        Intent intent = makeIntent();        intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, "");        intent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE, "something");        mSpeechRecognizer.startListening(intent);    }

停止监听:

    public void stopListening()    {        mSpeechRecognizer.stopListening();        mRecognitionView.showInitializing();    }

获取监听服务Intent

    private static Intent makeIntent()    {        Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);        if (Build.VERSION.RELEASE.equals("1.5")) {            intent = intent.setClassName("com.google.android.voiceservice",                    "com.google.android.voiceservice.IMERecognitionService");        } else {            intent = intent.setClassName("com.google.android.voicesearch",                    "com.google.android.voicesearch.RecognitionService");        }        return intent;    }

要让程序正常运行还需要安装google提供的VoiceSearch.apk

结果图:

    

    


下载:http://download.csdn.net/detail/hazard88/7408803

0 0
原创粉丝点击