Android中谷歌语音识别应用探究

引言  

  由于为期半年的项目结束了,进入了一段“疗养”的真空期,因此有时间可以去归纳整理项目的经验,学习新的姿势与技巧,对自己技术水平也是一种提升。另外,个人懒癌症严重,为强迫自己努力学习,立了一些福来阁(比如没有写出博客女装什么的咳咳,我一定会拔旗成功的,哼),总体来说督促效果还是挺不错的。

  项目中使用的Android和linux进行客户端的开发,结合项目的实战经验,七月份写的博客内容主要围绕Android开发进行,研究的内容预定为:Android中谷歌语音搜索功能探究(开篇),app应用意外关闭后MediaPlayer进行断点播放(预计两到三章左右)

  为何选择Android谷歌语音搜索作为第一篇正式的博文?第一实现功能较为简单,代码量很小,可以为后续的文章热热身;第二语音搜索这个功能强大的,尤其是谷歌作为IT巨头,语音搜索体感非常棒,识别快而精准。谷歌的语音搜索可以广泛应用与基于LBS的Android应用程序中,调用谷歌api获取搜索结果,然后根据这个结果做自己想要的功能。

  言归正传,下面开始正式介绍谷歌的语音搜索。

谷歌语音搜索基础

  语音识别是Google在API Level3,也就是SDK1.5中引入的。根据官方的SDK的资料,语音检索的模式行为(action)有4种:

ACTION_GET_LANGUAGE_DETAILS           --->   API Level8引入

ACTION_RECOGNIZE_SPEECH                        --->   API Level3引入

ACTION_VOICE_SEARCH_HANDS_FREE                   --->   API Level16引入

ACTION_WEB_SEARCH                        --->   API Level3引入

  大致的功能为:

  ACTION_GET_LANGUAGE_DETAILS:一个广播性质的intent,用于获取meta-data, 不常用。

  ACTION_RECOGNIZE_SPEECH:起一个activity将用户所说的内容发送至语音识别器,结果将会从onActivityResult中返回。(注: 官方不再支持startActivity的方式起intent, 改为startActivityResult)。该部分是核心功能。

  ACTION_VOICE_SEARCH_HANDS_FREE:API16中新引入的功能,不常用,目的是让用户在不使用客户端的情况下也能进行语音搜索,例如处于锁屏的安全模式中。如果要想使用该模式必须在manifest中加入如下:

1 <action android:name="android.speech.action.VOICE_SEARCH_HANDS_FREE" />

  ACTION_WEB_SEARCH:通过Web网络检索来实现。

  自定义设置项(Option)主要有以下3个:

  EXTRA_LANGUAGE_MODEL:语音识别的语言设置

  EXTRA_PROMPT: 语音输入时显示的提示文字

  EXTRA_MAX_RESULTS: 语音搜索结果最大值设定

  此外需要注意一点,在没有谷歌服务的地区是不能进行谷歌语音服务的,括弧笑。而且手机不支持语音搜索的话,本地需要预先安装一个语音包:Voice_Search_2.1.4.apk, 这个版本非常老,2011年出的一直没有更新,原生态的皮肤令人怀念。如果没有在google-market中下载到,可以到如下网址下载:

  http://www.coolapk.com/apk/com.google.android.voicesearch

谷歌语音搜索的实现

  实现的方法可以概括为以下四步:

  1 起一个名为RecognizerIntent的Intent活动

  2 putExtra中填入语音搜索的常量设定

  3 startActivityResult

  4 onActivityResult等待搜索结果。

核心代码示例:

  添加一个RadiaGroup, 设置3种常用的语音搜索模式。

