一、申请微信认证

30220605-c5e3e08be94d4dd98a080931b85ee3e1.jpg

微信认证后将自动开通高级接口,获得高级接口中所有接口权限,无需二次申请。

高级接口含有获取用户基本信息、客服接口、语音识别等高级接口权限。

二、获取语音识别结果

开通语音识别功能,且该功能设置处于开启状态的公众帐号,用户每次发送语音给公众号时,微信会在推送的语音消息XML数据包中,增加一个Recongnition字段。

06200937-ad31fdb9362f4e3ea73d1c60048af5a4.png

开启语音识别后的语音XML数据包如下:

copycode.gif

toUser

fromUser

1357290913

voice

media_id

Format

深圳天气怎么样

1234567890123456

copycode.gif

copycode.gif

参数说明:

参数 描述

ToUserName 开发者微信号

FromUserName 发送方帐号(一个OpenID)

CreateTime 消息创建时间 (整型)

MsgType 语音为voice

MediaID 语音消息媒体id,可以调用多媒体文件下载接口拉取该媒体

Format 语音格式:amr

Recognition 语音识别结果,UTF8编码

MsgID 消息id,64位整型

copycode.gif

三、使用中文分词提取关键特征

中文分词 (Chinese Word Segmentation) 指的是将一个汉字序列切分成一个一个单独的词。分词就是将连续的字序列按照一定的规范重新组合成词序列的过程。我们知道,在英文的行文中,单词之间是以空格作为自然分界符的,而中文只是字、句和段能通过明显的分界符来简单划界,唯独词没有一个形式上的分界符,虽然英文也同样存在短语的划分问题,不过在词这一层上,中文比之英文要复杂的多、困难的多。通过分词可以提取其中关键词语进行搜索。

打个比方:

例如,识别结果为”深圳天气怎么样”,可分词为”深圳”,”怎么样”,三个词。我们提取出“天气”作为名词,“深圳”作为地点名词,

以下是SAE上的分词代码示例:

copycode.gif

<?php

$str = "深圳天气怎么样";

$seg = new SaeSegment();

$ret = $seg->segment($str, 1);

print_r($ret); //输出

if ($ret === false)

var_dump($seg->errno(), $seg->errmsg());

?>

copycode.gif

识别结果如下:

copycode.gif

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

)

)

copycode.gif

copycode.gif

//词性对应关系

POSTAG_ID_N = 95 (line 322)

名词

POSTAG_ID_NS_Z = 102 (line 357)

地名(名处词专指:“中国”)

POSTAG_ID_D = 40 (line 207)

副词

copycode.gif

三、程序实现

判断是否开启语音识别

copycode.gif

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;

}

copycode.gif

效果如下:

25232419-b79a22d636324dcbad1c4725d4aab234.png

调用SAE分词

copycode.gif

var_dump(segment("明天长沙天气怎么样"));

function segment($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;

}

}

copycode.gif

返回结果如下:

array(2) {

["category"]=>string(6) "天气"

["keyword"]=>string(6) "长沙"

}

这样就获知晓了用户要查询的功能是天气,城市名称是长沙。

功能查询

根据获得的功能类别及关键字,我们可以查询相应的城市天气预报。

copycode.gif

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;

}

copycode.gif

四、效果演示

25232544-8ff29a99704f4726a6c45e9df6fc309a.png

25232558-c120f4d08eb84b25a54a017658cc71aa.png

06200040-c834cd25010849ce9b707ea1cbbc6cc4.png

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