• 把「人物」做成微信通讯录样式 + 联系人档案页(以人为中心聚合的地基)。
    
    - data:Person 加微信资料字段(nickname/remark/alias/pinyin/pyInitial/phone) + 迁移 v5→v6;
      PersonDao observe(id) / updateContactInfo;SegmentDao observeBySpeaker(声纹→录音)
    - WeChatEnrollWorker 重写两段:Pass1 给**全部真人联系人**upsert 资料(通讯录全员可见),
      Pass2 仅对有脸头像建 faceEmbedding 锚点。幂等
    - ContactList:搜索 + 拼音 A–Z 粘性分组 + 头像 + 人脸/声纹标,点进档案页
    - PersonProfileScreen:头像 + 微信名/备注/微信号 + 声纹绑定 + 关联照片列表 + 录音列表
      (录音 = segments.speakerId=person.voiceSpeakerId,绑声纹后出现)
    - 标注对话框改可滚动/搜索/固定底部按钮(联系人多时不再卡死)
    - extract 脚本补全字段(nickname/remark/alias/pinyin)
    
    实测:4357 真人联系人入通讯录(1339 人脸锚点),A–Z 分组 + 头像 + 档案页正常。
    
    Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
    yibo authored
     
    Browse File »

  • 把微信联系人头像建成人脸锚点,照片处理时自动认出"这是谁",标注时直接带名字。
    
    - data:Person 加 faceEmbedding 锚点字段 + 迁移 v4→v5(ALTER 加 BLOB 列,
      DDL 对过 Room;真机迁移零数据损失);PersonDao anchors/getByContactRef
    - FaceMatcher:gallery 统一 = 人物锚点(头像) + 已标注脸样本;match() 共享余弦匹配;
      PhotoProcessor 改用统一 gallery
    - WeChatEnrollWorker:读 filesDir/wx_enroll/(enroll.json + 头像) → 对每张头像跑
      **端上 FaceEngine**(必须同引擎才能跟照片人脸比),恰 1 脸就建 Person(name,
      contactRef=wechat:wxid, avatarPath, faceEmbedding)。幂等、单轮预算 8min、retry 续
    - UI:人物页「从微信导入联系人」按钮;人物卡片标注「微信/声纹」来源
    - server/services/wechat/extract-wechat-avatars.py:Mac 侧提取脚本
      (sqlcipher 解密 EnMicroMsg.db → rcontact⨝img_flag 筛真人 → 下载头像)
    
    实测:4338 真人联系人,头像有脸覆盖率 41%(1796/4337),端上 90s 建 284 锚点(继续后台跑)。
    头像/姓名属敏感 PII,存 _wx_enroll/ 已 gitignore。
    
    Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
    yibo authored
     
    Browse File »