最近图片比较很热,于是想到了语音比较,即找出与你声音契合度最高的人。
翻了翻技术文档,发现这个方向难度很大,实现很困难。也难怪语音识别技术发展很久也仍然处于初级阶段。
发现一个通过网络请求去访问Google语音引擎的一个途径,未证实,网址如下:http://blog.csdn.net/dlangu0393/article/details/7214728
未防止原文删除,将其复制如下:
最近在使用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,对已经发现的接口进行测试:
结果如下:
注:注释后为手工添加的结果解释
返回结果太明了了!直接就能拿来用了不是~ 返回的编码是UTF-8。
对于编码格式,在测试中使用了FLAC编码,采样率为16kHz,经测试其他采样率同样可用,但一定要保证Header里的rate与实际数据相符。(关于其他格式的实验请看本文底部。)
总结:
1、基本流程:
2、请求接口一、从音频输入设备获取原始数据。二、对原始数据进行包装、编码。三、将编码后的音频POST至接口地址。四、分析处理接口返回的JSON并得出结果。
请求方式:HTTP POST头部信息:Content-Type: audio/x-flac; rate=16000 (注:Content-Type根据所使用的编码格式不同而不同,详见文章底部。rate为音频采样率。)请求数据:编码后的音频数据
3、音频编码格式:
FLAC或WAV或SPEEX
至于读取函数,就不贴在这里了,具体见:
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 错误信息
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
返回结果:识别成功
由于识别接口并不开放,所以无法得知具体的支持格式,如果哪位朋友发现了新的支持格式,请一定要留言哦!
-
37楼
flight9 2013-06-02 20:26发表
-
为何我按你的方法,识别率超差啊,说“上午好”,返回“sina”,说“欢迎”返“日语”
-
Re:
flight9 2013-06-02 20:43发表
- 回复flight9:更正一下,说“你好”返“日语”,说“再见”返“漫画”
-
36楼
u010236042 2013-05-08 11:43发表
- 楼主你好,你的这篇文章我觉得写的挺好,收录到我们的网站了,链接:http://www.mmihome.net/portal.php?mod=view&aid=212,欢迎交流,有问题请联系,谢谢。
-
35楼
kevinlico 2013-05-08 10:57发表
-
亲爱的博主,看你的论文两天了。我发现了一个格式 amr,谷歌接口可以识别的。数据压缩非常小。效率很高。特别说明:我是在IOS平台上面实验的。
代码基本要点贴在下面:
1、AMR格式
请求Header:Content-Type: audio/amr; rate=16000
返回结果:识别成功
rate 8000 也可以。录制的过程中,注意对应就可以了。谢谢!-
Re:
lyfadd85 2013-05-24 11:18发表
- 回复kevinlico:amr,果然可以。
-
34楼
s253425456 2013-04-28 15:55发表
-
你好博主,感谢分享,
我在使用中遇到一个问题,我使用的是wav格式的音频,大小在35k左右,使用post上传时提示403错误。
如果我只post比较小的buffer(不是完整音频),可以post成功,识别失败(必然的),不知道之前的为什么post失败
-
33楼
lyfadd85 2013-04-23 19:36发表
- 博主你好,请教你两个问题。1、本文中你试验的speex格式文件能成功识别,是否与录音获取的数据类型有关,我用audiorecord录音获取byte数组可以识别,但是如果是short数组却不能;2、speex格式能识别,请问你是如何获取数据,数据类型是否存在转换的过程能解释一下吗,因为语音识别需要考虑流量的问题,采用speex格式传输更合理,期待你的回复,谢谢。
-
32楼
LiMiRiver 2013-04-16 19:45发表
- 楼主,问一个非常菜鸟的问题,我按照你的代码在Qt中运行,main文件总是出错,speechInput_audioFormat 没有声明,这个问题怎么解决啊?
-
31楼
jsjscool 2013-03-06 18:51发表
-
博主还有一些细节没说到,看看这篇文章
http://php.oil58.com/?p=483-
Re:
redsky_luan 2013-04-06 21:17发表
- 回复jsjscool:兄弟你好,FLAC格式或者WAV格式如何获得呢?之际读二进制文件么?
-
30楼
lehuoezu 2013-01-01 22:15发表
-
我使用VB6.0做这个,一直到转换flac都做出来了,播放转换后的flac也正常,说明转换过程应该没有问题,但是在post过程中遇到了点困难,如何把flac在VB中post出去?我最初尝试用读取文本的方式读取flac,但读出来的只是一行英文,还有一堆空格,显然是无法识别的,我又试着用二进制方式读取,读取到一大长串数字,post出去,得到这个结果:
{"status":5,"id":"b22e49c6bd19020f56d6437a17db5f7b-1","hypotheses":[]}
目测应该还是flac没有被正确post出去。
能否提供一下正确的post出去的字符串应该是什么样子的?数字?还是英文字母?最好,提供一下VB中的例子,哈哈,谢谢啦~-
Re:
redsky_luan 2013-04-06 21:16发表
- 回复lehuoezu:怎么样兄弟,问题解决了么?我也遇到同样的问题
-
29楼
yexiangCSDN 2012-12-24 13:34发表
- 为什么 我得到的状态 都为 5呢?
-
28楼
wow_qs_zs 2012-12-23 16:33发表
- 我很不解为什么 我的识别率这么低呢 楼主能给解答下吗代码在我的博客上。
-
27楼
汹涌的海 2012-11-20 17:17发表
- 赞
-
26楼
qinshudong 2012-10-27 20:34发表
-
不知道楼主在不在??
想要一个VC++里面的 例子
自己写的 调试不出来
-
25楼
yylsheng 2012-10-08 15:53发表
- 楼主,我要在WIN32平台下利用这个引擎,该如何写呢
-
24楼
alanlei22 2012-10-07 13:36发表
-
dlangu0393楼主你好,
我用QT引用你的源碼
但是在Protocol.cpp出現錯誤
你能給一下Protocol.h所有的變量嗎
那一些replyCheck,Nt_SPEECH,contentCheck,checkJsonKeys我不知道你定義他們為什麼類形
還有jsonConvertableTo是什麼Class呢...
我的email:alanlei22@yahoo.com.hk
請大大給我一份Protocol.h的完整源碼
謝謝!
-
23楼
dlangu0393 2012-09-17 08:17发表
-
这个我已经跟这个识别一同实现了,不过我接收木有遇到问题哦-
Re:
技术宅不是屌丝 2013-02-08 14:20发表
- 回复dlangu0393:请问,我用Java调,设置中文后,接收一直不能成功,可以请教一下您的解决方案吗?
-
Re:
技术宅不是屌丝 2012-12-05 15:30发表
- 回复dlangu0393:您好,我在使用JAVA调用Google语音合成API时,接受英文没有问题,但是无法成功接受中文,望请赐教!
-
22楼
ClamReason 2012-08-26 09:31发表
- 想楼主回复的一些有用的问题,为什么不更新这个帖子,写到原帖中去呢,对我们这些后来的狠不方便啊
-
21楼
liuminch 2012-08-03 14:29发表
- Google也有个语音合成API,向这个接口发http://translate.google.com/translate_tts?tl=en&q=test content,将返回一个test content的mp3文件,也支持中文。不知楼主有没有兴趣搞?比这个容易搞多了,只是偶较愚钝,返回的mp3文件一直接收有问题。
-
19楼
loshamo 2012-07-31 16:27发表
-
18楼
liuminch 2012-07-26 19:29发表
-
哇,楼主,我用java写的wav格式成功了,专程来感谢的!只是confidence偏低啊,这个是不是confidence越高,识别时间越短啊?还有用flac格式是不是confidence都很高啊?
-
Re:
wsw8612 2013-04-17 10:02发表
- 回复liuminch:你好,我也在看这个,但一直搞不通,能否发个java的demo来学习一下!wufan8612@163.com
-
Re:
loshamo 2012-07-31 15:10发表
-
你的java版是怎么写的? 我怎么搞不通呢,希望赐教。
-
Re:
chen735250065 2012-10-18 10:52发表
-
这个是关键代码实现了flac格式但是wav格式有问题。请求大神解决
-
17楼
huaye 2012-07-25 09:49发表
-
能否给个你测试过的wav或者flac文件上传地址,我下来测试下?
-
Re:
huaye 2012-07-25 13:50发表
-
回复huaye2007:搞定了,是
E:\MediaOutput\speechInput.wav
General
Complete name : E:\MediaOutput\speechInput.wav
Format : Wave
File size : 85.0 KiB
Audio #0
ID : 0
Format : PCM
Format settings, Endianness : Little
Codec ID : 1
Bit rate : 256 Kbps
Channel(s) : 1 channel
Sampling rate : 16.0 KHz
Bit depth : 16 bits
Stream size : 1.00 Byte (0%)
中Bit depth : 16 bits
而我这只有4或者8,结果都不行。改成16就可以了。
-
16楼
huaye 2012-07-25 09:48发表
-
对上传文件大小有限制不?
我的老是返回消息:
{"status":5,"id":"39f4a7ae3a539ae1a797c041e122f4b3-1","hypotheses":[]}-
Re:
yexiangCSDN 2012-12-24 13:33发表
- 为什么 我得到的状态 都为 5呢?
-
15楼
jplele 2012-07-11 10:56发表
- 楼主有对比过讯飞和google的语音识别么?
-
14楼
Victor000000 2012-04-30 16:35发表
-
能否给出protacol.h和protacol.cpp的完整代码?
-
Re:
dlangu0393 2012-04-30 17:40发表
-
回复Victor000000:不好意思这个没法给你,因为里面还有其他的很多东西。
Protocol头部中有用的信息如下:
另,在读取函数中应该使用:
而不是:
-
13楼
ABCDEFGA 2012-04-09 09:14发表
-
厉害,最近我也在做这一块,可是主要是用JAVA的,用于毕业论文,想问下你有相关的资料与建议吗~?
-
Re:
dlangu0393 2012-04-27 17:56发表
- 回复hacktheworld:呵呵 不好意思,我并不是研究这个的,只不过是软件需要用到,所以才去找的。^_^
-
12楼
stoneforestwhu 2012-03-16 19:47发表
-
wav 格式识别不准,flac非常准,下面是例子:
/wav格式(录音内容为“I have a dream”)
{"status":0,"id":"a01cd4f1efc9d433a1b0695e95011b40-1","hypotheses":[{"utterance":"rm","confidence":0.26077396}]}
/flac格式(录音内容为“I have a dream”)
{"status":0,"id":"e186ca8a3d98f461622dfa3662332fdc-1","hypotheses":[{"utterance":"i have a dream","confidence":0.87555957}]}
楼主可有好办法解决?-
Re:
dlangu0393 2012-04-27 17:55发表
- 回复stoneforestwhu:这个我也没有办法了,没有在源码中找到其他更多的信息。
-
11楼
stoneforestwhu 2012-03-15 20:10发表
-
我想问一下flac.exe -8 -f --sample-rate=16000 speechInput.wav 是WINdows下的指令,而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"是linux下使用的,表示不解。教程能否详细点,多谢!!!
-
Re:
dlangu0393 2012-03-15 21:17发表
-
回复stoneforestwhu:http://gnuwin32.sourceforge.net/packages/wget.htm
请在此下载wget for windows。
如果有不明白的地方请回复提问,我会尽力回答。
-
10楼
春城秋水 2012-03-12 13:18发表
-
天呀,为啥我设置了zh-CN,能识别英语却识别不出中文呢?中文显示乱码。。。。。
-
Re:
dlangu0393 2012-03-12 13:50发表
- 回复Q951248:返回内容为UTF-8编码。请修改读取部分的代码。
-
9楼
forLoginAndLogin 2012-03-11 19:33发表
-
楼主,你好。
你这片文章写得很好很详细。我有个问题解决不了,想请教楼主一下:
文中你提到google 这个api支持wav格式(就是改成audio/L16),我试了很多次,都不成功(返回的status:4),而我把它转换成flac格式又成功了,请问一下这是什么原因呢?谢谢~~~-
Re:
dlangu0393 2012-03-11 22:02发表
- 回复forLoginAndLogin:请注意一下rate(采样率)是否正确。
-
Re:
dlangu0393 2012-03-11 21:56发表
-
回复forLoginAndLogin:以下是我测试所使用的WAV文件信息:
E:\MediaOutput\speechInput.wav
General
Complete name : E:\MediaOutput\speechInput.wav
Format : Wave
File size : 85.0 KiB
Audio #0
ID : 0
Format : PCM
Format settings, Endianness : Little
Codec ID : 1
Bit rate : 256 Kbps
Channel(s) : 1 channel
Sampling rate : 16.0 KHz
Bit depth : 16 bits
Stream size : 1.00 Byte (0%)
wget测试命令:
E:\MediaOutput>wget -O "GoogleSpeechAPI.txt" --user-agent="Mozilla/5.0" --post-file=speechInput.wav --header="Content-Type: audio/L16; rate=16000" "http://www.google.com/speech-api/v1/recognize?xjerr=1&client=chromium&lang=zh-CN&maxresults=1"
返回结果:
{"status":0,"id":"ca0c1b3b2c6f89d70ab1643a70599c0d-1","hypotheses":[{"utterance":"下午好","confidence":0.7916111}]}-
Re:
darou1000 2012-04-27 11:32发表
-
回复dlangu0393:你好,请问你是用什么工具看到wav文件格式的?以及有没有什么工具可以把wav转换成speex
-
Re:
dlangu0393 2012-04-27 17:55发表
-
回复darou1000:我是从PotPlayer里拷贝的文件信息。
Speex请参看http://www.speex.org/
不过Speex在我这里测试成功率极低,甚至在64位系统下官方提供的编码器无法正常工作。-
Re:
darou1000 2012-05-02 14:28发表
- 回复dlangu0393:非常感谢,我测试成功了,还想请教一下,是否可以在请求时发送语法定义呢?
-
8楼
春城秋水 2012-03-09 18:29发表
-
我想问下,这个东西能应用到java写的系统么?
-
Re:
dlangu0393 2012-03-09 20:42发表
-
回复Q951248:当然可以哦,只要你用java实现就可以了。协议都是一样的。
-
Re:
春城秋水 2012-03-10 13:40发表
- 回复dlangu0393:你好,我又多看了几遍,大概的过程已经知道,但是因为我不懂C和C++,只懂点java,但看样子应该是要网络编程,不知道java该如何实现的。。。
-
Re:
春城秋水 2012-03-10 10:45发表
- 回复dlangu0393:你好,能否发一个完整的源代码例子给我看看呢?对于你说的这些感觉很散乱,我比较笨理不清思路........。邮箱:js.qiu@qq.com 谢谢啦!
-
7楼
Ostroff 2012-03-07 10:32发表
-
LZ太强大了,我用WAV格式测试OK。我现在有个问题,就是这里的语言是中文普通话,lang=zh-CN,对吧,那设置用户读音为粤语和英语,lang参数应该为什么呢?
-
Re:
dlangu0393 2012-03-07 12:49发表
-
回复Ostroff:通用语言代号参考:http://msdn.microsoft.com/en-us/library/ms533052(v=vs.85).aspx
英语的话,请使用en-us。至于粤语,可以尝试一下zh-hk,不好意思不认识会粤语的朋友,没法测试是否可行。如果你测试可行的话,一定要来留言哦。
-
6楼
hill141592 2012-03-06 11:56发表
-
十分感谢楼主分享!给了我非常大的帮助!非常给力!
然后我提醒下楼主,我在以audio/L16作为参数时候做测试的时候,wav文件中其实就是PCM格式的音频~-
Re:
dlangu0393 2012-03-06 12:49发表
- 回复hill141592:我所测试的PCM是指原始的PCM数据(原始PCM数据应该用什么Content-Type我也不确定,只是从网上找到一个,从朋友那里拿到一个),而WAV是PCM数据加上头信息,两者还是有区别的。如果能直接传送PCM原始数据的话那就太方便了,从音频设备获取的数据都不用包装直接送往服务器就行了,虽然带宽上并不划算。
-
5楼
wb1989124 2012-03-05 21:40发表
-
楼主你好,我最近要在linux上编一个语音自动应答模块,用C++,不知道要怎么运用到这个谷歌的语音识别引擎?不知道楼主能否给点意见和建议?
-
Re:
dlangu0393 2012-03-05 21:45发表
-
回复wb1989124:其实关键点在于那个请求地址以及POST的数据内容,在文章中已经给出了哦~(文笔不好大概不太好找)
至于实现,我使用的是Qt框架,示例代码也给出了哦。
其实这个接口的调用并没有什么难度,主要还是前端的一些处理,比如如何正确的截断音频输入(实例中只是简单地使用了定时器终止,后来使用了根据音频内容来终止,如果用户停止说话了,就自动截断)。-
Re:
wb1989124 2012-03-13 17:41发表
- 回复dlangu0393:楼主能不能留个QQ?方便交流。
-
Re:
wb1989124 2012-03-13 14:19发表
-
回复dlangu0393:楼主,那我是不是要在linux环境下安装QT框架,然后在这个框架下按照这篇文章的例程,调用谷歌语音识别引擎?
-
Re:
dlangu0393 2012-03-15 21:18发表
- 回复wb1989124:本文着重介绍GoogleSpeechAPI,我只是使用Qt平台写了一个范例,并不一定非要用Qt平台。使用任何可以进行网络请求的语言和平台都可以。
-
4楼
Kevin_jiang2011 2012-02-27 22:27发表
- 谢谢分享
-
3楼
kafeleung 2012-02-19 18:35发表
-
你好,我对你的研究很感兴趣。但是有一些问题希望能请教一下:
1. 对于发送到google speech api的audioData是什么格式?
2.这个audioData好像是通过flac.exe对wav文件进行转换的,flac.exe这个是什么文件?哪里能找到?
谢谢你的分享。^_^-
Re:
dlangu0393 2012-02-19 21:46发表
-
回复kafeleung:先从录制设备获取数据,然后使用flac或者speex进行编码,audioData即为编码后的数据。我的范例中使用的是flac编码,Header如下:
Content-Type: audio/x-flac; rate=16000
rate即采样率16kHz,经测试其他的rate同样可用,但一定要保证数据内容和Header一致,不然会出错。
flac.exe是FLAC编码器的binary,在
http://sourceforge.net/projects/flac/files/flac-win/
可以下载到。(本来想使用FLAC的库,结果遇到一些麻烦没有弄成功)-
Re:
kafeleung 2012-02-20 01:03发表
- 回复dlangu0393:明白,谢谢。
-
2楼
waterman0405 2012-02-17 16:11发表
-
谢谢楼主,不过话说你真是博学呀,这都能找到。
我找了一早上,终于找到想要的了,这还是多亏了你们这些大侠的帮助呀!3Q-
Re:
dlangu0393 2012-02-18 00:28发表
- 回复waterman0405:博学什么的,不敢不敢…… 大家共同学习嘛!
-
1楼
waterman0405 2012-02-17 09:44发表
-
楼主你好,我最近也要用到语音识别系统,但是我使用在android手机上的,我查找了google的voice actions,但是没有找到公开的API,想问下你有这方面的资料吗?谢谢
-
Re:
dlangu0393 2012-02-17 12:41发表
-
回复waterman0405:不好意思我还真没写过Android的应用,我看到了下面的这篇文章,不知道是否对你有用 :D
http://developer.android.com/resources/articles/speech-input.html
另外,如果android可以访问网络的话,本文描述的方法应该也是同样适用的。