2016年终总结

工作方面

机器人语音

非接触连续语音识别

手机上的语音识别一般是这样的:用户按下一个按钮后说话,话说完松开按钮,然后讯飞(语音识
别、语义理解技术 云端服务提供商)返回识别结果。这在机器人上是不适用的,因为用户不可能按下机
器人上的一个按钮才能说话。

设计出一种简单高效的 VAD(语音端点检测,实现智能断句)算法,能够实时分析麦克风传来的音
频数据,检测到用户开始说话时将音频数据交给讯飞识别,检测到用户停止说话就通知讯飞识别结束,
并获取识别结果,整个过程是实时的(延迟不到 1 秒)。

将近 1 秒的延迟是为了抗噪而引入的,因为 VAD 算法是通过计算音频数据的音量来实现检测的,当
环境中有突发噪声(比如打雷、鞭炮)时,音频数据的音量值会激增,导致误检。算法维护 5 个音频数
据缓冲区,当有 3 个以上为高音量时,才认为有人说话,有效减少了误检。

目前该算法在佩戴麦克风的情况下工作稳定正常。

离线语音识别

机器人需要在断网时也能识别常用语音命令,于是研究讯飞的离线语音识别 SDK(软件开发工具
包),PC 版经测试能正常使用,但 Android 版不行。

因为 Android 版即使用讯飞官方的 Demo 工程,也有问题,报错:“语法网络构建失败”,我在尽力
调试使讯飞报“语法网络构建成功”后,相应文件夹下却并没有生成语法网络文件,遂放弃。

离线语音识别还不可用。

远场语音识别场景下的降噪

通过麦克风与机器人交互太不方便,市面上讯飞推出了麦克风阵列技术来实现远距离语音识别(远
场识别),能让用户站在 5 米以外与机器人对话,这就对 VAD 算法的降噪能力提出了更高的要求。

阅读大量 VAD 领域论文,发现 LTSD 算法是较好的方案,不用训练就能自动消除背景噪声、回声,
而且对周围嘈杂的人声干扰也有显著抵抗性,使用 JNI 技术将其集成到 Android 平台,经实测发现,抗
噪效果是很好,但同时将正常的人声也抑制了,导致实际有效识别距离缩短到 1 米左右。

目前远场语音识别因为 VAD 算法的原因还不实用,待改进。

机器人 App

ROS 集成

ROS(机器人操作系统)是一个分布式通信程序库,有很多编程语言接口,如 C++、 Python、
Java 等,我们机器人的底盘就用的 ROS 系统。

机器人需要一块屏幕来向用户显示信息,而且底盘上运行的任务太多也需要分一部分出去,于是项
目决定将语音系统挪到 Android 平板上,平板跟底盘通过 ROS 消息 通信。

由于 Android 是基于 Java 的,所以平板要与底盘通信,必须使用 ROS 的 Java 接口,而该接口还不
成熟稳定,于是从源码编译生成程序库,并运行起来。

目前 Java 版 ROS 在各 App 项目上运行正常。

RosBridge 预研

Java 版 ROS 虽然能用,但由于其构建系统太过复杂,无法将其做成一个程序库,放到我们自己的
工程里使用,目前机器人平板上所有 App 都是将我们自己的代码寄生到 Java 版 ROS 里构建的,非常不
便。

发现有个通信协议叫 RosBridge,顾名思义,它为 非 ROS 系统 访问 ROS 系统 提供了桥梁,我寻
找到该协议的一个 Java 程序库 RosBridgeClient,集成过程中发现该库无法发送多数常见 ROS 消息,
深入阅读代码后解决该问题。

目前 RosBridgeClient 已经在小工程上测试通过,待集成到大工程。

语音系统集成

Android 获取音频数据跟 PC 不一样,首先格式是字节流,而不是 16bit 短整型;其次音频缓冲区长
度在不同设备上是可变的,而不是固定的。

编写音频数据获取代码,实现上述目标:将字节流转换成 16bit 短整型,注意将低字节清除符号位后
再与高字节执行按位或运算;维护一个环形缓冲区,不论实际 Android 设备的缓冲区多大,都能一字不
漏的捕获。

目前该音频收集算法在不同安卓设备上工作正常。

对话 App 架构设计

以点餐为切入点,与相关人员探讨完整流程,设计出一种基于状态机的方案,每个界面代表系统所
处的状态,系统根据语音输入在不同状态间跳转(即在不同界面间跳转)。

