语音比较

最近图片比较很热,于是想到了语音比较,即找出与你声音契合度最高的人。

翻了翻技术文档,发现这个方向难度很大,实现很困难。也难怪语音识别技术发展很久也仍然处于初级阶段。

发现一个通过网络请求去访问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 plain copy print ?
  1. flac.exe -8 -f --sample-rate=16000 speechInput.wav  
[plain]  view plain copy print ?
  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.   
  9.         request.setRawHeader("User-Agent""Mozilla/5.0");  
  10.         request.setRawHeader("Content-Type""audio/x-flac; rate=16000");  
  11.   
  12.         Nt_SPEECH = NetworkMGR.post(request, audioData);  
  13.         connect(Nt_SPEECH, SIGNAL(readyRead()), this, SLOT(Read_SPEECH()));  
  14.     }  
  15. }  

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

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

    返回结果:识别成功


    由于识别接口并不开放,所以无法得知具体的支持格式,如果哪位朋友发现了新的支持格式,请一定要留言哦!

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 plain copy print ?
  1. BufferedWriter w = new BufferedWriter(new FileWriter(outPutFilePath));  
  2.         String content = null;  
  3.         String result = "";  
  4.         while ((content = breader.readLine()) != null) {  
  5.             result += content + "\n";  
  6.         }  
  7.         w.write(result);  
  8.         w.flush();  
  9.         w.close();  
  10.         return result;  
Re:  liuminch 2012-08-03 14:21发表 [回复]
回复loshamo:是不是你的采样率设置错了?rate=16000
19楼  loshamo 2012-07-31 16:27发表 [回复]
[java]  view plain copy print ?
  1. public String post(String filePath) throws Exception {  
  2.         URL url = new URL(utl);  
  3.         HttpURLConnection conn = (HttpURLConnection)url.openConnection();  
  4.         conn.setDoOutput(true);  
  5.         conn.setDoInput(true);  
  6.         conn.setRequestMethod("POST");  
  7.         conn.setRequestProperty("Content-Type""audio/L16; rate=8000");  
  8.         conn.setRequestProperty("user-agent","mozilla/5.0");  
  9.         DataOutputStream writer = new DataOutputStream(conn  
  10.                 .getOutputStream());  
  11.         FileInputStream input = new FileInputStream(new File(filePath));  
  12.         byte[] buffer = new byte[256]; //必须用户自己创建一个buffer。  
  13.         int read = input.read(buffer);  
  14.         while (read != -1// 判断文件读完的条件  
  15.         {  
  16.             writer.write(buffer,0,read);  
  17.             read = input.read(buffer);  
  18.         }  
  19.         writer.flush();  
  20.         writer.close();  
  21.         input.close();  
  22.         InputStreamReader reder = new InputStreamReader(conn.getInputStream(),  
  23.                 "utf-8");  
  24.         BufferedReader breader = new BufferedReader(reder);  
  25.         BufferedWriter w = new BufferedWriter(new FileWriter(outPutFilePath));  
  26.         。。。  
  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发表 [回复]
[java]  view plain copy print ?
  1. String url = "http://www.google.com/speech-api/v1" +  
  2.                 "/recognize?xjerr=1&client=chromium&lang=zh-cn";  
  3.         URL postUrl = new URL(url);  
  4.         HttpURLConnection connection = (HttpURLConnection)postUrl.openConnection();  
  5.  connection.setRequestProperty("Content-Type","audio/x-flac; rate=16000");  
  6.         connection.connect();  
  7.         DataOutputStream outputStream  = new DataOutputStream(connection.getOutputStream());  
  8.         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头部中有用的信息如下:
  1. class Protocol  
  2. {  
  3. public slots:  
  4.     // 请求函数  
  5.     void Request_SPEECH(QByteArray &);  
  6. private slots:  
  7.     // 读取函数  
  8.     void Read_SPEECH();  
  9. signals:  
  10.     // 信号  
  11.     void Signal_SPEECH(int result, QString responsemsg, double confidence);  
  12. };  


另,在读取函数中应该使用:
  1. <br>connect(Nt_SPEECH, SIGNAL(finished()), this, SLOT(Read_SPEECH()));<br>  

而不是:
  1. <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可以访问网络的话,本文描述的方法应该也是同样适用的。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值