解决方案|科普 | 从解决方案到底层实现:你的手机是这样进行睡眠监测的( 五 )


当你把手机放在床头柜而不是床上时 , 发现最终识别效果并不是很理想 , 就说明此应用没有使用其他传感器的数据来辅助分析 。
Sleep as Android
在鼾声、梦话和呼吸频率的监测中 , 麦克风等声学元器件就起到了至关重要的作用 。 深夜的卧室里 , 环境一般都很安静 , 背景噪音是非常少的 , 所以声音数据的采集就比较有用处了 。 但考虑到功耗和存储限制 , App 一般不会整晚录音 , 那样生成的文件太大 , 也不便于分析 , 而是对分贝进行测量 , 大于设定阈值才会写入文件 。
Sleep as Android 的简介中提到了用声纳原理来监测身体在呼吸时的起伏 , 这样就可以避免使用加速度传感器 。 类似的原理在渔业和军事上早已广泛运用 , 很多定位设备都会通过发射声波信号和接收反射信号来判断目标位移 。
在我曾参与过的睡眠功能的开发中 , 并没有使用这个方法 , 当时主要是考虑到不同用户的睡眠环境、个体差异太大 , 且对设备的摆放位置要求较高 , 最终会导致训练难度加大 。 由于 Sleep as Android 并非开源软件 , 因此它这个声纳运用的有效性不太好验证 。
通过系统 API 监测睡眠行为
上面讲到的方案是开发者自己采集传感器的原始数据来进行睡眠分析 , 但随着这一需求的增多和相关训练模型的成熟 , Google 开始把睡眠监测整合成 API 加入到 GMS(谷歌移动服务)的服务框架中 。
这些 API 相当于对各种传感器原始数据采集的方法做了二次封装 , 并且还内置了监测识别的模型 , 开发者无需再关心睡眠监测应该如何去采集数据、如何去训练了 。 Google 现在帮你做好了 , 你只需要调用 API , 简单地处理结果事件即可 。
从Sleep API官方文档来看 , 使用方式非常简单:

To get started, do the following:
  • Target Android 10 (API level 29) or higher.
  • Request the ACTIVITY_RECOGNITION permission.
  • Register for updates to the user's sleep behavior, including sleep segments and sleep event classification results, by calling requestSleepSegmentUpdates.
只要设备基于 Android 10 及以上 , 声明并请求行为识别专属权限 , 再调用相应的方法即可获取睡眠事件 , 这些事件都是 GMS 在框架中已经识别分析之后的结果 , 开发者只需要关心自己的产品业务逻辑即可 。
其中最重要且仅有的两个睡眠事件有必要介绍一下: 和。
SleepSegmentEvent 顾名思义就是睡眠片段事件 , 其中包含了用户每一段睡眠的关键信息:
关键方法说明系统检测到用户停止睡眠并苏醒的时间 用户这段睡眠的持续时间(原文档特别提示到based on the device sensor data) 用户开始入睡的时间 事件状态 , 有数据缺失、无法检测和成功三种 , 第一种一般是数据采集不足导致的 , 第二种是识别结果置信度不够导致

推荐阅读