大家一起来分析google语音搜索API,Speex编码问题
想用Google 语音搜索的API,Chrome 浏览器上就使用了,以前chrome上使用的是speex语音编码,非常好,一段话编码后就几K,音质也很清晰,可没几天Google就换成Flac编码了,这样说一句话起码上百K,实在搞不懂为什麽要换Flac。不过speex编码的接口依然能用,可是就是生成不了符合要求的speex编码音频,Flac只要符合16000采样率就行,是标准的Flac数据头,测试通过。
API地址:http://www.google.com/speech-api/v1/recognize?lang=zh&client=chromium&xjerr=1&maxresults=1
Content-Type: audio/x-speex-with-header-byte; rate=16000
识别成功了就会返回json数据
我用speexenc.exe 将PCM数据转成spx格式,POST上去,识别不了,
speexenc.exe 是使用OGG封包的,数据头是OggS开头。
Chrome使用语音搜索时我抓包了下,发现POST上去的数据并不是OGG格式封装,而且也见不到Speex编码的字符串,我直接将PCM数据编码就导出,没数据头,POST上去也识别不了
但从Content-Type: audio/x-speex-with-header-byte可以看出应该是有加数据头的。
我就抓三次包,对比下,发现有两次前面几行是一样的,一次有区别
第一次
.F.fh...9.sGl.........+...F......9vsGl6..6.....6..
..o...v...
...x..v...
...H..v...
......v...
..f...v..B
...`..v...
..gh..v..@
..g...v..@
..f0..p...
..f...v...
..g...v...
..fh..v...
..g...v..B
......v...
...x..v...F5.!....2.;h...2.C.....".#..d...]J
第二次
.F.fh...9.sGl.........+...F......9vsGl6..6.....6..
..o...v...
...x..v...
...H..v...
......v...
..f...v..B
...`..v...
..gh..v..@
..g...v..@
..f0..p...
..f...v...
..g...v...
..fh..v...
..g...v..B
......v...
...x..v...F5......d.;h...2.C.......#..o.D.Q
第三次
.F.n8...9.sGl...6..6..6...F.fP.....sGl9..6..0..6..
..gx..v...
..n`..v..D
...|..v..
..o...v. .
......v...
..oL..v...
......v..@
... ..p...
...(..p. .
..g...v...
..f...p...
..nh..v..D
..nP..v..@
..f...v...
......v..@V=..D..........m.[m...?........u..[...........d.E.....
我只能去看chromium源码了,虽然语音搜索API是chromium 11正式版开始添加的,可没几天就换成Flac编码了,上面只有部分Speex编码代码。还好OSchina收录了使用speex编码的版本
http://www.oschina.net/code/explore/chromium.r67069/chrome/browser/speech
下面是speex编码的核心代码
http://www.oschina.net/code/explore/chromium.r67069/chrome/browser/speech/speech_recognizer.cc
可我并没有找到添加数据头的地方,Google也没有修改Speex的核心源码,
只看到下面这句
//Encode the frame and place the size of the frame as the first byte.
//This is the packet format for MIME type x-speex-with-header-byte. 腾出第一个字节不编码保留数据头,一个字节够数据头?没弄明白
大家帮忙分析下吧,就为这个Speex编码熬了好几天了....
另外还抓到了Android 和Iphone 的语音搜索的API
http://www.google.com/m/appreq/vs
http://www.google.com/m/appreq/gmiphone
Content-Type: application/binary
这个上传的声音数据头加了手机版本信息等数据头,好像使用ARM格式录制,但和PC端用的API不一样,POST要2次,还要用cookies去获取数据,返回的数据还是加密的,比较麻烦。