Skip to main content

Sleep Cycle SDK - Android 文档

概览

Sleep Cycle SDK for Android 让开发者能够将先进的睡眠分析能力集成到他们的应用中。SDK 通过音频和运动传感器提供实时睡眠追踪,并在整夜过程中生成详细的睡眠洞察和事件。

系统要求

最低 Android API 级别:
  • Min SDK:API level 28(Android 9.0 Pie)
  • Compile SDK:API level 35
Kotlin:
  • Kotlin 版本:1.9+(JVM target 11)
  • SDK 使用 Kotlin 编写,并提供 Kotlin 优先的 API

安装

可以在 Maven Central 上找到最新版本

Groovy DSL

将 Sleep Cycle SDK 依赖添加到您的 build.gradle

Kotlin DSL

将 Sleep Cycle SDK 依赖添加到您的 build.gradle.kts

前置条件

权限

SDK 需要麦克风权限以进行基于音频的睡眠分析:
SDK 在其清单文件中自动包含 WAKE_LOCK 权限,以便在分析期间保持设备唤醒:

使用前台服务保持分析处于活动状态

要确保整夜持续进行睡眠分析,您必须实现一个前台服务。这样可以防止 Android 在长时间运行期间终止分析进程。 正确启动前台服务由宿主应用负责。该服务必须在其清单中声明合适的前台服务类型,以指定它需要访问的系统资源。对于睡眠分析,您通常需要 healthmicrophone 服务类型,分别授予对健康传感器和麦克风的访问权限。

通用说明

SDK 是线程安全的,可以从任意线程调用。

初始化 SDK

SDK 在使用前需要进行身份验证。初始化过程会校验您的凭证并确定可用的功能。
返回的 SleepAnalysisFeatures 表示您的 API 密钥可用的能力:
sleepStaging Boolean - 睡眠分期分析
smartAlarm Boolean - 智能闹钟功能
audioEvents Boolean - 音频事件检测
snoringDetection Boolean - 鼾声检测
realTimeSleepStaging Boolean - 实时睡眠分期
multiChannelAnalysis Boolean - 多声道分析(立体声,两个声道)
extendedAudioEvents Boolean - 标准集之外的扩展音频事件类型

获取 SDK 状态

通过 StateFlow 监听 SDK 状态的变化:
获取当前状态:

启动睡眠分析会话

初始化完成后,即可启动一次睡眠分析会话。该方法返回标识本次会话的 UUID
参数:
config SleepAnalysisConfig - 用于指定使用哪些传感器的配置对象
startMillisUtc Long - 分析的起始时间(UTC 毫秒,默认为当前时间)
dataSource DataSource? - 可选的自定义数据源;为 null 时,SDK 使用设备实时传感器
audioEventListeners List<AudioEventListener> - 可选监听器列表,在音频分析过程中接收回调

恢复会话

SDK 支持恢复先前启动的分析会话。当应用重启或前台服务被系统终止时,这一功能很有用。

停止会话

要停止当前的分析会话并获取结果:

分析结果

AnalysisResult 包含一次睡眠分析会话的完整输出:
sessionId UUID - 唯一会话标识符
startSecondsUtc Double - 会话起始时间(UTC 秒)
endSecondsUtc Double - 会话结束时间(UTC 秒)
timeZoneId String - 会话开始时捕获的 IANA 时区(例如 “Europe/Stockholm”)
events List<Event> - 检测到的睡眠事件
breathingRates List<BreathingRate> - 呼吸频率测量值
sleepStageIntervals List<SleepStageInterval> - 睡眠阶段数据
realTimeSleepStageIntervals List<SleepStageInterval> - 会话期间实时发出的睡眠分期
statistics SleepStatistics? - 聚合的睡眠统计(可空)
audioStatistics AudioStatistics? - 音频运行状况统计(可空)

SleepStatistics

当存在时,statistics 包含本次睡眠会话的聚合指标:
totalSleepDurationSeconds Double - 总睡眠时长
sleepOnsetLatencySeconds Double? - 入睡所用时间
sleepEfficiency Double - 睡眠时长与在床时长的比值(0.0 到 1.0)
finalWakeTimeSecondsUtc Double? - 最终醒来时间(UTC 秒)
numberOfAwakenings Int - 整夜的醒来次数
snoreTimeSeconds Double - 鼾声总时长
snoreSessions List<SnoreSession> - 单次鼾声会话
sleepStageDurationsSeconds Map<SleepStage, Double> - 每个睡眠阶段的时长

AudioStatistics

当存在时,audioStatistics 包含整个会话期间音频输入运行状况的相关信息。

睡眠评分

会话完成后,您可以使用 SleepScoring.compute() 计算当晚的睡眠评分。该评分将当晚的结果与最近几晚的简短历史记录结合起来。
每个 SleepScore 字段的取值范围为 0.0–1.0,数值越高越好:
total Float - 当晚的总体睡眠评分
duration Float - 用户的睡眠时长
quality Float - 用户的睡眠质量
routine Float - 用户的睡眠作息
SleepScoring.identifyChronoType(history) 根据最近的历史记录推导用户的 ChronoTypeEXTREME_MORNINGMORNINGINTERMEDIATEEVENINGEXTREME_EVENING),数据不足时返回 null。其结果可作为 chronoType 参数传回 compute()

