4.3.1 接取识别结果

开通语音识别功能以后,用户每次发送语音给微信公众号,微信会在推送语音消息XML数据包中添加一个Recongnition字段,该字段为语音识别出的文本内容.

注:由于客户端缓存,开发者开启或者关闭语音识别功能,对新关注者立刻生效,对已关注用户需要24小时生效。开发者可以重新关注此帐号进行测试
<xml> <ToUserName> < ![CDATA[toUser] ]> </ToUserName> <FromUserName> < ![CDATA[
fromUser] ]> </FromUserName> <CreateTime>1357290913</CreateTime> <MsgType> < ![
CDATA[voice] ]> </MsgType> <MediaId> < ![CDATA[media_id] ]> </MediaId> <Format>
< ![CDATA[Format] ]> </Format> <Recognition> < ![CDATA[腾讯微信团队] ]> </Recognition>
<MsgId>1234567890123456</MsgId> </xml>


使用语音识别接口可以 简化输入,从繁琐的键盘输入中解放出来,对于一些简单内容的输入,用户可以直接使用语音与微信公众号进行交互

4.3.2 处理识别消息

微信公众号接收到语音后,由于数据包中已经包含了识别结果的文字内容,所有原则上,应当将其当作文本消息一样处理
public function responseMsg() { $postStr = $GLOBALS["HTTP_RAW_POST_DATA"]; if
(!empty($postStr)){ $this->logger("R ".$postStr); $postObj =
simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA); $RX_TYPE =
trim($postObj->MsgType); switch ($RX_TYPE) { case "voice": case "text": $result
=$this->receiveText($postObj); break; } $this->logger("T ".$result); echo
$result; }else { echo ""; exit; } }
在接收函数中,再将语音消息的识别结果或文本消息的文本赋给同一个变量

代码如下:
//接收文本、语音消息 private function receiveText($object) { if (!empty($object
->Recognition)){$keyword = trim($object->Recognition); $mediaid = trim($object
->MediaID); }else{ $keyword = trim($object->Content); } }

需要说的是,受个体口音,重音,音调,音量和发音的速度,环境噪音以及语义理解等诸多因素的影响,语音识别目前很难做到百分之百的准确率。,等待者语音技术的发展会有不一样的结果吧
- ^_ ^ -



