redis pub/sub 实战: 微信语音识别
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. 对微信发送语音消息, 即可在刚才的浏览器页面看到语音识别结果
冷知识点:
$_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 pub/sub 实战: 微信语音识别的更多相关文章
- redis,nodejs,php,pub/sub 实战: 微信语音识别
2015年5月22日 20:20:20 星期五 效果: 这边对微信说话, 浏览器端及时显示语音识别的文字 注意: 在连接socket.io时, 按下浏览器f12, 如果一直有请求不断的刷, 说明so ...
- Redis秒杀实战-微信抢红包-秒杀库存,附案例源码(Jmeter压测)
导读 前二天我写了一篇,Redis高级项目实战(点我直达),SpringBoot整合Redis附源码(点我直达),今天我们来做一下Redis秒杀系统的设计.当然啦,Redis基础知识还不过关的,先去加 ...
- 基于redis排行榜的实战总结
前言: 之前写过排行榜的设计和实现, 不同需求其背后的架构和设计模型也不一样. 平台差异, 有的立足于游戏平台, 为多个应用提供服务, 有的仅限于单个游戏.排名范围差异, 有的面向全局排名, 有的只做 ...
- redis在微博与微信等互联网应用笔记
Redis实战redis在微博与微信等互联网应用实例讲解全集 1. 对象缓存 id user balance 1 john 1200 2 tom 3000 对于这种存储,redis可以使用mset o ...
- 二、Redis基本操作——String(实战篇)
小喵万万没想到,上一篇博客,居然已经被阅读600次了!!!让小喵感觉压力颇大.万一有写错的地方,岂不是会误导很多筒子们.所以,恳请大家,如果看到小喵的博客有什么不对的地方,请尽快指正!谢谢! 小喵的唠 ...
- php redis pub/sub(Publish/Subscribe,发布/订阅的信息系统)之基本使用
一.场景介绍 最近的一个项目需要用到发布/订阅的信息系统,以做到最新实时消息的通知.经查找后发现了redis pub/sub(发布/订阅的信息系统)可以满足我的开发需求,而且学习成本和使用成本也比较低 ...
- 出书了!实战微信小程序
真正用心写完一本书,才知道写书真的很不容易. 我热衷喜欢分享一些技术,也喜欢钻研一些新东西,去年微信小程序刚内测的时候,我和我的同事四个人就一起研究,恰好公司有小程序相关的项目,做项目的同时,越发感觉 ...
- nginx+play framework +mongoDB+redis +mysql+LBS实战总结
nginx+play framework +mongoDB+redis +mysql+LBS实战总结(一) 使用这个样的组合结构已经很久了,主要是实现web-server,不是做网站,二是纯粹的数据服 ...
- 《Netty Zookeeper Redis 高并发实战》 图书简介
<Netty Zookeeper Redis 高并发实战> 图书简介 本书为 高并发社群 -- 疯狂创客圈 倾力编著, 高度剖析底层原理,深度解读面试难题 疯狂创客圈 Java 高并发[ ...
随机推荐
- MySQL索引之前缀索引和索引选择性
有时需要索引很长的字符列,它会使索引变大而且变慢.一个策略就是模拟哈希索引.但是有时这也不够好,那? 通常可以索引开始的几个字符,而不是全部值,以节约空间并得到好的性能.这使索引需要的空间变小,但是也 ...
- Hibernate uniqueResult方法的使用
以前写代码,总免不了编写登陆部分.在获取user的时候,只可能返回一个user实例,或者为null.以前使用以下方法实现.public User get(String id){ Sessio ...
- 浙大PAT-1002
1002. 写出这个数 (20) 读入一个自然数n,计算其各位数字之和,用汉语拼音写出和的每一位数字. 输入格式:每个测试输入包含1个测试用例,即给出自然数n的值.这里保证n小于10100. 输出格式 ...
- 再谈 X-UA-Compatible 兼容模式
如何理解 IE 的文档兼容模式(X-UA-Compatible)? IE 浏览器支持多种文档兼容模式,得以因此改变页面的渲染效果. IE9 模式支持全范围的既定行业标准,包括 HTML5(草案), W ...
- 基于iSCSI的SQL Server 2012群集测试(二)--SQL群集安装后初始化配置测试
4.群集安装后初始化配置测试 4.1 禁用full-text 服务和Browser服务 Full-text服务:公司目前暂不使用,需在两个节点上分别禁用 Browser服务:为保证安全,建议将Brow ...
- 牡丹江.2014k(构造)
K - Known Notation Time Limit:2000MS Memory Limit:65536KB 64bit IO Format:%lld & %llu Su ...
- CF #305(Div.2) D. Mike and Feet(数学推导)
D. Mike and Feet time limit per test 1 second memory limit per test 256 megabytes input standard inp ...
- poj.1988.Cube Stacking(并查集)
Cube Stacking Time Limit:2000MS Memory Limit:30000KB 64bit IO Format:%I64d & %I64u Submi ...
- svn更改默认服务启动目录
配置文件位于 /etc/sysconfig/svnserve 修改为自己的目录
- CentOS 6.5 安装nginx 1.6.3
使用epel [root@nginx /]# wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo ...