转载请注明出处
项目代码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为使用速度慢的语音识别
相关推荐
5. **自定义命令与识别精度**:默认的语音识别服务能处理通用的口语输入,但若需要识别特定词汇或短语,开发者可能需要使用更复杂的解决方案,如Google Cloud Speech-to-Text服务或第三方SDK,它们允许定制识别模型...
与旧版本不同,最新版的Pocketsphinx for Android Demo不再需要对JNI(Java Native Interface)进行手动编辑,而是直接调用预编译好的jar接口,简化了集成过程,使得开发者能够更轻松地在其应用程序中集成语音识别。...
- 语音识别技术应用:虽然在提供的内容中未详细展示语音识别功能的实现,但可以推测文档涉及了如何调用Android提供的语音识别API来实现语音输入和识别功能。 综合以上内容,我们可以看到,Android语音识别的应用与...
别忘了在用户停止使用语音识别功能时调用`stop()`方法,释放资源: ```dart _speech.stop(); ``` 此外,`speech_to_text`插件还提供了其他功能,如设置识别语言、获取可用语言列表、控制录音音量等。这为开发者...
科大讯飞是一家中国领先的人工智能公司,以其强大的语音识别和合成技术闻名,尤其在中文处理方面表现出色。 谷歌的TextToSpeech API是一个广泛使用的Android平台服务,但默认情况下,它可能不支持所有语言,特别是...
9. **Intent与BroadcastReceiver**:Android中的Intent用于组件间的通信,可能用在启动语音识别服务或者响应系统广播。BroadcastReceiver可以监听特定事件,例如当设备连接到耳机时启动语音识别。 10. **测试与调试...
源码可能包含了设置麦克风权限、启动语音识别服务、解析返回的文本结果等步骤,以便将语音转化为可处理的文字指令。 2. **自然语言处理(NLP)**:识别出的语音需要经过NLP处理,才能理解用户的意图。这通常包括...
开发者需要选择合适的TTS引擎,并通过编程接口调用其服务。 2. 语音库:TTS引擎通常依赖于特定的语音库,这些库包含了不同语言、性别和音色的预录制声音片段。选择合适的语音库可以提供更自然、流畅的朗读体验。 ...
首先,该系统的核心是Android应用开发,这是谷歌推出的开源操作系统,广泛应用于智能手机和平板电脑。开发者需要掌握Java或Kotlin语言,使用Android Studio作为集成开发环境(IDE)来编写代码。在这个项目中,开发者...
首先,**Android Studio**是Google推出的一款集成开发环境(IDE),专门用于构建Android应用程序。它基于IntelliJ IDEA,提供了丰富的工具集,包括代码编辑器、调试器、性能分析器以及版本控制系统等,方便开发者...
总的来说,Python语音助手项目是一个有趣的实践,它结合了语音识别、自然语言处理和API调用等技术,展示了Python在人工智能领域的强大能力。通过学习和理解此类项目,开发者不仅可以提升自己的编程技能,还能深入...
此外,如果涉及到语音识别,如 Siri 或 Google Assistant,可以使用系统的语音识别服务,如Android的`SpeechRecognizer`或iOS的`SiriKit`。 除了基本的调用,开发者还需要关注权限管理。在现代操作系统中,例如...
2. **语音命令处理**:应用集成 Google 的语音识别服务,使得用户无需触碰设备就能触发操作。用户只需说出预设的语音指令,应用就能启动并发送短信。这依赖于 Android Wear 平台上对语音识别的API支持。 3. **SMS...
例如,在`SaySomething`这个可能的示例中,我们可能创建一个Intent来启动语音识别功能。 9. **使用Mobile Services** `MobileServiceCallContacts`可能涉及到调用手机联系人服务。Android提供了`ContentResolver`...
描述了车机端需要具备哪些特定功能才能与CarLife良好协作,如语音识别、地图导航、音乐播放等。 9. **数据通道** 数据通道部分详细讨论了数据如何在车机与手机之间流动,可能包括数据加密、传输速率、错误检测与...
它的主要特点在于集成Google Now的语音识别技术,能够将个人信息,如短信、应用通知等直接推送到搭载该系统的智能设备上。Android Wear系统允许开发者基于开源代码进行深度定制,构建自己的ROM或应用程序。 ...
1. **语音识别与合成**:可以集成Google的语音识别和合成服务,让用户通过语音与机器人互动。 2. **深度学习集成**:对于更复杂的对话逻辑,可以考虑集成TensorFlow等深度学习框架,训练自己的语义理解模型。 3. *...
Java局域网通信——飞鸽传书源代码 28个目标文件 内容索引:JAVA源码,媒体网络,飞鸽传书 Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java...