本帖最后由 陶國樑 于 2014-7-19 08:56 编辑
一、接收语音识别结果
开通语音识别功能以后,用户每次发送语音给公众号时,微信会在推送的语音消息XML数据包中,增加一个Recongnition字段。该字段为语音识别出的文本内容。
用户发送语音:
语音XML数据包如下
<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> 其中的Recognition 就是语音识别结果,UTF8编码
二、使用SAE中文分词
一个简单的示例如下:
<?php
$str = "深圳天气怎么样";
$seg = new SaeSegment();
$ret = $seg->segment($str, 1);
print_r($ret); //输出
if ($ret === false)
var_dump($seg->errno(), $seg->errmsg());
?> 返回结果如下:
Array
(
[0] => Array
(
[word] => 深圳
[word_tag] => 102
[index] => 0
)
[1] => Array
(
[word] => 天气
[word_tag] => 95
[index] => 1
)
[2] => Array
(
[word] => 怎么样
[word_tag] => 40
[index] => 2
)
)
这里,SAE在这句话“深圳天气怎么样”,分词为“深圳”,“天气”,“怎么样”三个词。其中“天气”为名词,“深圳”为地点名词。
根据这个特点,我们能做基于城市查询的天气预报
三,微信语音识别判断
private function receiveVoice($object)
{
if (isset($object->Recognition) && !empty($object->Recognition)){
$contentStr = "你发送的是语音,内容为:".$object->Recognition;
}else{
$contentStr = "未开启语音识别功能或者识别内容为空";
}
if (is_array($contentStr)){
$resultStr = $this->transmitNews($object, $contentStr);
}else{
$resultStr = $this->transmitText($object, $contentStr);
}
return $resultStr;
} 五、SAE分离名词与地址名词
function sinasegment($str)
{
$seg = new SaeSegment();
$ret = $seg->segment($str, 1);
if ($ret === false){
return;
}
$category = "";
$keyword = "";
foreach ($ret as $key => $value) {
if ($value["word_tag"] == 95){
$category = $value["word"];
}
if ($value["word_tag"] == 102){
$keyword = $value["word"];
}
}
if (!empty($category) && !empty($keyword)){
return array('category'=>$category, 'keyword'=>$keyword);
}else{
return;
}
} 最后,就是根据分离后的名词做为类别,地点名词做为输入,传入相应的接口,以下是天气预报和空气质量的查询
$content = strval($object->Recognition);
include("segment.php");
$result = sinasegment($content);
if (is_array($result)){
switch ($result['category'])
{
case "天气":
$url = "http://api100.duapp.com/weather/?appkey=trialuser&city=".urlencode($result['keyword']);
$output = file_get_contents($url);
$contentStr = json_decode($output, true);
break;
case "空气":
$url = "http://api100.duapp.com/airquality/?appkey=trialuser&city=".urlencode($result['keyword']);
$output = file_get_contents($url);
$contentStr = json_decode($output, true);
break;
default:
$contentStr = "还不支持这一功能:".$result['category'];
break;
}
}else{
$contentStr = "不能理解你的内容:".$content;
} 效果图如下:
|