2015年5月22日 20:20:20 星期五

效果:

这边对微信说话,  浏览器端及时显示语音识别的文字

注意:

在连接socket.io时, 按下浏览器f12, 如果一直有请求不断的刷, 说明socket.io没有连接成功

代码:

node.js server端

 var module_path = '/usr/local/web/node/bin/node_modules/';
var html = '<html> <head> <meta charset="utf-8"> <title>微信接口</title> <script src="http://cdn.bootcss.com/jquery/2.1.4/jquery.js"></script> <script src="http://cdn.bootcss.com/socket.io/1.3.5/socket.io.js"></script> </head> <body> <div id="voice"> 语音识别:<br><br> </div> <script type="text/javascript"> var voice = document.getElementById("voice"); var socket = io.connect("http://www.zhangzhibin.com:1337"); socket.on("hello", function(data){console.log(data); socket.emit("hello", {"status":"ok"}); }); socket.on("emit", function(data){var t = data+"<br>"; voice.innerHTML += t; socket.emit("emit", {"get":"data"}); }); </script> </body> </html>';
//链接redis
var redis = require(module_path+'redis');
var redis_client = redis.createClient(6379, '127.0.0.1');
redis_client.auth('123456');
redis_client.on('error', function(error){
console.log('redis-error: ' + error);
}); //创建服务器
var http = require('http');
var url = require('url');
var fs = require('fs');
var ch = false;
var server = http.createServer(function (req, res) {
//获取请求参数
var objReqArg = url.parse(req.url, true).query;
ch = objReqArg.openid;
if (ch) {
redis_client.subscribe(ch, function(e){
console.log('channel: '+ ch);
});
};
//返回
res.writeHead(200, {'Content-Type': 'text/html'});
res.end(html); });
server.listen(1337, 'www.zhangzhibin.com'); //创建服务器
var io = require(module_path + 'socket.io').listen(server);
io.sockets.on('connection', function(socket){
socket.on('hello', function(data){
console.log(data);
});
socket.emit('hello', function(data){
console.log(data);
});
redis_client.on('message', function(error, msg){
socket.emit('emit', msg);
});
}); console.log('Server running at http://www.zhangzhibin.com:1337');

浏览器端html代码:

就是上边代码的第二行变量 var html='....'

 <html>
<head>
<meta charset="utf-8">
<title>微信接口</title>
<script src="http://cdn.bootcss.com/jquery/2.1.4/jquery.js"></script>
<script src="http://cdn.bootcss.com/socket.io/1.3.5/socket.io.js"></script>
</head>
<body>
<div id="voice"> 语音识别:<br><br> </div>
<script type="text/javascript">
var voice = document.getElementById("voice");
var socket = io.connect("http://www.zhangzhibin.com:1337");
socket.on("hello", function(data){ console.log(data); socket.emit("hello", {"status":"ok"}); });
socket.on("emit", function(data){ var t = data+"<br>"; voice.innerHTML += t; socket.emit("emit", {"get":"data"}); });
</script>
</body>
</html>

微信端:

注意一点, 在语音回调函数中, 将语音识别的结果publish到某一个频道上即可

这时, 会触发上边第41行代码, 将文字发完浏览器端

下边是微信回调的代码:

     public function voice()
{
// 每次发送消息都会post 来一份签名相关的数据
// $echostr = $this->checkSignature();
// exit($echostr); preg_match('#<FromUserName><!\[CDATA\[([a-zA-Z0-9_]+)\]#', $GLOBALS['HTTP_RAW_POST_DATA'], $matches1);
preg_match('#<Recognition><!\[CDATA\[([^\]]*)\]#', $GLOBALS['HTTP_RAW_POST_DATA'], $matches2);
$openid = !empty($matches1[1]) ? $matches1[1] : '0';
$text = !empty($matches2[1]) ? $matches2[1] : '没听清...'; $objRedis = iredis::getInstance();
$objRedis->publish($openid, $text); }

测试方法:

1. 关注我的微信公众号"xxx"

2. 发送消息"主播_username"

3. pc端打开 http://www.zhangzhibin.com/wechat/index/zhubolist

4. 点击你刚才输入的用户名, 进入你的对话页面

5. 对微信发送语音消息, 即可在刚才的浏览器页面看到语音识别结果

冷知识点:

php流处理

$_POST 无法解释二进制流,需要用到 $GLOBALS['HTTP_RAW_POST_DATA'] 或 php://input

$content = $GLOBALS['HTTP_RAW_POST_DATA'];  // 需要php.ini设置

$content = file_get_contents('php://input'); // 不需要php.ini设置,内存压力小

