Happy Hacking!

2020-01-12
2019 蒙太奇

2019 蒙太奇

时间过得真是非常的快。去年的总结好像才刚完成不久,现在又开始写 2019 年的总结了。也正因如此,年度总结才显得格为重要,无论如何都必须坚持下去,直到自己老到敲不动键盘为止。

2019 年对我而言,最大的意义是实现了几个重要的小目标。在这一年,我搬进了自己住的房子,紧接着又幸运地摇到号订了车。在工作中,我渐渐地胜任了管理角色。另外,我还达成了一个公益小目标:利用开源项目筹集并捐出一万元善款。当然还有一些不尽如人意的部分,比如这一年过得更宅了。

按照惯例,今年的总结依然会分几个主题来回顾:正经事(工作、开源、博客、授课),不正经事(居家、旅行、游戏、健康、看书、感情)。

Read More

2020-01-05
脑机接口概述及Muse头环Python开发基础

脑机接口概述及Muse头环Python开发基础

一、BCI 技术综述

BCI 技术(Brain-Computer Interface Science, 脑机接口)是一种用于在人脑和外部设备间发送和接受信号的技术。BCI 的基本原理是捕获并解释人脑的信号,然后传输到与人脑相连接的机器上,这个机器可以进一步对人脑的信号进行处理,输出相应指令。

BCI 技术有着非常广泛的应用前景,例如帮助残疾、老年或者行动不便的人士控制轮椅、智能家居以及机器人。BCI 的通信还可以是双工的:除了能将脑部信号传输到外部设备外,还能反向将外部设备的信号传输回脑部。这种能主动传回脑部的 BCI 称为主动 BCI(Active BCI),而只支持脑部到外部设备单向信号传输的 BCI 称为被动 BCI (Passive BCI)。

BCI 的主要挑战在于从信噪比匮乏的脑部信号中精确识别出人类的意图。较低的分类准确度以及较差的泛化能力都制约着 BCI 技术的应用和普及。为了解决以上的问题,最近几年深度学习开始被用在大脑信息处理上。

Read More

2020-01-05
小目标达成:一万元开源项目善款筹集计划

小目标达成:一万元开源项目善款筹集计划

非常自豪的分享一件事。我在 18 年设定的一个公益小目标——收集一万元开源项目进群费并捐给壹基金等公益机构——已经达成!

缘起

这个目标缘起于 18 年中旬,当时我的 dingdang-robot 项目已经积累了一定的用户数,QQ 用户群(580447290)也已经接近 500 名,即将超出普通会员所能创建的群人员限制。

为了控制群人数,我开始实行了入群收费制。一开始,入群费设定为五元,但这个收费过于便宜,并没能刹住车——每天入群的人依然很多,很快就把群人数撑破了 500 名。于是我只好将我的 QQ 账户升级为 QQ 超级会员,将用户群人数上限升级为 2000 名。将群改为付费入群后,带来了两个好处:

  1. 放缓了群人数增长速度。原来一个月入群人数可能都会有一百名,改为付费制后,单个月的入群人数降到了 10~20 个。
  2. 提高了群内容质量。因为是付费入群,也就杜绝了广告党的乱入。入群的人全都是 dingdang-robot 或者 wukong-robot 的用户,群讨论质量得到了保证。

但随之而来的问题是:这些入群费要怎么使用?

Read More

2020-01-05
Cocos Creator 最佳实践之注意 JavaScript API 兼容性

Cocos Creator 最佳实践之注意 JavaScript API 兼容性

不同的浏览器和移动设备所使用的 JavaScript 虚拟机(VM)千差万别,所支持的 API 也大相径庭。

我们来了解一下 Cocos Creator 在各个端所使用的 JavaScript VM :

  • 对于 iOS 客户端和 Mac 客户端:在 Cocos Creator 1.6 及以前,Cocos Creator 一直是使用非系统原生的 SpiderMonkey 作为 JS VM ;从 1.7 开始,Cocos Creator 引入了 JSB 2.0 ,支持了 V8、JavaScriptCore 等多种 JS VM 。于是 Cocos Creator 便将 iOS 端和 Mac 端的 JS VM 都改为了系统自带的 JavaScriptCore ,以达到节省包体的目的;到了 2.1.3 ,Cocos Creator 又将 Mac 端的 JS VM 切换到了 V8,以提升应用性能。
  • 对于 Android 客户端和 Windows 客户端:在 Cocos Creator 1.6 及以前,Cocos Creator 同样是使用 SpiderMonkey 作为 JS VM ;从 1.7 开始,得益于 JSB 2.0 ,V8 成了 Android 和 Windows 客户端的 JS VM 。
  • 对于 Web 端:使用浏览器本身的 JavaScript VM 来解析 JavaScript 代码。
Read More

2019-04-24
wukong-robot:一个更加优雅的中文智能音箱项目

wukong-robot:一个更加优雅的中文智能音箱项目

dingdang-robot 之殇

在两年前,我做了第一个智能音箱项目 dingdang-robot 。在去年 7 月加入上报统计后,在不到一年的时间里,这个项目已经运行在 1000+ 台设备中,被唤醒了 128,000+ 次。截至今天,这个项目的个人版和社区版在 Github 上总共获得了 2,600+ 个 stars ,820+ 次 forks。

在我去年的一篇年度总结中,我提到因为 dingdang-robot 本身维护上的困难,我将项目迁移到了 dingdang-robot 组织交由社区进行维护。很遗憾的是,即使迁到了 dingdang-robot 组织,由于组织维护者们都并不是全职维护这个项目,而且硬件和操作系统上的差异始终给 dingdang-robot 的维护带来了很大的问题,所以取得的效果并不理想。而且随着自己能力的不断提升,我对 dingdang-robot 里头的代码也越发不满意:

  1. dingdang-robot 是基于 Python 2 的,在 Python 3 环境里跑不起来。而 Python 2 已经停止维护了。
  2. dingdang-robot 的热词唤醒(KWS)复用的是 jasper-client 的那套,基于 PyAudio 自己实现录音和 VAD ,基于 PocketSphinx 实现热词唤醒。然而那套录音和VAD代码我个人觉得写得并不鲁棒,为了避免各种边界情况我不得不加了一些 try...catch ,虽然没人发现这一点,但我自己是过不了自己那一关的,每每想到自己在用一套有问题的代码作为别人的入口就像是留一个坑叫别人跳进来,内心觉得很有罪恶感;另外 PocketSphinx 的安装非常复杂,虽然我提供了树莓派的镜像,但是很多人还是希望手动安装,而 PocketSphinx 对环境要求也很苛刻,所以总会遇到各种奇怪的问题,而我又不能复现;
  3. 还有一些使用上的便利性问题。比如没有更新提示,有时候修了一个bug,别人不知道,提了issue后我得告诉他请更新到最新;再比如使用YAML作为配置文件,但是很多用户不懂YAML的语法格式,常见的比如把半角冒号(:)打成全角(),或者冒号后没有跟着空格再写键值;再比如当初我处理 log 的打印也设计得比较傻逼,为了写到文件里头,直接用的是重定向,完全没有考虑用 FileHandler 这种东西。

到了今年,我决定对 dingdang-robot 进行完全重写,做出一个更加 优雅、灵活、鲁棒 的版本。

Read More