google语音搜索识别API【转载】

一. 语音输入只有在Chrome浏览器下才能看到

       语音搜索功能只有在Google Chrome浏览器下才能看到,在IE,Firefox下测试都看不到。之后查官方文档显示该语音搜索功能现在只支持webkit内核的浏览器,大家赶快下个Google Chrome测试一下吧!

       如果你没有安装谷歌浏览器,只是想试试 语音识别 的功能,有个很简单的办法!小编春节在家上网,不经意间发现QQ聊天面板,多功能辅助输入里面多了一个语音识别功能,于是尝试了几次,准确率还是比较高的,大家可以试试!

QQ语音输入

 

二.如何在自己的网站上实现 语音搜索识别

      既然很多个人博客上都有该功能,那么说明这个功能能通过调用第三方API实现……我原本以为会很难,应该是没想到会如此的简单……原理就是一句代码 “ x-webkit-speech ”,将这句代码添加在你的<input>标签里面,比如:

1 <FORM method="post" action="">
2 标题:<INPUT type="text" name="title"  x-webkit-speech lang="zh-CN">
3 <INPUT type="submit" value="提交">
4 </FORM>

        就这么简单……不信你可以马上将这段代码保存到任意的HTML文件,比如新建一个index.html文件,然后用Chrome打开!x-webkit-speech后面可以跟很多参数,比如代码中的 lang="zh-CN" 参数(这个参数也可以不加)。

      还有 x-webkit-grammar="bUIltin:search"  使得语音输入的内容尽量靠近搜索内容,去除多余的字符,例如“的”、“啦”,

      onwebkitspeechchange 发声语音改变时会触发,可以用它来设置说完话就自动搜索,比如

       <input type="text" x-webkit-speech onwebkitspeechchange="$(this).cloest('form').submit()"/>,想知道其他更具体的信息可以给我留言。

 

三.google语音搜索识别探究

       大熊做事向来喜欢打破砂锅查到底,所以开始了折腾!因为这个简单的HTML5应用激发了我的兴趣。我最开始猜测这是webkit内核的浏览器自带的功能,因为我用Chrome 开发人员工具抓不到数据包。但是断网后就发现该功能不能用了,所以可以确定实现这个方法一定是调用了远程API。而且调用API的这段代码还是写在Chrome内核里面的,不然数据包会被Chrome 开发人员工具抓到。

       先说说怎么抓包吧,打开一个网站,按F12  —> 在出现的窗口中选择Network—>再刷新网站—->就能看到你抓到的数据包了。点击能查看每个数据包的详情,比如下图我用谷歌翻译,翻译“我是谁”抓到的包:

Chrome开发人员工具

 

现在我们能确定两点

1. 语音搜索识别功能是调用远程API

2. 调用API的代码写在Chrome内核中

确定这两点之后我的思路就清晰多了!因为Chrome是开源的,所以大部分源代码都是开放的。很顺利,我在

http://src.chromium.org/viewvc/chrome/trunk/src/content/browser/

找到了 speech模块!

       于是开始分析,其实谈不上分析,就是根据用C语言写的源代码的文件名的意思慢慢猜测。因为找不到哪里能下载整个Chrome源代码的链接,就只能一个一个网页去打开,希望有下载链接的朋友分享一下。最后在speech文件夹下的google_one_shot_remote_engine.cc文件里找到了我要的链接!!

http://src.chromium.org/viewvc/chrome/trunk/src/content/browser/speech/google_one_shot_remote_engine.cc?revision=170920&view=markup

我把主要的部分引用过来


01 const charconst kDefaultSpeechRecognitionUrl =
03 const charconst kStatusString = "status";   //调用接口后返回的状态代码,0表示成功,代码之后会单独说明
04 const charconst kHypothesesString = "hypotheses";  //猜测的结果,一个json结构的数
05 const charconst kUtteranceString = "utterance";   //解析出来的词语
06 const charconst kConfidenceString = "confidence";  //调用会返回有多个结果,这是解析的信心值
07 const int kWebServiceStatusNoError = 0;
08 const int kWebServiceStatusNoSpeech = 4;
09 const int kWebServiceStatusNoMatch = 5;
10  
11 const AudioEncoder::Codec kDefaultAudioCodec = AudioEncoder::CODEC_FLAC;//发送的是FLAC格式的声音文件
12  
13 //调用谷歌远程引擎
14 void GoogleOneShotRemoteEngine::StartRecognition() {
15   DCHECK(delegate());
16   DCHECK(!url_fetcher_.get());
17   std::string lang_param = config_.language;
18  
19   if (lang_param.empty() && url_context_) {
20     // If no language is provided then we use the first from the accepted
21     // language list. If this list is empty then it defaults to "en-US".
22     // Example of the contents of this list: "es,en-GB;q=0.8", ""
23     net::URLRequestContext* request_context =
24         url_context_->GetURLRequestContext();
25     DCHECK(request_context);
26     // TODO(pauljensen): GoogleOneShotRemoteEngine should be constructed with
27     // a reference to the HttpUserAgentSettings rather than accessing the
28     // accept language through the URLRequestContext.
29     std::string accepted_language_list = request_context->GetAcceptLanguage();
30     size_t separator = accepted_language_list.find_first_of(",;");
31     lang_param = accepted_language_list.substr(0, separator);
32   }
33  
34   if (lang_param.empty())
35     lang_param = "en-US";
36  
37 /*************************************************************
38 /* 重要注释: 来自---编程学习博客  网址:http://php.oil58.com/ 
39 /*     parts参数非常的重要,里面将存储接口参数,根据下面的代码
40 /* 我们可以知道有如下几个参数: 下文会单独解释
41 /*  "lang="
42 /*  "lm="
43 /*  "xhw="
44 /*  "maxresults="
45 /*  "key="
46 **************************************************************/
47   std::vector<std::string> parts;
48   parts.push_back("lang=" + net::EscapeQueryParamValue(lang_param, true));
49   /* "lang="是一个重要的参数,用来选择语言类型,默认是"en-US" 美式英文,中文为zh-CN,其余语言代码参考:
51  
52   if (!config_.grammars.empty()) {
53     DCHECK_EQ(config_.grammars.size(), 1U);
54     parts.push_back("lm=" + net::EscapeQueryParamValue(config_.grammars[0].url,
55                                                        true));
56   }
57  
58   if (!config_.hardware_info.empty())
59     parts.push_back("xhw=" + net::EscapeQueryParamValue(config_.hardware_info,
60                                                         true));
61   parts.push_back("maxresults=" + base::UintToString(config_.max_hypotheses));
62   parts.push_back(config_.filter_profanities ? "pfilter=2" "pfilter=0");
63  
64   std::string api_key = google_apis::GetAPIKey();
65   parts.push_back("key=" + net::EscapeQueryParamValue(api_key, true));
66  
67 }  // namespace content

 

看不懂代码的没关系,我说重点。

"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格式的声音识别率最高。


原文地址:http://php.oil58.com/?p=483

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值