本文介绍如何使用微信公众平台高级接口中的语音识别功能,做出一个语音版的天气预报查询功能。根据这个模型,你可以扩展到所有的语音查询。

一、接收语音识别结果

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

用户发送语音:

语音识别开源库 语音识别 开发_整型

语音XML数据包如下

toUser

fromUser

1357290913

voice

media_id

Format

深圳天气怎么样

1234567890123456

参数说明:

参数

描述

ToUserName

接收方微信号

FromUserName

发送方帐号(一个OpenID)

CreateTime

消息创建时间 (整型)

MsgType

语音为voice

MediaID

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

Format

语音格式:amr

Recognition

语音识别结果,UTF8编码

MsgID

消息id,64位整型

二、中文分词

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

打个比方:“深圳天气怎么样”,这句话中可分词为“深圳”,“天气”,“怎么样”三个词。其中“天气”为名词,“深圳”为地点名词。

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

<?php$str = "深圳天气怎么样";$seg = newSaeSegment();$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)
)

得到,名词天气,和地名名词深圳,副词怎么样可以忽略。

三、程序实现

判断是否开启语音识别

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;
}

效果如下:

语音识别开源库 语音识别 开发_语音识别_02

调用SAE分词

var_dump(segment("明天长沙天气怎么样"));function segment($str)
{$seg = newSaeSegment();$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;
}
}

返回结果如下:

array(2) {
["category"]=>string(6) "天气"["keyword"]=>string(6) "长沙"}

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

功能查询

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

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;default:
$contentStr = "还不支持这一功能:".$result['category'];break;
}
}else{$contentStr = "不能理解你的内容:".$content;
}

四、效果演示

语音识别开源库 语音识别 开发_语音识别开源库_03

语音识别开源库 语音识别 开发_中文分词_04