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 pub/sub 实战: 微信语音识别的更多相关文章

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

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

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

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

  3. 基于redis排行榜的实战总结

    前言: 之前写过排行榜的设计和实现, 不同需求其背后的架构和设计模型也不一样. 平台差异, 有的立足于游戏平台, 为多个应用提供服务, 有的仅限于单个游戏.排名范围差异, 有的面向全局排名, 有的只做 ...

  4. redis在微博与微信等互联网应用笔记

    Redis实战redis在微博与微信等互联网应用实例讲解全集 1. 对象缓存 id user balance 1 john 1200 2 tom 3000 对于这种存储,redis可以使用mset o ...

  5. 二、Redis基本操作——String(实战篇)

    小喵万万没想到,上一篇博客,居然已经被阅读600次了!!!让小喵感觉压力颇大.万一有写错的地方,岂不是会误导很多筒子们.所以,恳请大家,如果看到小喵的博客有什么不对的地方,请尽快指正!谢谢! 小喵的唠 ...

  6. php redis pub/sub(Publish/Subscribe,发布/订阅的信息系统)之基本使用

    一.场景介绍 最近的一个项目需要用到发布/订阅的信息系统,以做到最新实时消息的通知.经查找后发现了redis pub/sub(发布/订阅的信息系统)可以满足我的开发需求,而且学习成本和使用成本也比较低 ...

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

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

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

    nginx+play framework +mongoDB+redis +mysql+LBS实战总结(一) 使用这个样的组合结构已经很久了,主要是实现web-server,不是做网站,二是纯粹的数据服 ...

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

    <Netty Zookeeper Redis 高并发实战> 图书简介 本书为 高并发社群 -- 疯狂创客圈 倾力编著, 高度剖析底层原理,深度解读面试难题 疯狂创客圈 Java 高并发[ ...

随机推荐

  1. C#List的排序和简单去重总结

    List集合在开发过程中很常见,经常我们要对该集合进行一系列操作,本文介绍如何将该集合内的元素进行排序,博主制作简单WinForm应用程序进行演示. 首先,我们来看一下c#泛型List提供的Sort方 ...

  2. 一次插入多条记录 [mysql]

    调用多次INSERT语句不就可以插入多条记录了吗?但使用这种方法要增加服务器的负荷,因为,执行每一次SQL服务器都要同样对SQL进行分析.优化等操作.幸好MySQL提供了另一种解决方案,就是使用一条I ...

  3. android-android获取navigationview 上的控件id

    NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view); View headerView = navi ...

  4. git执行pull命令时,报错

    在图形界面中,执行拉取操作时,出现下面的错误. You asked to pull from the remote 'origin', but did not specifya branch. Bec ...

  5. CF449B Jzzhu and Cities (最短路)

    CF449B CF450D http://codeforces.com/contest/450/problem/D http://codeforces.com/contest/449/problem/ ...

  6. hdu4888 Redraw Beautiful Drawings 最大流+判环

    hdu4888 Redraw Beautiful Drawings Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 65536/6553 ...

  7. Node.SelectNodes

    http://www.crifan.com/csharp_under_some_node_search_specific_child_node/ https://msdn.microsoft.com/ ...

  8. Java多线程初学者指南(7):向线程传递数据的三种方法

    在传统的同步开发模式下,当我们调用一个函数时,通过这个函数的参数将数据传入,并通过这个函数的返回值来返回最终的计算结果.但在多线程的异步开发模式下,数据的传递和返回和同步开发模式有很大的区别.由于线程 ...

  9. 必须知道的.net(继承)

    1.继承定义:就是面向对象中类与类之间的一种关系.通过继承,使得子类具有父类的属性和方法,同时子类也可以通过加入新的属性和方法或者修改父类的属性和方法建立新的类层次. 2.CLR支持实现单继承和接口多 ...

  10. Effective Java 读书笔记之一 创建和销毁对象

    一.考虑用静态工厂方法代替构造器 这里的静态工厂方法是指类中使用public static 修饰的方法,和设计模式的工厂方法模式没有任何关系.相对于使用共有的构造器来创建对象,静态工厂方法有几大优势: ...