前言

在现有的软件的搜索框中基本上都会加上语音搜索的图标,以方便用户输入.我们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语音搜索的更多相关文章

  1. 将语音搜索集成到Google Now中

    原文标题:Use Voice Search to integrate with Google Now 原文链接:http://antonioleiva.com/voice_search_google_ ...

  2. Android语音播报、后台播报、语音识别

    Android语音播报.后台播报.语音识别 本文介绍使用讯飞语音实现语音播报.语音识别功能. 讯飞开放平台:http://www.xfyun.cn/index.php/default/index 程序 ...

  3. 3D语音天气球(源码分享)——在Unity中使用Android语音服务

    转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! 开篇废话: 这个项目准备分四部分介绍: 一:创建可旋转的"3D球":3 ...

  4. android浮动搜索框

    android浮动搜索框的配置比较繁琐,需要配置好xml文件才能实现onSearchRequest()方法. 1.配置搜索的XML配置文件​,新建文件searchable.xml,保存在res/xml ...

  5. 淘宝语音搜索的实现——html5

    作为一个专业的淘宝控,不知道从什么时候开始发现淘宝上居然还有语音搜索,好吧,因为好奇心作祟还是想一探究竟.不过我想仔细一点的人,都会发现在只有在webkit内核的浏览器上有,原因是它只支持webkit ...

  6. Android 系统搜索框(有浏览记录)

    实现Android 系统搜索框(有浏览记录),先看下效果: 一.配置搜索描述文件  要在res中的xml文件加创建sreachable.xml,内容如下: <?xml version=" ...

  7. 实时Android语音对讲系统架构

    本文属于Android局域网内的语音对讲项目系列,<通过UDP广播实现Android局域网Peer Discovering>实现了局域网内的广播及多播通信,本文将重点说明系统架构,音频信号 ...

  8. 改进Android语音对讲系统的方法

    本文属于Android局域网内的语音对讲项目系列,<实时Android语音对讲系统架构>阐述了局域网内Android语音对讲功能的框架,本文在此基础上进行了优化,包括音频的录制.播放,通信 ...

  9. ---- 关于Android蓝牙搜索到设备的图标显示和设备过滤

    根据: https://www.douban.com/note/637446089/http://bbs.16rd.com/blog-23795-3446.html 以下摘自原文: (Android主 ...

随机推荐

  1. python中隐式的内存共享

    在python中,基本上使用的是引用,那么就会造成一个隐式的内存共享,特别是在容器对象中,例如list,dictionary 对于不可变对象,是不会造成隐式的内存共享情况,如下所示: >> ...

  2. java 开发环境

    jdk:包括jre,自己下载即可. 客户端只需安装jre即可. 安装路径:C:\jdk7.0\jdk1.7.0_25\bin (适时更改) 环境变量是从前往后找 测试成功:cmd      java ...

  3. 【一段日子荟萃】where should I go.

    当<UNIX环境高级编程>和<鸟哥的私房菜>到我的桌头的时候,我忽然产生了厌倦的心. NO,我不是想做这个,我不是想学习这个操作系统的结构和接口. 我想些一个操作系统,更一般的 ...

  4. IE 兼容性写法

    1. 条件注释语句 <!--[if !IE]><!--> 除IE外都可识别 <!--<![endif]--> <!--[if IE]> 所有的IE ...

  5. erlang代码片段

    转载自http://blog.csdn.net/sw2wolf/article/details/6797708 .列表操作 lists:foreach(fun(X) -> io:format(& ...

  6. Who is the best at Dataset X?

    推荐一个关于分类.目标检测.姿态估计的数据集收藏的网页. Did you ever want to quickly learn?which paper provides the best result ...

  7. dom 拖拽div

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  8. 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到/ ...

  9. Hadoop应用开发实战案例 第2周

    比如,封面,是一网页,可以看出用户在此网页上,鼠标呈现F形状. 海量Web日志分析 用Hadoop提取KPI统计指标 更详细原文博客:http://blog.fens.me/hadoop-mapred ...

  10. HDU 1525 Euclid's Game (博弈)

    Euclid's Game Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tot ...