根据Android中源码修改使用Google语音识别,开始识别后每次识别不用重新点击开始。
2014-05-27 10:57
471 查看
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
开始监听:
停止监听:
获取监听服务Intent
要让程序正常运行还需要安装google提供的VoiceSearch.apk
结果图:
下载:http://download.csdn.net/detail/hazard88/7408803
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
相关文章推荐
- 快速使用Android静态人脸识别(附源码)
- Android源码解析--Material Design之水波纹点击效果RippleEffect使用
- Android对apk源码的修改--反编译+源码修改+重新打包+签名【附HelloWorld的修改实例】
- 微信Android SDK反编译还原源码 进行修改重新编译
- 使用最广泛的Android爬虫指示器PagerSlidingTabStrip遇到的相关问题的解决,并源码修改
- 用于验证码图片识别的类(C#源码) 使用进程投票,可自动清除Alert弹出窗口,可自动换IP,ADSL用户自行修改Restart.bat中第三行内容
- Android对apk源码的修改--反编译+源码修改+重新打包+签名【附HelloWorld的修改实例】
- android 源码的m、mm、mmm编译命令的使用与重新打包android系统镜像文件。
- android下根据公司需要修改后的能正常使用的坐标校准代码
- 安卓学习笔记---Android源码解析--Material Design之水波纹点击效果RippleEffect使用
- sql 修改 某个字段值得一部分;sql使用多个如果批量更新,sql自增主键重新从1开始
- android关于每次点击图标进入应用后都会重新创建启动页的问题
- android关于每次点击图标进入应用后都会重新创建启动页的问题
- Android对apk源码的修改--反编译+源码修改+重新打包+签名【附HelloWorld的修改实例】
- Android使用ViewPager实现导航页根据情况禁止滑动以及点击切换
- Android项目-智慧北京:02(三种技术设计主页面及源码分析点击事件传递的机制及Json数据传递的使用)
- xcode修改完js lua等文件不用每次都重新编译的设置方法
- Android hibeaver修改jar源码,重新打包,备注,防忘记
- 之前使用的wifi连接不上了,每次点击连接不成功,也没法重新输入密码。
- android修改系统源码(重新编译源码)