用 Rokid AIUI 做一个「专注时刻助手」:把一段专注时间挂在眼前
学习或工作时,我常常需要一段不被打断的时间。手机当然能计时,但每次想确认剩余时间,都要把注意力从手边的事挪开。于是我想做一个足够简单的眼镜端工具:说出任务和时长,抬眼能看见倒计时,需要时再用语音或按键操作。
这个想法最后变成了「专注时刻助手」。它没有任务清单,也没有复杂统计,只围绕一件事工作:把当前这段专注时间清楚地显示出来,并在开始、暂停和结束时给出简短反馈。

一、项目简介
专注时刻助手面向学习、办公和刷题场景。用户可以通过类似“开始专注 25 分钟背单词”的表达唤起智能体,页面接收任务名称和时长,显示待机倒计时。用户点击或选中“开始”后,计时才正式启动;计时中可以暂停或重置,完成后自动保存一条记录。
主页提供五个操作:开始、暂停、重置、记录和语音。语音入口可以识别“设置 10 分钟”一类的口令来调整时长;记录页展示最近完成的专注任务。记录保存在设备本地,最多保留 50 条。
我把功能范围控制得比较窄。它不管理待办事项,也不做长期效率分析,避免为了“功能齐全”而让眼镜界面变得拥挤。打开之后,用户最先看到的是任务名和大号倒计时,其他信息都围绕它服务。
二、使用场景与用户意图
常见的使用场景是:坐到书桌前准备学习,用户说“开始专注 25 分钟背单词”。AIUI 根据智能体说明和页面参数定义,将这类需求交给专注时刻助手,并把分钟数和任务名传入页面。主页据此显示“背单词”和“25:00”,用户确认后再开始计时。
用户也可能只说“专注 10 分钟”,没有提供具体任务。项目为任务名和时长设置了默认值,避免参数缺失时页面无法显示。对于与专注无关的闲聊或知识问题,AGENTS.md 明确要求不要调起这个应用。这个边界很重要:专注工具如果什么话题都打断用户,反而会破坏它要保护的注意力。
计时过程中,页面上的操作按钮负责开始、暂停和重置;需要设置时长时,用户进入语音入口,说出“设置 10 分钟”。目前我把语音改时长的验证范围放在计时尚未开始或已经暂停的状态。计时正在运行时的改时长行为还需要进一步收口,后文会说明。
<script type="application/json" def>
{
"navigationBarTitleText": "专注时刻",
"description": "专注倒计时卡片。当用户想开始一段专注时间、想用番茄钟、想倒计时学习或工作时调用本页面。用户可以指定专注时长(分钟)和这次要做的事。卡片上显示倒计时,双击卡片可进入全屏操作开始、暂停和重置。",
"schema": {
"data": {
"type": "object",
"properties": {
"minutes": {
"type": "number",
"description": "专注时长,单位分钟,不填默认25,最大180"
},
"task": {
"type": "string",
"description": "这次专注要做的事,例如:背单词、写周报、刷题"
}
}
}
}
}
</script>
三、方案设计
3.1 智能体定义
AGENTS.md 将它定义为一名戴在用户眼前的专注教练:少说话、反馈简短,不用夸张的鼓励语,也不重复播报。它主要处理专注、倒计时和学习计时相关需求;超过单次时长范围时,需要给出清楚的反馈。
3.2 页面与交互
项目由主页和记录页组成。主页显示任务名、倒计时、当前状态和五个操作按钮;记录页展示任务、时长和完成时间。对于没有记录的情况,页面会显示空状态提示。
眼镜上的操作不能只依赖鼠标点击,所以主页通过 onKeyDown 管理当前选中的按钮:方向键移动选中项,回车执行对应操作。记录页也支持方向键浏览列表。预览卡片与全屏页面的交互方式不同,调试时需要先进入全屏,再检查按钮和焦点操作。
3.3 状态流转
语音唤起应用
↓
读取任务名和时长,显示待机卡片
↓ 用户选择“开始”
专注计时中 ──“暂停”──→ 已暂停
│ │
├──“重置”→ 回到设定时长 └──“开始”→ 继续剩余时间
↓ 倒计时结束
语音提醒 + 保存记录
↓
打开记录页查看最近完成的专注

