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

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

效果:

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

注意:

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

代码:

node.js server端

 1 var module_path = ‘/usr/local/web/node/bin/node_modules/‘;
 2 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>‘;
 3 //链接redis
 4 var redis = require(module_path+‘redis‘);
 5 var redis_client = redis.createClient(6379, ‘127.0.0.1‘);
 6 redis_client.auth(‘123456‘);
 7 redis_client.on(‘error‘, function(error){
 8     console.log(‘redis-error: ‘ + error);
 9 });
10
11 //创建服务器
12 var http = require(‘http‘);
13 var url = require(‘url‘);
14 var fs = require(‘fs‘);
15 var ch = false;
16 var server = http.createServer(function (req, res) {
17     //获取请求参数
18     var objReqArg = url.parse(req.url, true).query;
19     ch = objReqArg.openid;
20     if (ch) {
21         redis_client.subscribe(ch, function(e){
22             console.log(‘channel: ‘+ ch);
23         });
24     };
25     //返回
26     res.writeHead(200, {‘Content-Type‘: ‘text/html‘});
27     res.end(html);
28
29 });
30 server.listen(1337, ‘www.zhangzhibin.com‘);
31
32 //创建服务器
33 var io = require(module_path + ‘socket.io‘).listen(server);
34 io.sockets.on(‘connection‘, function(socket){
35     socket.on(‘hello‘, function(data){
36         console.log(data);
37     });
38     socket.emit(‘hello‘, function(data){
39         console.log(data);
40     });
41     redis_client.on(‘message‘, function(error, msg){
42         socket.emit(‘emit‘, msg);
43     });
44 });
45
46 console.log(‘Server running at http://www.zhangzhibin.com:1337‘);

浏览器端html代码:

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

 1 <html>
 2     <head>
 3         <meta charset="utf-8">
 4         <title>微信接口</title>
 5         <script src="http://cdn.bootcss.com/jquery/2.1.4/jquery.js"></script>
 6         <script src="http://cdn.bootcss.com/socket.io/1.3.5/socket.io.js"></script>
 7     </head>
 8     <body>
 9     <div id="voice"> 两秒钟同步一次:<br><br> </div>
10     <script type="text/javascript">
11         var voice = document.getElementById("voice");
12         var socket = io.connect("http://www.zhangzhibin.com:1337");
13         socket.on("hello", function(data){ console.log(data);  socket.emit("hello", {"status":"ok"}); });
14         socket.on("emit", function(data){ var t = data+"<br>"; voice.innerHTML += t; socket.emit("emit", {"get":"data"}); });
15     </script>
16     </body>
17 </html>

微信端:

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

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

下边是微信回调的代码:

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

测试方法:

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

2. 发送消息"主播_username"

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

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

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

时间: 2024-11-03 22:48:11

redis pub/sub 实战: 微信语音识别的相关文章

基于redis排行榜的实战总结

前言: 之前写过排行榜的设计和实现, 不同需求其背后的架构和设计模型也不一样. 平台差异, 有的立足于游戏平台, 为多个应用提供服务, 有的仅限于单个游戏.排名范围差异, 有的面向全局排名, 有的只做朋友圈排名. 实时性差异, 离线统计有之, 实时排名更常见. 不管如何, 本文将结合之前写的网页闯关游戏, 来具体阐述基于redis排行榜的实战过程. 相关文章系列: 之前写过两篇关于排行榜的文章, 不过那是针对游戏平台(类似微信, 手Q等)而言的. 每个用户都有自己的排行榜, 不是全局性的. •

redis pub/sub 发布订阅

Redis的列表数据结构有blpop和brpop命令,能从列表里返回且删除第一个(或最后一个)元素,或者被堵塞,直到有一个元素可供操作.这可以用来实现一个简单的队列. (译注:对于blpop和brpop命令,如果列表里没有关键字可供操作,连接将被堵塞,直到有另外的Redis客户端使用lpush或rpush命令推入关键字为止.) 此外,Redis对于消息发布和频道订阅有着一流的支持.你可以打开第二个redis-cli窗口,去尝试一下这些功能.在第一个窗口里订阅一个频道(我们会称它为warnings

nginx+play framework +mongoDB+redis +mysql+LBS实战总结

nginx+play framework +mongoDB+redis +mysql+LBS实战总结(一) 使用这个样的组合结构已经很久了,主要是实现web-server,不是做网站,二是纯粹的数据服务server.早就想总结一下,一直没有时间,最近也是一而再再而三的解决了使用途中的各种问题,从此片开始到之后悔慢慢的将这些经验教训总结下来,一边自己和朋友们借鉴使用.此片算是开篇吧,首先对这几种技术或者说平台做简单的介绍吧,顺便推荐一些文章给大家. nginx:本身是一个web server ,在

Redis 缓存应用实战

原文:Redis 缓存应用实战 为了提高系统吞吐量,我们经常在业务架构中引入缓存层. 缓存通常使用 Redis / Memcached 等高性能内存缓存来实现, 本文以 Redis 为例讨论缓存应用中面临的一些问题. 缓存更新一致性 先更新数据库,再删除缓存 先更新数据库,再更新缓存 先删除缓存,再更新数据库 先更新缓存,再更新数据库 异步更新 缓存穿透 集合式缓存 重建缓存 Check-Lock-Check 事务 Rename 乐观锁 离线数据处理 临时键的生成 SortedSet 延时队列

《Netty Zookeeper Redis 高并发实战》 图书简介

<Netty Zookeeper Redis 高并发实战> 图书简介 ## 重要的重复3遍: 本书 面试必备 + 面试必备 + 面试必备 购买链接 京东商城<Netty Zookeeper Redis 高并发实战 > <Netty Zookeeper Redis 高并发实战> 图书简介 机械工业出版社出版,尼恩编著的<Netty Zookeeper Redis 高并发实战>一书, 从操作系统底层的IO原理入手,同时提供高性能开发的实战案例,是一本高并发Jav

Spring Data Redis—Pub/Sub(附Web项目源码)

一.发布和订阅机制 当一个客户端通过 PUBLISH 命令向订阅者发送信息的时候,我们称这个客户端为发布者(publisher). 而当一个客户端使用 SUBSCRIBE 或者 PSUBSCRIBE 命令接收信息的时候,我们称这个客户端为订阅者(subscriber). 为了解耦发布者(publisher)和订阅者(subscriber)之间的关系,Redis 使用了 channel (频道)作为两者的中介 —— 发布者将信息直接发布给 channel ,而 channel 负责将信息发送给适当

Redis集群实战

Redis基础到集群实战笔记 持久化存储 redis介绍 redis是基于key-value的持久化数据库存储系统,redis和memcached服务很想,但是redis支持的数据存储类型 服务更丰富 memcached支持value redis支持string(字符)list(链表)  set(集合)  push.pop redis比memcached服务性能好,但是比相对性的关系数据库(如mysql) 相对差 redis支持各种不同方式的排序,与memcached一样,为了保存效率,数据都是

Spring Data Redis—Pub/Sub(附Web项目源码) (转)

一.发布和订阅机制 当一个客户端通过 PUBLISH 命令向订阅者发送信息的时候,我们称这个客户端为发布者(publisher). 而当一个客户端使用 SUBSCRIBE 或者 PSUBSCRIBE 命令接收信息的时候,我们称这个客户端为订阅者(subscriber). 为了解耦发布者(publisher)和订阅者(subscriber)之间的关系,Redis 使用了 channel (频道)作为两者的中介 —— 发布者将信息直接发布给 channel ,而 channel 负责将信息发送给适当

redis pub/sub Spring StringRedisTemplate

redis 订阅发布 项目名称:SmRemind_NEW @Service public class PubServiceImpl implements PubService { @Resource(name="stringRedisTemplate") private  StringRedisTemplate stringRedisTemplate; private String channelTopic = "Baojing"; /*发布消息到Channel*/