XiaoHu.ai开发日志(自2018年2月6日至2019年4月11日)

一年多来,一直在项目目录下的update_log.txt里记录开发日志,今天放到网上来,共 6189个字。

————XiaoHu.ai Standard 代号STD————

2/6 v0.1 项目启动,第一行负责录音的代码被写了出来

2/8 v0.2 语音助手可以识别正则表达式指令,整合turing获得聊天功能

2/9 v0.36 更换数据库架构为xml,编写了标记技术可以识别输入语句里变量的存在

2/10 v0.4 添加日程管理:日程添加,日程查询,日程删除。编到晚上嗓子疼

2/11 v0.52 #修复日程的两个bug 搞了一上午和一下午添加了点歌功能

2/12 v0.58 上午尝试通过微信控制 不断出现离奇bug 数据库被清空,花了半个小时重写了一遍 于是赶忙改了回来,顺便优化了一下数据库下午做了用微信控制电脑的小脚本 开学装班级电脑上 晚上加了语音输入和打开office后自动按回车的设置

2/20 v0.7 重新写了微信控制的代码,整体良好,在等待用户输入这个功能上费了好长时间,因为微信接收消息是被动的。后来一个变量在当前模块不生效,在其他模块生效,索性(在当前模块中调用另一模块调用的当前模块里的变量)

2/21 v0.78 用多进程解决了微信版不能检查提醒的问题,修复了一堆reminding的bug

2/22 v0.9 小虎已经基本完成,又添加了用户需求的五个功能:[打开,搜索的自定义;修复输入指令不能输入回车的bug;自动下载播放本机没有的音乐;音量的调节;离我最近的提醒],为了操作网易云音乐下载了两个大模块,愣是把所有代码用3个小时读通了,把两个模块嫁接到了一起。Standard 1.0版本明天就要完成了,23日上午进行最后的完善和校验,假期最后三天拍演示视频

2/23 v1.0 Standard 又搞了好久把下载播放音乐的功能编完整了,大功告成~视频我想等EVO完成后再拍,那样更惊艳。

————总共1047行代码————

————XiaoHu.ai Evolve 代号EVO————

 

3/11 开学了,开始小虎EVO版本的开发,大幅简化播放音乐,添加提醒的过程

3/5-3/19进军物联网,第一次刷了raspbian和ha,可以查看灯的状态但无法控制。于是两个礼拜来一直刷hassbian和hass.io,结果发现系统都启动不了,到了贵哥那里知道是供电,于是换了显示器和电源。不知为啥hassbian和hassio可以启动但没有ha,所以又刷了raspbian,情况又和第一天一样了。持续僵持,暂时休整。

4/5解决了持续快两个月的大bug,删除提醒删除不干净,于是机智地重写了一遍,循环删除,直到全删除完了为止

4/6从姥姥家回家路上突发奇想,重新启用科大讯飞api。科大讯飞的aiui自我步入EVO阶段就一直想搞可惜它不支持python代码,神奇的是回家一看发现它支持web post调用,于是申请了一个web应用,一个下午和晚上都忙于讯飞和小虎的对接。晚上再一次更新了数据库的格式,删除了一堆冗余的如runmode,runpath的tag,以及把之前一些tag的名字改成更易于理解的单词,在变量命名上也与讯飞的json看齐,把之前的cmd“指令”改成intent“意图”。又忙到了十一点..

4/7继续忙于与讯飞的对接,讯飞的功能的确强大,使我精简了一堆代码,截至12点,小虎已经可以完成讯飞上95%的技能,达到小爱的75%水平。从此以后小虎的目标不是Jarvis而是小爱,小爱由于运行在手机上而有着得天独厚的优势,我想以后能不能把小虎的客户端移植到手机上,保留电脑服务器端。不过那是下一个版本要做的事了。

4/21 4/9后给小虎定了10个小目标,两个礼拜的现在已经基本完成了。多是一些重要优化,以及把放音乐的过程从调用win的media player改成了一个基于pygame的内置播放器,作为单独进程执行,攻克了进程间共享变量的问题后就基本简单了。新的播放器没有窗口,在后台运行,支持上一首、下一首、暂停、继续等操作。

5/6期中考试后继续搞XiaoHu,修复了几个播放器的bug:在歌单中replay会播放第一首的bug;部分音乐网易没有版权导致运行时报错的解决方式;等等。XiaoHu距离物联网的下一步已经很近了。

5/12 期末前最后一次编XiaoHu,加入了对讯飞API的超时处理,改了图灵机器人无法处理的反馈。又用了一个小时的时间吧之前的烂代码格式全部整理了一遍,XiaoHu的代码现在除了注释比较少之外基本能看。

