博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【miscellaneous】使用Google语音识别引擎(Google Speech API)[3月5日修改]
阅读量:5298 次
发布时间:2019-06-14

本文共 3918 字,大约阅读时间需要 13 分钟。

原文:http://blog.csdn.net/dlangu0393/article/details/7214728#comments

近期重写本文,暂时禁止评论。

    最近在使用Qt编写一个客户端程序的时候需要增加语音识别输入的功能。起初尝试使用SAPI来完成这个任务,但是发现SAPI不仅使用起来超级复杂,而且识别效果也很惨烈。于是就需要寻找一个更加便捷优秀的方案。

    自从Chrome 11开始,Chrome开始支持的语音输入API,QQ紧接着也推出了语音识别输入(可以看做跟风么:D)。显然这些识别操作不可能在本地完成,那么我们就有直接利用接口的可能。

    对Chromium的repo进行搜索之后,终于找到了Chromium对语音识别的实现代码:

    分析过程就算了,直接上成果。

    Chromium先从mic获取音频,然后使用flac或者speex进行编码,直接通过HTTPS POST到服务器。接口地址如下:

    

    Chromium在请求时还会拼上很多参数:

    

    注:参数解释

        xjerr=1    # 不详,猜测为错误的标准

        client=chromium    # 客户端类型,这里是Chromium,猜测Chrome也应该可行,估计是作为统计用的。

        lang=en-US    # 语言类型,这里是英文,中文为zh-CN,其余语言代码参考:

        maxresults=1    # 最大返回结果数量,多个结果在hypotheses列表中保存。

    参数很明了,这给我们提供了很多便利。我们对参数进行调整,得到如下的接口地址:

    

    

    接下来祭出wget,对已经发现的接口进行:

[plain]   
 
  1. flac.exe -8 -f --sample-rate=16000 speechInput.wav  
[plain]   
 
  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]   
 
  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++)中的请求:

[cpp]   
 
  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: 

AudioInput:

    speechInput.h: 

    speechInput.cpp: 

main:

    mainwidget: 

    在翻阅Chromium源码的过程之中,还发现了其他有用的东西:

Speech Input API Specification 

    到目前为止,Google好像还没有公开这个API,使用许可依旧不详,请求也没有用到任何认证。但它确实能用,而且十分方便,对于编写非商业程序的人来说,这个东西真的是再好不过了(因为它有着高的爆表的识别率)。

参考:

Chromium Repository    

Accessing Google Speech API / Chrome 11    

附:

1、SpeechInputError interface 错误信息

[cpp]   
 
  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

    返回结果:识别成功

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

转载于:https://www.cnblogs.com/huty/p/8517563.html

你可能感兴趣的文章
博弈论
查看>>
Redis sentinel & cluster 原理分析
查看>>
我的工作习惯小结
查看>>
把word文档中的所有图片导出
查看>>
Spring 自动装配;方法注入
查看>>
浏览器的判断;
查看>>
ubuntu 18.04取消自动锁屏以及设置键盘快捷锁屏
查看>>
uva 10791
查看>>
codeforces Round #440 A Search for Pretty Integers【hash/排序】
查看>>
python的字典(dict)的键值对存储规则
查看>>
more 分页显示文件内容
查看>>
ubuntu18 tensorflow cpu fast_rcnn
查看>>
PageHelper在Mybatis中的使用
查看>>
POJ 1742 Coins
查看>>
Leetcode 589. N-ary Tree Preorder Traversal
查看>>
ADO.Net——增、删、改、查
查看>>
thinking back no11
查看>>
机器学习/深度学习/其他开发环境搭建记录
查看>>
xml.exist() 实例演示
查看>>
判断是否为空然后赋值
查看>>