微信公众平台开发(75) 语音识别

摘要:
语音XML数据包如下<[CDATA[to用户]]&gt![CDATA[来自用户]]>[CDATA[voice]]>[CDATA[media_id]]>[CDATA[格式]]>[CDATA[深圳的天气怎么样]]>阵列([0]=>深圳[word_tag]=<天气[word_tag]=&1)[2]=>

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

一、接收语音识别结果

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

用户发送语音:

微信公众平台开发(75) 语音识别第1张

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

效果如下:

微信公众平台开发(75) 语音识别第2张

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

四、效果演示

微信公众平台开发(75) 语音识别第3张微信公众平台开发(75) 语音识别第4张

免责声明:文章转载自《微信公众平台开发(75) 语音识别》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇【python 3.6】从网站抓图并存放到本地路径OpenCV4学习笔记(3.0)官方教程 | Load, Modify, and Save an Image 加载、修改和保存图像下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Dubbo 常用配置

高可用-zookeeper宕机与dubbo直连 注册中心宕机,还可以消费dubbo暴露的服务 监控中心宕机了,不影响使用,只会丢失部分数据的采集 数据库宕机了,zookeeper仍然可以通过缓存查询服务提供者列表,但是不能注册新服务 注册中心集群对等集群,任何一台挂掉后都会切换到另一台 注册中心全部宕机,仍可一通过使用本地缓存进行通信 服务提供者提供无...

PHP 开发环境搭建( Eclipse PDT XAMPP XDEBUG)

1.下载和安装配置XAMPP 我下载的是,XAMPP Lite(精简版) ZIP 压缩包,下载地址 http://www.apachefriends.org/zh_cn/xampp-windows.html 根据xampp的文档描述,解压到根目录意味着您可以直接使用,不需要先运行“setup_xampp.bat”进行配置 (参见:http://www.ap...

Dijkstra和堆优化

Dijkstra算法 由于我之前一直记的迪杰斯特拉的翻译导致我把dijkstra写成了dijstra……所以下文#define dijstra dijkstra 我以后叫她迪杰克斯歘! Dijskra是用来在有向图或者无向图中寻找任意两个点的最小距离的算法。它相较于spfa不会死掉(spfa死了),但是无法处理带负环的图和求最长路(除非加上一些奇怪的东西,...

c语言数据类型长度

 头文件<limits.h>和<float.h>中说明了基础数据的长度。float,double和long double的范围就是在IEEE 754标准中提及的典型数据。 关键字 位长(字节) 范围 格式化字符串 char 1 -128..127(或0..255,与体系结构相关) %c unsigned char 1 0...

Django 之 Form 组件

常用功能 From 组件主要有以下几大功能: 生成 HTML 标签 验证用户数据(显示错误信息) HTML Form 提交保留上次提交数据 初始化页面显示内容 小试牛刀 下面我们通过 Form 组件来生成 HTML 标签和验证用户提交的数据以及保留上次提交的数据。 创建 Form 类 form_verify.py from django import...

windows版本Sublime Text安装使用说明

      Sublime Text 是一款简洁轻快地代码编辑器,本人以前热衷于使用WebStrom,在接触Sub之后发现Sub要比WebStrom轻巧快速的多。具有多种插件,多行编译和编辑状态回复能力等N多优点于一身。相信接触这款编译器之后都会喜欢上它, 一,下载安装      http://www.sublimetext.com/  官网下载就可以了,...