【miscellaneous】使用Google语音识别引擎(Google Speech API)[3月5日修改]
原文:http://blog.csdn.net/dlangu0393/article/details/7214728#comments
近期重写本文,暂时禁止评论。
最近在使用Qt编写一个客户端程序的时候需要增加语音识别输入的功能。起初尝试使用SAPI来完成这个任务,但是发现SAPI不仅使用起来超级复杂,而且识别效果也很惨烈。于是就需要寻找一个更加便捷优秀的方案。
自从Chrome 11开始,Chrome开始支持HTML5的语音输入API,QQ紧接着也推出了语音识别输入(可以看做跟风么:D)。显然这些识别操作不可能在本地完成,那么我们就有直接利用接口的可能。
对Chromium的repo进行搜索之后,终于找到了Chromium对语音识别的实现代码:
http://src.chromium.org/viewvc/chrome/trunk/src/content/browser/speech/
分析过程就算了,直接上成果。
Chromium先从mic获取音频,然后使用flac或者speex进行编码,直接通过HTTPS POST到服务器。接口地址如下:
https://www.google.com/speech-api/v1/recognize
Chromium在请求时还会拼上很多参数:
xjerr=1&client=chromium&lang=en-US&maxresults=1
注:参数解释
xjerr=1 # 不详,猜测为错误的标准
client=chromium # 客户端类型,这里是Chromium,猜测Chrome也应该可行,估计是作为统计用的。
lang=en-US # 语言类型,这里是英文,中文为zh-CN,其余语言代码参考:http://msdn.microsoft.com/en-us/library/ms533052(v=vs.85).aspx
maxresults=1 # 最大返回结果数量,多个结果在hypotheses列表中保存。
参数很明了,这给我们提供了很多便利。我们对参数进行调整,得到如下的接口地址:
http://www.google.com/speech-api/v1/recognize?xjerr=1&client=chromium&lang=zh-CN&maxresults=1
接下来祭出wget,对已经发现的接口进行测试:
- flac.exe -8 -f --sample-rate=16000 speechInput.wav
- wget -O "GoogleSpeechAPI.txt" --user-agent="Mozilla/5.0" --post-file=test.flac --header="Content-Type: audio/x-flac; rate=16000" "http://www.google.com/speech-api/v1/recognize?xjerr=1&client=chromium&lang=zh-CN&maxresults=1"
结果如下:
- {
- "status":0, /* 结果代码,详细见本文结尾 */
- "id":"c421dee91abe31d9b8457f2a80ebca91-1", /* 识别编号 */
- "hypotheses": /* 假设,即结果 */
- [
- {
- "utterance":"下午好", /* 话语 */
- "confidence":0.2507637 /* 信心,即准确度 */
- }
- ]
- }
注:注释后为手工添加的结果解释
返回结果太明了了!直接就能拿来用了不是~ 返回的编码是UTF-8。
对于编码格式,在测试中使用了FLAC编码,采样率为16kHz,经测试其他采样率同样可用,但一定要保证Header里的rate与实际数据相符。(关于其他格式的实验请看本文底部。)
总结:
1、基本流程:
一、从音频输入设备获取原始数据。二、对原始数据进行包装、编码。三、将编码后的音频POST至接口地址。四、分析处理接口返回的JSON并得出结果。
2、请求接口
请求方式:HTTP POST头部信息:Content-Type: audio/x-flac; rate=16000 (注:Content-Type根据所使用的编码格式不同而不同,详见文章底部。rate为音频采样率。)请求数据:编码后的音频数据
3、音频编码格式:
FLAC或WAV或SPEEX
下面是我写的Qt(C++)中的请求:
- void Protocol::Request_SPEECH(QByteArray & audioData)
- {
- if (!Nt_SPEECH)
- {
- QNetworkRequest request;
- QString speechAPI = "http://www.google.com/speech-api/v1/recognize?xjerr=1&client=chromium&lang=zh-CN&maxresults=1";
- request.setUrl(speechAPI);
- request.setRawHeader("User-Agent", "Mozilla/5.0");
- request.setRawHeader("Content-Type", "audio/x-flac; rate=16000");
- Nt_SPEECH = NetworkMGR.post(request, audioData);
- connect(Nt_SPEECH, SIGNAL(readyRead()), this, SLOT(Read_SPEECH()));
- }
- }
至于读取函数,就不贴在这里了,具体见:
Protocol: http://pastebin.com/6G6wggfF
AudioInput:
speechInput.h: http://pastebin.com/qdMPeWZD
speechInput.cpp: http://pastebin.com/567B47qF
main:
mainwidget: http://pastebin.com/c8bk7zd2
在翻阅Chromium源码的过程之中,还发现了其他有用的东西:
Speech Input API Specification http://www.w3.org/2005/Incubator/htmlspeech/2010/10/google-api-draft.html
到目前为止,Google好像还没有公开这个API,使用许可依旧不详,请求也没有用到任何认证。但它确实能用,而且十分方便,对于编写非商业程序的人来说,这个东西真的是再好不过了(因为它有着高的爆表的识别率)。
参考:
Chromium Repository http://src.chromium.org/viewvc/chrome/trunk/src/content/browser/speech/
Accessing Google Speech API / Chrome 11 http://mikepultz.com/2011/03/accessing-google-speech-api-chrome-11/

