云计算开发者社区

用新浪微博连接

一步搞定

查看: 25504|回复: 36

使用SAE分词,实现微信智能语音查询 [复制链接]

Rank: 2

发表于 2014-1-6 15:05:55 |显示全部楼层
本帖最后由 陶國樑 于 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;
    }
效果图如下:


附件: 你需要登录才可以下载或查看附件。没有帐号?立即注册

使用道具 举报

Rank: 7Rank: 7Rank: 7

发表于 2014-1-6 15:07:49 |显示全部楼层
这个好,很有用,改天试一下

使用道具 举报

Rank: 11Rank: 11Rank: 11Rank: 11

发表于 2014-1-6 15:10:03 |显示全部楼层
留名收藏!
一个什么也不会的phper

使用道具 举报

Rank: 3Rank: 3

发表于 2014-1-6 16:34:02 |显示全部楼层
感谢楼主分享
[url=http://weibo.com/u/3553600261?s=6uyXnP][img]http://service.t.sina.com.cn/wi

使用道具 举报

Rank: 1

发表于 2014-1-6 17:50:34 |显示全部楼层
学习参考了。其中几个函数可以在其他应用中使用。

使用道具 举报

Rank: 1

发表于 2014-1-7 15:06:01 |显示全部楼层
                 收藏

使用道具 举报

Rank: 7Rank: 7Rank: 7

发表于 2014-3-7 23:37:03 |显示全部楼层
不得不承认,真不错。

使用道具 举报

Rank: 1

发表于 2014-3-13 22:19:11 |显示全部楼层
学习 明天联系~~

使用道具 举报

Rank: 1

发表于 2014-3-21 22:22:12 |显示全部楼层
不错,留名收藏!

使用道具 举报

Rank: 2

发表于 2014-4-12 15:05:14 |显示全部楼层
问一下,如果不开通语音识别功能,如何和讯飞的语音识别功能结合在一起吗?
中国空气质量在线监测分析平台
http://aqistudy.sinaapp.com/

使用道具 举报

Rank: 1

发表于 2014-4-14 14:16:36 |显示全部楼层
, 我来学习学习

使用道具 举报

Rank: 1

发表于 2014-4-15 21:24:00 |显示全部楼层
private function receiveVoice($object)
{
&nbsp;&nbsp;if (isset($object-&gt;Recognition) &amp;&amp; !empty($object-&gt;Recognition)){
&nbsp;&nbsp;&nbsp;&nbsp;$contentStr = "你发送的是语音,内容为:".$object-&gt;Recognition;
&nbsp;&nbsp;}else{
&nbsp;&nbsp;&nbsp;&nbsp;$contentStr = "未开启语音识别功能或者识别内容为空";
&nbsp;&nbsp;}
&nbsp;&nbsp;if (is_array($contentStr)){
&nbsp;&nbsp;&nbsp;&nbsp;$resultStr = $this-&gt;transmitNews($object, $contentStr);
&nbsp;&nbsp;}else{
&nbsp;&nbsp;&nbsp;&nbsp;$resultStr = $this-&gt;transmitText($object, $contentStr);
&nbsp;&nbsp;}
&nbsp;&nbsp;return $resultStr;
}
在实际的代码中,就只有这段代码吗?还是怎么识别呀,楼主讲的详细点

使用道具 举报

Rank: 1

发表于 2014-4-16 19:58:27 |显示全部楼层
很好,赞一个

使用道具 举报

Rank: 2

发表于 2014-4-18 09:36:13 |显示全部楼层
Mark一下,以后应该可以用到~~~

使用道具 举报

Rank: 2

发表于 2014-4-18 10:34:51 |显示全部楼层
又是方倍。。。。能把完整源码分享出来吗
蜂蜜圈欢迎您!
http://www.fengmiq.com

使用道具 举报

Rank: 3Rank: 3

发表于 2014-4-19 10:59:10 |显示全部楼层
mark...

使用道具 举报

Rank: 1

发表于 2014-5-11 07:26:38 |显示全部楼层
语音识别好东东

使用道具 举报

Rank: 1

发表于 2014-5-12 23:46:14 |显示全部楼层
初来乍到,便发现如此好贴,此论坛必火.

使用道具 举报

Rank: 1

发表于 2014-5-13 15:34:36 |显示全部楼层
留名收藏

使用道具 举报

Rank: 1

发表于 2014-7-11 13:57:17 |显示全部楼层
原来分词功能还能区分词性~

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

Archiver|云计算开发者社区 ( 京ICP证000007-137 )

GMT+8, 2018-7-21 19:52 , Processed in 0.190588 second(s), Total 13, Slave 12 queries .

Powered by Discuz! X2

© 2001-2011 Comsenz Inc.

回顶部