Lilt 产品设计蓝图 v1Lilt product blueprint — functions, data capture, library, journey, and how the research method becomes interaction
一个 App、两种模式:Settle(安定)用无旋律的自适应中性声音接住急性焦虑;Unwind(舒缓)用真歌的舒缓版陪你从一天里退出来。手表/戒指给出心率,App 静默地调整声音,结束后才把"比你平时更平静了多少"告诉你。每一次聆听同时是一次被测量的实验。
One app, two modes: Settle catches acute anxiety with melody-free adaptive neutral sound; Unwind eases you out of the day with calm arrangements of real songs. The watch or ring supplies heart rate, the app adapts the sound silently, and only afterwards tells you how much calmer you were than your usual. Every listen is also a measured experiment.
0. 一页总览The whole product on one page
1. 设计原则:人因工程与参考产品Design principles — human factors, and what we borrow from good apps
焦虑发作时注意力会收窄(Easterbrook 1959 的"线索利用"),工作记忆被占满(Sweller 认知负荷)。所以这个 App 的第一原则不是"功能多",而是在用户最不能思考的时刻,把决定降到零。下面每条原则都写明它约束了哪个界面。
Under acute anxiety attention narrows (Easterbrook's cue-utilisation) and working memory is full (Sweller's cognitive load). So the first principle is not feature count but zero decisions at the moment the user can least think. Each principle below names the screen it constrains.
| 原则 Principle | 依据 Basis | 落到界面 Where it lands |
|---|---|---|
| 一屏一个动作One primary action per screen | Hick 定律:选项数 ↑ → 决策时间 ↑;Nielsen "极简美学"Hick's law; Nielsen heuristic 8 | 首页只有 Settle / Unwind 两个大按钮(睡眠是 Settle 的定时器变体,不是第三个选项);会话页只有"结束"。Home has two hero buttons; Sleep is a timer variant of Settle, not a third choice; the session screen has only End. |
| 大目标、拇指区Big targets in the thumb zone | Fitts 定律;Apple HIG ≥ 44 pt;WCAG 2.2 目标尺寸Fitts's law; Apple HIG 44 pt; WCAG 2.2 target size | 主按钮 ≥ 64 pt 高、居屏幕下 1/3;"结束"永远在同一位置(识别优于回忆)。Hero buttons ≥ 64 pt tall in the lower third; End always in the same place (recognition over recall). |
| ≤ 3 次点击、≤ 10 秒出声Three taps, ten seconds to sound | TAM 易用性(问卷 E1);Endel 一键场景的先例TAM ease-of-use (survey E1); Endel's one-tap scenes | 首页 → 模式 → 开始;"上次的设置"一键重放;预休息 60 s 与出声并行(声音先起,测量后到)。Home → mode → start; "same as last time" replay; the 60-s pre-rest overlaps with sound starting. |
| 安静的技术:会话中不显示数字Calm technology — no numbers during Settle | Weiser & Brown 1996;焦点小组"实时数字 vs 事后结果";访谈 biometric.live_number_anxietyWeiser & Brown; FG probe "live number vs post-hoc"; interview code | Settle 会话页只有呼吸光场和一个"结束";心率在 Unwind 里可选显示,默认关;结果在会话后才出现。Settle shows only a breathing field and End; HR is optional in Unwind, off by default; results appear after. |
| 结果相对于"你自己的平时"Results relative to your own usual | METHODOLOGY §4.4 残差化;Oura "Readiness" 相对基线的先例Residualisation; Oura's baseline-relative Readiness | "比你平时 22:00 更平静 9 bpm",不给绝对分数、不与他人比较;前 14 天显示"正在学习你的基线 3/14"。"9 bpm calmer than your usual 22:00", never an absolute score or a comparison to others; first 14 days show "learning your baseline 3/14". |
| 诚实的测量Honest measurement | ML §3.2 质量指数 < 70% 剔除;§6 安全规则Quality index rule; safety rule | 信号质量徽章(好 / 一般 / 无法测量);质量差就说"这次没测准"而不给分数;HR > 130 或用户标记 panic → 只显示接地文字,不显示数字。Signal-quality badge; low quality says "couldn't measure reliably" instead of a number; HR > 130 or a panic tag shows grounding text only. |
| 渐进式同意、最小采集Progressive consent, data minimisation | ML §6 治理;GDPR 同意;HealthKit 条款Governance; GDPR consent; HealthKit terms | 先只要心率;HRV / 睡眠 / 动作各自一个开关,用到时再问;"哪些数据离开手机"一句话说清;一键导出 / 删除。Ask for HR first; separate toggles for HRV, sleep, motion, requested when needed; one sentence on what leaves the phone; export / delete. |
| 温暖、低亮度、无蓝光Warm, low-luminance, no blue | 睡前使用场景(问卷 B3 "in bed");WCAG 对比度 ≥ 4.5:1 仍须满足In-bed use (survey B3); WCAG contrast ≥ 4.5:1 still holds | App 内永远是单一暖色深夜世界(亚麻白字 / 琥珀色动作 / 炭褐底);青 / 珊瑚只用于会话后的数据语义;尊重系统"减少动态效果"。In-app is one warm dark world (linen text, amber action, charcoal-brown ground); teal / coral only as post-session data semantics; honours reduced motion. |
| 自主、胜任、不设内疚Autonomy, competence, no guilt | 自我决定理论(Deci & Ryan);避免暗黑模式Self-determination theory; no dark patterns | 不做"连续打卡断了"的惩罚;只说"你回来了";分享卡默认不带数字;14 天试用到期前 3 天提醒,一键取消(对照 Calm 的计费投诉)。No broken-streak guilt; share card carries no numbers by default; trial reminder 3 days before, one-tap cancel (Calm's billing complaints are the anti-pattern). |
| 手腕上的触觉呼吸Haptic breathing on the wrist | Apple Mindfulness 的先例;免视觉通道Apple Mindfulness precedent; eyes-free channel | 手表伴侣:一个呼吸光环 + 触觉节律(6 次/分钟)+ 结束;手机可以扣在桌上。Watch companion: breathing halo + haptic rhythm (6/min) + End; the phone can lie face-down. |
参考产品:借什么、避什么Reference apps — what to borrow, what to avoid
| 产品 | 借鉴 Borrow | 避免 Avoid |
|---|---|---|
| Endel | 一键场景;心率 + 时间 + 动作的实时适配;Apple Watch 年度 App 的手表原生体验One-tap scenes; live adaptation to HR + time + motion; watch-native | "昂贵的环境噪音"口碑与冷感界面;无结果反馈(用户不知道有没有用)"Expensive ambient noise" reputation, cold UI, no outcome feedback |
| Calm | 温暖插画式氛围;每日一个入口Warm atmosphere; one daily entry point | 内容目录过载;计费投诉(Trustpilot 1.4–1.8)Content overload; billing complaints |
| Oura | 相对基线的"Readiness"口径;第二天早晨的回顾;戒指数据的克制呈现Baseline-relative Readiness; next-morning review; restrained data | 数字过多引发"看分数焦虑"(焦点小组 biometric.live_number_anxiety)Score anxiety from too many numbers |
| Apple Mindfulness / Breathe | 手腕触觉呼吸;HKWorkoutSession 的心率流;无文字的呼吸动画Haptic breathing; HR stream via workout session; wordless animation | — |
| Brain.fm | 模式 + 定时器两步即开始Mode + timer, then start | "科学"话术过重(独立证据薄)Over-claiming science |
| 潮汐 Tide | 中文市场里温暖、场景化的视觉;睡眠定时淡出Warm scene-based visuals; sleep timer fade | 功能堆叠(冥想 + 专注 + 睡眠 + 日记)Feature stacking |
| Spotify / SoundCloud embeds | 演示阶段用官方嵌入播放真歌,零版权成本、零商用Official embeds for real songs in the demo: no licensing, non-commercial | 嵌入不能改音频,所以真歌层的"自适应"只能是选曲与切换(§6.2)Embeds cannot alter audio, so adaptation on the real-song layer is selection and sequencing only (§6.2) |
2. 系统架构图System architecture — sensors to sound to evidence
这张图把 ML_RESEARCH_DESIGN.md §5 的学习架构展开成产品部件。左边是数据从哪来,中间是手机上做什么,右边是声音怎么出、证据往哪去。粗线是每次会话必经的路径,虚线是离线 / 次日路径。
This expands the learning architecture in ML_RESEARCH_DESIGN.md §5 into product components: where data comes from (left), what the phone computes (middle), how sound is produced and where evidence goes (right). Solid lines run every session; dashed lines are offline or next-day.
3. 用户路径:从安装到听歌到反馈The user journey — from install through listening to feedback
横向滚动看 13 个阶段。每个阶段写明:用户做什么、采集什么数据、喂给哪个学术构念 / 信念 / 实验。高亮的是核心循环(7–11),用户每天走的就是这几步。
Scroll sideways through 13 stages. Each names what the user does, what data is captured, and which construct, belief or experiment it feeds. Highlighted stages (7–11) are the daily core loop.
← 横向滚动 · scroll sideways → · * 仅研究参与者 / pilot weeks only
每一步的成本预算The effort budget per step
| 步骤 | 用户投入 User effort | 系统在做 System does | 失败时 If it fails |
|---|---|---|---|
| 首次安装到首次出声Install → first sound | ≤ 90 秒(欢迎 → 同意 → 连接 → 首页 → 开始);画像可跳过≤ 90 s; profile skippable | 请求 HealthKit 心率权限;启动手表伴侣;用总体先验选首个变体HealthKit HR auth; launch watch companion; population prior picks first variant | 无手表 → 播放固定曲线并标注"未自适应",不假装No watch → fixed curve, labelled non-adaptive |
| 日常一次会话A daily session | 3 次点击 + 2 次滑动(前 / 后 0–10)+ 1 次 👍👎3 taps + 2 slides + 1 thumb | 60 s 预休息基线 → 每 60 s 调参 → 最后 5 min 残差 → 结果Pre-rest baseline → adapt every 60 s → last-5-min residual → result | 信号质量 < 70% → "这次没测准",仍保存自评Quality < 70% → "couldn't measure", self-report kept |
| 试点会话(E1)Pilot session | 研究助理引导;5 min 预休息 + STAI-6 + 2 题期待值;15 min;3 min 后休息 + STAI-6RA-led; 5-min rest + STAI-6 + expectancy; 15 min; 3-min post + STAI-6 | App 处于"研究模式":条件由拉丁方表指定(T1 / T2 / C),参数由规则表驱动或由 RA 手动"扮演算法"Research mode: condition from the Latin square; params from rule table or RA (WoZ) | Polar 未连 → 记录为仅手表数据,标记校准缺失No Polar → watch-only, calibration flagged |
4. 界面设计:八屏 + 手表 + 安全屏Screens — eight phone screens, the watch companion and the safety screen
先看 72 秒录屏(真实线上版本,心率为模拟曲线):Settle → 预休息 → 会话(无数字)→ 接地屏 → 回访 → 结果 → Unwind(Spotify 嵌入)→ 历史。可安装的 App 在 https://38.180.150.12.sslip.io/app/。下面八屏是设计稿,其中 S1–S3(欢迎 / 同意 / 连接)在 v0.1 里尚未实现,App 直接从首页 S4 开始。
Watch the 61-second recording first (the live build; heart rate simulated): Settle → pre-rest → session (no numbers) → grounding → check-in → result → Unwind (Spotify embed) → history. The installable app is at the link above. The eight screens below are the design; S1–S3 (welcome / consent / connect) are not yet in v0.1, which starts at the Home screen S4.
视觉方向:一个温暖的深夜世界。炭褐底、亚麻白字、琥珀色只给"可以按的东西",青色只在会话后表示"更平静"。没有插画堆叠,没有紫色渐变,没有表情符号;字体用系统字(SF Pro / 苹方)配等宽数字。每一屏下面写明"为什么这样"和"采集了什么"。
Visual direction: one warm night world. Charcoal-brown ground, linen text, amber only for what can be tapped, teal only after the session to mean "calmer". No illustration piles, no purple gradients, no emoji; system type (SF Pro / PingFang) with monospaced numerals. Each screen states why it is built this way and what it captures.
声音,跟着你的心率一起慢下来。
Sound that settles with you. 这不是冥想,也不是白噪音;这是一个会听你身体的播放器。
健康与放松用途,不用于诊断或治疗。若你正处于危机中,请联系当地求助热线。
Lilt 需要读什么
只在会话期间读取。节拍级数据只在手机上处理,离开手机的只有每分钟的汇总。
心率从哪里来
Apple Watch 可以实时适配;Oura 提供第二天早晨的睡眠回顾。
Android(Health Connect)与 Garmin / WHOOP 在后续版本。
安定下来
肩膀放下来。我们先听 60 秒你的心率,声音会从这里开始跟着你。
(网页版在此处直接播放 · plays inline on the web version)
W · 手表伴侣 Watch companion呼吸光环 + 触觉节律(每分钟 6 次)+ 点按结束。手表在这里不只是传感器:HKWorkoutSession 必须从手表端启动才能拿到 1–5 秒的心率流。Breathing halo + haptic rhythm (6/min) + tap to end. The watch is not only a sensor: the workout session must start on the watch to get the 1–5 s HR stream.
你在这里。
把脚踩在地上。说出你看到的三样东西。声音会一直在。
需要有人说话时:当地求助热线 →
X · 安全屏 Safety screen静息心率 > 130 或用户标记 panic 时:不显示任何数字,只显示接地文字与求助线;声音不停。这是 ML §6 的安全规则变成的界面。Resting HR > 130 or a panic tag: no numbers, grounding text and a help line only; sound keeps playing. ML §6's safety rule as a screen.
次级界面(不在核心循环里)Secondary screens outside the core loop
- 洞察 Insights:每周一张卡,"你的 Settle 在 22–23 点最有效 · 床 B 比床 A 更适合你 · 昨晚睡眠 HRV +6 ms"。柱状图七根,青色表示比基线更平静。One card per week: best hour, best bed, last night's sleep HRV; seven bars, teal = calmer than baseline.
- 曲库 Library:Unwind 按艺人 / 情绪 / 慢度浏览,标签见 §6;Settle 只有 4–6 张"床",用质地命名(Fog · Linen · Low tide · Warm static),不用情绪词,避免暗示。Unwind browsable by artist / mood / slowness; Settle offers 4–6 beds named by texture, not emotion, to avoid suggestion.
- 数据与隐私 Data:同意开关、"哪些数据离开手机"、导出 JSON、删除全部。Consent toggles, what leaves the phone, export JSON, delete all.
- 研究模式 Research mode(隐藏,RA 用密码开启):拉丁方条件、5 分钟预休息、STAI-6、期待值、Polar H10 配对、会话导出。Hidden, RA-unlocked: Latin-square condition, 5-min pre-rest, STAI-6, expectancy, Polar pairing, session export.
5. 数据采集接口Data-capture interfaces — function × signal × source × API
每个功能需要什么信号、从哪个接口来、多久一次、要什么权限、没有时怎么办。iOS 是首发平台(因为只有 Apple Watch 能给实时心率流);Oura 只能给第二天;Polar H10 既是校准金标准,也是网页演示里唯一能实时读心率的途径(Web Bluetooth)。
For each function: the signal, its interface, rate, permission and fallback. iOS ships first because only Apple Watch gives a live HR stream; Oura is next-day only; Polar H10 is both the calibration reference and the one way a web demo can read live HR (Web Bluetooth).
| 功能 Function | 信号 Signal | 来源 · 接口 Source · API | 频率 / 延迟 Rate | 权限 Permission | 学术用途 Research use | 缺失时 Fallback |
|---|---|---|---|---|---|---|
| 实时适配Live adaptation | HR bpm | Apple Watch → HealthKit:watchOS 伴侣启动 HKWorkoutSession(.mindAndBody)+ HKLiveWorkoutBuilder / HKAnchoredObjectQuery,经 WCSession 推到 iPhone | 1–5 s | HealthKit 读取 heartRate;手表端 App | 控制信号;共同主要生理结局(残差 HR)Control signal; co-primary physiological outcome | 无手表:固定曲线,标注"未自适应" |
| 会话内 RMSSDIn-session RMSSD | RR 间期 | HKHeartbeatSeriesSample(手表在会话期间记录,结束后可读) | 会话后 | HealthKit 读取 heartbeat series | 次要结局;E2 奖励的可选项Secondary outcome | 只用 HR |
| 前后 HRVBefore / after HRV | SDNN | HKQuantityType.heartRateVariabilitySDNN(机会性采样) | 滞后 ≤ 30 min | HealthKit 读取 HRV | A2b;基线模型输入A2b; baseline model input | 结果页省略 HRV 行 |
| 个人基线Personal baseline | 14 天背景 HR / HRV | HealthKit 历史查询(HKSampleQuery + 后台交付) | 每日同步 | 同上 | §3.3 残差化模型;"比你平时"口径Residualisation model | 用总体曲线(分层收缩);显示 d/14 |
| 次日回顾 · 睡眠结局Next-morning · sleep outcome | 夜间 HRV(5 min RMSSD)· HR · 睡眠分期 · readiness | Oura API v2(OAuth2):/v2/usercollection/sleep · /heartrate · /daily_readiness | 次日早晨 | Oura 账号授权;需活跃会员(2024 起) | 睡前段结局;A6 回访触发;次日个性化Sleep-onset outcome; retention trigger | 无戒指:跳过晨间卡 |
| 校准 E0 · 网页演示Calibration · web demo | RR 间期(ECG 级) | Polar H10:BLE 心率服务 0x180D,特征 0x2A37 含 RR 字段(1/1024 s);网页用 navigator.bluetooth.requestDevice({filters:[{services:['heart_rate']}]}) | 每拍 | 蓝牙 | ICC · MAPE · λ 去衰减;网页演示的实时心率ICC, MAPE, λ; live HR for the web demo | 演示用模拟心率曲线(明确标注) |
| 伪影剔除Artefact masking | 加速度 | 手表:workout session 内的运动数据;手机:CoreMotion | 50 Hz | 动作与健身 | §3.2 运动掩膜;差异性误差检查Motion mask; differential-error check | 用 HR 跳变规则兜底 |
| 上下文Context | 时刻标签 · 时间 · 定时 · 耳机 | App 内;AVAudioSession 输出路由 | 事件 | — | B3 分群;bandit 上下文Segmentation; bandit context | — |
| 自评Self-report | 平静 0–10 前后 · 👍👎 · 一个词;试点:STAI-6 · 期待值 | App 内 | 每次会话 | — | A2a 构念;bandit 奖励的 λ·Δself;训练标签Construct; reward term; label | 可跳过,仍记录 HR |
| 会话日志Session log | 变体 · 参数轨迹 · 60 s 窗口特征 · 质量 · 结局 | App → 后端(Supabase / 自建 Postgres,EU 区) | 会话后 | 同意状态随行 | E1 分析;E2–E4 的分层模型E1 analysis; hierarchical models | 离线缓存,联网后同步 |
| 后续平台Later platforms | HR · HRV | Android Health Connect(HeartRateRecord, HeartRateVariabilityRmssdRecord);Garmin / WHOOP / Fitbit 云 API(非实时) | 分钟级 / 次日 | 各平台授权 | 扩样本;C2 SDK 对接Scale; C2 SDK | — |
6. 曲库与标签Library and tags — two catalogues, one schema, two playback tiers
6.1 两个曲库Two catalogues
| Settle · 中性床 Neutral beds | Unwind · 真歌舒缓版 Real-song calm arrangements | |
|---|---|---|
| 内容规格Content spec | 无音高中心、无节奏、无歌词;频谱重心 1.2 kHz → 600 Hz 随会话下移;60 Hz 以下无内容(避免"嗡");瞬态 ≤ 床 +6 dB;−16 LUFS(= FOCUS_GROUP_KIT S-B 规格)No pitch centre, rhythm or lyrics; centroid drifts 1.2 kHz → 600 Hz; nothing below 60 Hz; transients ≤ +6 dB; −16 LUFS | 器乐钢琴 / 吉他改编,60–66 bpm,无打击乐,柔和低通,无突变动态(= S-A 规格);演示阶段用 Spotify / SoundCloud 上已有的慢速真歌代替Instrumental piano / guitar, 60–66 bpm, no percussion, gentle low-pass, no sudden dynamics; the demo substitutes existing slow real songs on Spotify / SoundCloud |
| 数量(演示)Count (demo) | 4–6 张床,各 3 层 stem(bed / air / warmth)4–6 beds, 3 stems each | 20–30 首,≥ 10 首为 TDMusic 自有(可做参数适配)20–30 tracks, ≥ 10 TDMusic-owned |
| 来源Source | TDMusic AI 引擎生成,人工试听 QA 后才进急性模式Generated by the TDMusic engine; human listening QA before acute mode | Spotify / SoundCloud 官方嵌入(embed-only);自有曲目直接托管(owned)Official embeds; owned tracks hosted directly |
| 适配档位Adaptation tier | P · 参数级:低通截止、增益、层密度、脉冲等效速度,每 60 s 一步P · parametric: cutoff, gain, layer density, pulse-equivalent tempo, stepped every 60 s | S · 选曲级:按起始心率带选曲,按残差趋势决定下一首更慢 / 保持,交叉淡入 8 s;自有曲目可升级到 PS · selection: pick by start-HR band, next track slower / hold by residual trend, 8-s crossfade; owned tracks can go to P |
| 对应试点条件Pilot condition | T1 | T2(C = 用户自己的放松歌单,原样播放)T2 (C = the user's own playlist, untouched) |
6.2 标签规范(每首曲目 / 每张床一条)Tag schema — one record per track or bed
标签同时服务三件事:规则表选曲(slot)、bandit 的"参数格"(acoustic)、E4 的晋升 / 退役(posterior)。Spotify 的 audio-features 接口 2024 年 11 月起对新应用关闭,所以声学标签由我们自己标:自有音源用 librosa / Essentia 算,嵌入曲目人工标 + 试听核对。
Tags serve three jobs at once: rule-table selection (slot), the bandit's parameter cell (acoustic), and E4 promotion / retirement (posterior). Spotify's audio-features endpoint closed to new apps in November 2024, so we tag ourselves: librosa / Essentia on owned audio, manual tagging plus listening checks for embeds.
{ "id": "unwind-0007", "mode": "unwind",
"title": "Weightless", "artist": "Marconi Union",
"source": { "spotify": "6kkwzB6hXLIONkEk9JciA6", "soundcloud": "665599673" },
"rights": "embed-only", // owned | embed-only | licensed
"adapt_tier": "S", // P parametric | S selection
"fit": ["wind-down", "sleep-onset"],
"acoustic": { "bpm": 60, "pulse_eq": 60, "brightness": "dark", "density": "sparse",
"transients": "none", "lyrics": "none", "melody_salience": 1,
"sub60hz": false, "lufs": -18, "key": "Dm" },
"slot": { "start_hr": "<75", "role": "lead-down" }, // ≥90 | 75–90 | <75
"qa": { "human": "2026-09-01", "notes": "long fades, no sharp onsets" },
"posterior": { "n": 0, "mean": null, "sd": null, "prior": "pop:unwind:dark-sparse" } }
{ "id": "settle-B2", "mode": "settle", "name": "Linen",
"source": { "owned": "/audio/settle/linen/", "stems": ["bed", "air", "warmth"] },
"rights": "owned", "adapt_tier": "P",
"fit": ["acute", "sleep-onset", "pre-performance"],
"acoustic": { "pitch_centre": "none", "rhythm": "none", "centroid_hz": [1200, 600],
"sub60hz": false, "transient_max_db": 6, "lufs": -16 },
"params": { "cutoff_hz": [600, 2400], "density": [0, 1], "pulse_eq": [50, 66], "gain_db": [-6, 0] },
"controller": "E1-rule-table-v0",
"qa": { "human": "pending", "gate": "acute mode requires human QA" } }
20 首 Unwind 候选曲目见下表:从 12 个 Spotify 官方舒缓歌单出发,官方歌单里多为匿名"幽灵艺人",因此又经 Wikidata 解析 17 位知名艺人的 Spotify ID,取各自"热门"榜(Spotify 按播放量排序)前 4 名随机抽一首、每位艺人一首。所有 ID 已用 Spotify oEmbed 校验;尚未人工试听,声学标签(bpm、亮度、密度)待试听后填写,急性模式不使用这些曲目。
The 20 Unwind candidates below start from 12 Spotify editorial calm playlists; because those are dominated by pseudonymous "ghost" artists, 17 well-known artists were resolved to Spotify IDs via Wikidata and one track per artist was drawn at random from the top four of each artist's Popular list (Spotify's own play-count order). Every ID is verified with Spotify's oEmbed endpoint; none has been listened to yet — acoustic tags (bpm, brightness, density) are filled after listening, and none of these enters the acute mode.
| # | 艺人 Artist | 曲目 Title | 类型 Band | 来源 Provenance |
|---|---|---|---|---|
| 01 | Yiruma | Kiss The Rain | piano | artist Popular |
| 02 | Ólafur Arnalds | Happiness Does Not Wait | piano | artist Popular |
| 03 | Eluvium | Requiem On Frankfort Ave | ambient | artist Popular |
| 04 | Kiasmos | Blurred | electronic | artist Popular |
| 05 | Dalby | Roar | piano | editorial + artist |
| 06 | Hania Rani | Dreamy | piano | artist Popular |
| 07 | Federico Albanese | Migrants | piano | artist Popular |
| 08 | Claude Debussy | Rêverie, CD 76 | piano | editorial + artist |
| 09 | Nils Frahm | Ambre | piano | artist Popular |
| 10 | Brian Eno | An Ending (Ascent) | ambient | artist Popular |
| 11 | Ludovico Einaudi | Nuvole Bianche | piano | artist Popular |
| 12 | William Basinski | Melancholia II | ambient | artist Popular |
| 13 | A Winged Victory for the Sullen | Steep Hills of Vicodin Tears | ambient | artist Popular |
| 14 | Max Richter | On the Nature of Daylight | piano | artist Popular |
| 15 | Harold Budd | A Stream With Bright Fish | ambient | artist Popular |
| 16 | Johann Sebastian Bach | Orchestral Suite No. 3 in D Major, BWV 1068: II. Air "on the G String" | piano | editorial + artist |
| 17 | Carbon Based Lifeforms | Interloper | ambient | artist Popular |
| 18 | Ludwig van Beethoven | Für Elise, Bagatelle in A Minor, WoO 59 | piano | editorial + artist |
| 19 | Dirk Maassen | Muse | piano | artist Popular |
| 20 | Joep Beving | Sleeping Lotus | piano | artist Popular |
6.3 嵌入播放 + 参数适配:可行性实验台Embedded playback + parametric adaptation — a feasibility bench
下面这个小实验台证明两件事在浏览器里就能做:① 官方嵌入播放器可以被页面控制(Spotify iFrame API / SoundCloud Widget API:播放、暂停、跳转、事件);② 自有音源走 Web Audio 时,低通截止与增益可以跟着心率每秒变化。心率在这里是模拟的(从 92 沉到 68),网页版可换成 Polar H10 的 Web Bluetooth 实时读数。这个实验台也部署在生产应用的"实验"页面里,可以用实时心率测试。
This bench shows two things work in a browser: ① official embeds can be driven by the page (Spotify iFrame API / SoundCloud Widget API: play, pause, seek, events); ② owned audio through Web Audio lets low-pass cutoff and gain follow heart rate second by second. HR here is simulated (92 settling to 68); the web version can swap in a Polar H10 over Web Bluetooth. The bench is also live in the deployed app's Lab screen, where you can test it with live heart rate.
曲目:Vindu — Peace At Last(TDMusic 自有,30 s 片段)。规则:cutoff = 600 + (HR−60)/40 × 1800 Hz,限幅 600–2400;gain 随残差下降 0 → −4 dB;动作标记时保持上一值。Track: Vindu — Peace At Last (TDMusic-owned, 30-s clip). Rule: cutoff = 600 + (HR−60)/40 × 1800 Hz clamped 600–2400; gain eases 0 → −4 dB as the residual falls; hold last value on a motion flag.
6.4 权利与商用边界Rights and the non-commercial line
- 演示阶段不商用、不推广:真歌只通过 Spotify / SoundCloud 官方嵌入播放,不下载、不改音频、不去水印,符合两家的嵌入条款;Spotify 未登录只播 30 秒预览,登录 Premium 播全曲。Demo is non-commercial and unpromoted: real songs play only through official embeds — no download, no audio alteration — within both platforms' embed terms; Spotify plays 30-s previews unless the viewer is logged in to Premium.
- 参数级适配只对 TDMusic 自有或已确认改编权的曲目做(A5 法务核查 ≥ 50 首仍在进行);急性模式的中性床全部自有,不需要曲库权利。Parametric adaptation only on TDMusic-owned or rights-cleared tracks (the A5 legal check on ≥ 50 tracks is still running); Settle beds are all owned and need no catalogue rights.
- 试点里 T2 的"舒缓版"应优先用自有曲目,避免把法务风险带进效果检验。In the pilot, T2 arrangements should prefer owned tracks so the efficacy test carries no rights risk.
7. 学术方法 → 产品交互:逐项映射Method → interaction — the mapping, item by item
这是老师最想看到的一张表:论文里的每个方法元素,在产品里长成了哪个交互,产出什么数据,推动哪个信念。反过来读也成立:产品里没有一个交互是没有研究理由的。
The table the supervisor will want: each method element in the dissertation, the interaction it becomes, the data it yields and the belief it moves. It reads backwards too: no interaction in the product lacks a research reason.
| 方法元素 Method element | 产品交互 Interaction | 数据 Data | 推动 Feeds |
|---|---|---|---|
| 唤醒状态分割 A1a / A1b(访谈"软墙"→ 问卷 C3 McNemar)Arousal-state split | 首页的两个模式 = 两个内容世界;用户选模式就是在给自己贴状态标签Two home modes = two content worlds; choosing is self-tagging | moment tag × 完成率 × 👍👎 | A1a / A1b 的行为证据;试点 T1 vs T2 对比Behavioural evidence; T1 vs T2 |
| 三条件被试内交叉设计(METHODOLOGY §4.1)3-condition within-subject crossover | 研究模式:条件由拉丁方表指定;C 条件播放用户自己的歌单,界面完全相同Research mode: Latin-square condition; C plays the user's own playlist in the same UI | condition · order · session# | β1 β2 与 β1−β2;A2a A2b A1aModel coefficients |
| ANCOVA 形式的混合模型(基线作协变量)ANCOVA-form mixed model | 预休息屏:声音先起、60 s(试点 5 min)基线窗口Pre-rest screen as baseline window | pre HR · pre RMSSD · pre calm | Pre_ij 协变量;消除均值回归Baseline covariate |
| 期待效应控制Expectancy control | 研究模式在预休息屏多两题"你觉得这段会有多大帮助";所有条件都叫"舒缓音频"Two expectancy items in research mode; all arms called "calming audio" | expect 1–7 | β5 协变量Covariate |
| STAI-S(6) 主要结局STAI-6 primary outcome | 试点周前后各 6 题;日常只用单题 0–10(负担 20 秒)Six items pre/post in pilot weeks; single item daily | STAI-6 · calm 0–10 | A2a;bandit 奖励 λ·ΔselfA2a; reward term |
| 预注册清洗规则(ML §3.1–3.2)Pre-registered cleaning | 结果页的信号质量徽章;质量 < 70% 不出数字Quality badge; no number under 70% | quality index · flagged share | 结局纳入 / 剔除;差异性误差检查Inclusion; differential-error check |
| 残差化(ML §3.3)Residualisation | "比你平时 22:00 更平静 9 bpm";"正在学习你的基线 3/14""Calmer than your usual"; "learning your baseline" | Δr HR · Δ log-RMSSD | 试点生理结局;E2 奖励;用户信任(D4)Outcome; reward; trust |
| E0 校准子研究Calibration sub-study | 研究模式里配对 Polar H10;同一会话双记录Pair Polar H10 in research mode; dual recording | watch vs polar RR | ICC · MAPE · λ;A2b 测量 LRReliability; measurement LR |
| E1 规则表(v0 控制器)E1 rule table | 会话中每 60 s 静默调参;用户只看到"正在跟着你"Silent 60-s steps; user sees "following you" | params trajectory | WoZ 可复现;v1 策略的默认臂Reproducible WoZ; default arm |
| E2 微实验Micro-experiments | 每次会话从允许集里随机分配变体;用户无感Random variant per session, invisible | variant × moment × Δr | 分层模型;被测量的曲库Hierarchical model; measured library |
| E3 情境 banditContextual bandit | 洞察卡:"床 B 比床 A 更适合你";探索 ≤ 15% 从不告知具体哪次Insight card; exploration never announced per session | per-user posterior | 个性化;A6 留存Personalisation; retention |
| E4 自生成曲库 + 人工 QA 门Self-generating library + QA gate | 曲库里的"新声音"徽章只在 QA 通过后出现;急性模式永远不放未 QA 的变体"New" badge only after QA; acute mode never gets un-QA'd variants | qa.human · posterior | 晋升 / 退役;"医院空调"风险Promotion / retirement |
| Kano K1 实时适配 · K2 前后结果(问卷 E2:A / O)Kano attractive / one-dimensional | K1 = 会话核心;K2 = 结果页第一句K1 is the session; K2 is the result's first line | — | A3 价值感;留存假设Perceived value |
| TAM 易用性 · DOI 可试用性TAM ease · DOI trialability | ≤ 3 次点击;14 天试用;分享卡可观察但不带数字Three taps; 14-day trial; share card observable without numbers | time-to-sound · trial→paid | A3 · A4;landing 转化 LRConversion LR |
| ODI 未满足结果(B9 ≥ 6)ODI under-served outcomes | 文案直接用未满足结果的原话("脑子停不下来"、"知道它有没有用")Copy lifted from under-served outcomes | — | POV / HMW 优先级POV priority |
| 治理 · 安全(ML §6)Governance · safety | 分项同意;节拍级数据不出手机;安全屏;无医疗话术Per-type consent; on-device; safety screen; no medical claims | consent state | D5;GDPR;HealthKit 条款Privacy; legal |
| 内部人偏差控制(METHODOLOGY §7)Insider-bias control | 研究模式由 RA 开启与操作;创始人不主持会话;分析盲化条件标签RA runs research mode; founder does not moderate; analyst blinded | operator id | 方法章节的可信度Credibility |
8. 反馈与学习闭环Feedback and the learning loop
用户侧 · 三层反馈
- 即时(会话后 20 秒):平静 0–10、👍👎、一个词。这是构念测量,也是训练标签。Immediate: calm 0–10, thumbs, one word. Construct measure and training label.
- 次日(Oura):"昨晚之后你的睡眠 HRV +6 ms"。唯一的推送,且只在有数据时发。Next day: the one push, only when data exists.
- 每周:一张洞察卡,说"什么对你有效",不说"你做得不够"。Weekly: one insight card — what works for you, never what you failed to do.
系统侧 · 奖励与更新
每次会话的奖励 = −标准化 Δr HR + λ·Δ自评(λ 由试点定,起点 0.5)。只用自评会被期待效应骗,只用心率会被"一动不动"骗,所以是复合的,并且质量指数 < 70% 的会话不进奖励。更新按分层贝叶斯:总体后验是每个新用户的先验,个人后验每次会话更新;探索上限 15%;某臂比默认差 > 0.3 SD 就对该用户暂停。
Session reward = −standardised Δr HR + λ·Δ self-report (λ set by the pilot, starting at 0.5). Self-report alone is gamed by expectancy, HR alone by stillness, so the reward is composite, and sessions under 70% quality are excluded. Updates are hierarchical Bayesian: the population posterior is every new user's prior; the per-user posterior updates each session; exploration capped at 15%; an arm worse than default by > 0.3 SD is suspended for that user.
诚实规则(写进界面文案)
- 没测准就说没测准,不给分数。If we couldn't measure, say so; no score.
- 只和你自己比,不和别人比。Compare only with your own usual.
- 心率说的是"身体的紧张",不是"焦虑"本身;结果页用"更平静",不用"焦虑降低"。HR indexes arousal, not anxiety; the result says "calmer", never "anxiety reduced".
- "正在跟着你"只在真的有心率流时出现。"Following you" appears only when a live HR stream exists.
- 探索(试新声音)从不单独告知,但用户可以在设置里关掉"尝试新声音"。Exploration is never announced per session, but the user can switch off "try new sounds".
研究侧 · 进入决策模型
试点结束:STAI-6 的 P(β1 < 0) → A2a;残差 HR / RMSSD → A2b;连接率与结果页停留 → A3。这些后验直接写回 决策引擎的"+pilot"情景。
After the pilot: P(β1 < 0) on STAI-6 → A2a; residual HR / RMSSD → A2b; connect rate and result-screen dwell → A3, written back into the decision engine's "+pilot" scenario.
9. 技术栈与"周一上线"计划Stack and the plan to release on Monday
- 架构文档 · 计划 · VPS HTTPS(38.180.150.12.sslip.io)
- 核心模块 + 单元测试 · 20 首候选(ID 已校验)
- v0.1.1 已上线 https://38.180.150.12.sslip.io/app/
- Settle 合成床音质 + 离线渲染客观测试
- 端到端浏览器测试(Settle / Unwind / 无传感器 / 安全屏 / 持久化)并修 bug
- SoundCloud 播放器 + Spotify 加载兜底
- Capacitor iOS 脚手架 + IOS.md · 蓝图更新 + 演示脚本
- 研究模式核心(拉丁方 · STAI-6 · 期待值)+ 测试
- 研究模式界面(参与者编号 → 条件、5 分钟预休息、STAI-6 前后、期待值、导出)
- 手机动作标记进入质量指数 · Settle 预设可选
- 自有曲目 tier P(待 TDMusic 文件)· 蓝牙胸带实测(Android / 桌面 Chrome)
- QA.md 在 iPhone Safari(已安装)、Android Chrome、桌面 Chrome 通过
- 版本与缓存升级 · 部署 · 蓝图与首页链接
- 5 分钟演示脚本排练 · 候选清单与你核定
- 全部测试通过、零控制台错误
- app-ios/ Capacitor 打包 → TestFlight 内部测试
- HealthKit 14 天历史 → 真实"你的平时" · 后台音频
- watchOS 伴侣(实时心率、触觉)· Polar 配对
- E0 校准 · E1 试点
- Oura OAuth + 晨间卡 · 基线模型 · Supabase 后端 · 周洞察 · E2 随机化
| 层 Layer | 选型 Choice | 理由 Why |
|---|---|---|
| 移动端 | SwiftUI(iOS 17+)+ watchOS 伴侣;后期 React Native 不可行(手表端必须原生) | 实时心率流只能从手表端 workout session 拿到Live HR needs a native watch session |
| 音频 | iOS:AVAudioEngine(低通、增益、多层 stem);Web:Web Audio API;真歌:Spotify iFrame API / SoundCloud Widget API | 自有音源参数适配;嵌入零版权Parametric on owned; embeds cost nothing |
| 信号 | Swift 端:运动掩膜、Kalman(1-D)、60 s 窗口特征;节拍级不出手机 | ML §3 预注册规则;数据最小化Pre-registered rules; minimisation |
| 后端 | Supabase(Postgres + Auth + Row-level security,EU 区);或 VPS 自建 Postgres | 周级上线;GDPR 区域存储Weeks to ship; EU storage |
| 分析 | Python:statsmodels / PyMC(混合模型 + 贝叶斯再分析);与 survey_pipeline.py 同一仓库 | 与决策引擎口径一致Same idiom as the decision layer |
| 网页演示 | 静态 HTML + Web Audio + Web Bluetooth(可选);部署在现有 nginx | 周一可展示;不需要 App 审核Showable Monday; no review |
需要你拍板的项目(第一周)Blocking items you must provide (week one)
- Apple Developer Program(P4 需要;需要 24–48 小时注册)— 已有吗?Already have it?
- Xcode 安装在 Mac 上(≈ 1–2 小时下载)— P4 需要。Needed for P4.
- Spotify Premium 登录(后续使用;嵌入已用 30 秒预览工作)。Later; embeds already work with 30-s previews.
- 自有音源:≥ 3 首慢 TDMusic 曲目文件;如可能 4 张 Settle 床按 §6.1 规格(合成噪声 + 缓慢 pad 作为临时方案)。≥ 3 slow TDMusic tracks as files; 4 Settle beds to §6.1 spec if possible (synth beds as fallback).
- 20 曲候选表核查:保留 / 删除 / 增加。Confirm the 20-track candidate list: keep / drop / add.
10. 附录:v0 控制规则与安全规则Appendix — the v0 controller and safety rules
START pulse_eq = HR ≥ 90 → 66 · 75–90 → 60 · < 75 → 56 (entrainment: start near the listener, then lead down)
cutoff = 600 + clamp((HR − 60) / 40, 0, 1) × 1800 Hz
density = HR ≥ 90 → dense → sparse over 3 min · else sparse
EVERY 60 s
Δ = residual HR (this window) − residual HR (previous window)
Δ ≤ −2 bpm → pulse_eq −2 · cutoff −1 notch (−250 Hz) · keep layers
Δ ≥ +3 bpm, no motion → hold · remove any transient layer
else → hold
GUARDS pulse_eq ≥ 50 · no onsets > bed +6 dB · loudness −16 LUFS fixed · nothing < 60 Hz
SAFETY resting HR > 130 or panic tag → grounding screen, numbers hidden, sound continues
QUALITY window flagged if accel SD > 0.05 g or HR jump > 12 bpm; session < 70 % clean → no outcome shown
UNWIND (tier S) next track = same rules applied to the catalogue's pulse_eq / brightness tags; 8-s crossfade
(tier P, owned) identical to Settle, applied to the calm arrangement's stems
The same table drives the Wizard-of-Oz pilot (a human applies it), the v0 controller in the app, and the default arm of the later bandit — one rule set, three implementations, so the pilot result transfers to the product.