之前说Baymax 的UI设计,现在UI设计好了,我们得开始讲一讲识别方面的事了。这里我们需要用到百度的语音识别技术,大家可以先上百度语音开放平台,上面有开发手册和demo帮助大家学习。贴上连接:http://yuyin.baidu.com/

前面注册百度开发者的那些步骤我就跳过了,基本上开发手册写的很详细了。这里我就不再多说。

首先是注册可能需要用到的权限

<span style="font-size:14px;"><uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /></span>
 然后是填上自己在百度申请到的秘钥
<!--请填写应用实际的APP_ID --><meta-dataandroid:name="com.baidu.speech.APP_ID"android:value="your app id"/>
<!--请填写应用实际的API_KEY -->
<meta-dataandroid:name="com.baidu.speech.API_KEY"android:value="your api key"/>
<!--请填写应用实际的SECRET_KEY -->
<meta-dataandroid:name="com.baidu.speech.SECRET_KEY"android:value="your api secret"/>

导入所需资源包之后(在百度语音开发平台官网可以下载),就要开始调用了

首先是创建识别器及识别器监听事件

<span style="font-size:18px;"> //创建识别器
speechRecognizer=SpeechRecognizer.createSpeechRecognizer(this,new ComponentName(this,VoiceRecognitionService.class));//识别器监听事件
speechRecognizer.setRecognitionListener(this);
</span>

监听器需要重写的方法有如下这些,我加以详细说明,开发者根据开发需要重写内容即可