附:
1、SpeechInputError interface 错误信息
- // This enumeration follows the values described here:
- // http://www.w3.org/2005/Incubator/htmlspeech/2010/10/google-api-draft.html#speech-input-error
- enum SpeechInputError {
- // There was no error.
- SPEECH_INPUT_ERROR_NONE = 0,
- // The user or a script aborted speech input.
- SPEECH_INPUT_ERROR_ABORTED,
- // There was an error with recording audio.
- SPEECH_INPUT_ERROR_AUDIO,
- // There was a network error.
- SPEECH_INPUT_ERROR_NETWORK,
- // No speech heard before timeout.
- SPEECH_INPUT_ERROR_NO_SPEECH,
- // Speech was heard, but could not be interpreted.
- SPEECH_INPUT_ERROR_NO_MATCH,
- // There was an error in the speech recognition grammar.
- SPEECH_INPUT_ERROR_BAD_GRAMMAR,
- };
2、多种音频格式的测试
收到朋友的邮件说使用flac实在是很不方便,问我有没有更好的解决方法,于是我尝试将其他编码格式应用于Google Speech API。以下为结果:
1、WAV格式
请求Header:Content-Type: audio/L16; rate=16000
返回结果:识别成功
2、MP3格式
请求Header:Content-Type: audio/mpeg; rate=16000
返回结果:无法识别的编码
请求Header:Content-Type: audio/mpeg3; rate=16000
返回结果:无法识别的编码
请求Header:Content-Type: audio/x-mpeg; rate=16000
返回结果:无法识别的编码
请求Header:Content-Type: audio/x-mpeg-3; rate=16000
返回结果:无法识别的编码
请求Header:Content-Type: audio/mp3; rate=16000
返回结果:无法识别的编码
3、PCM格式
请求Header:Content-Type: audio/x-ogg-pcm; rate=16000
返回结果:无法识别的编码
请求Header:Content-Type: audio/pcm; rate=16000
返回结果:无法识别的编码
4、SPEEX格式
请求Header:Content-Type: audio/x-speex-with-header-byte; rate=16000
返回结果:识别成功
请求Header:Content-Type: audio/speex; rate=16000
返回结果:识别成功
由于识别接口并不开放,所以无法得知具体的支持格式,如果哪位朋友发现了新的支持格式,请一定要留言哦!
【miscellaneous】使用Google语音识别引擎(Google Speech API)[3月5日修改]的更多相关文章
- 语音识别(Web Speech API)
近期看了一个语音识别的dome-----Web Speech API 本api为js调用云端接口识别 个人测试了一下,响应速度还是比较快的 注意:本API与官网需翻墙使用和访问 展示效果: 页面代码如 ...
- 调用 google speech api (使用Google语音识别引擎)
完全参考自: http://mikepultz.com/2011/03/accessing-google-speech-api-chrome-11/ http://aiku.me/bar/104480 ...
- 谷歌技术面试要点(Google面试)(14年5月20日交大专场)
技术面试的主题 1.简要自我介绍: 姓名.学校.专业 做过的项目与实习 个人主要成就 2.技术评估: 构建与开发算法 编程 计算机基础知识 数据结构 现实世界问题解决能力 设计问题(主要针对博士生) ...
- Google帝国研究——Google的产业构成
Google帝国研究--Goog ...
- 利用Google Speech API实现Speech To Text
很久很久以前, 网上流传着一个免费的,识别率暴高的,稳定的 Speech To Text API, 那就是Google Speech API. 但是最近再使用的时候,总是返回500 Error. 后来 ...
- HTML5 Web Speech API 结合Ext实现浏览器语音识别以及输入
简介 Web Speech API是HTML5技术中的一个提供原生语音识别技术的API,Google Chrome在25版之后开始支持Web Speech API,Google也提供了一个 ...
- IOS Google语音识别更新啦!!!
旧版本的API: —Google提供了一个在线语音识别的API接口,通过该API可以进行中文.英文等语言的识别. API地址:http://www.google.com/speech-api ...
- Google 新推出Background sync API
Background sync是Google新推出的Web API,可延迟用户行为,直到用户网络连接稳定.这样有助于保证用户想要发送的数据就是实际发送的数据. 目前存在的问题 网络是消磨用户时间最多的 ...
- 怎样用Google APIs和Google的应用系统进行集成(3)----调用Google 发现(Discovery)API的RESTful服务
说了这么多,那么首先同意我以Google Discovery RESTful服务为例,给大家演示怎样用最普通的Java代码调用Google Discovery RESTful服务. 引言: 在&quo ...
随机推荐
- nginx+uwsgi+bottle python服务器部署
一.安装nginx(如果服务器上已经有nginx了,则无需重复安装) sudo apt-get install nginx 二.nginx配置,例如:/etc/nginx/conf.d/digger. ...
- vue,react,angular三大web前端流行框架简单对比
常用的到的网站 vue学习库: https://github.com/vuejs/awesome-vue#carousel (json数据的格式化,提高本地测试的效率) json在线编辑: http: ...
- mysql 解决忘记密码 mysql5.7 远程登录不上MySQL(解决腾讯服务器初始mysql密码问题)
一.修改MySQL启动配置文件 #如果不知道配置文件,先查找find / -name my.cnf#编辑配置文件 vim /etc/my.cnf 在[mysql] 下面第一行加入 skip-gran ...
- tomcat——web.xml
本机tomcat位置:D:\tomcat7\apache-tomcat-7.0.61 web.xml web工程的部署描述文件.在web工程中此文件并不是必须有的. 位置:D:\tomcat7\apa ...
- Node.js 调试小技巧
小技巧--使用 supervisor如果你有 PHP 开发经验,会习惯在修改 PHP 脚本后直接刷新浏览器以观察结果,而你在开发 Node.js 实现的 HTTP 应用时会发现,无论你修改了代码的哪一 ...
- python中闭包的概念
闭包:简单来说,就是一个外部函数的返回值是内部函数的引用 通过一个例子来说明 def outer(a): b = 10 def inner(): print(a+b) return inner # ...
- Django—Ajax
Ajax-get url url(r'^ajax_add/', views.ajax_add), url(r'^ajax_demo1/', views.ajax_demo1), 视图 def ajax ...
- css定位中的百分比
----转载自自己在牛人部落中的相关文章--- 在前端css定位中经常面对的一个问题是,百分比定位究竟是针对于谁定位? 一.margin,padding的百分比 首先从css的设计意图说起,在浏览器默 ...
- 虚拟Linux系统使用Windows系统oracle数据库
前提:本地oracle数据库能正常使用. 数据库:oracle 11g 虚拟机:VMware_workstation_full_12.5.2 本机系统:Windows 7 旗舰版 虚拟机系统:open ...
- 【Linux】ssh命令行下多任务前后台切换
原文:https://my.oschina.net/huxuanhui/blog/13844 我们都知道,在 Windows 上面,我们要么让一个程序作为服务在后台一直运行,要么停止这个服务.而不能让 ...