实时事件

SDK 在分析过程中通过 Flow API 提供实时事件更新:
当您的 API 密钥启用了 extendedAudioEvents 功能时,会在标准事件之外同时报告额外的 EventType 值:BIRDCATDIGESTIVEDOGFARTMUSICSNEEZETHROAT_CLEARINGTRAFFICWATERWIND 每个 Event 包含:
type EventType - 事件类型
startTime Double - 起始时间戳(UTC 秒)
endTime Double - 结束时间戳(UTC 秒)
probability Float - 置信度分数(0.0 到 1.0)
source EventSource - 检测来源
sessionId UUID - 该事件所属的会话
signature FloatArray? - 可选特征向量(用于鼾声事件)

实时呼吸频率

SDK 在分析过程中提供实时呼吸频率测量:
每个 BreathingRate 包含:
timestampSecondsUtc Double - 测量时间(自 Unix 纪元起的秒数)
bpm Float - 呼吸频率(每分钟呼吸次数)
confidence Float - 测量的置信度(0.0 到 1.0)
sessionId UUID - 该测量所属的会话

实时睡眠分期(实验性)

此功能为实验性功能,未来版本中可能会发生变更。API 和行为可能在未通知的情况下被修改。
SDK 可在分析过程中提供实时睡眠阶段预测。此功能要求您的 API 密钥启用了 realTimeSleepStaging 功能。
该 Flow 在分析过程中大约每 30 秒发出一个 SleepStageInterval 对象,从而以接近实时的方式反馈睡眠状态的转换。

实时音频运行状况

SDK 在分析期间监测音频输入的运行状况,并在状态变化时发出更新:
AudioHealthStatus 取值:
HEALTHY - 音频输入包含有变化的信号
FLATLINE - 检测到恒定值(麦克风失效或输入静音)
MISSING_INPUT - 较长时间内未收到任何音频输入

智能闹钟

智能闹钟在唤醒时段内监测身体活动,并在用户处于浅睡眠阶段时发出事件,从而让您在最佳时机唤醒用户。这需要为您的 API 密钥启用 smartAlarm 功能,且仅在主声道上支持。 使用 SmartAlarmConfig 配置唤醒时段,并在开始分析时传入:
通过 smartAlarmFlow 观察闹钟生命周期事件:
smartAlarmConfig 参数在 startMultiChannelAnalysis() 上同样可用。

事件签名

对于鼾声事件,Event.signature 属性包含一个 16 维特征向量,表示所检测到鼾声的独特特征。来自同一人的鼾声事件在签名空间中彼此聚集,因此可以按人对事件进行聚类。

音频事件监听器

AudioEventListener 接口允许您在会话过程中接收实时的音频分析更新。实现该接口可在分析进行时访问原始音频样本、事件检测以及音量信息。
audioSamples 参数顺序包含所有已处理的音频数据,批次之间没有间隙或重叠。每个批次都从前一个批次结束的位置精确接续,从而对所有分析过的音频实现完整覆盖。 audioProbability 参数提供所分析时间窗口内每种 EventType 的每批次概率。dbSpl 参数提供批次中每个时间帧以 dB SPL 表示的 A 计权声音音量。

音频片段

当检测到特定的睡眠事件(例如鼾声、梦话或咳嗽)时,SDK 可以捕获短音频录音。 要使用音频片段,需创建一个音频片段生成器,并将其传入 startAnalysis
每个 AudioClip 包含:
startTime Double - 起始时间戳(秒)
type EventType - 触发本次捕获的事件类型
samples FloatArray - 原始音频样本
sampleRate Int - 采样率(Hz)
sessionId UUID - 该片段所属的会话

多声道分析

SDK 支持使用立体声音频源同时分析两个声道。多声道分析将数据源生命周期与各个会话生命周期分离,使您可以独立启动和停止每个声道上的会话。 立体声流应来自两个独立的单声道麦克风,每个麦克风占用一个声道,再合并为单个立体声流。 此功能要求您的 API 密钥启用了 multiChannelAnalysis 功能。

声道分离

使用立体声输入时,ChannelSeparationConfig 控制如何将音频事件分配到各个声道。内置预设:
  • BED_SIDE_MICS — 分离放置的床头麦克风(默认值)
  • CENTERED_MIC_ARRAY — 间距很近的麦克风阵列
  • DETECTION_STRENGTH_ONLY — 不进行空间过滤,仅依据检测置信度
所有参数(麦克风间距、模糊区、置信度阈值、各事件类型设置)都可以单独调节,以适配您的具体硬件配置和使用场景。

数据源生命周期

在启动各个会话之前,使用立体声音频配置启动数据源:

在每个声道上启动会话

数据源运行后,在每个声道上启动一个会话:
AnalysisChannel 取值:
PRIMARY - 第一个音频声道(或单声道)
SECONDARY - 立体声中的第二个音频声道

独立停止各个会话

每个会话都可以独立停止以获取其结果:

停止数据源

所有会话都已停止后,再停止数据源:
如果在仍有会话处于活动状态时调用 stopDataSource(),会强制停止这些会话并丢弃其结果。要保留结果,请先停止每个会话。