Life Recorder
一款原生 iPhone 录音器与私有 Mac 接收端。iPhone 以约一分钟为单位录制 AAC 音频分块,Mac 接收端使用 Whisper 在本地转录,并维护一份带小时标记的连续 Markdown 转录文稿。音频在持久化接收并成功转录后即被删除。无需付费转录服务或云端后端。
环境要求
- 配有 Xcode 的 macOS,以及能够在 iPhone 上安装开发版构建的 Apple 开发者账号
- 运行受支持 iOS 版本的 iPhone,开发安装需开启开发者模式(Developer Mode)
- Python 3.10+、
ffmpeg、来自 whisper.cpp 的whisper-cli,以及已下载的 GGML Whisper 模型 - 手机与 Mac 之间可达的 HTTPS 通路(默认同一局域网;蜂窝网络下使用私有 VPN)
构建与安装
在 Xcode 中打开 ios/LifeRecorder.xcodeproj,选择已连接的 iPhone,选择你的 Apple 开发团队,然后 Build and Run。应用会请求麦克风和本地网络访问权限。请保持源码树中不含运行时凭据。
如需命令行构建,使用 Apple 开发团队和已连接设备的标识符:
DEVELOPER_DIR=/Applications/Xcode.app/Contents/Developer \
xcodebuild -project ios/LifeRecorder.xcodeproj -scheme LifeRecorder \
-destination 'id=YOUR_DEVICE_UDID' -allowProvisioningUpdates \
DEVELOPMENT_TEAM=YOUR_TEAM_ID build
配置 Mac 接收端
python3 receiver/setup.py \
--data-dir /absolute/private/runtime \
--model /absolute/path/to/ggml-small.bin \
--install-agent
Setup 会在数据目录中创建一个随机 bearer token、一个自签名 TLS 证书和一个私有配对页面。请仅在目标 iPhone 上打开该页面。token 存储在 iPhone 的 Keychain 和 Mac 的私有运行时中,且被 Git 忽略。接收端只绑定一个经过身份验证的上传端点,不暴露转录文稿下载或对 Mac 的任意访问。
接收端将合并后的转录文稿写入数据目录中的 life.md。该文件可以放在任何位置,包括 ~/Documents/life.md,只需移动该文件并在运行时路径留下符号链接即可。
录音行为
轻点一次录音开关即可。录音会在锁屏和使用其他应用时持续进行。如果 iPhone 重启或应用被强制退出,iOS 要求先打开一次 Life Recorder,麦克风采集才能恢复。待处理的音频会保留在手机上,直到接收端确认接收。上传任务会自动重试,过期的连接任务会被取消,因此不会无限期占用队列。
Whisper 在 Mac 上本地运行。接收端会移除常见的舞台指示标记和高度重复的幻觉噪声,然后写入一份带小时采集标记的连续文档。这只是清理,并不能保证转录完美无误。
使用 Codex 复现整套配置
随附的 SKILL.md 是一个可复用的 Codex 流程。Codex 可以检查和编辑源码,用 Xcode 构建项目,并使用 Apple CoreDevice 工具在已连接的 iPhone 上安装并启动应用。对于手机的可视化交互,它使用 CUA iPhone Mirroring 界面。Codex 不得猜测或绕过 iPhone 密码;受保护的提示、信任对话框、开发者模式以及麦克风/本地网络授权均由用户处理。Codex 绝不应打印或提交运行时 token、私钥、配对页面、音频、转录文稿、设备标识符或用户专属路径。
安全与限制
默认连接为本地局域网 HTTPS,带有证书锁定(certificate pinning)和 256 位随机 bearer token。接收端不内置公共隧道或云存储。在家庭网络之外进行蜂窝网络上传需要私有 VPN。任何能读取私有运行时目录的人都能读取 token 和转录文稿,因此请保持该目录私有,并酌情将其排除在备份或代码仓库之外。
许可证
MIT。参见 LICENSE。