这是很久前写的文章,博客关闭之后我会翻出来再发一遍。
最近发现很多网站的搜索框里面都添加了语音搜索功能,大的像谷歌搜索,淘宝官网,以DZ为模版的论坛。小的网站像很多个人博客,网址导航网站等……其实像谷歌和淘宝出现语音搜索都不足为奇,但是个人博客上出现这个功能,引起了我的关注。下面是我探索的步骤,与大家分享!
一. 语音输入只有在Chrome浏览器下才能看到
语音搜索功能只有在Google Chrome浏览器下才能看到,在IE,Firefox下测试都看不到。之后查官方文档显示该语音搜索功能现在只支持webkit内核的浏览器,大家赶快下个Google Chrome测试一下吧!
如果你没有安装谷歌浏览器,只是想试试 语音识别 的功能,有个很简单的办法!我在家上网,不经意间发现QQ聊天面板,多功能辅助输入里面多了一个语音识别功能,于是尝试了几次,准确率还是比较高的,大家可以试试!
二.如何在自己的网站上实现 语音搜索识别
既然很多个人博客上都有该功能,那么说明这个功能能通过调用第三方API实现……原本以为会很难,应该是没想到会如此的简单……原理就是一句代码 “ x-webkit-speech ”,将这句代码添加在你的标签里面,比如:
1 | <FORM method="post" action=""> |
就这么简单……不信你可以马上将这段代码保存到任意的HTML文件,比如新建一个index.html文件,然后用Chrome打开!x-webkit-speech后面可以跟很多参数,例如代码中的 lang=”zh-CN” 参数(这个参数也可以不加)。
还有 x-webkit-grammar=”bUIltin:search” 使得语音输入的内容尽量靠近搜索内容,去除多余的字符,例如“的”、“啦”,
onwebkitspeechchange 发声语音改变时会触发,可以用它来设置说完话就自动搜索,比如
1 | <input type="text" x-webkit-speech onwebkitspeechchange="$(this).cloest('form').submit()"/> |
想知道其他更具体的信息可以给我留言。
三.google语音搜索识别探究
我做事向来喜欢打破砂锅查到底,所以开始了折腾!因为这个简单的HTML5应用激发了我的兴趣。我最开始猜测这是webkit内核的浏览器自带的功能,因为我用Chrome 开发人员工具抓不到数据包。但是断网后就发现该功能不能用了,所以可以确定实现这个方法一定是调用了远程API。而且调用API的这段代码还是写在Chrome内核里面的,不然数据包会被Chrome 开发人员工具抓到。
先说说怎么抓包吧,打开一个网站,按F12 —> 在出现的窗口中选择Network—>再刷新网站—->就能看到你抓到的数据包了。点击能查看每个数据包的详情,比如我用谷歌翻译,翻译“我是谁”抓到的包。
现在我们能确定两点
- 语音搜索识别功能是调用远程API(联网解析的)
- 调用API的代码写在Chrome内核中
确定这两点之后我的思路就清晰多了!因为Chrome是开源的,所以大部分源代码都是开放的。很顺利,我在 http://src.chromium.org/viewvc/chrome/trunk/src/content/browser/ 找到了 speech模块!
于是开始分析,其实谈不上分析,就是根据用C语言写的源代码的文件名的意思慢慢猜测。因为找不到哪里能下载整个Chrome源代码的链接,就只能一个一个网页去打开,希望有下载链接的朋友分享一下。最后在speech文件夹下的google_one_shot_remote_engine.cc文件里找到了我要的链接!!
我把主要的部分引用过来
1 | const char* const kDefaultSpeechRecognitionUrl = |
看不懂代码的没关系,我说重点。
“https://www.google.com/speech-api/v1/recognize?xjerr=1&client=chromium&" 就是我们一直要找的那个调用接口。
他的参数我们通过Chrome源代码知道的有:
xjerr=1 参数功能不详,值只能是0或1,去掉也能正常获得结果;
client=chromium 客户端类型,参数不详,修改和去掉能正常获取结果;
lang=en-US 说话的语言类型,这里是英文,中文为zh-CN,其余语言代码参考:
http://msdn.microsoft.com/en-us/library/ms533052(v=vs.85).aspx ;
lm 语法的URL地址,没做深入研究;
xhw 硬件信息,可能用来判断是移动设备还是PC;
maxresults=1 最大返回结果数量,结果根据confidence参数排了序;
key 谷歌API密匙,现在没有也没关系。
此外还要准备一个.flac格式的音频,我试过wav格式的音频也是可以的,网上说只有flac格式的声音识别率最高。
做好这些准备工作,就能开始调用该接口,帮我们完成解析工作了。这篇文字太长了,我马上另起一篇,并且奉上代码和所有测试文件。