语音比较
2013-06-19 10:04
169 查看
最近图片比较很热,于是想到了语音比较,即找出与你声音契合度最高的人。
翻了翻技术文档,发现这个方向难度很大,实现很困难。也难怪语音识别技术发展很久也仍然处于初级阶段。
发现一个通过网络请求去访问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,对已经发现的接口进行测试:
[plain] view
plaincopyprint?
flac.exe -8 -f --sample-rate=16000 speechInput.wav
[plain] view
plaincopyprint?
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
plaincopyprint?
{
"status":0, /* 结果代码,详细见本文结尾 */
"id":"c421dee91abe31d9b8457f2a80ebca91-1", /* 识别编号 */
"hypotheses": /* 假设,即结果 */
[
{
"utterance":"下午好", /* 话语 */
"confidence":0.2507637 /* 信心,即准确度 */
}
]
}
注:注释后为手工添加的结果解释
返回结果太明了了!直接就能拿来用了不是~ 返回的编码是UTF-8。
对于编码格式,在测试中使用了FLAC编码,采样率为16kHz,经测试其他采样率同样可用,但一定要保证Header里的rate与实际数据相符。(关于其他格式的实验请看本文底部。)
总结:
1、基本流程:
一、从音频输入设备获取原始数据。
二、对原始数据进行包装、编码。
三、将编码后的音频POST至接口地址。
四、分析处理接口返回的JSON并得出结果。
2、请求接口
地址:http://www.google.com/speech-api/v1/recognize?xjerr=1&client=chromium&lang=zh-CN&maxresults=1
请求方式:HTTP POST
头部信息:Content-Type: audio/x-flac; rate=16000 (注:Content-Type根据所使用的编码格式不同而不同,详见文章底部。rate为音频采样率。)
请求数据:编码后的音频数据
3、音频编码格式:
FLAC或WAV或SPEEX
下面是我写的Qt(C++)中的请求:
[cpp] view
plaincopyprint?
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 错误信息
[cpp] view
plaincopyprint?
// 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
返回结果:识别成功
由于识别接口并不开放,所以无法得知具体的支持格式,如果哪位朋友发现了新的支持格式,请一定要留言哦!
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 没有声明,这个问题怎么解决啊?
Re: LiMiRiver 2013-04-16 21:44发表 [回复]
回复LiMiRiver:这个问题已经解决啦。。。但是博主你给的Protocol是头文件吗?在这个文件上编译总有错。
Re: LiMiRiver 2013-04-17 13:26发表 [回复]
回复LiMiRiver:额……原谅我吧楼主,请忽略以上白痴问题
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发表 [回复]
引用“liuminch”的评论:Google也有个语音合成API,向这个接口发http://translate.google.com...
这个我已经跟这个识别一同实现了,不过我接收木有遇到问题哦
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文件一直接收有问题。
20楼 loshamo 2012-07-31 16:28发表 [回复]
[java] view
plaincopyprint?
BufferedWriter w = new BufferedWriter(new FileWriter(outPutFilePath));
String content = null;
String result = "";
while ((content = breader.readLine()) != null) {
result += content + "\n";
}
w.write(result);
w.flush();
w.close();
return result;
Re: liuminch 2012-08-03 14:21发表 [回复]
回复loshamo:是不是你的采样率设置错了?rate=16000
19楼 loshamo 2012-07-31 16:27发表 [回复]
[java] view
plaincopyprint?
public String post(String filePath) throws Exception {
URL url = new URL(utl);
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
conn.setDoOutput(true);
conn.setDoInput(true);
conn.setRequestMethod("POST");
conn.setRequestProperty("Content-Type", "audio/L16; rate=8000");
conn.setRequestProperty("user-agent","mozilla/5.0");
DataOutputStream writer = new DataOutputStream(conn
.getOutputStream());
FileInputStream input = new FileInputStream(new File(filePath));
byte[] buffer = new byte[256]; //必须用户自己创建一个buffer。
int read = input.read(buffer);
while (read != -1) // 判断文件读完的条件
{
writer.write(buffer,0,read);
read = input.read(buffer);
}
writer.flush();
writer.close();
input.close();
InputStreamReader reder = new InputStreamReader(conn.getInputStream(),
"utf-8");
BufferedReader breader = new BufferedReader(reder);
BufferedWriter w = new BufferedWriter(new FileWriter(outPutFilePath));
。。。
}
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发表 [回复]
[java] view
plaincopyprint?
String url = "http://www.google.com/speech-api/v1" +
"/recognize?xjerr=1&client=chromium&lang=zh-cn";
URL postUrl = new URL(url);
HttpURLConnection connection = (HttpURLConnection)postUrl.openConnection();
connection.setRequestProperty("Content-Type","audio/x-flac; rate=16000");
connection.connect();
DataOutputStream outputStream = new DataOutputStream(connection.getOutputStream());
outputStream.write(readfileByYte("aaa.flac"));
这个是关键代码实现了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头部中有用的信息如下:
[cpp] view
plaincopyprint?
class Protocol
{
public slots:
// 请求函数
void Request_SPEECH(QByteArray &);
private slots:
// 读取函数
void Read_SPEECH();
signals:
// 信号
void Signal_SPEECH(int result, QString responsemsg, double confidence);
};
另,在读取函数中应该使用:
[cpp] view
plaincopyprint?
<br>connect(Nt_SPEECH, SIGNAL(finished()), this, SLOT(Read_SPEECH()));<br>
而不是:
[cpp] view
plaincopyprint?
<br>connect(Nt_SPEECH, SIGNAL(readyRead()), this, SLOT(Read_SPEECH()));<br>
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可以访问网络的话,本文描述的方法应该也是同样适用的。
翻了翻技术文档,发现这个方向难度很大,实现很困难。也难怪语音识别技术发展很久也仍然处于初级阶段。
发现一个通过网络请求去访问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,对已经发现的接口进行测试:
[plain] view
plaincopyprint?
flac.exe -8 -f --sample-rate=16000 speechInput.wav
[plain] view
plaincopyprint?
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
plaincopyprint?
{
"status":0, /* 结果代码,详细见本文结尾 */
"id":"c421dee91abe31d9b8457f2a80ebca91-1", /* 识别编号 */
"hypotheses": /* 假设,即结果 */
[
{
"utterance":"下午好", /* 话语 */
"confidence":0.2507637 /* 信心,即准确度 */
}
]
}
注:注释后为手工添加的结果解释
返回结果太明了了!直接就能拿来用了不是~ 返回的编码是UTF-8。
对于编码格式,在测试中使用了FLAC编码,采样率为16kHz,经测试其他采样率同样可用,但一定要保证Header里的rate与实际数据相符。(关于其他格式的实验请看本文底部。)
总结:
1、基本流程:
一、从音频输入设备获取原始数据。
二、对原始数据进行包装、编码。
三、将编码后的音频POST至接口地址。
四、分析处理接口返回的JSON并得出结果。
2、请求接口
地址:http://www.google.com/speech-api/v1/recognize?xjerr=1&client=chromium&lang=zh-CN&maxresults=1
请求方式:HTTP POST
头部信息:Content-Type: audio/x-flac; rate=16000 (注:Content-Type根据所使用的编码格式不同而不同,详见文章底部。rate为音频采样率。)
请求数据:编码后的音频数据
3、音频编码格式:
FLAC或WAV或SPEEX
下面是我写的Qt(C++)中的请求:
[cpp] view
plaincopyprint?
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 错误信息
[cpp] view
plaincopyprint?
// 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
返回结果:识别成功
由于识别接口并不开放,所以无法得知具体的支持格式,如果哪位朋友发现了新的支持格式,请一定要留言哦!
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 没有声明,这个问题怎么解决啊?
Re: LiMiRiver 2013-04-16 21:44发表 [回复]
回复LiMiRiver:这个问题已经解决啦。。。但是博主你给的Protocol是头文件吗?在这个文件上编译总有错。
Re: LiMiRiver 2013-04-17 13:26发表 [回复]
回复LiMiRiver:额……原谅我吧楼主,请忽略以上白痴问题
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发表 [回复]
引用“liuminch”的评论:Google也有个语音合成API,向这个接口发http://translate.google.com...
这个我已经跟这个识别一同实现了,不过我接收木有遇到问题哦
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文件一直接收有问题。
20楼 loshamo 2012-07-31 16:28发表 [回复]
[java] view
plaincopyprint?
BufferedWriter w = new BufferedWriter(new FileWriter(outPutFilePath));
String content = null;
String result = "";
while ((content = breader.readLine()) != null) {
result += content + "\n";
}
w.write(result);
w.flush();
w.close();
return result;
Re: liuminch 2012-08-03 14:21发表 [回复]
回复loshamo:是不是你的采样率设置错了?rate=16000
19楼 loshamo 2012-07-31 16:27发表 [回复]
[java] view
plaincopyprint?
public String post(String filePath) throws Exception {
URL url = new URL(utl);
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
conn.setDoOutput(true);
conn.setDoInput(true);
conn.setRequestMethod("POST");
conn.setRequestProperty("Content-Type", "audio/L16; rate=8000");
conn.setRequestProperty("user-agent","mozilla/5.0");
DataOutputStream writer = new DataOutputStream(conn
.getOutputStream());
FileInputStream input = new FileInputStream(new File(filePath));
byte[] buffer = new byte[256]; //必须用户自己创建一个buffer。
int read = input.read(buffer);
while (read != -1) // 判断文件读完的条件
{
writer.write(buffer,0,read);
read = input.read(buffer);
}
writer.flush();
writer.close();
input.close();
InputStreamReader reder = new InputStreamReader(conn.getInputStream(),
"utf-8");
BufferedReader breader = new BufferedReader(reder);
BufferedWriter w = new BufferedWriter(new FileWriter(outPutFilePath));
。。。
}
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发表 [回复]
[java] view
plaincopyprint?
String url = "http://www.google.com/speech-api/v1" +
"/recognize?xjerr=1&client=chromium&lang=zh-cn";
URL postUrl = new URL(url);
HttpURLConnection connection = (HttpURLConnection)postUrl.openConnection();
connection.setRequestProperty("Content-Type","audio/x-flac; rate=16000");
connection.connect();
DataOutputStream outputStream = new DataOutputStream(connection.getOutputStream());
outputStream.write(readfileByYte("aaa.flac"));
这个是关键代码实现了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头部中有用的信息如下:
[cpp] view
plaincopyprint?
class Protocol
{
public slots:
// 请求函数
void Request_SPEECH(QByteArray &);
private slots:
// 读取函数
void Read_SPEECH();
signals:
// 信号
void Signal_SPEECH(int result, QString responsemsg, double confidence);
};
另,在读取函数中应该使用:
[cpp] view
plaincopyprint?
<br>connect(Nt_SPEECH, SIGNAL(finished()), this, SLOT(Read_SPEECH()));<br>
而不是:
[cpp] view
plaincopyprint?
<br>connect(Nt_SPEECH, SIGNAL(readyRead()), this, SLOT(Read_SPEECH()));<br>
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可以访问网络的话,本文描述的方法应该也是同样适用的。
相关文章推荐
- 几个常见的语音交互平台的简介和比较
- 几个常见的语音交互平台的简介和比较
- LTE语音解决方案以及比较(3)
- 语音库比较
- P2P语音通信和一般VoIP通信质量比较
- 多人语音通讯混音算法比较和总结
- 高仿语音发送动画,按住闪烁,滑动跟随,删除翻转丢入垃圾桶,比较全的一个动画实例
- 目前音频(语音)编码器的比较
- 几个常见的语音交互平台的简介和比较
- Android文字转语音引擎(TTS)简单比较及下载
- 几个常见的语音交互平台的简介和比较
- 常见的语音交互平台的简介和比较
- 几个常见的语音交互平台的简介和比较
- 基于分组网络的语音连接技术CESoP与VoIP的比较
- [转]几个常见的语音交互平台的简介和比较
- p2p语音通信和一般voip通信质量比较
- 几个常见的语音交互平台的简介和比较
- 几个常见的语音交互平台的简介和比较
- 几个常见的语音交互平台的简介和比较
- 12本北美比较常用的机器学习/自然语言处理/语音处理经典书籍