<RadioGroup

        android:id="@+id/search_group"

        android:orientation="vertical"

        android:layout_marginLeft="90dp"

        android:layout_width="wrap_content"

        android:layout_height="wrap_content">

        <RadioButton

            android:checked="true"

            android:text="ACTION_RECOGNIZE_SPEECH"

            android:layout_width="wrap_content"

            android:layout_height="wrap_content" />

        <RadioButton

            android:text="ACTION_WEB_SEARCH"

            android:layout_width="wrap_content"

            android:layout_height="wrap_content" />

        <RadioButton

            android:text="ACTION_VOICE_SEARCH_HANDS_FREE"

            android:layout_width="wrap_content"

            android:layout_height="wrap_content" />

    </RadioGroup>

  在MainActivity中获取RadioGroup所选的内容,代码如下

 1 private String getRecognizerMode() {
 2
 3         for (int i=0; i<radioBtn.getChildCount(); i++) {
 4
 5             RadioButton btn = (RadioButton) radioBtn.getChildAt(i);
 6
 7             if (btn.isChecked()) {
 8
 9                 if (btn.getText().equals(RecognizerIntent.ACTION_RECOGNIZE_SPEECH)) {
10
11                     return RecognizerIntent.ACTION_RECOGNIZE_SPEECH;
12
13                 } else if (btn.getText().equals(RecognizerIntent.ACTION_WEB_SEARCH)) {
14
15                     return RecognizerIntent.ACTION_WEB_SEARCH;
16
17                 } else if (btn.getText().equals(RecognizerIntent.ACTION_VOICE_SEARCH_HANDS_FREE)) {
18
19                     return RecognizerIntent.ACTION_VOICE_SEARCH_HANDS_FREE;
20
21                 }
22
23                 else {
24
25                     return null;
26
27                 }
28
29             }
30
31         }
32
33         return null;
34
35 }

  然后是点击语音按钮后,执行startVoiceRecognition这个方法起intent操作

 1 private void startVoiceRecognition(String mode) {
 2
 3         try {
 4
 5             Intent intent = new Intent(mode);
 6
 7             intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,
 8
 9                     RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
10
11             intent.putExtra(RecognizerIntent.EXTRA_PROMPT, R.string.voice_begin);
12
13             intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, "zh-HK");
14
15             startActivityForResult(intent, VOICE_RECOGNITION_REQUEST_CODE);
16
17         } catch (Exception e) {
18
19             e.printStackTrace();
20
21             Toast.makeText(this, "No Google Voice app, plz download.", Toast.LENGTH_SHORT).show();
22
23         }
24
25     }

在测试中发现,语音搜索所识别的内容依赖于机器的系统环境,如果是中文系统识别出的是中文的搜索内容,如果是日文系统的则是日文的搜索内容。RecognizerIntent.EXTRA_LANGUAGE这个属性似乎没有什么乱用。

最后是onActivityResult回调结果部分

 protected void onActivityResult(int requestCode, int resultCode, Intent data) {

        super.onActivityResult(requestCode, resultCode, data);

        Log.d("lsy", "onActivityResult --> requestCode: " + requestCode + " resultCode: " + resultCode);

        if (requestCode == VOICE_RECOGNITION_REQUEST_CODE && resultCode == RESULT_OK) {

            ArrayList<String > results = data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);

            if (results.size() > 0) {

                String result = results.get(0).toString().trim();

                if (null != result && result.length() > 0) {

                    searchResult.setText(result);

//                    获取所有检索结果

//                    for (String str : results) {

//                        searchResult.append(str + "/n");

//                    }

                } else {

                    Toast.makeText(this, "Voice Content Fail", Toast.LENGTH_SHORT).show();

                }

            } else {

                Log.d("lsy", "onActivityResult --> Voice Content Fail");

                Toast.makeText(this, "Voice Content Fail", Toast.LENGTH_SHORT).show();

            }

        }

    }

所有搜索的结果保存在一个ArrayList的列表中,第一个数据是匹配值最高,代码中因为需要拿最匹配的值去做地图搜索才会选择第一个数据。注释部分可以打印出所有满足搜索条件的值。

总结

谷歌的语音搜索可以帮助我们实现在LBS类应用中进行语音定位,其搜索精度高,速度快,只是不可描述的存在限制了这个好用的功能,很是可惜。后续基于谷歌语音开发的内容可以包括:历史语音搜索记录、语音联想功能、与自主开发导航软件的协同工作等,由于时间仓促没有来的及实现,有兴趣的朋友可以实验下。

本文对网上关于谷歌语音搜索的文章进行总结和部分拓展,做了点微小的贡献,甚是惭愧。

参考博文

http://blog.csdn.net/h7870181/article/details/11151773

http://blog.csdn.net/gumanren/article/details/6771265

时间: 2024-10-27 14:21:11

Android中谷歌语音识别应用探究的相关文章

[转]Android中直播视频技术探究之---摄像头Camera视频源数据采集解析

http://blog.csdn.net/jiangwei0910410003/article/details/52057543 一.前言 在视频直播中一般都是两种视频数据源,一个是摄像头数据,一个是录制桌面数据,而一般来说美女妹子直播都是来自于摄像头数据,游戏直播都是录制桌面数据的,那么今天就来看看第一个数据源数据采集分析,Android中使用摄像头的场景很多,在没有直播这个行业出现之前,之前用到摄像头的最多就两个场景,一个是二维码扫描,一个是美颜拍照类的应用.那么这里就来看看Android中