4/9立下的十个目标都完成了。下一个是最后阶段--HA。

————总共1218行代码————

 

7/8 期末考完试开始编程,把期末前上厕所想到的“将HA安装到win上”的想法实现,结果居然没有报错!无论是无线开关和夜灯都可以控制了。这是HA阶段里程碑的一天。

7/14 新购置的传感器到货。添加了“自动化”功能,第一个自动化是通过检测门窗传感器达成开储物间门时灯自动开启,关门时灯自动关闭。一个bug让我调了一上午,最后终于调好了。至此XiaoHu-HA阶段的理论部分全部完成。剩下就是等月底搬家后大批量购置和建设自动化。由于XiaoHu的智能家居部分是全部模块化的,所以月底就不用再多编什么代码。

7/16 重新回到10space 上午做的XiaoHu的流程图,下午在HA上搞了天气组件,增加了简报功能。修复了reminder的bug

7/17 做了一个与播放器原理相同的speaker,简化了各个模块的代码。继续修复提醒的bug

7/18 开始做电影的查询和下载,通过编写电影天堂和豆瓣的爬虫实现下载、查询的功能。我使用一个强大的模拟浏览器模块selenium,这个模块在我1月份开始学py做爬虫时就听说过,只是当时还是初学,对py了解不深,安装都没有成功。使用selenium可以让我抓取一些动态网页,或者是一些难爬的网页。拿电影天堂为例,在主页面输入查询电影名称时,它会把电影字符串信息转成一个ID,我通过Chrome的console试着找到转换的规律,可并没有找到。于是我使用selenium让他模拟打开主页面,再模拟输入电影名称,等转到搜索页面时,再把url转给beautifulsoup,进行爬取。在XiaoHu播报电影查询结果时,我发现了speaker的一个bug:由于它是连续播报,前一个语句还没有播报1s,下一个就开始了,导致最后只放出来了最后一句话。7/23 经过调试我发现这是因为我给speaker设定的“同时只能有一个speaker存在”这是为了让它在说话时可以随意中断。但它是异步的,没有堵塞,就导致了这样的情况。我、只好给它添加了“等待上一个speaker执行完”,解决了bug,却牺牲了随意中断的能力。下一步我要做一个稳定的手机端client,贵哥建议我使用微信小程序。它使用js编程,有点像网页。但由于我刚从py的顺序结构程序转过来,对js的事件驱动还不太适应。

7/24 我做了“机器人小程序”,通过使用图灵机器人的API实现了自动聊天功能。对小程序有了了解,我计划用py搭建一个服务器,使用http协议进行交互,搞了一晚上,最后发现http POST的方式只能一来一回,而这不符合XiaoHu的工作方式,只好把搭建好的服务器放弃了。我计划使用socket将服务器与客户端进行连接,达成一来多回的目的。

7/25 我计划采用socket.io这一个已经充分封装好的websocket模块来通信。搞了一下午才找到合适的服务器,从django和flask中还是选了flask,最终使用flask-socketio,python-socketio和js-socketio分别是服务器和两个客户端,用js脚本先模仿微信小程序,指令从js端发出,通过服务器接收,由于服务器由python编写,所以可以直接与XiaoHu源程序沟通,源程序调用py客户端的send()方法,将反馈发给服务器,再由服务器转发给前端。

7/27 上午11点就来到了10space,打算今天搞定小程序。到了之后就立刻开始wxsocketio的安装,却发现小程序的socketio无法与python的服务器和客户端建立连接。无奈之下听从贵哥的建议,使用node.js搭建服务器。下午搭建好了后发现可以与微信连接,却不能与py客户端连接。同时因为没有了python的服务器,XiaoHu主程序无法获取到指令。我的第一个方法是使用js的cmd模块模拟win命令行调用XIaoHu主程序,再获取程序所有的stdout。这种方法可以处理简单的指令,但如果程序给的是“非一次性反馈”的话,它也会把所有的反馈凑在一起发给微信,这严重影响用户体验。而且由于主程序没有连续运行,XiaoHu的上下文记忆功能受限,由于它的内置播放器是一个相对独立的进程,如果主进程被迫“死掉”,播放器就会成为“僵尸进程”,不能关闭。我又想到给py客户端添加接收功能,让它从服务器获取到指令信息。但另一个问题是这时的py客户端由于不知名的原因,还无法与服务器进行连接。我上谷歌查了这种报错的解决方案,github上说这个python-socketio库早就停了更新,要使用另一个库。我安装了那另外一个库,问题解决了。好不容易建立了通信,这时我又发现服务器又不能向客户端发信息了。起初我以为是某个客户端出了问题,但是经过排查发现都工作得很好。此时已快九点了。接了爸妈电话后又突然有了灵感,因为在25号的server-client模型中,每个发送操作都是需要广播的,我想了一下,觉得客户端的发送不需要广播,反而是服务器需要用广播把消息发给所有客户端,于是我加了broadcast,一切正常了!到家,做了内网穿透,使得手机端小程序也可以参与通信。还修复了一些的bug。