@Overridepublic void onReadyForSpeech(Bundle params) {//准备监听时事件}@Overridepublic void onBeginningOfSpeech() {//开始监听事件}@Overridepublic void onRmsChanged(float rmsdB) {//声音级别更改时调用的方法}@Overridepublic void onBufferReceived(byte[] buffer) {//反馈给用户捕获的音频}@Overridepublic void onEndOfSpeech() {//结束说话时调用此方法}@Overridepublic void onError(int error) {//错误时事件}@Overridepublic void onResults(Bundle results) {//识别结果事件,识别结果为results,需要进行解析}@Overridepublic void onPartialResults(Bundle partialResults) {//这个不太懂}@Overridepublic void onEvent(int eventType, Bundle params) {//}

以上是我个人的理解,不是很正确,建议大家看一下开发文档,里面有详细的解释,我这里只是做点简单的介绍。里面最重要的方法就是onResults(Bundle results)识别结果就是在这里面处理的,有了识别结果,我们就可以做出各种“动作”了,像什么开灯关灯,打开相机,拍照什么的都可以。只要你愿意,想让手机关机我想也是可以的。

关于识别监听器就讲完了,没什么好说的,接下来讲识别的参数问题。

百度语音识别SDK需要设置的参数不少,当然也可以全都默认,个人觉得挺好的,可以适应不同环境做识别,提高准确率。这里也是大概讲一下哪些参数可能要用到

<span style="font-size:14px;">①提示音(默认是静音)
intent.putExtra(Constant.EXTRA_SOUND_START, R.raw.bdspeech_recognition_start);intent.putExtra(Constant.EXTRA_SOUND_END, R.raw.bdspeech_speech_end);intent.putExtra(Constant.EXTRA_SOUND_SUCCESS, R.raw.bdspeech_recognition_success);intent.putExtra(Constant.EXTRA_SOUND_ERROR, R.raw.bdspeech_recognition_error);intent.putExtra(Constant.EXTRA_SOUND_CANCEL, R.raw.bdspeech_recognition_cancel);②是否保存录音(默认无)
intent.putExtra(Constant.EXTRA_OUTFILE, "sdcard/outfile.pcm");
③设置采样率(8000为2g/3g网络适用,16000为3g/4g网络)
intent.putExtra(Constant.EXTRA_SAMPLE, 8000/16000);④设置识别语言(可识别普通话/粤语/四川话/英语)
intent.putExtra(Constant.EXTRA_LANGUAGE,      xxx);⑤是否进行语义解析(默认否)
intent.putExtra(Constant.EXTRA_NLU,    );⑥VAD,选择输入关键字或输入长句(默认关键字)
intent.putExtra(Constant.EXTRA_VAD,   );</span>

其中有一个很重要的参数叫做“垂直领域”,当时我看了很久都没搞懂是什么,经过后来的实践,我觉得可能是优先识别领域吧。里面可以设置应用、联系人、音乐、输入、视频、地图、网页、电话、联系人……等等等等(好吧我到现在还是不太明白垂直领域的作用,还望哪位大神可以告知一下)。垂直领域的设置可以提高语言识别的准确率,设置的越详细越多就越准确。除此之外,垂直领域里面某些项是支持离线识别的。但据说离线识别不太妥(百度方面说是SDK包的一个BUG,说近期会出一个新的包出来,但是从去年9月份到现在一直有人反映这个问题,百度给出的回答还是这样,估计是bug没解决还是怎样。)总之大家想用离线识别的话就可以看看百度提供的demo,里面就可以。不过有些网友反映还是不可以23333333

还是那句话,大家要是怕麻烦,只是想试试百度语音识别的效果,那就不用去该参数,默认的就可以了。

设置了参数,可以有两种方式进行识别,一种是有API,一种是无API的,具体是什么区别呢?我说你就明白了,无API会调出“百度定制”的dialog(别想了,你改不了),有API就没有那个dialog了,而且识别是一个字一个字识别,当你结束说话时识别结束。论识别准确率嘛,个人觉得是无api比较准确,要好看一点嘛,不想看到百度dialog的话,那就是有api比较妥了。但是无所谓了,能识别出来就是好的。

两种识别调用方式分别如下:

<span style="font-size:18px;">有api:
speechRecognizer.startListening(intent);
无api:
intent.setAction("com.baidu.action.RECOGNIZE_SPEECH");
startActivityForResult(intent, REQUEST_UI);</span>

有api识别结果的处理就是上面说到的onResult,具体要进行什么操作就看个位看官的了,然后无API的话要重写一下onActivityResult方法然后在里面调用onResult。这就是全部的识别流程了,贴出效果图

   

package chmel.android.baymax;import android.app.Activity;
import android.app.AlertDialog;
import android.content.ComponentName;
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.provider.Contacts;
import android.provider.ContactsContract;
import android.provider.MediaStore;
import android.speech.RecognitionListener;
import android.speech.SpeechRecognizer;
import android.util.Log;
import android.view.View;
import android.view.WindowManager;
import android.widget.ImageButton;
import android.widget.TextView;
import android.hardware.Camera;
import android.hardware.Camera.Parameters;
import android.widget.Toast;import com.baidu.speech.VoiceRecognitionService;import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;import java.util.ArrayList;
import java.util.Collections;
import java.util.List;/*** Created by xuan on 2016/3/10 0010.*/
public class Mainactivity extends Activity implements RecognitionListener {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER);context=this;textResult=(TextView)findViewById(R.id.textResult );textLog=(TextView)findViewById(R.id.textLog);button=(ImageButton)findViewById(R.id.btn);//创建识别器speechRecognizer=SpeechRecognizer.createSpeechRecognizer(this,new ComponentName(this,VoiceRecognitionService.class));//识别器监听事件speechRecognizer.setRecognitionListener(this);//点击“开始”按钮事件button.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {start();}});}//start()调用百度语音识别技术进行语音识别private void start() {Intent intent = new Intent();init(intent);SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this);{String args = sp.getString("args", "");if (null != args) {intent.putExtra("args", args);}}boolean api = sp.getBoolean("api", false);if (api) {speechEndTime = -1;speechRecognizer.startListening(intent);} else {intent.setAction("com.baidu.action.RECOGNIZE_SPEECH");startActivityForResult(intent, REQUEST_UI);}textResult.setText("");textLog.setText("");}public void init(Intent intent){intent.putExtra(Constant.EXTRA_SOUND_START, R.raw.bdspeech_recognition_start);intent.putExtra(Constant.EXTRA_SOUND_END, R.raw.bdspeech_speech_end);intent.putExtra(Constant.EXTRA_SOUND_SUCCESS, R.raw.bdspeech_recognition_success);intent.putExtra(Constant.EXTRA_SOUND_ERROR, R.raw.bdspeech_recognition_error);intent.putExtra(Constant.EXTRA_SOUND_CANCEL, R.raw.bdspeech_recognition_cancel);intent.putExtra(Constant.EXTRA_OFFLINE_SLOT_DATA, buildTestSlotData());}//导入离线数据private String buildTestSlotData() {JSONObject slotData = new JSONObject();JSONArray name = new JSONArray().put("张三").put("李四").put("王五");JSONArray app = new JSONArray().put("QQ").put("地图").put("微信").put("支付宝").put("知乎").put("网易云音乐").put("美团").put("饿了么").put("京东").put("微博").put("去哪儿").put("贴吧");JSONArray usercommand = new JSONArray().put("关灯").put("开灯").put("相机").put("拍照").put("联系人").put("通信录");try {slotData.put(Constant.EXTRA_OFFLINE_SLOT_NAME, name);slotData.put(Constant.EXTRA_OFFLINE_SLOT_APP, app);slotData.put(Constant.EXTRA_OFFLINE_SLOT_USERCOMMAND, usercommand);} catch (JSONException e) {}return slotData.toString();}//识别结束结果返回@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);if (resultCode == RESULT_OK) {onResults(data.getExtras());}}@Overridepublic void onReadyForSpeech(Bundle params) {}@Overridepublic void onBeginningOfSpeech() {}@Overridepublic void onRmsChanged(float rmsdB) {}@Overridepublic void onBufferReceived(byte[] buffer) {}@Overridepublic void onEndOfSpeech() {print("说完了");}@Overridepublic void onError(int error) {}@Overridepublic void onResults(Bundle results) {long end2finish = System.currentTimeMillis() - speechEndTime;ArrayList<String> nbest = results.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION);
//        print("识别成功:" + Arrays.toString(nbest.toArray(new String[nbest.size()])));String strEnd2Finish = "";if (end2finish < 60 * 1000) {strEnd2Finish = "(waited " + end2finish + "ms)";}textResult.setText(nbest.get(0) + strEnd2Finish);//对识别结果进行分析recognize(nbest);}@Overridepublic void onPartialResults(Bundle partialResults) {}@Overridepublic void onEvent(int eventType, Bundle params) {}@Overrideprotected void onDestroy() {speechRecognizer.destroy();super.onDestroy();}//对识别结果进行分析public void recognize(ArrayList<String> nbest) {print("");int bool=0;for(int i=0;i<nbest.size();i++){String temp=nbest.get(i);if(openApp(temp)){bool++;break;}else if(temp.contains("开")&&temp.contains("灯")){openCloseLight(0);bool++;break;}else if(temp.contains("关")&&temp.contains("灯")){openCloseLight(1);bool++;break;}else if(temp.contains("相机")||temp.contains("拍照")||temp.contains("照相")){bool++;openCamera();break;} else if(temp.contains("电")&&temp.contains("话")){bool++;openTel();break;}else if(temp.contains("联系人")){bool++;openContacts();break;}else if(temp.contains("短信")||temp.contains("信息")){bool++;openMess();break;}else if(temp.contains("搜索")){bool++;String keyword=temp.substring(2);search(keyword);break;}else if(temp.contains("退下") || temp.contains("下去")) {finish();break;}}if(bool==0){print("抱歉我没有听清楚");}}//打印日记public void print(String msg) {textLog.setText(msg);Log.d(TAG, "----" + msg);}//打开相机public void openCamera(){if(!isOpen) {print("马上为您打开相机");Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);startActivity(intent);}else{print("相机打开失败");}}//打开短信界面public void openMess(){print("马上为您打开短信");Intent intent = new Intent(Intent.ACTION_VIEW);intent.setType("vnd.android-dir/mms-sms");startActivity(intent);}//打开联系人界面public void openContacts(){print("马上为您打开联系人");Intent intent = new Intent();intent.setAction(Intent.ACTION_VIEW);intent.setData(Contacts.People.CONTENT_URI);startActivity(intent);}}

Baymax (Android版的Siri)之百度语音识别SDK调用相关推荐

  1. Android开发学习之使用百度语音识别SDK实现语音识别(上)

    作为移动互联网杀手级的交互方式,语音识别从问世以来就一直备受人们的关注,从IOS的Siri到国内的讯飞语音,语音识别技术在移动开发领域是最为充满前景和希望的技术.Android作为一个移动操作系统,其 ...

  2. Baymax (Android版的Siri)之UI设计

    写于2016/3/17日,学习了那么久,这几天一直想着找一个平台来托管我的代码,然后也想着和大家分析我的Android 开发心得,故将这次开发的过程贴上来,没人看就给自己看咯. Baymax是一款基于 ...

  3. 语音识别sdk for ios android,iOS百度语音识别SDK 让你的APP不在单调

    大家好,我是RickyWei. 语音识别有很多种,今天给大家带来的是,百度语音识别 . 一. 引入编译需要的Framework 1.BDVRClient使用了录音和播放功能,因此需要在Xcode工程中 ...

  4. android开发游记:集成百度定位SDK进行实时定位 获取当前城市地理信息

    定位功能在app开发中很常用,大多数企业都是不具备定位资质的,所有一般是通过接入第三方的sdk来进行定位,比较熟悉的有如:百度.高德.谷歌.腾讯等.而国内比较地图策划比较成熟的主要是百度和高德,这里就 ...

  5. python调用离线百度语音识别_python调用百度语音识别api

    最近在处理语音检索相关的事. 其中用到语音识别,调用的是讯飞与百度的api,前者使用js是实现,后者用python3实现(因为自己使用python) 环境: python3.5 centos 7 流程 ...

  6. Unity接入百度语音识别SDK windows平台

    1.先注册百度开放平台的账号,然后按文档申请试用资格及创建应用:https://ai.baidu.com/ai-doc/SPEECH/qknh9i8ed Windows平台选择"不需要&qu ...

  7. 高通ar android,Android版高通AR Vuforia QCAR SDK学习笔记

    望集齐大家的力量,将AR(增强现实)发展壮大. PS:不是我不加链接,是我加了超链接,没有用啊,难道是我权限不够,只得自己复制.粘贴了 1.下载高通SDK(高通刚刚才更新开发中心地址,版本更新为v2. ...

  8. Android实战:借助百度语音识别SDK实现简单的语音识别

    前言: 此demo阉割了离线功能,只支持在线识别,并删除了根据代码报错参数纠错的部分,整个部分自己写的代码也就六七十行左右,显得非常简洁明了,很多部分都写了备注,希望大家能够获得些帮助. 准备工作 首 ...

  9. Android的清单文件添加百度地图SDK

    一.http://lbsyun.baidu.com/登录自己百度帐号 二.开发文档,Android地图SDK 三.创建应用 四.填写信息 五.复制并替换KEY

最新文章

  1. 为什么远程桌面不能复制?解决方法
  2. 【编译原理】递归下降的预测分析(真の能看懂~!)
  3. Spring Boot使用缓存功能
  4. ML_Multiple Linear Regression
  5. 请编写一个程序,用于统计字符串中每个字母的出现次数(字母忽略大小写),统计出结果后,请按照{'a':3,'b':2}的格式输出。
  6. VS里的新建模板(自动添加版本注释)
  7. su: Authentication failure 的解决方案
  8. iOS 刘海屏 隐藏横条 home键
  9. 【网络安全】DRIDEX木马巧用VEH混淆API调用流程
  10. A. Diverse Team
  11. php 模态框效果,超酷的模态框效果 - Nifty
  12. 大数据技术有什么特点
  13. 有钱人的心肠更硬吗?
  14. Activity启动流程源码分析-浅析生命周期函数
  15. 图书音像全场满100返100
  16. MySQL:使用SQL语句删除所有索引
  17. 语音识别工具箱综述和产品介绍
  18. 我的世界服务器没有显示物品ID,我的世界物品ID不显示怎么办
  19. 百度Ai studio上运行pytorch和tensorflow(转载)
  20. 群联PS2251-03东芝MLC量产成功教程(东芝16G)

热门文章

  1. CTF解题-web类
  2. 观后感之《我们与恶的距离》
  3. 相机镜头焦距和拍摄物体高度表
  4. 人人网Httpclient
  5. 2018Java面试
  6. 前后端分离项目,vue+uni-app+php+mysql外卖点餐小程序系统设计与实现
  7. 金融IC卡行业应用的发展--困境(1)
  8. android one手机流畅,一加9系列系统评测:功能丰富+稳定流畅,或是目前最佳安卓系统...
  9. HTML编码规范 - (WEB前端命名规范)
  10. 从软件开发到开淘宝店铺