`
zuoshu
  • 浏览: 195964 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

调用Google手机版语音识别服务

阅读更多

转载请注明出处

项目代码https://github.com/zuoshu/android-voicesearch-opensource.git

调用google手机版语音识别云服务,3g网络下速度快,流量小,识别准,无弹出框。

 

由于项目需要用到语音识别,选用google的语音识别服务,现在一般的做法是将语音通过post发到http://www.google.com/speech-api/v1/recognize?lang=en-us,再从返回里面取识别结果。在wifi的情况下速度还可以接受,但是在3g的情况下速度很慢。和Android上的VoiceSearch比起来慢很多。看了下VoiceSearch的log,发现voicesearch连接的其实是www.google.com/m/voice-search。一般的做法最初是从chrome开源代码里面找到的,而VoiceSearch属于android平台,在google内部这两个产品分属两个不同的团队,猜测后台的语音识别服务其实实现了两套?总而言之,android/ios和chrome使用的语音识别是不一样的,并且android/ios的速度要快很多。

但是,VoiceSearch不开源,没办法,只能从反编译apk入手,有些地方反编译也没办法,过程比较费劲,直接上结果。

这个是使用www.google.com/speech-api/v1/recognize作为语音识别服务的结果,3g网络下用时2878ms

这个是使用www.google.com/m/voice-search作为语音识别服务的结果,3g网络下用时828ms


 速度相差3倍左右,多次测试发现,后一种基本上会在2秒内返回结果,前一种长的时候会要10多秒。

VoiceSearch具体的工作原理如何?稍后上分析过程,这里直接上工作原理。

VoiceSearch采用protobuf作为数据传输协议。发送语音的过程使用protobuf包装数据,然后通过http或tcp发送。

协议大致包括Alternates,ClientParametersProto,ClientReportProto,GoogleSearchRequest,IntentApi,PartialResult,RecognitionContextProto,RecognitionResultSet,SpeechService,VoiceSearch

具体流程如下

1.建立session

客户端先手机手机上的一些信息,比如地区,系统等,然后生成一个SpeechService.CreateSessionRequest的协议包,通过post发送到www.google.com/m/voice-search,将返回的结果以SpeechService.CreateSessionResponse来解析,结果里面包含ip,port,stunid三个重要的信息。用这个ip和port建立socket连接,在识别结束之前,socket一直不关闭。用stunId生成一个StunPacket(这里用的不是protobuf)

private static byte[] createStunBindingRequest(String stunId)
		throws UnsupportedEncodingException {
	StunPacket packet = new StunPacket(
			StunMessageType.STUN_BINDING_REQUEST);
	StunAttribute stunAttribute = new StunAttribute(
			StunAttributeType.STUN_ATTR_USERNAME);
	stunAttribute.setData(new StunAttribute.Username(stunId));
	packet.addAttribute(stunAttribute);
	return packet.asByteArray();
}

 将StunPacket发送给服务器,服务器会有一个返回。这时,session就建立了。

2.录音

录音编码这部分也有特殊处理。先通过AudioRecord录制原始数据

mAudioRecord = new AudioRecord(6, sampleRateInHz, 16, 2, Math.max(
				AudioRecord.getMinBufferSize(sampleRateInHz, 16, 2),
				bufferSizeInBytes));

 packetSize为320。再通过AMR_NB压缩

3.发送数据

一个320byte的原始数据被压缩为32byte的AMR_NB数据,每448的AMR_NB数据发送一次,用448byte的AMR_NB数据生成一个SpeechService.MediaData,通过socket发送到服务器。

4.获取结果

建立连接后,发送语音数据的时候,服务器会不定时返回一个SpeechService.RecognizeAck数据包,不管就可以。录音结束时,发送一个空数据的SpeechService.MediaData数据包。服务器会返回一个SpeechService.RecognizeResponse数据包。识别结果都包含在里面。结束之后,客户端发送一个DestroySession的数据包关闭session。

5.其他参数

在建立session的时候,可以通过一个参数setEnablePartialResults来设置是否返回partial result,如果设置true,则可以一边说,一边有识别结果返回。

可以通过setLanguage来设置语言,"en-US"为英文,"zh-CN"为中文。

先放apk和协议,项目稍后放出,见附件apk_and_protos.rar,其中voice1.apk为使用速度快的语音识别,voice2.apk为使用速度慢的语音识别

  • 大小: 12.8 KB
  • 大小: 14.6 KB
分享到:
评论

相关推荐

    android 语音识别

    5. **自定义命令与识别精度**:默认的语音识别服务能处理通用的口语输入,但若需要识别特定词汇或短语,开发者可能需要使用更复杂的解决方案,如Google Cloud Speech-to-Text服务或第三方SDK,它们允许定制识别模型...

    语音识别pocketsphinx FOR android demo

    与旧版本不同,最新版的Pocketsphinx for Android Demo不再需要对JNI(Java Native Interface)进行手动编辑,而是直接调用预编译好的jar接口,简化了集成过程,使得开发者能够更轻松地在其应用程序中集成语音识别。...

    Android语音识别的应用与开发.pdf

    - 语音识别技术应用:虽然在提供的内容中未详细展示语音识别功能的实现,但可以推测文档涉及了如何调用Android提供的语音识别API来实现语音输入和识别功能。 综合以上内容,我们可以看到,Android语音识别的应用与...

    speech_to_text:Flutter插件,可将设备特定的文本公开给语音识别功能

    别忘了在用户停止使用语音识别功能时调用`stop()`方法,释放资源: ```dart _speech.stop(); ``` 此外,`speech_to_text`插件还提供了其他功能,如设置识别语言、获取可用语言列表、控制录音音量等。这为开发者...

    科大讯飞语音3.0+修改手机截图

    科大讯飞是一家中国领先的人工智能公司,以其强大的语音识别和合成技术闻名,尤其在中文处理方面表现出色。 谷歌的TextToSpeech API是一个广泛使用的Android平台服务,但默认情况下,它可能不支持所有语言,特别是...

    基于安卓Android的中文语音助理源码.zip

    9. **Intent与BroadcastReceiver**:Android中的Intent用于组件间的通信,可能用在启动语音识别服务或者响应系统广播。BroadcastReceiver可以监听特定事件,例如当设备连接到耳机时启动语音识别。 10. **测试与调试...

    Android 仿Siri的中文语音助理源码.rar

    源码可能包含了设置麦克风权限、启动语音识别服务、解析返回的文本结果等步骤,以便将语音转化为可处理的文字指令。 2. **自然语言处理(NLP)**:识别出的语音需要经过NLP处理,才能理解用户的意图。这通常包括...

    开发一个语音朗读程序、语言朗读

    开发者需要选择合适的TTS引擎,并通过编程接口调用其服务。 2. 语音库:TTS引擎通常依赖于特定的语音库,这些库包含了不同语言、性别和音色的预录制声音片段。选择合适的语音库可以提供更自然、流畅的朗读体验。 ...

    毕设&课程作业_基于android的智能语音家居控制系统 安卓端1.0.zip

    首先,该系统的核心是Android应用开发,这是谷歌推出的开源操作系统,广泛应用于智能手机和平板电脑。开发者需要掌握Java或Kotlin语言,使用Android Studio作为集成开发环境(IDE)来编写代码。在这个项目中,开发者...

    蓝牙遥控控制智能小车AndroidStudio参考代码

    首先,**Android Studio**是Google推出的一款集成开发环境(IDE),专门用于构建Android应用程序。它基于IntelliJ IDEA,提供了丰富的工具集,包括代码编辑器、调试器、性能分析器以及版本控制系统等,方便开发者...

    voice-assistant-python:这是使用Python的语音助手!! 这是一个了不起的Python项目!!!

    总的来说,Python语音助手项目是一个有趣的实践,它结合了语音识别、自然语言处理和API调用等技术,展示了Python在人工智能领域的强大能力。通过学习和理解此类项目,开发者不仅可以提升自己的编程技能,还能深入...

    调用系统工具

    此外,如果涉及到语音识别,如 Siri 或 Google Assistant,可以使用系统的语音识别服务,如Android的`SpeechRecognizer`或iOS的`SiriKit`。 除了基本的调用,开发者还需要关注权限管理。在现代操作系统中,例如...

    SOS-App:一个简单的 android-wear 应用程序,允许您使用语音命令从您的 android-wear 向 3 个配置的号码发送 SMS 消息

    2. **语音命令处理**:应用集成 Google 的语音识别服务,使得用户无需触碰设备就能触发操作。用户只需说出预设的语音指令,应用就能启动并发送短信。这依赖于 Android Wear 平台上对语音识别的API支持。 3. **SMS...

    Eclipse开发GoogleAndroid教程

    例如,在`SaySomething`这个可能的示例中,我们可能创建一个Intent来启动语音识别功能。 9. **使用Mobile Services** `MobileServiceCallContacts`可能涉及到调用手机联系人服务。Android提供了`ContentResolver`...

    百度CarLife车机手机互联方案接入详细指南new1

    描述了车机端需要具备哪些特定功能才能与CarLife良好协作,如语音识别、地图导航、音乐播放等。 9. **数据通道** 数据通道部分详细讨论了数据如何在车机与手机之间流动,可能包括数据加密、传输速率、错误检测与...

    基于Android Wear系统的智能可穿戴设备研究.pdf

    它的主要特点在于集成Google Now的语音识别技术,能够将个人信息,如短信、应用通知等直接推送到搭载该系统的智能设备上。Android Wear系统允许开发者基于开源代码进行深度定制,构建自己的ROM或应用程序。 ...

    android智能机器人

    1. **语音识别与合成**:可以集成Google的语音识别和合成服务,让用户通过语音与机器人互动。 2. **深度学习集成**:对于更复杂的对话逻辑,可以考虑集成TensorFlow等深度学习框架,训练自己的语义理解模型。 3. *...

    JAVA上百实例源码以及开源项目源代码

    Java局域网通信——飞鸽传书源代码 28个目标文件 内容索引:JAVA源码,媒体网络,飞鸽传书 Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java...

Global site tag (gtag.js) - Google Analytics