————XiaoHu.ai Education 代号EDU————

 

10/5 开学后,XiaoHu转型智能教室的构想逐渐成熟,docx设计计划落地,前端设计草图落地。

11/19 开始着手开发前端系统12/5 前端的HTML搭建基本完成,还剩下最大的一个问题是“div内换行问题”,我要让我的文字在气泡(承载了图片的div)里换行,可是html内一个换行比我的气泡都大,我用Line-height调整,又导致网页的布局乱了,下周咨询一下老师。

12/10 今天问了毛老师,他在div里加了一个p,用p把文字套起来后把line-height放在p里,成功了。好像是说line-height如果放在div内就会影响div的位置,放在p里文字的位置就会受限于div。前端设计完成了,开始搞网络通信,使用XiaoHuEVO的server,client1,client2框架,因为有先前的经验积累所以代码移植过来后测试一次成功,周三把通信整个搞好。

12/13 今天把原EVO里的代码都移了过来,去除了一些不会被用到的功能,完善了通信系统,可又遇到了新问题:即使这些python文件都放在一个目录下,却无法正常的互相引用。这是一个很奇怪的问题,因为在EVO的目录下他们就可以正常引用。

12/15 今天查了一下import的相对引用和绝对引用,有了一些想法。我在根目录下建立一个__init__.py,让目录成为一个大模块,让其余的py文件都成为它的子模块,引用时通过母模块调用子模块,问题就解决了,这更类似于相对引用。我想了一下具体的用户场景,觉得网页在老师的手机上是不太方便操控的,而且绝不是最好的交互方式。而微信小程序也受限于其极短的生命周期不能作为前端。最后我选定了服务号,服务号在以前也作为小虎前端搞过,当时用的是itchatmp。现在我再搜索Python服务号解决方案时已经多了很多新的库,这才五个月啊。

12/16 我的第一个选择是使用wechatpy搭配一个wsgi使用,功能还不错但是不知道为什么我一引用XiaoHu其他的py文件就会无法引用,这 样自然是无法使用的。还有一个选择是django,明天试试。

12/17 django有些繁琐且多余文件太多,在查找其他可行解决方式时我看到了werobot,一个非常精简实用的python微信公众号库,测试也是一遍过。但是我引用XiaoHu的brain后就发现它卡住不能运行了。经过一番“print”断点调试后我排除了werobot自身的问题。并把目光锁定在了brain自身引用的一堆XiaoHu内部脚本上,我轮流添加了断点,最终发现了问题所在:brain引用了socket.py,这个socket本来是在之前的server-client架构里使用的,现在已经不用了,而它的代码里有一行向服务器申请连接的代码"socket_send = SocketIO('127.0.0.1', 3000)" 然而我连服务器都没有运行,它自然会陷入无限的重连中。我还没有把这行放在"if name == main"中。我注释掉了这行代码,问题迎刃而解。然而在测试中我又发现它虽然可以接受消息并传给brain,却没有向用户返回消息。这肯定是brain的问题。我专门有一个reply变量存储brain作出操作的返回值,而在每次操作后reply被赋值前会有一个speak方法,用来让XiaoHu说出操作反馈。我把speak注释掉,发现它成功的返回了返回值。现在我知道是speak堵塞的问题,我试着不运行robot,直接在brain里通过输入给出命令,不使用werobot的时候就可以说话没有堵塞。这就成了问题:我要使用werobot,又要让它语音说出结果。到家后想出了解决办法:把speak函数放到控制声音的audio.py里面,然后使用socket连接brain和audio,brain要想要说话,就要发信息给audio,audio再播放。他们是两个进程,就不会再有进程堵塞了。这个结构颇像由神经连起来的大脑和嘴巴。反正XiaoHu的brain以后会放在全天候运转的服务器上,是肯定要和控制教室电脑客户端声音的audio分开的。这样就完美解决了问题。服务号开发基本完成了(只用了三天),我 把XiaoHu的聊天功能开放给了同学们,于是整个晚上它都在说话,不得不说它还是很幽默的。

12/19 今天获得了学校服务器的权限,我试着把XiaoHu服务器程序在服务器上运行起来,费了好大力气把依赖库安装好,结果发现程序老是卡住,不知道为什么。python自带的ide实在麻烦。

