原文: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. docker容器日志管理

    docker容器日志分为两类:docker引擎日志(Docker本身运行的日志)和容器日志(各个容器内产生的日志) 一.Docker引擎日志: Centos系统下的docker引擎日志一般给syste ...

  2. git中的基本命令

    工作区:      当前的编辑位置 缓存区:      add 之后的区域 版本库:      commit之后的区域就是版本库 git init .         初始化 git add .    ...

  3. sql 查询 between and 和 >= <= 比较

    好久没有更新博客了,积累了很多问题没有得到解决,自己也在纠结有些东西需不需要花时间研究一下,认真想了想,不管怎么样,不能停止更新博客,继续保持一周至少一篇的习惯,不能放弃. 今天说的问题比较简单,就是 ...

  4. list,tuple,set,dict基础

    list # @Auther : chen # @Time : 2018/4/26 19:55 # @File : list_ex.py # @SoftWare : PyCharm # list1 = ...

  5. 本地启动服务,两个进程分别监听两个端口,导致两个 URL 不同

    问题描述: 本地启了两个服务:A(http://localhost:8001) B(http://localhost:8000),A 项目要怎么才能关联到 B 项目,也就是 A 项目请求怎么跳到 B ...

  6. deepin安装下载,部署在虚拟机上

    第一次接触linux就用了很久的Ubuntu,后来尝试了Manjaro.Debian,还是用了Ubuntu,但是用VM虚拟机使用的ubuntu经常卡顿.我始终觉得ubuntu的默认桌面环境gnome可 ...

  7. HDU 4393 Throw nails(贪心加模拟,追及问题)

    题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=115361#problem/D 题意大致是:给出最多50000个人,拥有最初速度 ...

  8. mlflow ui 启动报错No such file or directory: 'gunicorn': 'gunicorn'

    1.mlflow ui 启动报错,信息如下: [root@localhost mlflow]# mlflow ui /usr/local/python3/lib/python3./importlib/ ...

  9. vmware压缩vmdk文件大小

    在搭建靶机环境的过程中总是遇见vmdk越来越大,导致上传时间变长.记一下压缩vmdk的方法 ;sync;rm -f zero.fill /usr/bin/vmware-toolbox-cmd disk ...

  10. python selenium 的配置安装

    selenium的使用需要以下几个配置步骤. (1) 首先安装selenium,使用python自带的pip进行安装.若pip配置到系统环境变量,可以直接在cmd命令行中使用,若没有配置到到环境变量, ...