redis,nodejs,php,pub/sub 实战: 微信语音识别的更多相关文章

  1. redis pub/sub 实战: 微信语音识别

    2015年5月22日 20:20:20 星期五 效果: 这边对微信说话,  浏览器端及时显示语音识别的文字 注意: 在连接socket.io时, 按下浏览器f12, 如果一直有请求不断的刷, 说明so ...

  2. 出书了!实战微信小程序

    真正用心写完一本书,才知道写书真的很不容易. 我热衷喜欢分享一些技术,也喜欢钻研一些新东西,去年微信小程序刚内测的时候,我和我的同事四个人就一起研究,恰好公司有小程序相关的项目,做项目的同时,越发感觉 ...

  3. Redis秒杀实战-微信抢红包-秒杀库存,附案例源码(Jmeter压测)

    导读 前二天我写了一篇,Redis高级项目实战(点我直达),SpringBoot整合Redis附源码(点我直达),今天我们来做一下Redis秒杀系统的设计.当然啦,Redis基础知识还不过关的,先去加 ...

  4. 最通俗易懂的Redis发布订阅及代码实战

    发布订阅简介 除了使用List实现简单的消息队列功能以外,Redis还提供了发布订阅的消息机制.在这种机制下,消息发布者向指定频道(channel)发布消息,消息订阅者可以收到指定频道的消息,同一个频 ...

  5. Redis从基础命令到实战之列表类型(List)

    经过上一篇基于Redis散列类型的改造后,实战练习中的商品管理已经具备了增加.修改整体.修改部分属性和分页查询功能,但仍然不支持删除商品的功能.这是因为商品总数是以一个自增数字记录的,且关联了新商品k ...

  6. Redis和消息队列使用实战

    消息队列是在乐视这边非常普遍使用的技术.在我们部门内部,不同的项目使用的消息队列实现也不一样.下面是支付系统的流转图(部门兄弟画的,借用一下): 从图中可以看到,里面用到了kafka消息队列.作用是做 ...

  7. 服务器环境配置安装(mysql+redis+nodejs+nginx)

    公司用来测试的服务器挂了,最后重装了系统,需要重新配置程序运行环境,linux上安装不是很熟悉,特此记录一下. 首先获取系统版本信息: 参考:获取Linux系统版本信息 一.mysql 1. 安装 安 ...

  8. redis发布(pub)、订阅(sub)模式

    前言:redis提供了很多种功能或模式,可以运用在不同的场景下,今天记录下redis中的发布.订阅模式的基本使用 注redis安装及主从搭建请参考我其他博文http://www.cnblogs.com ...

  9. 5000+字硬核干货!Redis 分布式集群部署实战

    原理: Redis集群采用一致性哈希槽的方式将集群中每个主节点都分配一定的哈希槽,对写入的数据进行哈希后分配到某个主节点进行存储. 集群使用公式(CRC16 key)& 16384计算键key ...

随机推荐

  1. Beta 冲刺 五

    团队成员 051601135 岳冠宇 031602629 刘意晗 031602248 郑智文 031602330 苏芳锃 031602234 王淇 照片 项目进展 岳冠宇 昨天的困难 数据交换比较复杂 ...

  2. Activiti随着Spring启动自动部署开关

    Activiti的act_re_deployment表NAME_列:全部显示SpringAutoDeployment. 查阅Activiti,https://github.com/Activiti/A ...

  3. 侧边导航栏css示例

    效果展示: html: <div class="sidebar"> <ul> <li>优先级 <ul> <li>< ...

  4. ubuntu14.04如何设置静态IP的方法

    第一步: 配置静态IP地址: 打开/etc/network/interfaces文件,内容为 auto lo iface lo inet loopback auto eth0 iface eth0 i ...

  5. Simple Cycles Edges CodeForces - 962F(点双连通分量)

    题意: 求出简单环的所有边,简单环即为边在一个环内 解析: 求出点双连通分量,如果一个连通分量的点数和边数相等,则为一个简单环 点双连通分量  任意两个点都至少存在两条点不重复的路径  即任意两条边都 ...

  6. fgt2eth Script

    fgt2eth Script explanation_on_how_to_packet_capture_for_only_certain_TCP_flags_v2.txt Packet capture ...

  7. PHP使用serialize和json_encode序列化数据并通过redis缓存文件和$GLOGALS缓存资源对象

    PHP常用缓存方式:第一种,把需要缓存的数据进行处理,形成PHP可以直接执行的文件.在需要缓存数据的时候,通过include方式引入,并使用.第二种,把需要的数据通过serialize函数序列化后直接 ...

  8. Link Cut Tree 总结

    Link-Cut-Tree Tags:数据结构 ##更好阅读体验:https://www.zybuluo.com/xzyxzy/note/1027479 一.概述 \(LCT\),动态树的一种,又可以 ...

  9. Java基础-Java中23种设计模式之常用的设计模式

    Java基础-Java中23种设计模式之常用的设计模式 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.   一.设计模式分类 设计模式是针对特定场景给出的专家级的解决方案.总的来说设 ...

  10. bzoj千题计划293:bzoj3142: [Hnoi2013]数列

    http://www.lydsy.com/JudgeOnline/problem.php?id=3142 如果已知数列的差分数列a[1]~a[k-1] 那么这种差分方式对答案的贡献为 N-Σ a[i] ...