12/23 完善了人脸识别功能,全面换装了百度v3版api,v3版本没有了m:n多人识别,枚举所有用户来进行1:n识别太慢,不可行。最后的方案是先 使用face_detect检测出图片里所有人脸,分别框出输出成临时文件,然后对于只有一张人脸的文件,识别与之对应的用户。百度给出的人脸 框太小了,导致识别身份时有时候会识别不出来,我强行增加了人脸框的大小,准确度就提高了。人脸模块基本实现了,下一步就是等物联 网部署后与摄像机的连接。

12/24 今天继续调试服务器,先是在服务器系统上安装了pycharm,用了这个ide后发现服务程序竟然可以运行了,十分神奇。于是用ngrok搞了个 内网穿透,绑定了微信服务号的服务器地址,XiaoHu就运行起来了。

“只要北大附的官网还能访问,小虎就永远存在。”

 

---------------------------------2 0 1 9----------------------------------------

2/1 之前想接入物联网时出了离奇的bug,使得我的程序始终不能和网关建立连接,后来改了一下config,成功把网关又接入了XiaoHu,物联网部 分没有什么技术问题了。

2/5 修复了之前一直很苦恼的socket通信问题,原来是服务器的问题,服务器的脚本里应该填自身ip而不是127.0.0.1,怪不得本机调试没有问题,一用远程服务器就不行了,现在通信的bug也解决了。

2/6 今天,是XiaoHu一周年,但是要鸽了。

2/7~3-26 假期里订购的摄像头到货,调试过程却不是很顺利,照着网上的hack教程做但是没有起色,问了老师,也同样无果。开学以来就一直在搞 服务器端和客户端的连接问题,从学校服务器搞内网穿透,但是只能穿透一个端口,我需要80和3000。后来换了一个外网服务器,但是延迟太 高。在何天阳的帮助下借用了他的服务器,一度好使,不过由于他的一次事故导致原先的服务器坏掉,换了新的,却不好使了,微信服务器验证 总是失败,我一度怀疑werobot的token验证问题,并想换成php进行验证。卡了很久,小虎的服务处于半宕机状态。

3/27 放学后,我回阅览室去找耳机,恰好碰上何天阳,跟他说了这个问题,他说是不是防火墙问题,因为他之前也在这个服务器上有这种情况,在 防火墙上打开那个端口就好了,我回去打开了80,php脚本就可以运行了。后来我想会不会python的验证也是这种问题,一试,果然如此。依 次把80和3000端口打开,小虎复活了。

4/4 小虎现在还存在一个问题,那就是会有“答非所问”的情况,有时会把上个问题的答案放到下个问题去回答,而上个问题就没有了回应,这在同时收到多个问题的情况下更易出现,。我分析了一下,我认为这种问题是由于第一个问题的答案被“堵塞”到了下一个问题,“堵塞”的原因则 是因为我给它设置的严苛的超时限制,超时限制是0.05s,50ms,这个时限是我在试图增加它效率时给添加的,这对于它尚不稳定的服务来说未 免太短了。我把时限增加到了0.5s,同时为了使它能够应付“连串问题”的情况,而不是收到多个问题后,哪个答案先返回就先说哪个,我在它 的数据包里增加了一个token,token基于当前时间,进行md5加密,可以保证没有重复。这样第一个问题在接收到正确token后才会回复答案。 这保证了回复的顺序。

4/7 小虎在上个周末的服务很不稳定,重新调试了服务器,同步了两端的文件,在pyclient上增加了断线自动重连的设定。增加聊天记录储存,增加 以userid+timestamp的md5加密。

4/9 得到了希悦的clientid和clientsecret,这样就可以用他的rest api,用request库来发送get和post,post获取authkey很成功,但是用get获取课表信息就遇到了问题,他给的api地址里的末尾有一个/:id,我不知道这是干什么,原样放了进去就404,上网查了好久,没有结果,因为搜索引擎总是把我的/:这俩符号吃掉,最后受到一篇博客的启发,用id变量直接代替/:id,成功收到了返回,也是涨知识了,因为之前压根没有用过get这种,但这次是没有权限。

4/10 与希悦的工程师建立了微信沟通,他为我开放了权限,我也在他的指导下成功取得了返回,在通过学号查找获取数据库id的过程中,我发现即使 把学号作为参数传了上去,结果依旧是没有经过筛选的,后来得知要把id传到网页的后缀里,问题就解决了,结果只有查找到的一个学生。回家对 查课表的功能又做了一些拓展。

4/11 修复了小虎因聊天记录读写错误而造成服务停机的bug。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值