zoukankan      html  css  js  c++  java
  • 微信公众平台开发(75) 语音识别

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

    一、接收语音识别结果

    开通语音识别功能以后,用户每次发送语音给公众号时,微信会在推送的语音消息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>

    参数说明:

    参数

    描述

    ToUserName

    接收方微信号

    FromUserName

    发送方帐号(一个OpenID)

    CreateTime

    消息创建时间 (整型)

    MsgType

    语音为voice

    MediaID

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

    Format

    语音格式:amr

    Recognition

    语音识别结果,UTF8编码

    MsgID

    消息id,64位整型

    二、中文分词

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

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

    以下是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
            )
    
    )

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

    三、程序实现

    判断是否开启语音识别

    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分词

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

    返回结果如下:

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

    四、效果演示

  • 相关阅读:
    二分图最大匹配的K&#246;nig定理及其证明
    HDOJ 2389 Rain on your Parade
    HDOJ 1083 Courses
    HDOJ 2063 过山车
    POJ 1469 COURSES
    UESTC 1817 Complete Building the Houses
    POJ 3464 ACM Computer Factory
    POJ 1459 Power Network
    HDOJ 1532 Drainage Ditches
    HDU 1017 A Mathematical Curiosity
  • 原文地址:https://www.cnblogs.com/lanzhi/p/6467554.html
Copyright © 2011-2022 走看看