原文: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,对已经发现的接口进行测试

  1. flac.exe -8 -f --sample-rate=16000 speechInput.wav
  1. 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"

结果如下:

[javascript] view
plain
 copy

print?

  1. {
  2. "status":0,    /* 结果代码,详细见本文结尾 */
  3. "id":"c421dee91abe31d9b8457f2a80ebca91-1",    /* 识别编号 */
  4. "hypotheses":    /* 假设,即结果 */
  5. [
  6. {
  7. "utterance":"下午好",    /* 话语 */
  8. "confidence":0.2507637    /* 信心,即准确度 */
  9. }
  10. ]
  11. }

注:注释后为手工添加的结果解释

返回结果太明了了!直接就能拿来用了不是~ 返回的编码是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++)中的请求:

  1. void Protocol::Request_SPEECH(QByteArray & audioData)
  2. {
  3. if (!Nt_SPEECH)
  4. {
  5. QNetworkRequest request;
  6. QString speechAPI = "http://www.google.com/speech-api/v1/recognize?xjerr=1&client=chromium&lang=zh-CN&maxresults=1";
  7. request.setUrl(speechAPI);
  8. request.setRawHeader("User-Agent", "Mozilla/5.0");
  9. request.setRawHeader("Content-Type", "audio/x-flac; rate=16000");
  10. Nt_SPEECH = NetworkMGR.post(request, audioData);
  11. connect(Nt_SPEECH, SIGNAL(readyRead()), this, SLOT(Read_SPEECH()));
  12. }
  13. }

至于读取函数,就不贴在这里了,具体见:

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 错误信息

  1. // This enumeration follows the values described here:
  2. // http://www.w3.org/2005/Incubator/htmlspeech/2010/10/google-api-draft.html#speech-input-error
  3. enum SpeechInputError {
  4. // There was no error.
  5. SPEECH_INPUT_ERROR_NONE = 0,
  6. // The user or a script aborted speech input.
  7. SPEECH_INPUT_ERROR_ABORTED,
  8. // There was an error with recording audio.
  9. SPEECH_INPUT_ERROR_AUDIO,
  10. // There was a network error.
  11. SPEECH_INPUT_ERROR_NETWORK,
  12. // No speech heard before timeout.
  13. SPEECH_INPUT_ERROR_NO_SPEECH,
  14. // Speech was heard, but could not be interpreted.
  15. SPEECH_INPUT_ERROR_NO_MATCH,
  16. // There was an error in the speech recognition grammar.
  17. SPEECH_INPUT_ERROR_BAD_GRAMMAR,
  18. };

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日修改]的更多相关文章

  1. 语音识别(Web Speech API)

    近期看了一个语音识别的dome-----Web Speech API 本api为js调用云端接口识别 个人测试了一下,响应速度还是比较快的 注意:本API与官网需翻墙使用和访问 展示效果: 页面代码如 ...

  2. 调用 google speech api (使用Google语音识别引擎)

    完全参考自: http://mikepultz.com/2011/03/accessing-google-speech-api-chrome-11/ http://aiku.me/bar/104480 ...

  3. 谷歌技术面试要点(Google面试)(14年5月20日交大专场)

    技术面试的主题 1.简要自我介绍: 姓名.学校.专业 做过的项目与实习 个人主要成就 2.技术评估: 构建与开发算法 编程 计算机基础知识 数据结构 现实世界问题解决能力 设计问题(主要针对博士生) ...

  4. Google帝国研究——Google的产业构成

                                                                                        Google帝国研究--Goog ...

  5. 利用Google Speech API实现Speech To Text

    很久很久以前, 网上流传着一个免费的,识别率暴高的,稳定的 Speech To Text API, 那就是Google Speech API. 但是最近再使用的时候,总是返回500 Error. 后来 ...

  6. HTML5 Web Speech API 结合Ext实现浏览器语音识别以及输入

    简介      Web Speech API是HTML5技术中的一个提供原生语音识别技术的API,Google Chrome在25版之后开始支持Web Speech API,Google也提供了一个 ...

  7. IOS Google语音识别更新啦!!!

      旧版本的API:   —Google提供了一个在线语音识别的API接口,通过该API可以进行中文.英文等语言的识别.  API地址:http://www.google.com/speech-api ...

  8. Google 新推出Background sync API

    Background sync是Google新推出的Web API,可延迟用户行为,直到用户网络连接稳定.这样有助于保证用户想要发送的数据就是实际发送的数据. 目前存在的问题 网络是消磨用户时间最多的 ...

  9. 怎样用Google APIs和Google的应用系统进行集成(3)----调用Google 发现(Discovery)API的RESTful服务

    说了这么多,那么首先同意我以Google Discovery RESTful服务为例,给大家演示怎样用最普通的Java代码调用Google Discovery RESTful服务. 引言: 在&quo ...

随机推荐

  1. 向导中的参数传递 wizard param

    1.在向导页中使用WizardPage.this.getNextPage()方法可以获取到下一页的向导页: 2.在向导wizard中addPages()方法初始化的时候把整个页面传进去. 例:Wiza ...

  2. 201812-4 数据中心(kruskal)

    考场上的时候被题目完全蒙住了,当时状态也不好,前几次考试每次考试当天就头晕感冒流鼻涕 好的,以上都是借口,自己没有好好复习才是真的... 题目: 好的,以上题目简述就是:给你一个无向连通图,求它的最小 ...

  3. BZOJ 3884——欧拉降幂和广义欧拉降幂

    理论部分 欧拉定理:若 $a,n$ 为正整数,且 $a,n$ 互质,则 $a^{\varphi (n)} \equiv 1(mod \ n)$. 降幂公式: $$a^b=\begin{cases}a^ ...

  4. [2019HDU多校第二场][HDU 6591][A. Another Chess Problem]

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6591 题目大意:二维坐标系上,所有满足\(5|2x+y\)的点都被设为障碍物,无法通过.现给出一对点, ...

  5. Treasure Exploration POJ - 2594 【有向图路径可相交的最小路径覆盖】模板题

    Have you ever read any book about treasure exploration? Have you ever see any film about treasure ex ...

  6. MySQL 几种性能测试的工具使用

    近期由于要比较mysql及其分支mariadb, percona的性能,了解了几个这方面的工具,包括:mysqlslap sysbench tpcc-mysql,做一个整理,备忘,分享 1.mysql ...

  7. 浏览器console中加入jquery,测试选择元素

    一.chrome浏览器F12打开调试界面,在console中输入(firefox同样可以): var jquery = document.createElement('script'); jquery ...

  8. 利用chrome console批量下载文件

    因工作需要,需要定期从某页面下载多个文档,是体力活. 想用chrome扩展,找了几个不行.原因是: 1.有的扩展识别不了链接,因为链接是形如:jsp?XXX=XXX的形式 2.有的扩展能批量打开链接, ...

  9. 2019 Multi-University Training Contest 10

    目录 Contest Info Solutions C - Valentine's Day D - Play Games with Rounddog E - Welcome Party G - Clo ...

  10. 创建全局变量用以保存传递MFC中不同窗口中的数据

    格式如下: //DATA_TEMP.h class CDATA_TEMP{public: CDATA_TEMP(); virtual ~CDATA_TEMP();public: static int ...