feat: 语音播报契约与播放模块 + 相册选图 + 报告历史存储/服务端落盘

- docs/语音播报内容设计文档_V1.0.md:14 条播报文案/触发时机/文件名契约;格式定 MP3(iOS Safari/微信不支持 OGG);播放层 WebAudio 单通道、4s 去重、manifest.json 清单制(文件待生成,缺失静默跳过)
- 相册:相机页「相册」按钮接系统图库(#album-file 不带 capture),与实拍同管线压 1280 推进,替换 Toast 占位
- 报告历史:检测成功按「检测」为单位存 localStorage(juzi.reports.v1,5 条上限)——三张照片+档案+评分数据+marks 坐标,不含 face_maps 图层;报告页「历史」列表可回看/删除/清空,回看时坐标叠加类图仍可用
- server.js:每次检测完整原始返回落盘 h5/data/results/(复核/真值,已 .gitignore)
- e2e:新增 E5(相册三连拍)/E6(存储与历史回看)断言,E3 增落盘校验;全量绿(含真实 API 闭环)
This commit is contained in:
Ubuntu
2026-09-27 00:05:34 +08:00
parent f8de5f881a
commit cc83987043
5 changed files with 161 additions and 2 deletions
+7 -2
View File
@@ -59,6 +59,8 @@ node server.js # 默认 8080,可用 PORT=xxx 修改
- **倒计时自动拍**:姿态 ok 连续维持 ≥600ms 进入 3s 倒计时(中央大数字,轮廓保持绿色);倒计时中任一帧不 ok 立即取消并回到对应提示。倒计时结束进入白屏补光。
- **白屏补光**:全屏纯白覆盖层瞬间点亮,~300ms 后抓全分辨率帧(镜像 + 最长边 1280 JPEG),保持 ~300ms 再淡出(总 600–900ms),同步 `navigator.vibrate(30)`。
- **手动兜底**:快门任何时刻可拍当前步(同样走白屏补光),不依赖检测;face-api/模型加载失败 → toast"自动识别不可用,已切换手动拍摄",全程手动。系统相机降级模式(getUserMedia 不可用/被拒)维持原样:无检测、无补光。
- **相册选图**:相机页「相册」按钮可选当前步的图片(任何模式下可用),与实拍同管线(压 1280 → 推进流程)。
- **语音播报**:步骤引导/姿态提示/倒计时/拍摄完成/分析中/失败共 14 条,文案与文件名契约见 `../docs/语音播报内容设计文档_V1.0.md`。WebAudio 单通道播放、同条 4s 去重;`assets/voice/manifest.json` 清单制,**语音文件待生成**——清单未提供时全部静默跳过。
- **无进展提示**:单步 12s 未触发倒计时,底部浮出"识别不到?可点下方快门手动拍摄"(不阻塞流程)。
- **资源管理**:离开拍照页(cam-back/完成)停止检测循环、清全部定时器、释放摄像头;`camSeq`(流程)/`camSeqCam`(相机)双令牌防竞态;face-api 模型只加载一次(缓存 promise,失败后下次进入重试)。
@@ -77,7 +79,9 @@ node server.js # 默认 8080,可用 PORT=xxx 修改
- 报告底部:降级标注(`vm.notes` 非空才展示,如下颌线未参与评分)、综合分析(`vm.summary`)、生活方式建议(`vm.lifestyle`)、精华推荐卡(`vm.essence` + 触发判据);
- 近期优先关注 = 最差维度(`vm.focus`);6 分类各配检测可视化图:轮廓=正脸实拍、皱纹=正脸压暗+`texture_enhanced_lines` 皱纹增强线(线图层几乎全透明,直挂白底不可读,故与压暗沉脸合成)、光滑=正脸+色斑/痣/痤疮标记叠加、肤色=`brown_area` 色沉图、敏感=`red_area` 红区图、痘痘=正脸+闭口粉刺/痤疮标记叠加(marks 按原像素坐标叠加到正脸实拍)。
5. 真值回归:`node h5/test/regression.js` 以 `docs/皮肤检测测试结果_三视图_20260926.xlsx`(sheet「三视图检测汇总」,数据第 3/4 行=案例1/案例2)两组三视图真值对照评分引擎输出。
6. 检测失败按服务端 message 提示并退回档案页。
6. **报告历史**:检测成功后按「检测」为单位存入 localStorage(`juzi.reports.v1`,上限 5 条,超配额逐条淘汰)——含三张照片、档案、全部评分数据与 marks 坐标,**不含 face_maps 整幅图层**(体积原因;回看时皱纹/肤色/敏感图降级为占位,光滑/痘痘标记叠加仍可用)。报告页导航栏「历史」进入列表,可回看/删除单条/清空。
7. **原始返回落盘**:服务端每次检测成功后把 Face++ 完整原始返回写入 `h5/data/results/<时间戳>-<request_id>.json`(复核/真值用,已 .gitignore;写盘失败不影响响应)。
8. 检测失败按服务端 message 提示并退回档案页。
## 部署
@@ -123,7 +127,8 @@ server {
## 已知占位清单
- 产品图(prod-1.jpg)为设计稿素材;检测图已替换为用户实拍。
- 相册、切换镜头、「了解更多」为开发中占位(Toast 提示)。
- **语音文件待生成**:播报文案/文件名/格式已定(`../docs/语音播报内容设计文档_V1.0.md`),生成后放入 `assets/voice/` 并更新 `manifest.json` 即生效。
- 切换镜头、「了解更多」为开发中占位(Toast 提示)。
- **侧脸角度符号与 yaw 系数需真机校准**:`head-pose.js` 的 `YAW_COEFF`/pitch 映射与 `mirrored` 符号在不同机型/镜像策略下可能相反,上线前用真机样本回归(校准接口:调用方 `mirrored` 标志与 `HeadPose.config`)。
## 技术说明
Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB