• 微信聊天本地化——EnMicroMsg.db 是 SQLCipher 加密的,过去靠 Mac 解密推 wx_enroll,现在端上直接读:
    - key 纯端上可推导(真机验证,无需 Frida):MD5("1234567890ABCDEF" + uin)[:7]
      imei 用微信默认值(现代 Android 读不到真 IMEI 的回退,稳定);uin 从 shared_prefs last_login_uin 读
    - WeChatChatImporter:su --mount-master 拷 EnMicroMsg.db + 读 uin → 算 key → SQLCipher 打开
      (cipher_compatibility=1, cipher_page_size=1024) → 读 message 表 type=1 文本,按 talker 取目标 wxid
    - 依赖:net.zetetic:android-database-sqlcipher:4.5.4
    - 接线:单人「⬇下载图片」顺带解密该人聊天;「🔄更新」一次性解密整库读所有 wxid(避免逐人重复解密)
      聊天写 wechat_messages(按 talker 先清再灌,幂等);档案页「聊天」tab 直接显示
    - 真机验证:读到与某联系人的聊天记录
    
    Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
    yibo authored
     
    Browse File »

  • 以「人」为中心融合身份的相册基础(声纹那套的人脸版):
    - data:persons/photos/faces 三表 + 增量迁移 v3→v4(DDL 对过 Room,真机零数据损失)
    - vision/FaceEngine:ML Kit 检测+5点 → 相似变换对齐 → TFLite MobileFaceNet 512维
      embedding(同人 0.976/异人 0.127,embed 44ms)。**不用 onnxruntime-android**——
      它和 sherpa 自带 libonnxruntime.so(自定义符号版本)无法共存,会弄坏音频
    - vision/VisionClient:经 llama-swap 8080 的 vl 端点(Qwen2.5-VL-3B)出场景描述,只描场景不报人名
    - vision/PhotoProcessor:人脸+embedding+VL+EXIF → 更新 photos 行 + 写 faces + 匹配 Person
    - vision/PhotoWorker + PhotoScheduler:导入只瞬时登记,重活交后台 worker 定时/闲时处理
      (15min periodic + 导入触发 runNow,单轮 7min 预算,防并发),不阻塞导入
    - vision/FaceMatcher:标注一张脸 → 回填其它照片同一人(同声纹回填)
    - ImageUtil:EXIF 时间/GPS、按方向解码、降 512px 喂 VL、embedding 打包
    - 模型 w600k_mbf.tflite(6.5MB) 进 assets(实测还原 onnx cos=1.0)
    
    Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
    yibo authored
     
    Browse File »

  • 设备侧 hermes api_server platform 配置(HANDOFF §五新增详细步骤):
    - ~/.hermes/.env 加 API_SERVER_ENABLED + HOST + PORT + KEY + MODEL_NAME
    - pip install anthropic(kimi-for-coding 走 Anthropic-compat 协议层)
    - setsid + disown 启动避免 adb shell 退出时 SIGTERM 杀掉 gateway
    
    App 侧:
    - BuildConfig 增加 HERMES_API_URL / HERMES_API_KEY / HERMES_MODEL
    - keys.properties.example 同步样本
    - HermesClient.kt: minimal OkHttp 客户端,POST /v1/chat/completions +
      Bearer auth;JSONObject 拼请求 / 解 choices[0].message.content
    - SummaryWorker.kt (CoroutineWorker):
      - 滑动 1h 时间窗;speech < 60s 直接 skip
      - 拉 Transcript + speaker name 拼用户提示
      - system prompt 要求 markdown 出「主题概括 / 关键要点 / 人物 / 地点 / 待办」
      - 写 Summary 表(windowStartTs, windowEndTs, markdown, model)
    - SummaryScheduler.kt: enqueueUniquePeriodicWork 每小时(KEEP)+
      OneTimeWorkRequest(按钮触发)
    - LifelogApp.onCreate 启动时 schedulePeriodic
    - MainActivity: 新「纪要」section + 「现在跑一次」按钮 + SummaryCard 列表
    - AndroidManifest android:networkSecurityConfig 开 127.0.0.1 + localhost
      cleartext 豁免(OkHttp 默认禁 HTTP,loopback 也禁)
    
    实测:60min 窗 / 172 段 / 709s 语音 / Kimi 14.3k prompt token / 649
    completion → 一份 markdown 纪要正确分辨出「电影解说 + 修仙网文」两段
    内容,按要求列出主题/要点/人物/地点/待办 5 个 section。
    
    HANDOFF.md §五 LLM 纪要 worker 移到「已完成」;下一档是存储 TTL /
    设置页 / 多 anchor 平均 / lemonPCRM 回链 / hermes 自启。
    
    Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
    yibo authored
     
    Browse File »

  • Pixel 8 Pro 上的本地 lifelog 应用,v1 核心闭环:
    
    - 前台服务 (foregroundServiceType=microphone) + AudioRecord 16k mono PCM
    - Silero VAD on-device 切段(500ms 静音切、300ms 最短、30s 强切)
    - sherpa-onnx + paraformer-zh int8 本地 ASR
      Tensor G3 实测 ~25× realtime,<200ms 处理 1-10s 段
      whisper-small 0.6× 跑不动,paraformer 是甜点选型
    - Room (Segment + Transcript + Summary) + Compose 时间轴 LazyColumn UI
    - 232 MB 模型首次启动从 hf-mirror.com 下载到 app filesDir
    - 讯飞 中文识别大模型 WebSocket 客户端备用(云复核 fallback)
    
    依赖:
    - sherpa-onnx v1.13.2 Android jniLibs (arm64-v8a, ~34 MB)
    - Silero VAD ONNX (~629 KB),sample.wav (3 MB) 内嵌资源
    - AGP 8.7.3 / Kotlin 2.1 / Compose BOM 2024.12.01 / Room 2.6.1
    
    后续待办(按用户语音里提到的优先级):声纹识别 / Opus 编码 /
    FTS5 中文搜索 / hermes-Kimi 纪要 worker。
    
    Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
    yibo authored
     
    Browse File »