3.4 视觉方案
Rokid 眼镜显示区域有限,项目按单绿色显示思路设计页面。倒计时使用较大的数字,任务名和状态提示采用较小字号与不同透明度;按钮选中状态同时通过边框和字重区分,不依赖多种颜色表达状态。主页容器按约 480×352 的显示空间排布,优先保证“任务是什么、还剩多久、现在是什么状态”一眼能读到。
四、AIUI 实现
4.1 项目结构与配置
项目目录/
├── AGENTS.md # 智能体身份、触发时机与行为边界
├── app.json # 页面注册、应用信息和录音权限
├── app.js # 生命周期与全局错误记录
└── pages/
├── index/index.ink # 倒计时主页
└── records/records.ink # 专注记录页
app.json 注册了主页和记录页,并声明 RECORD_AUDIO 权限供语音识别使用。app.js 保持精简,只保留应用生命周期钩子和全局错误日志,便于在调试时定位异常。主要页面逻辑放在两个 .ink 文件中。
4.2 用页面参数承接用户意图
主页文件顶部定义了页面说明和参数 schema。minutes 表示时长,默认值为 25 分钟,设计上限为 180 分钟;task 表示本次专注任务。页面在 onLoad 中读取参数,转换分钟数,并把任务名限制在 12 个字符内,避免长文本挤压倒计时区域。
这份 schema 可以看作页面和智能体之间的数据约定:页面需要什么,就把字段和含义说明清楚。用户用自然语言表达需求后,智能体才能把识别到的时长和任务传给页面,而不是让页面再从一整句话里猜所有内容。
4.3 用结束时间戳计算倒计时
倒计时没有采用每隔一秒就把剩余秒数减一的方式。开始时,页面根据当前时间和剩余时长计算 endTime;每次刷新时,再用结束时间减去当前时间得到剩余量。这样即使页面短暂被遮挡或定时器执行不够准,回来后也会按真实经过的时间重新计算。
计时器每 500 毫秒检查一次,但只有格式化后的显示值发生变化时才调用 setData。这避免了没有必要的高频页面刷新,也让按键操作不容易被连续更新干扰。暂停时,页面记录新的剩余毫秒数;再次开始时,从剩余时间继续。
计时归零后,主页停止定时器、切换到完成状态、调用语音播报,并把任务名、时长和时间戳写入本地存储。记录页从同一个存储键读取数据,在逻辑层先把时间戳格式化,再交给模板显示。
4.4 语音识别与播报
用户点击“语音”后,页面创建中文语音识别实例,提取识别结果中的阿拉伯数字;如果没有数字,再尝试解析常见中文数字。识别过程设置了 3 秒超时,避免页面长时间停留在聆听状态。开始、暂停、重置、完成和时长设置结果都通过 wx.speech.playTTS() 给出简短提示;播报异常不会阻止页面继续工作。

五、交互体验
一次典型操作是:先说“开始专注 25 分钟背单词”,确认眼前卡片显示了正确的任务和时间,再选择“开始”。进入专注状态后,倒计时持续更新;需要中断时选择“暂停”,准备继续时再选择“开始”。如果本轮不合适,可以“重置”回到当前设定时长。完成后,用户会听到简短提醒,并能在记录页看到这次任务。
按键操作由页面自己维护焦点。ArrowDown 和 ArrowUp 在按钮间移动,Enter 执行当前选中的操作;返回行为交给运行时处理。页面还显示最近收到的按键事件,调试时可以分辨问题出在事件没有到达,还是事件已经到达但尚未绑定到预期操作。

六、调试与验证
目前项目的调试以 模拟器为主。我用“开始专注 25 分钟背单词”和“专注 10 分钟”等输入方式,检查应用是否被正确调起、页面是否收到参数,以及倒计时和任务名是否正确显示。暂停、重置、记录写入和记录浏览也可以在模拟环境中逐项检查。为了验证结束状态和记录保存,可以在开发调试时缩短测试时长,避免每次等待完整一轮。
调试过程中有几类现象容易误判:
-
卡片状态下操作没有反应时,先确认是否已经进入全屏页面;卡片和全屏页面的交互能力并不相同。
-
语音输入没有触发页面时,使用完整自然语言句子测试,并确认模拟器已选择设备类型、麦克风处于正确状态。
-
方向键或回车失效时,先观察“最近事件”是否显示事件码,再检查当前选中项和操作绑定。
-
倒计时显示走偏时,检查是否仍由绝对时间戳计算剩余时间,而不是依赖定时器累计扣秒。
-
语音识别没有结束时,确认超时清理和
onend兜底都能把聆听状态关闭。
七、成果与复盘
这个项目已经形成一个由两页组成的 AIUI 专注计时器:主页负责承接任务和倒计时,记录页负责展示最近完成的专注;计时数据在本地保存,语音播报和焦点按键也纳入了完整交互流程。它没有试图覆盖所有效率管理需求,而是先把一个高频的小动作做清楚。
实现过程中也发现了需要继续统一的边界。AGENTS.md 写的是超过 180 分钟时按 180 分钟处理,但当前页面 onLoad 对无效或超限参数会回到 25 分钟默认值;语音分支虽然会提示“已设为 25 分钟”,目前却没有同步重置时长和倒计时显示。另外,计时正在运行时修改时长,需要同步清理旧定时器并更新结束时间戳,避免旧计时继续影响页面。下一步我会先统一这些规则,再补真机测试和上架验证。
这次开发让我更确定一件事:眼镜上的专注工具应该减少操作和视觉负担,而不是把手机里的效率面板原样搬过来。对专注时刻助手来说,任务名、剩余时间和一个清晰的开始动作已经足够。剩下的功能只有在确实让这段专注更顺畅时,才值得继续加进来。
更多推荐



所有评论(0)