Android语音搜索
前言
在现有的软件的搜索框中基本上都会加上语音搜索的图标,以方便用户输入.我们xxxx的搜索框其实也可以借鉴这样的输入方式,提高用户体验.
语音识别有3种方式实现①使用intent调用语音识别程序;②通过sevice的方式实现;③选用接入第3方语音识别库;
下面就这一方案技术①,③实现进行描述.
1. 使用intent调用语音识别程序
Android系统已经为我们提供了通过intent的方式来启动,在代码中只发出一个”android.speech.action.RECOGNIZE_SPEECH”的intent,就可以调用到系统中已经安装好的语音识别软件.我们只要获取返回值并显示即可.调用代码如下:
Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
intent.putExtra(RecognizerIntent.EXTRA_PROMPT, getString(R.string.hint_code));
startActivityForResult(intent, REQUEST_CODE_RECOGNITION_REQUEST);
当然,如果用户的机子没有安装相关的软件,就会报错,所以我们还需要做如下的处理之一.
1.为上面的代码段添加异常捕获并提示;
2.在调用之前判断下时候用户的机子已经安装了相关的软件,没有则把语音输入的按钮隐藏或者不可操作,判断的代码如下:
public static boolean isApkInstalled(String strIntent){
PackageManager packageManager = context.getPackageManager();
List<ResolveInfo> activities = packageManager.queryIntentActivities(new Intent(strIntent), 0);
return activities != null && !activities.isEmpty();
}
在调用之后在onActivityResult()里添加对语音输入返回的值的过滤.例如在intent中就存在结果集data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);下面示例就是显示输入结果让用户选择正确的输入值,这里是弹出对话框的方式.
if(requestCode == REQUEST_CODE_RECOGNITION_REQUEST && resultCode == RESULT_OK) {
ArrayList<String> results=data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
if(results!=null && !results.isEmpty()){
int size=results.size();
audioArray=new String[size];
results.toArray(audioArray);
for(int i=0; i<size;i++){
String str=results.get(i);
if(str!=null){
str.replaceAll(" ", "");
str.replaceAll(" ", "");
}
audioArray[i]=str;
}
showDialog(DIALOG_AUDIO);
}else{
Toast.makeText(this, R.string.hite_audio, Toast.LENGTH_SHORT).show();
}
}
2. 选用接入第3方语音识别库
上面那种是依赖于用户自己已经安装了语音输入的方式,但如果用户机子上没有的话,可以用过提示用户安装.其实更好的方式是采用接入第2,3方的语音输入来实现更可靠些. 下面介绍选用科大讯飞的语音识别库.
科大讯飞语音识别库中主要是用到RecognizerDialog,他是继承与Dialog,所以只要用过showDialog()的方式即可直接显示其输入界面.createDialog代码如下:
RecognizerDialog recognizerDialog = new RecognizerDialog(MainActivity.this, "appid=1234567");
// appid应该写从科大讯飞申请到的appid recognizerDialog.setEngine("sms", null, null);//”sms”:普通文本转写 recognizerDialog.setListener(new RecognizerDialogListener() {
@Override
public void onResults(ArrayList<RecognizerResult> results,
boolean arg1) {
StringBuffer result = new StringBuffer();
for (RecognizerResult r : results) {
result.append(r.text);
}
editText.setText(result.toString());
}
@Override
public void onEnd(SpeechError arg0) {
}
});
Android语音搜索的更多相关文章
- 将语音搜索集成到Google Now中
原文标题:Use Voice Search to integrate with Google Now 原文链接:http://antonioleiva.com/voice_search_google_ ...
- Android语音播报、后台播报、语音识别
Android语音播报.后台播报.语音识别 本文介绍使用讯飞语音实现语音播报.语音识别功能. 讯飞开放平台:http://www.xfyun.cn/index.php/default/index 程序 ...
- 3D语音天气球(源码分享)——在Unity中使用Android语音服务
转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! 开篇废话: 这个项目准备分四部分介绍: 一:创建可旋转的"3D球":3 ...
- android浮动搜索框
android浮动搜索框的配置比较繁琐,需要配置好xml文件才能实现onSearchRequest()方法. 1.配置搜索的XML配置文件,新建文件searchable.xml,保存在res/xml ...
- 淘宝语音搜索的实现——html5
作为一个专业的淘宝控,不知道从什么时候开始发现淘宝上居然还有语音搜索,好吧,因为好奇心作祟还是想一探究竟.不过我想仔细一点的人,都会发现在只有在webkit内核的浏览器上有,原因是它只支持webkit ...
- Android 系统搜索框(有浏览记录)
实现Android 系统搜索框(有浏览记录),先看下效果: 一.配置搜索描述文件 要在res中的xml文件加创建sreachable.xml,内容如下: <?xml version=" ...
- 实时Android语音对讲系统架构
本文属于Android局域网内的语音对讲项目系列,<通过UDP广播实现Android局域网Peer Discovering>实现了局域网内的广播及多播通信,本文将重点说明系统架构,音频信号 ...
- 改进Android语音对讲系统的方法
本文属于Android局域网内的语音对讲项目系列,<实时Android语音对讲系统架构>阐述了局域网内Android语音对讲功能的框架,本文在此基础上进行了优化,包括音频的录制.播放,通信 ...
- ---- 关于Android蓝牙搜索到设备的图标显示和设备过滤
根据: https://www.douban.com/note/637446089/http://bbs.16rd.com/blog-23795-3446.html 以下摘自原文: (Android主 ...
随机推荐
- python中隐式的内存共享
在python中,基本上使用的是引用,那么就会造成一个隐式的内存共享,特别是在容器对象中,例如list,dictionary 对于不可变对象,是不会造成隐式的内存共享情况,如下所示: >> ...
- java 开发环境
jdk:包括jre,自己下载即可. 客户端只需安装jre即可. 安装路径:C:\jdk7.0\jdk1.7.0_25\bin (适时更改) 环境变量是从前往后找 测试成功:cmd java ...
- 【一段日子荟萃】where should I go.
当<UNIX环境高级编程>和<鸟哥的私房菜>到我的桌头的时候,我忽然产生了厌倦的心. NO,我不是想做这个,我不是想学习这个操作系统的结构和接口. 我想些一个操作系统,更一般的 ...
- IE 兼容性写法
1. 条件注释语句 <!--[if !IE]><!--> 除IE外都可识别 <!--<![endif]--> <!--[if IE]> 所有的IE ...
- erlang代码片段
转载自http://blog.csdn.net/sw2wolf/article/details/6797708 .列表操作 lists:foreach(fun(X) -> io:format(& ...
- Who is the best at Dataset X?
推荐一个关于分类.目标检测.姿态估计的数据集收藏的网页. Did you ever want to quickly learn?which paper provides the best result ...
- dom 拖拽div
<!doctype html> <html> <head> <meta charset="utf-8"> <title> ...
- centos php php-fpm install
好记性不如烂笔头,把自己安装的步骤记录下来 1.下载php-5.2.8以及php-5.2.8-fpm-0.5.10.diff.gz,放到/usr/local/src目录 2.解压php-5.2.8到/ ...
- Hadoop应用开发实战案例 第2周
比如,封面,是一网页,可以看出用户在此网页上,鼠标呈现F形状. 海量Web日志分析 用Hadoop提取KPI统计指标 更详细原文博客:http://blog.fens.me/hadoop-mapred ...
- HDU 1525 Euclid's Game (博弈)
Euclid's Game Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tot ...