redis,nodejs,php,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,nodejs,php,pub/sub 实战: 微信语音识别的更多相关文章
- redis pub/sub 实战: 微信语音识别
2015年5月22日 20:20:20 星期五 效果: 这边对微信说话, 浏览器端及时显示语音识别的文字 注意: 在连接socket.io时, 按下浏览器f12, 如果一直有请求不断的刷, 说明so ...
- 出书了!实战微信小程序
真正用心写完一本书,才知道写书真的很不容易. 我热衷喜欢分享一些技术,也喜欢钻研一些新东西,去年微信小程序刚内测的时候,我和我的同事四个人就一起研究,恰好公司有小程序相关的项目,做项目的同时,越发感觉 ...
- Redis秒杀实战-微信抢红包-秒杀库存,附案例源码(Jmeter压测)
导读 前二天我写了一篇,Redis高级项目实战(点我直达),SpringBoot整合Redis附源码(点我直达),今天我们来做一下Redis秒杀系统的设计.当然啦,Redis基础知识还不过关的,先去加 ...
- 最通俗易懂的Redis发布订阅及代码实战
发布订阅简介 除了使用List实现简单的消息队列功能以外,Redis还提供了发布订阅的消息机制.在这种机制下,消息发布者向指定频道(channel)发布消息,消息订阅者可以收到指定频道的消息,同一个频 ...
- Redis从基础命令到实战之列表类型(List)
经过上一篇基于Redis散列类型的改造后,实战练习中的商品管理已经具备了增加.修改整体.修改部分属性和分页查询功能,但仍然不支持删除商品的功能.这是因为商品总数是以一个自增数字记录的,且关联了新商品k ...
- Redis和消息队列使用实战
消息队列是在乐视这边非常普遍使用的技术.在我们部门内部,不同的项目使用的消息队列实现也不一样.下面是支付系统的流转图(部门兄弟画的,借用一下): 从图中可以看到,里面用到了kafka消息队列.作用是做 ...
- 服务器环境配置安装(mysql+redis+nodejs+nginx)
公司用来测试的服务器挂了,最后重装了系统,需要重新配置程序运行环境,linux上安装不是很熟悉,特此记录一下. 首先获取系统版本信息: 参考:获取Linux系统版本信息 一.mysql 1. 安装 安 ...
- redis发布(pub)、订阅(sub)模式
前言:redis提供了很多种功能或模式,可以运用在不同的场景下,今天记录下redis中的发布.订阅模式的基本使用 注redis安装及主从搭建请参考我其他博文http://www.cnblogs.com ...
- 5000+字硬核干货!Redis 分布式集群部署实战
原理: Redis集群采用一致性哈希槽的方式将集群中每个主节点都分配一定的哈希槽,对写入的数据进行哈希后分配到某个主节点进行存储. 集群使用公式(CRC16 key)& 16384计算键key ...
随机推荐
- final版本发布评价II
其实我对技术上的问题了解不多,所以有些评语可能说的不对或者压根就没啥用.可直接忽略.请见谅. 1新蜂的俄罗斯方块,UI设计虽然给出了背景和颜色,但是感觉色彩对比也不好,模块之间也不协调.没有更多的说服 ...
- Python爬虫利器:BeautifulSoup库
Beautiful Soup parses anything you give it, and does the tree traversal stuff for you. BeautifulSoup ...
- OneZero第二周第五次站立会议(2016.4.1)
会议时间:2016年4月1日 会议成员:冉华,张敏,夏一鸣.(王请假). 会议目的:汇报前一天工作,会议成员评论. 会议内容: 1.前端,由夏,张负责汇报,完成前端功能,待命. 2.数据逻辑控制,由王 ...
- 苹果ATS 豁免摆乌龙?
现象 我们的App已经完成了NA部分的ATS适配.网页端由于有使用到第三方的页面,所以开启了网页的豁免权限.关于如何开启豁免及方法,可以参考喵神的Blog最终,我们的适配参数为: NSAllowsAr ...
- Cat VS Dog HDU - 3829 (最大独立集 )
Cat VS Dog Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 125536/65536 K (Java/Others)Total ...
- 自学huawei之路-6005-8AP设备启动界面
返回自学Huawei之路 自学huawei之路-AC6005-8AP设备启动界面 [YK-MES-MASTER] Please check whether system data has been c ...
- 三、spring boot 1.5.4 web容器定制(端口号等修改)
spring boot 默认采用tomcat作为嵌入的web容器 定制方式有三种 1. 2.如下 @Component public class CustomizationBean implement ...
- PostgreSQL(一)教程 -----SQL语言
一.概念 PostgreSQL是一种关系型数据库管理系统 (RDBMS).这意味着它是一种用于管理存储在关系中的数据的系统.关系实际上是表的数学术语. 今天,把数据存储在表里的概念已经快成了固有的常识 ...
- oracle系统表v$session、v$sql字段说明
在本视图中,每一个连接到数据库实例中的 session都拥有一条记录.包括用户 session及后台进程如 DBWR, LGWR, arcchiver等等. V$SESSION中的常用列 V$SESS ...
- web开发中的跨域整理
1.springboot通过CROS实现跨域: https://www.cnblogs.com/520playboy/p/7306008.html springboot下各种跨域方式: http:// ...