chrome用到了google的语音识别webservice,下面对该webservice使用原理,即voice recognition和chrome的语音识别实现原理进行分析。详见chrome源码。
google语音识别有两个webservice,一种叫做google_one_shot_remote_engine,一种叫做google_streaming_remote_engine,简称为oneshot和streaming。如果进行http抓包,可以发现,one_shot连接的是一个端口为80的地址,streaming连接的是一个地址的443端口。
但是,认真研究发现,android上的voice recognition和chrome并不是用的这种方式。在voice recognition或者chrome做语音识别的时候,无论说多长的句子,马上就会有返回结果,0.5秒以内。如果用oneshot的方式,会有一个等待时间,这个等待的时间是线性的,句子越长,等待时间越长。而voice recognition是常量时间,无论一句两句三句都是0.5秒内返回,这里就要讲到streaming的语音识别方式了。
streaming的基本原理是用两个http连接连服务器,叫做upstream和downstream,分别上传和下载数据,实现的关键还是在服务器,streaming用的webservice在接受完数据后马上能返回结果。接下来说一些细节。
1.upstream连接地址
https://www.google.com/speech-api/full-duplex/v1/up?key=AIzaSyBHDrl33hwRp4rMQY0ziRbj8K9LPA6vUCY&pair=xxx&output=pb&lang=en-us&pFilter=0&maxAlternatives=5&client=chromium&xhw=xxx&continuous&interim
参数说明
key是google api key,可以申请google的开发者key,也可以用chrome里面自带的key"AIzaSyBHDrl33hwRp4rMQY0ziRbj8K9LPA6vUCY"
pair是客户端根据时间随机生成的一个8byte的配对码,16进制表示。每次语音识别的过程中,downstream使用和upstream相同的配对码
xhw是硬件信息,可以省略
2.downstream连接地址
https://www.google.com/speech-api/full-duplex/v1/down?key=AIzaSyBHDrl33hwRp4rMQY0ziRbj8K9LPA6vUCY& pair=xxx&output=pb
这里的key使用AIzaSyBHDrl33hwRp4rMQY0ziRbj8K9LPA6vUCY即可,pair使用和1中pair相同的值
3.发送数据
upstream采用POST方式连接服务器,将音频文件编码的方式设置成content-type,比如conn.setRequestProperty("Content-Type","audio/x-flac;rate = 16000").之后不断的将编码好的音频数据写入连接即可,upstream只需要写数据,不需要从连接读取数据
4.客户端怎样告诉服务器数据已经写完了?
源码中写道
// The encoder requires a non-empty final buffer. So we encode a packet
// of silence in case encoder had no data already.
即客户端在所有数据都发送完后发送一个silence packet即可通知服务器数据发送完了。什么是silence packet?packet是声音数据的一个单位,是一个byte数组,全为0即表示silence,用一个byte[100]其中每个数据都为0即可表示silence packet。
5.接受数据
downstream采用GET方式连接服务器,等upstream发送了silence packet之后即可读取到数据。返回数据的格式有点特殊,返回的不是json的格式,而需要按照byte来解析。首先,返回的最开头会有4byte0,这个表示客户端连接成功。接下来的数据以chunk为单位,每次的返回有0个或者多个chunk,每个chunk的开头有4byte用来表示chunk数据部分的长度,即|4byte len|chunk data|4byte len|chunk data|。data部分是string的byte值。
原理部分基本上就这些,稍后放demo源码。
转载请注明出处
分享到:
相关推荐
spark Streaming和structed streaming分析,理解整个 Spark Streaming 的模块划分和代码逻辑。
Face Recognition(face_recognition) Using Hadoop Streaming API Face Recognition(face_recognition) Using Hadoop Streaming API
(1)利用SparkStreaming从文件目录读入日志信息,日志内容包含: ”日志级别、函数名、日志内容“ 三个字段,字段之间以空格拆分。请看数据源的文件。 (2)对读入都日志信息流进行指定筛选出日志级别为error或warn...
很全面的Darwin streaming server 分析文档,对于研究DSS有很大的帮助
flume+Logstash+Kafka+Spark Streaming进行实时日志处理分析【大数据】
29:Spark2.3.x StructuredStreaming项目实时分析
Project_Pravega_支持streaming和实时分析的存储平台.pdf
Flink,Storm,Spark Streaming三种流框架的对比分析。比较清晰明确
数据分析:见项目 功能一: 统计到今天为止视频的访问量 yyyyMMdd courseId 使用数据库来进行存储我们的统计结果 sparkstreaming把统计结果写入到数据库里面 hbase表设计:create 'aqy_video_clickcount','info...
Darwin_Streaming_Server代码框架分析
Darwin Streaming Server 5.5.5源代码分析文档 DarwinStreamServer是苹果公司开发的流媒体视频服务器。我们分析的代码基于版本5.5.5。
本科毕业设计项目,基于spark streaming+flume+kafka+hbase的实时日志处理分析系统 基于spark streaming+flume+kafka+hbase的实时日志处理分析系统 本科毕业设计项目,基于spark streaming+flume+kafka+hbase的...
spark streaming streaming
http live streaming protocol http live streaming protocol
基于spark streaming和kafka,hbase的日志统计分析系统 仅用于学习和参考
java的sparkstreaming连接kafka的例子,kafka生产者生产消息,消费者读取消息,sparkstreaming读取kafka小区并进行存储iotdb数据库。
Flink Streaming SQL 基础 Flink Streaming SQL 基础 Flink Streaming SQL 基础
赠送jar包:flink-streaming-java_2.11-1.13.2.jar; 赠送原API文档:flink-streaming-java_2.11-1.13.2-javadoc.jar; 赠送源代码:flink-streaming-java_2.11-1.13.2-sources.jar; 赠送Maven依赖信息文件:flink-...
【资源说明】 1、该资源包括项目的全部源码,下载可以直接使用! 2、本项目适合作为计算机、数学、电子信息等专业的课程设计、期末大作业和毕设...基于spark streaming+kafka+hbase的日志统计分析系统源码+项目说明.zip
一个完善的Spark Streaming二次封装开源框架,包含:实时流任务调度、kafka偏移量管理,web后台管理,web api启动、停止spark streaming,宕机告警、自动重启等等功能支持,用户只需要关心业务代码,无需关注繁琐的...