>>分享Android开发相关的技术 书籍支持  卫琴直播  品书摘要  在线测试  资源下载  联系我们
发表一个新主题 开启一个新投票 回复文章 您是本文章第 19696 个阅读者 刷新本主题
 * 贴子主题:  Android语音识别 android.speech 包分析 回复文章 点赞(0)  收藏  
作者:mary    发表时间:2020-03-31 18:23:05     消息  查看  搜索  好友  邮件  复制  引用

    
       Android voice recognition,语音识别作为Service实现。 语音识别API在 android.speech中 API大致分成应用端API和service端API

       RecognizerIntent

         顾名思义,在自己的程序中,需要语音识别了,发出这个intent,如果已经安装了google voice search应用,谷歌的activity,service就会跳出来帮你。 http://download.csdn.net/source/2591401有三个例子。 例子1基本就实现了这样一个应用。 例子1实际上很简单,就靠RecognizerIntent,intent发出后,相应的service会处理intent。 基本上是借鉴了google官方sample:http://developer.android.com/resources/articles/speech-input.htmlhttp://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/app/VoiceRecognition.html

         (运行例子1的前提是,google voice search应用已经安装,这样确保Service已经安装了) 注意,需要微调程序中的RecognizerIntent的三个参数,可以得到不同的运行效果,简单,参考javadoc即可。
  1.    Intent intent =  new  Intent(RecognizerIntent.ACTION_WEB_SEARCH);  

  2.   intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,
  3.   RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);

        以上是最简单的方式,只需要RecognizerIntent一个类就搞定

         自己实现RecognitionService

          如果要自己做一个识别引擎Service,是可以的。Android提供了RecognitionService抽象类  识别引擎作为Service存在,要实现这个抽象类.  This RecognitionService class should be extended only in case you wish to implement a new speech recognizer.  

         Android SDK提供了一个sample VoiceRecognitionService extends RecognitionService,是一个假的引擎,识别结果固定为abc或者123。 这个引擎不读取麦克风,也不含麦克风dialog界面。稍候在SpeechRecognizer处介绍如何使用这个假service.

         RecognitionService比较朴素,提供三个方法:

  1.    abstract   void    onStartListening(Intent recognizerIntent, RecognitionService.Callback listener)  
  2.   Notifies the service that it should start listening  for  speech. 开始识别,intent发过来了
  3.    abstract   void    onStopListening(RecognitionService.Callback listener)
  4.   Notifies the service that it should stop listening  for  speech. 结束识别
  5.    abstract   void    onCancel(RecognitionService.Callback listener)  
  6.   Notifies the service that it should cancel the speech recognition. 取消识别

      RecognitionService是无状态的,不能并行开始识别多个音频流,三个方法必须按照开始-->结束/取消,再开始-->结束/取消,这样顺序调用,否则报错。

        谷歌的Service实现,不开源

         AOSP里面没有实现RecognitionService的代码。所以默认的AOSP编出来的android SDK都是不带语言识别Service的,SDK桌面的google search widget没有麦克风,就说明识别Service还没装。

         google自己实现了RecognitionService,装了voicesearch 2.1.4之后(一般手机都已经预置),桌面的google search widget也会出现小麦克了点击小麦克出现"speak now"对话框。同时settings voice input output的识别引擎选择框会出现google的选项。谷歌的service叫com.google.android.voicesearch.RecognitionService 这个程序也不开源,无法深度定制谷歌那个"speak now"对话框。

         点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小

         P.S. google的识别是基于网络的。 google voice search小应用client不开源,网络端更不开源,网络API尚未开放,但有些人已经研究出来了...  

       参考资料:

         http://stackoverflow.com/questions/2080401/is-there-a-speech-to-text-api-by-google

         https://github.com/taf2/speech2text

         https://github.com/taf2/audiosplit

         http://mikepultz.com/2011/03/accessing-google-speech-api-chrome-11 比较牛

         vlingo virtual assistant也实现了RecognitionService,不开源

          RecognitionService.Callback 的作用

          Callback类是个二传手,被service调用,并通过ipc转发结果给RecognitionListener。

         The RecognitionService.Callback class receives callbacks from the RecognitionService and forwards them to the RecognitionListener

         RecognitionListener是用户自己进程中实现的,RecognitionService是在service进程中的,service没法直接调用listener,就通过callback类转发。

         Callback帮助自己做service的人处理了ipc,aidl等问题,挺好的。

          SpeechRecognizer  使用service的

          This class provides access to the speech recognition service. 给应用程序进程用的,方便对RecognitionService的访问

         This class's methods must be invoked only from the main application thread. 只有主应用线程中可以调用...为什么呢...可能因为service会弹出识别的dialog...?

         Please note that the application must have RECORD_AUDIO permission to use this class. 程序必须有录音权限

         packages/inputmethods/LatinIME/java/src/com/android/inputmethod/voice/VoiceInput.java 可以参考  

         例子3  MyStt3Activity也是个参考,但要给识别intent加一行,否则出现error 5

         intent.putExtra("calling_package", "");

         在例子3中,按下speak按钮之后,程序用SpeechRecognizer.startListening(intent); 开启了麦克风等待用户说话,不会弹出google的“speak now”麦克风的dialog,直接说就行了。

         如果此时settings里面设定默认engine为demo的com.example.android.voicerecognitionservice假引擎,则干脆不会读取麦克风,直接返回abc或者123的假结果。

         我也试验了vlingo virtual assistant的引擎,也可以用。

         多个RecognitionService实现并存,是允许的。不通过settings的默认设置,程序化指定Service,怎么做?todo  intent.setClassName不行

          RecognizerResultsIntent 略

         开源SREC库,是nuance贡献给AOSP的

           利用 srec 里面的动态插入语音标签功能( Voice Enrollment ) , 添加事先录好的普通话短语,之后就可以对其做语音识别了,

          非google的风格的识别

         最后,有的厂商自己搞voice framework,不走google android.speech的任何代码,从activity到intent到service到widget全都自己设计,也行。超出本文范围。  

        参考资料:
        
         http://blog.csdn.net/lzf_china/article/details/4510980

         http://topic.csdn.net/u/20100817/15/bcc84f6f-1fec-4e73-9dbf-9ef595597926.html

                                              

