睡觉是每一个人与生俱来的技能,但却没人能十分自信地说了解自己的睡眠状况,所以我们需要比较专业的手段来进行睡眠监测。
需要留宿于医院一个晚上,做为期6-8小时的睡眠记录,而且需要全程配有专业睡眠检查的人员或医生。因此如果对于自己的睡眠有所疑问,可以洽询耳鼻喉科、胸腔内科、精神病学的医生以及睡眠技师(呼吸治疗师)等。
睡眠监测有何用处呢?
市面上也有很多商家专门贩卖睡眠监测仪之类的消费级设备(某些有点智商税的感觉),相比医院的医疗级设备肯定是差了不少,个人认为借助移动端的睡眠监测来知晓简况就已经足够。
Apple在健康App的开发上面应该是起步最早的,产品功能都已经非常成熟了。在早期的iOS13及以前版本,健康和时钟App就有联动的功能,在时钟上使用「就寝」,可以追踪用户的睡眠时长。
只需设置希望的每夜睡眠时长,「时钟」应用便可提醒您就寝,并通过播放闹钟来唤醒您。
从最新官方海报来看,睡眠并没有作为重点功能介绍,但其依然是小米健康App的主要功能模块之一,除此之外,还有运动、心率、经期、健身课程等模块。这里的心率是一个单独的模块,并没有作为睡眠监测的依赖数据。
小米健康的睡眠模块基本与Apple的睡眠类似,比较有特色的是深浅睡和鼾声梦话记录,可以回放自己的梦话音频。作为系统应用,不管是交互还是功能本身,从我的实际使用体验来看,要优于国内大多数同类竞品,小米的产品定位或多或少有一些可玩性。
除了睡眠监测分析等基本功能外,锦上添花的配套服务也比较丰富,例如白噪音、冥想等,属实是抢了不少三方应用的用户。
由于个人近几年对华为产品体验比较少,此处就点到为止了。
仍然需要重点说明的是,手机厂商有一个很大的优势便是硬件,尤其是在传感器数据采集、穿戴设备的生态建设等方面,定制化地的集成研发都比三方应用只在数据层玩得开。
市面上有很多成熟的睡眠类App,聊聊我最近发现的SleepasAndroid这款应用,从应用配置清单(manifest)来看,就很可能利用了Google最新开放的SleepAPI,再结合自己的机器学习模型来实现睡眠监测。其功能丰富程度可以说是睡眠类应用的标准模板了。
深浅睡和快速眼动(REM)这些基本数据都会有。入睡前有催眠曲,叫醒时会使用闹钟提醒起床,并且必须通过某些小测验才能解锁并停止闹钟,以证明你真的清醒了。当然,这对那些梦里都能操作的人来说,或许……没什么用。
下面就是重点了,我们从软件到硬件层面聊一下睡眠监测的技术实现方式和原理。
不管是系统应用还是三方应用,其实应用软件本身在原始数据采集这一步能做的事情并不是很多,重点还是在数据的二次加工及使用上。比如Apple和国内Android厂商的系统级健康App,其数据采集方式都是差不多的。
在手机设备上,它们无非是通过加速度传感器、光学传感器、扬声器/麦克风等元器件记录设备整晚的位移变化、光强度变化、声音变化信息,这些数据有分散也有连贯的。一些较为特殊的指标比如心率、血氧等,就依赖手表等穿戴设备来获取。
简单地讲,加速度传感器的数据源是最为重要的,它往往作为睡眠类App的主要训练分析对象,其他数据源作为辅助优化训练结果。我之前在使用小米健康的时候,它就会请求身体运动信息等类似权限,并告诉你尽量放在枕边,保证你自己和手机睡在同一张床上,以此来监测你入眠后翻身、扭头等动作带来的振动,作为深浅睡的识别依据。
例如,对Android应用开发者来说,监听部分传感器的数据实现起来也非常简单,系统底层框架已经屏蔽了不同手机设备的硬件差异。
在鼾声、梦话和呼吸频率的监测中,麦克风等声学元器件就起到了至关重要的作用。深夜的卧室里,环境一般都很安静,背景噪音是非常少的,所以声音数据的采集就比较有用处了。但考虑到功耗和存储限制,App一般不会整晚录音,那样生成的文件太大,也不便于分析,而是对分贝进行测量,大于设定阈值才会写入文件。
SleepasAndroid的简介中提到了用声纳原理来监测身体在呼吸时的起伏,这样就可以避免使用加速度传感器。类似的原理在渔业和军事上早已广泛运用,很多定位设备都会通过发射声波信号和接收反射信号来判断目标位移。
在我曾参与过的睡眠功能的开发中,并没有使用这个方法,当时主要是考虑到不同用户的睡眠环境、个体差异太大,且对设备的摆放位置要求较高,最终会导致训练难度加大。由于SleepasAndroid并非开源软件,因此它这个声纳运用的有效性不太好验证。
这些API相当于对各种传感器原始数据采集的方法做了二次封装,并且还内置了监测识别的模型,开发者无需再关心睡眠监测应该如何去采集数据、如何去训练了。Google现在帮你做好了,你只需要调用API,简单地处理结果事件即可。
从SleepAPI官方文档来看,使用方式非常简单:
Togetstarted,dothefollowing:
SleepSegmentEvent顾名思义就是睡眠片段事件,其中包含了用户每一段睡眠的关键信息:
而SleepClassifyEvent,便是睡眠识别分类事件,包含了睡眠识别的置信度和传感器数据等信息,且此事件回调周期是固定间隔10分钟:
有了这些方法,睡眠类App开发的门槛大幅降低,大概是一件好事吧。当然,这就相当于完全信任Google的模型,且依赖GMS框架,国内恐怕不好普及。
由于GMS的闭源特性,成熟的商业App肯定不会只使用Google的SleepAPI,更多是以此来辅助自己的算法,用户体验到的会是优化后的融合效果。例如我们前面提到的SleepasAndroid,设置选项中就有是否使用Google睡眠API的选项(默认打开),说明当你关闭的时候,它有自己的备选方案来兜底。
相比三方应用开发者,手机厂商的巨大优势就是硬件,这里说的硬件不仅仅是区别于手机的穿戴设备那么简单,而是指手机、手表等设备内部的芯片、传感器。
上层软件开发者在睡眠监测这个功能上有两个主要劣势:
针对上述2个缺点,对应聊一聊厂商的系统应用是如何解决的。
任何某个单一传感器都是无法满足监测识别任务的,厂商可以开发专属的传感器,来采集其他基本传感器的数据,融合成新的传感器事件(event)。这个专属传感器可以是真实元件,成本较高;也可是模拟的,一般在系统的硬件抽象层(HAL)做模拟。
最后对于上层的系统应用(SystemApps)来说,就是多了一个可以监听的Sensor类型而已。
融合传感器可以避免上层应用同时监听多个传感器,大大降低功耗。很多人可能会有疑问:融合的数据不也是在底层同时采集了多个其他传感器吗?
确实是,但是它减少了从底层到上层一系列的框架调用,底层硬件的耗电其实远小于软件层面的CPU消耗电量。
有了融合传感器之后,我们可以进一步把一些较为固定的业务逻辑和算法模型下沉到系统底层,让专用的处理单元(比如DSP、TPU等)去做计算工作,最后直接把识别的结果传递给上层应用即可,传递数据之前的整个过程中都不需要唤醒上层的应用进程,应用层只需要在接收结果后稍作修饰,再做纯业务展示即可。
其实Google很早就在AOSP中沉淀研发算法下沉的框架,并被命名为CHRE(ContextHubRuntimeEnvironment):
ContextHub运行时环境(CHRE)为在低功耗处理器上运行应用程序提供了一个通用平台,具有简单、标准化、嵌入式友好的API。CHRE使设备OEM及其可信赖的合作伙伴可以轻松地从AP卸载处理,节省电池并改善用户体验的各个领域,并启用一类永远在线的上下文感知功能,尤其是那些涉及机器应用程序的功能学习环境感知。
简单地讲,CHRE在硬件抽象层(HAL)和AndroidFramework层分别提供了一套API,屏蔽各硬件平台的差异,为传感器的开发者提供了更加统一和方便的使用硬件能力的方式。
高通在这方面也有自己的技术方案,由于只给合作厂商提供具体文档,并不开源。
这一系列做法可以极大地降低设备功耗。这就是为什么某些厂商可以自信地宣称系统内置运动健康类App的各种活动识别全天耗电在1%以内。
睡眠监测越来越得到各家健康App的重视,虽然三方和厂商在基础能力上有先天差距,但随着技术的成熟,厂商为了建立自己的生态,也愿意开放能力出来给大家使用。降低行业总体成本的同时,未来角逐的更多还是产品体验。