语音识别 示例代码如下:
<?php define("TOKEN", "weixin"); $wechatObj = new wechatCallbackapiTest(); if
(!isset($_GET['echostr'])) { $wechatObj->responseMsg(); }else{ $wechatObj
->valid(); }class wechatCallbackapiTest { //验证消息 public function valid() {
$echoStr = $_GET["echostr"]; if($this->checkSignature()){ echo $echoStr; exit;
} }//检查签名 private function checkSignature() { $signature = $_GET["signature"];
$timestamp = $_GET["timestamp"]; $nonce = $_GET["nonce"]; $token = TOKEN;
$tmpArr = array($token, $timestamp, $nonce); sort($tmpArr, SORT_STRING); $tmpStr
= implode($tmpArr); $tmpStr = sha1($tmpStr); if($tmpStr == $signature){ return
true; }else{ return false; } } //响应消息 public function responseMsg() { $postStr =
$GLOBALS["HTTP_RAW_POST_DATA"]; if (!empty($postStr)){ $this->logger("R ".
$postStr); $postObj = simplexml_load_string($postStr, 'SimpleXMLElement',
LIBXML_NOCDATA);$RX_TYPE = trim($postObj->MsgType); switch ($RX_TYPE) { case
"voice": case "text": $result = $this->receiveText($postObj); break; } $this
->logger("T ".$result); echo $result; }else { echo ""; exit; } } //接收文本、语音消息
private function receiveText($object) { if (!empty($object->Recognition)){
$keyword = trim($object->Recognition); $mediaid = trim($object->MediaID); }else{
$keyword = trim($object->Content); } switch ($keyword) { case "文本": $content =
"这是个文本消息"; break; case "图文": case "单图文": $content = array(); $content[] = array(
"Title"=>"单图文标题", "Description"=>"单图文内容", "PicUrl"=>
"http://discuz.comli.com/weixin/weather/icon/cartoon.jpg", "Url" =>
"http://m.cnblogs.com/?u=txw1958"); break; case "多图文": $content = array();
$content[] = array("Title"=>"多图文1标题", "Description"=>"", "PicUrl"=>
"http://discuz.comli.com/weixin/weather/icon/cartoon.jpg", "Url" =>
"http://m.cnblogs.com/?u=txw1958"); $content[] = array("Title"=>"多图文2标题",
"Description"=>"", "PicUrl"=>
"http://d.hiphotos.bdimg.com/wisegame/pic/item/f3529822720e0cf3ac9f1ada0846f21fbe09aaa3.jpg"
,"Url" =>"http://m.cnblogs.com/?u=txw1958"); $content[] = array("Title"=>
"多图文3标题", "Description"=>"", "PicUrl"=>
"http://g.hiphotos.bdimg.com/wisegame/pic/item/18cb0a46f21fbe090d338acc6a600c338644adfd.jpg"
,"Url" =>"http://m.cnblogs.com/?u=txw1958"); break; case "音乐": $content = array(
"Title"=>"最炫民族风", "Description"=>"歌手:凤凰传奇", "MusicUrl"=>
"http://121.199.4.61/music/zxmzf.mp3", "HQMusicUrl"=>
"http://121.199.4.61/music/zxmzf.mp3"); break; default: $content = date("Y-m-d
H:i:s",time())."\n技术支持 方倍工作室"; break; } if(is_array($content)){ if (isset(
$content[0]['PicUrl'])){ $result = $this->transmitNews($object, $content); }else
if (isset($content['MusicUrl'])){ $result = $this->transmitMusic($object,
$content); } }else{ $result = $this->transmitText($object, $content); } return
$result; } //回复文本消息 private function transmitText($object, $content) { $textTpl
="<xml> <ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName> <CreateTime>%s</CreateTime>
<MsgType><![CDATA[text]]></MsgType> <Content><![CDATA[%s]]></Content> </xml>";
$result = sprintf($textTpl, $object->FromUserName, $object->ToUserName, time(),
$content); return $result; } //回复图文消息 private function transmitNews($object,
$newsArray) { if(!is_array($newsArray)){ return; } $itemTpl = " <item>
<Title><![CDATA[%s]]></Title> <Description><![CDATA[%s]]></Description>
<PicUrl><![CDATA[%s]]></PicUrl> <Url><![CDATA[%s]]></Url> </item>"; $item_str =
""; foreach ($newsArray as $item){ $item_str .= sprintf($itemTpl, $item['Title'
],$item['Description'], $item['PicUrl'], $item['Url']); } $newsTpl = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName> <CreateTime>%s</CreateTime>
<MsgType><![CDATA[news]]></MsgType> <Content><![CDATA[]]></Content>
<ArticleCount>%s</ArticleCount> <Articles> $item_str</Articles> </xml>"; $result
= sprintf($newsTpl, $object->FromUserName, $object->ToUserName, time(), count(
$newsArray)); return $result; } //回复音乐消息 private function transmitMusic($object,
$musicArray) { $itemTpl = "<Music> <Title><![CDATA[%s]]></Title>
<Description><![CDATA[%s]]></Description> <MusicUrl><![CDATA[%s]]></MusicUrl>
<HQMusicUrl><![CDATA[%s]]></HQMusicUrl> </Music>"; $item_str = sprintf($itemTpl,
$musicArray['Title'], $musicArray['Description'], $musicArray['MusicUrl'],
$musicArray['HQMusicUrl']); $textTpl = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName> <CreateTime>%s</CreateTime>
<MsgType><![CDATA[music]]></MsgType> $item_str </xml>"; $result = sprintf(
$textTpl, $object->FromUserName, $object->ToUserName, time()); return $result; }
//日志记录 private function logger($log_content) { if(isset($_SERVER['HTTP_APPNAME'
])){//SAE sae_set_display_errors(false); sae_debug($log_content);
sae_set_display_errors(true); }else if($_SERVER['REMOTE_ADDR'] != "127.0.0.1"){
//LOCAL $max_size = 10000; $log_filename = "log.xml"; if(file_exists(
$log_filename) and (abs(filesize($log_filename)) > $max_size)){unlink(
$log_filename);} file_put_contents($log_filename, date('H:i:s')." ".$log_content
."\r\n", FILE_APPEND); } } } ?>

友情链接
KaDraw流程图
API参考文档
OK工具箱
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:[email protected]
QQ群:637538335
关注微信