----------------------------
原文链接:https://blog.51cto.com/mengxx/767085

程序猿的技术大观园:www.javathinker.net



[这个贴子最后由 flybird 在 2020-04-18 19:06:17 重新编辑]
  Java面向对象编程-->图形用户界面(下)
  JavaWeb开发-->Servlet技术详解(Ⅰ)
  JSP与Hibernate开发-->映射组成关系
  Java网络编程-->Java反射机制
  精通Spring-->Vue指令
  Vue3开发-->绑定CSS样式
  Android面试题汇总
  Android开发实践:用脚本编译Android工程
  android 手势操作GestureDetector
  Android 滚动Tab
  创建 和使用Android服务
  Android忽略HTTPS安全验证的解决
  Android多线程及异步处理问题
  Android 解码播放GIF图像
  Android--Widget开发
  Android Broadcast receiver 编程-Mobile and Linux Develop...
  Roboletric+Retrofit2单元测试
  自定义ViewGroup和FrameLayout实现轮播图(包括底部小圆点)
  Android仿Volley手写属于自己的万能网络访问框架
  Android - 监听WebView加载失败的处理
  Android adb你真的会用吗?
  更多...
 IPIP: 已设置保密
树形列表:   
1页 0条记录 当前第1
发表一个新主题 开启一个新投票 回复文章


中文版权所有: JavaThinker技术网站 Copyright 2016-2026 沪ICP备16029593号-2
荟萃Java程序员智慧的结晶,分享交流Java前沿技术。  联系我们
如有技术文章涉及侵权,请与本站管理员联系。