上述架构可以确保系统对用户每个输入都同步响应。

对话 App 性能优化

最初 App 每个界面都是基于 Activity 实现的,Activity 之间通过 Intent 互相跳转,Intent 又慢又不
便于传递某些特殊类型的数据,随着界面增多,需要优化 App 内的通信机制。

使用 Fragment 替代 Activity 做界面,由于 Fragment 和 Activity 属于统一线程,二者通信通过简
单的对象方法调用即可实现,大大简化了通信。因为 Fragment 不像 Activity 那样有 Android 系统来管理界面可见性,需要开发人员自己来管理。

所以我们在宿主 Activity 里构造一个栈,每个 Fragment 启动时压入栈顶,停止时从栈顶弹出,这样任
何时候的可见界面就是当前栈顶的 Fragment,宿主 Activity 可向它发送消息。

优化完毕后,界面响应速度大大提高,且代码量减少了上千行,结构更加清晰。

对话系统

对话系统,它负责理解用户说的话,执行相应的动作,并合成语音告知用户执行结果,是机器人的
大脑。

“理解用户说的话”指的是,目前使用 HanLP(一个能对汉语文本进行分词、并标注词性的程序库)
理解用户说话意思,并基于它设计简单的对话管理器,能查天气,命令底盘移动到指定位置等。

“执行相应动作”指的是,目前是在代码里实现的,将理解的意图对应到特定的函数,由函数执行相应
的动作,并同时合成预定告知用户执行结果。

目前该系统还比较简陋,扩展性较差。

多媒体答案格式

单纯的对话比较枯燥,设计出一套多媒体答案格式,机器人在回答用户提问时,不光能输出语音,
还能显示图片、播放视频,而且用户可以为每种媒体格式设置停顿时间,提高人机交互体验。

目前该多媒体功能在平板上自测通过。

视频监控平台

一个能实现手机远程监视、遥控机器人的云平台,手机上安装观看端 App,机器人上安装采集端
App,二者通过众云视频平台通信。

除了传输视频,我们还利用众云平台的命令通道,传输控制信息(比如行走、室内地图、机器人当
前位置、剩余电量等),实现手机遥控的效果。

目前该 App 大部分功能测试通过,持续扩展和完善中。

机器人云端系统

底盘 IP 自动配置系统

当新用户买了我们的机器人放到家里,怎么给机器人配置 WiFi 网络?平板相对容易,但底盘没有屏
幕和键盘,怎么输入 WiFi 密码?

设计了一个网络自动配置系统,底盘启动后先尝试连接 WiFi,若连接失败则将自己设置成一个
WiFi 热点,用户手机连上该热点后输入密码,底盘获取密码后重新将自己设置成普通 WiFi 设备,连上
用户 WiFi。连上用户 WiFi 后,机器人向云端上报自己的局域网 IP,这样平板就能从云端获取底盘 IP,
并连上底盘。

目前该系统在婷婷上测试通过。

App 自动升级系统

对话 App、采集端 App、观看端 App 均支持在线自动升级。

对话系统后台部分

实现用户自己输入对话内容,内容按场景区分,用户可以根据业务创建多个场景,每个场景的对话
内容都不一样。

对话的问题支持模糊匹配,即同一个意思可以有多种问法。

对话的答案支持随机选择,即同一个问题可以随机返回多个答案中的一个,例如用户问”你能给我讲
个笑话吗?“,机器人可以随机回复一个笑话。

目前该功能已完成并自测通过。

生活方面

考驾照

3月5号科目三第一次没过,先是听到前方会车没往右打方向,再是起步忘打左转向灯
3月26号科目三第二次过了
5月18号科目四顺利通过并拿到驾照

买车

五一买了卡罗拉2014款1.6高配
6月6号提车,当天就在加油站把前保险杠刮了-_-!
6月16号到车管所上牌,因为前保险杠有刮痕,不给上,浪费了一天。去4s点刮了重喷,6月20号再去,顺利上牌

其他

7月份我上家公司终于把拖欠的工资结清了,而我是1月份就从那里离开的-_-!
8月18号我们的婷婷发布,很有意义
9月份我北京的公积金终于转到陕西省了,从去年9月份开始办的,历时一年-_-!
10月份跟同事们参加了在北京举行的世界机器人大会,颇有收获

你可能感兴趣的:(生活杂记)