大家一起来分析google语音搜索API,Speex编码问题

ghostsys 2011-10-28 04:41:12
想用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去获取数据,返回的数据还是加密的,比较麻烦。
...全文
1107 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
MagicFox 2012-08-05
  • 打赏
  • 举报
回复
楼主,有没有语音设备的JDK或者jar文件呢?
illuspas 2012-06-28
  • 打赏
  • 举报
回复
看speech_recognizer.cc 100行

// 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.
将每个frame的size作为第一个字节打包就构成了 x-speex-with-header-byte 类型
我试过,识别成功
seaseal 2011-10-31
  • 打赏
  • 举报
回复
http://blog.laobubu.net/546?replytocom=318

看看Google的猥琐API之STT!(属于speech-api v1的recognize)

http://www.google.com/speech-api/v1/recognize?xjerr=1&client=chromium&lang=zh-CN

如何调用

要使用这个API,你得先有一些心理素质:面对倒霉的FLAC格式,因为这个API只支持FLAC格式的数据,杯具啊。

不过你找到了我的博客,那么你是幸福的,因为我已经为你准备了不少好东西了。(顺便说一句,如果要转载记得清楚地标注“来自http://blog.laobubu.net”,我信任你。)

现在看看如何请求数据:

【URL】http://www.google.com/speech-api/v1/recognize?xjerr=1&client=chromium&lang=zh-CN
【方式】POST
【请求头】Content-Type:audio/x-flac; rate=16000
【POST】flac文件的数据

如果你人品大爆发,你成功了,可以得到类似这个的结果

{"status":0,"id":"54e1babccaa58682ffbb02ceb42aa47c-1",
"hypotheses":[{"utterance":"测试程序","confidence":0.8556527}]}

实例:用于Python

#By laobubu.net


import urllib2
FILE='1.flac' #这里假设在当前文件夹下有一个叫1.flac的文件被识别
url = 'http://www.google.com/speech-api/v1/recognize?xjerr=1&client=chromium&lang=zh-CN'
audio=open(FILE,'rb').read()
headers = {'Content-Type' : 'audio/x-flac; rate=16000'}
req = urllib2.Request(url, audio, headers)
response = urllib2.urlopen(req)
print response.read().decode('UTF-8')

头疼:FLAC文件格式

这里我长话短说,google的flac也有限制,22050 Hz+201kbps还正常,如果比这个大多了就不对了。

不过还有最要命的问题,怎么生成FLAC文件?

没关系,这里有救星:flac.exe包下载

http://datastorage.laobubu.net/FLAC.zip (跟你说的,上laobubu.net没错的)

具体使用方法是【flac.exe 文件.wav】这样在命令行调用即可,测试得知:不支持MP3等格式,但是支持基本的wav格式。

好了,你可以去制造你的app了,哈哈。

爱你:来自laobubu实验室的福音

为了方便,我写了一个python程序,放在Google App Engine上面,只要提交一个音频文件的URL(支持MP3、wav等常见格式),且文件不大,就可以得到结果了哦。(再次强调,跟你说的,上laobubu.net没错的)

API入口:http://laobubumf.appspot.com/stt/
备用入口:http://glab.laobubu.net/stt/
星羽 2011-10-31
  • 打赏
  • 举报
回复
没接触过,up一下
quwei197874 2011-10-28
  • 打赏
  • 举报
回复
微软的speech sdk和Google的差不多,楼主可关注下,要好些的可找科大讯飞或neuance的demon版的引擎。
柯本 2011-10-28
  • 打赏
  • 举报
回复
只用CB用过MS sapi.dll的SpVoive(ActiveX 控件),它的语音文件的确很小,比我下载的其它语音包小很多.不过倒是没研究过它的格式,关注下.
JieTouLangRen 2011-10-28
  • 打赏
  • 举报
回复
mark~

3,882

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