Android中直播视频技术探究之---基础核心类ByteBuffer解析

一.前言 前一篇文章我们介绍了Android中直播视频技术的基础大纲知识,这里就开始一一讲解各个知识点,首先主要来看一下视频直播中的一个重要的基础核心类:ByteBuffer,这个类看上去都知道了,是字节缓冲区处理字节的,这个类的功能非常强大,也在各个场景都有用到,比如网络数据底层处理,特别是结合网络通道信息处理的时候,还有就是后面要说到的OpenGL技术也要用到,当然在视频处理中也是很重要的,因为要处理视频流信息,比如在使用MediaCodec进行底层的视频流编码的时候,处理的就是字节,我们如

Android中直播视频技术探究之---视频直播服务端环境搭建(Nginx+RTMP)

一.前言 前面介绍了Android中视频直播中的一个重要类ByteBuffer,不了解的同学可以 点击查看 到这里开始,我们开始动手开发了,因为我们后续肯定是需要直播视频功能,然后把视频推流到服务端,本地在进行拉流播放的流程.所以这个过程中,我们需要首先来把服务端这个中间环节的工作搞定,后续再弄推流和拉流功能.现在推流大部分都是使用RTMP/HLS协议的,关于这两个协议的区别: 所以我们服务端搭建就需要用这两个协议,不过本文放心了,不会去手动的编写一套协议代码的,谁叫这个世界属于开源呢? 需要的

Android中直播视频技术探究之---基础知识大纲介绍

一.前言 最近各种视频直播app到处都是,各种霸屏,当然我们也是需要体验的,关于视频直播的软件这里就不介绍了,在不是技术的人来看,直播是一种潮流,是一种娱乐方式,但是作为一个高技术的,我们除了看看,更重要的是学习技术,其实Android中的视频技术没什么说的,因为网上的资料很多,但是之前的视频技术大部分都出现在了视频播放,就是主流的视频播放器,那个最重要的一个技术就是视频的编解码,这个也会在后续文章中详细介绍视频的处理技术.但是现在直播的技术是在之前的视频技术上又有了一个要求就是视频录制,现在录

Android中的Handler, Looper, MessageQueue和Thread

Android中的Handler, Looper, MessageQueue和Thread 前几天,和同事探讨了一下Android中的消息机制,探究了消息的发送和接收过程以及与线程之间的关系.虽然我们经常使用这些基础的东西,但对于其内部原理的了解,能使我们更加容易.合理地架构系统,并避免一些低级错误. 对于这部分的内容,将分成4小节来描述: 1.职责与关系 2.消息循环 3.线程与更新 4.几点小结 ------------------------------------------------

Android:日常学习笔记(8)———探究UI开发(5)

Android:日常学习笔记(8)---探究UI开发(5) ListView控件的使用 ListView的简单用法 public class MainActivity extends AppCompatActivity { private String[] data={"Apple","Banana","Orange","Watermelon","Pear","Grape","

Android 中常见控件的介绍和使用

1 TextView文本框 1.1 TextView类的结构 TextView 是用于显示字符串的组件,对于用户来说就是屏幕中一块用于显示文本的区域.TextView类的层次关系如下: java.lang.Object   ? android.view.View   ? android.widget.TextView 直接子类: Button, CheckedTextView, Chronometer, DigitalClock, EditText 间接子类: AutoCompleteTextV

关于android中v7包(appcompat)的说明

关于android中v7包(appcompat)的说明,有需要的朋友可以参考下. 大家对于v4包都已经很熟悉了,现在在新建android项目时,v4包是默认导入的.v7包出来没多长时间,用的人也不多,主要对3.0以下版本提供ActionBar支持,以及SearchView,PopupMenu等控件的支持.因为一些开源框架已经实现对3.0以下版本ActionBar的支持,所以v7包的使用意义也不是很大.既然谷歌官方提供了这个功能,也很有必要学习一下.现在根据自己在官方文档上的学习和实践,现总结如下

Android:日常学习笔记(6)——探究活动(3)

Android:日常学习笔记(6)--探究活动(3) 活动的生命周期 返回栈 Android中的活动是可以叠加的,我们每启动一个新活动,就会覆盖在原来的活动上,点击Back以后销毁最上面的活动,下面的活动就会重新显现出来.Android是使用任务(Task)来管理活动的,一个任务就是一组存放在栈里的活动的集合. 默认情况下,每当我们启动一个新的活动,他会在返回栈中入栈,并处于栈顶位置.而每当我们按下Back或者Finish以后,处于栈顶位置的活动会出栈. 活动的状态 运行状态(栈顶的元素).暂停