From 4932ed7651a66f3a8721c8a56596e5401a63e74d Mon Sep 17 00:00:00 2001 From: long <452591453@qq.com> Date: Wed, 30 Sep 2026 14:55:25 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=E7=A7=BB=E9=99=A4=20AI=20=E8=B7=9F?= =?UTF-8?q?=E7=BB=83=E4=B8=AD=E6=B2=A1=E6=9C=89=E4=BD=9C=E7=94=A8=E7=9A=84?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 删除从未显示的 idle 手势帧(小程序包内 png 和视频用高清帧),训练分包减少 17KB - 删除骨架连线 BONES、镜像函数 mirrorPose(骨架已去掉)和未使用的 Bgm 类型 - 只给单测用的 sampleMotion 移到测试目录 - 删除训练菜单里未使用的 .menu-icon-text 样式 - 补全 history 单测数据缺少的 adviceKind 字段(严格类型检查报错) --- .../components/dev-training-entry/index.vue | 5 ---- .../pages/components/coach-sprite.vue | 4 +-- .../training/pose/__tests__/counters.test.ts | 3 +- .../training/pose/__tests__/history.test.ts | 1 + .../training/pose/__tests__/sampleMotion.ts | 15 ++++++++++ .../training/pose/__tests__/session.test.ts | 3 +- TUICallKit-Vue3/training/pose/bgm.ts | 2 -- TUICallKit-Vue3/training/pose/coachFrames.ts | 2 +- TUICallKit-Vue3/training/pose/keypoints.ts | 27 ------------------ TUICallKit-Vue3/training/pose/motions.ts | 15 +--------- .../training/static/coach/idle.png | Bin 18334 -> 0 bytes training-videos/README.md | 2 +- training-videos/public/coach/hd/idle.webp | Bin 39380 -> 0 bytes training-videos/scripts/coach_export.py | 4 +-- 14 files changed, 27 insertions(+), 56 deletions(-) create mode 100644 TUICallKit-Vue3/training/pose/__tests__/sampleMotion.ts delete mode 100644 TUICallKit-Vue3/training/static/coach/idle.png delete mode 100644 training-videos/public/coach/hd/idle.webp diff --git a/TUICallKit-Vue3/components/dev-training-entry/index.vue b/TUICallKit-Vue3/components/dev-training-entry/index.vue index 200a4ff75..5e3b3166c 100644 --- a/TUICallKit-Vue3/components/dev-training-entry/index.vue +++ b/TUICallKit-Vue3/components/dev-training-entry/index.vue @@ -477,11 +477,6 @@ $brand-light: #34d399; line-height: 1; } -.menu-icon-text { - font-size: 32rpx; - line-height: 1; -} - /* 哑铃小 icon */ .dumbbell-shape { width: 40rpx; diff --git a/TUICallKit-Vue3/training/pages/components/coach-sprite.vue b/TUICallKit-Vue3/training/pages/components/coach-sprite.vue index 9b1a1b4cb..fc0ccb3f0 100644 --- a/TUICallKit-Vue3/training/pages/components/coach-sprite.vue +++ b/TUICallKit-Vue3/training/pages/components/coach-sprite.vue @@ -41,7 +41,7 @@ * mode: * - demo 按示范节奏循环(speed 调快慢,paused 时站立待机、轻微呼吸) * - mirror 跟随用户实时动作幅度 amount / side - * - gesture 挥手 / 欢呼 / 点赞 / 待机 + * - gesture 挥手 / 欢呼 / 点赞 * 示范模式下教练每做完一次发出 rep 事件(领练模式据此计数,报数和画面同步)。 * 动作中不插入欢呼 / 弹跳:和动作节奏对不上的突变,看起来就是“闪一下”。 * @@ -67,7 +67,7 @@ const props = withDefaults( { move: 'squat', mode: 'demo', - gesture: 'idle', + gesture: 'wave', amount: 0, side: 'L', speed: 1, diff --git a/TUICallKit-Vue3/training/pose/__tests__/counters.test.ts b/TUICallKit-Vue3/training/pose/__tests__/counters.test.ts index c2a88611f..86aad2280 100644 --- a/TUICallKit-Vue3/training/pose/__tests__/counters.test.ts +++ b/TUICallKit-Vue3/training/pose/__tests__/counters.test.ts @@ -5,7 +5,8 @@ import { test } from 'node:test' import assert from 'node:assert/strict' import { createCounter, type CoachEvent } from '../counters.ts' -import { MISTAKE_POSES, MOTIONS, sampleMotion, type MoveId } from '../motions.ts' +import { MISTAKE_POSES, MOTIONS, type MoveId } from '../motions.ts' +import { sampleMotion } from './sampleMotion.ts' import type { Pose } from '../keypoints.ts' const MOVES: MoveId[] = ['squat', 'march', 'jack', 'raise'] diff --git a/TUICallKit-Vue3/training/pose/__tests__/history.test.ts b/TUICallKit-Vue3/training/pose/__tests__/history.test.ts index ad064fba3..282bcf879 100644 --- a/TUICallKit-Vue3/training/pose/__tests__/history.test.ts +++ b/TUICallKit-Vue3/training/pose/__tests__/history.test.ts @@ -19,6 +19,7 @@ const summary = (reps: number): SessionSummary => ({ stars: 3, scores: [], advice: '', + adviceKind: 'praise', }) const DAY = 86400000 diff --git a/TUICallKit-Vue3/training/pose/__tests__/sampleMotion.ts b/TUICallKit-Vue3/training/pose/__tests__/sampleMotion.ts new file mode 100644 index 000000000..6c1d7dcb2 --- /dev/null +++ b/TUICallKit-Vue3/training/pose/__tests__/sampleMotion.ts @@ -0,0 +1,15 @@ +/** 单测辅助:把示范动作按时间采样成 Pose 序列(文件名不带 .test,不会被当成用例执行) */ +import type { Pose } from '../keypoints.ts' +import { MOTIONS, type MoveId } from '../motions.ts' + +export function sampleMotion(id: MoveId, seconds: number, fps = 12, startMs = 0): Pose[] { + const spec = MOTIONS[id] + const frames: Pose[] = [] + const n = Math.round(seconds * fps) + for (let i = 0; i < n; i++) { + const tSec = i / fps + const points = spec.poseAt(tSec / spec.cycleSeconds) + frames.push({ points, scores: points.map(() => 0.9), t: startMs + tSec * 1000 }) + } + return frames +} diff --git a/TUICallKit-Vue3/training/pose/__tests__/session.test.ts b/TUICallKit-Vue3/training/pose/__tests__/session.test.ts index 35ac2cc78..1bb5381d2 100644 --- a/TUICallKit-Vue3/training/pose/__tests__/session.test.ts +++ b/TUICallKit-Vue3/training/pose/__tests__/session.test.ts @@ -1,7 +1,8 @@ import { test } from 'node:test' import assert from 'node:assert/strict' import { TrainingSession, summarize, type SessionEvent } from '../session.ts' -import { MOTIONS, sampleMotion } from '../motions.ts' +import { MOTIONS } from '../motions.ts' +import { sampleMotion } from './sampleMotion.ts' import type { Pose } from '../keypoints.ts' const standing = (t: number): Pose => { diff --git a/TUICallKit-Vue3/training/pose/bgm.ts b/TUICallKit-Vue3/training/pose/bgm.ts index f722b2578..2d677d5d6 100644 --- a/TUICallKit-Vue3/training/pose/bgm.ts +++ b/TUICallKit-Vue3/training/pose/bgm.ts @@ -177,5 +177,3 @@ export function createBgm(opts: BgmOptions) { }, } } - -export type Bgm = ReturnType diff --git a/TUICallKit-Vue3/training/pose/coachFrames.ts b/TUICallKit-Vue3/training/pose/coachFrames.ts index 0f9146dec..5bcf5c45a 100644 --- a/TUICallKit-Vue3/training/pose/coachFrames.ts +++ b/TUICallKit-Vue3/training/pose/coachFrames.ts @@ -8,7 +8,7 @@ import type { MoveId, Side } from './motions.ts' import { COACH_HD, COACH_SEQUENCES, type CoachSequence } from './coachSequences.ts' -export type Gesture = 'idle' | 'wave' | 'cheer' | 'thumbs' +export type Gesture = 'wave' | 'cheer' | 'thumbs' const MOVE_SEQUENCE: Record> = { squat: { L: 'squat', R: 'squat' }, diff --git a/TUICallKit-Vue3/training/pose/keypoints.ts b/TUICallKit-Vue3/training/pose/keypoints.ts index df73c502d..35455a5b7 100644 --- a/TUICallKit-Vue3/training/pose/keypoints.ts +++ b/TUICallKit-Vue3/training/pose/keypoints.ts @@ -57,28 +57,6 @@ export const KP = { export const KEYPOINT_COUNT = 23 -/** 画骨架用的连线(左右成对,便于左右分色) */ -export const BONES: Array<[number, number]> = [ - [KP.L_SHOULDER, KP.R_SHOULDER], - [KP.L_HIP, KP.R_HIP], - [KP.L_SHOULDER, KP.L_HIP], - [KP.R_SHOULDER, KP.R_HIP], - [KP.L_SHOULDER, KP.L_ELBOW], - [KP.L_ELBOW, KP.L_WRIST], - [KP.L_WRIST, KP.L_HAND], - [KP.R_SHOULDER, KP.R_ELBOW], - [KP.R_ELBOW, KP.R_WRIST], - [KP.R_WRIST, KP.R_HAND], - [KP.L_HIP, KP.L_KNEE], - [KP.L_KNEE, KP.L_ANKLE], - [KP.L_ANKLE, KP.L_FOOT_OUT], - [KP.L_ANKLE, KP.L_FOOT_IN], - [KP.R_HIP, KP.R_KNEE], - [KP.R_KNEE, KP.R_ANKLE], - [KP.R_ANKLE, KP.R_FOOT_OUT], - [KP.R_ANKLE, KP.R_FOOT_IN], -] - /** 判定“全身入镜”需要看得到的点 */ export const FULL_BODY_POINTS = [ KP.NOSE, @@ -179,11 +157,6 @@ export function smoothPose(prev: Pose | null, next: Pose, alpha = 0.55): Pose { return { points, scores, t: next.t, aspect: next.aspect } } -/** 水平镜像(前置摄像头预览是镜像的) */ -export function mirrorPose(pose: Pose): Pose { - return { ...pose, points: pose.points.map((p) => ({ x: 1 - p.x, y: p.y })) } -} - type RawPoint = { x: number; y: number } | [number, number] /** diff --git a/TUICallKit-Vue3/training/pose/motions.ts b/TUICallKit-Vue3/training/pose/motions.ts index 7079bfc85..9c6f127db 100644 --- a/TUICallKit-Vue3/training/pose/motions.ts +++ b/TUICallKit-Vue3/training/pose/motions.ts @@ -8,7 +8,7 @@ * 坐标系与 VisionKit 一致:x/y 归一化到 [0,1],y 向下; * 被拍摄者的“左侧”在画面右侧(未镜像的正面视角)。 */ -import { KEYPOINT_COUNT, type Point, type Pose } from './keypoints.ts' +import { KEYPOINT_COUNT, type Point } from './keypoints.ts' export type MoveId = 'squat' | 'march' | 'jack' | 'raise' @@ -310,19 +310,6 @@ export const MISTAKE_POSES: Record Point[]> = { }, } -/** 把示范动作按时间采样成 Pose 序列(单测用) */ -export function sampleMotion(id: MoveId, seconds: number, fps = 12, startMs = 0): Pose[] { - const spec = MOTIONS[id] - const frames: Pose[] = [] - const n = Math.round(seconds * fps) - for (let i = 0; i < n; i++) { - const tSec = i / fps - const points = spec.poseAt(tSec / spec.cycleSeconds) - frames.push({ points, scores: points.map(() => 0.9), t: startMs + tSec * 1000 }) - } - return frames -} - /** * 示范动作“完成一次”的检测:幅度到过顶点、再回落到起始附近,算完成一次。 * 领练模式按教练动画计数,报数和画面同步(按时钟计数会比教练做完晚半拍)。 diff --git a/TUICallKit-Vue3/training/static/coach/idle.png b/TUICallKit-Vue3/training/static/coach/idle.png deleted file mode 100644 index b96165583364452b361657193850f03f4e016ae4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18334 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 X-`Vc~+?!+CJu!<4kJ~2*BbELK1$2-V diff --git a/training-videos/README.md b/training-videos/README.md index ae8e79988..a4e93202c 100644 --- a/training-videos/README.md +++ b/training-videos/README.md @@ -36,7 +36,7 @@ AI 跟练的素材流水线:教练“小甄”动作帧(AI 生成连续动 - Codex 只能出约 1.5MP 的图,人物 300~450px 高:切帧时先 4 倍超分再缩到主帧尺寸(站姿身高 720px) - 设定稿里手臂偶尔碰到隔壁或上一行的人物,切帧会按格子拆开;脚踝以下出现的肤色像素(别人的指尖)会被去掉 - 生成结果有随机性:先看 `work/preview/contact_*.jpg`,不满意就重新生成那一张;`coach_frames.py` 的 `MOVES` 可指定取哪些人物 -- 手势帧(idle / wave / cheer / thumbs)和错误示范帧(wrong_*)不随动作帧重新生成,导出时沿用 `public/coach/hd` 里已有的 +- 手势帧(wave / cheer / thumbs)和错误示范帧(wrong_*)不随动作帧重新生成,导出时沿用 `public/coach/hd` 里已有的 - 没有 `work/` 时,可用 `python3 scripts/coach_export.py --from-hd` 从高清帧重新导出小程序帧 ## 高清帧(COS) diff --git a/training-videos/public/coach/hd/idle.webp b/training-videos/public/coach/hd/idle.webp deleted file mode 100644 index 961371dcb42aad62d5ef51eb1b8e7c8ef915d891..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 39380 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 CVsgp= diff --git a/training-videos/scripts/coach_export.py b/training-videos/scripts/coach_export.py index 09466fa5c..e7b874494 100644 --- a/training-videos/scripts/coach_export.py +++ b/training-videos/scripts/coach_export.py @@ -32,8 +32,8 @@ CDN_MARGIN = 12 # 每个动作的帧名前缀:同一个动作的所有帧共用一个裁切框,帧与帧之间位置不变 MOVE_PREFIX = {"squat": ("sq_",), "raise": ("ra_",), "jack": ("jl_", "jr_"), "march": ("ml_", "mr_")} -STATIC_FRAMES = ["idle", "wave", "cheer", "thumbs", "wrong_squat", "wrong_march", "wrong_jack", "wrong_raise"] -MINI_STATIC = ["idle", "wave", "cheer", "thumbs"] +STATIC_FRAMES = ["wave", "cheer", "thumbs", "wrong_squat", "wrong_march", "wrong_jack", "wrong_raise"] +MINI_STATIC = ["wave", "cheer", "thumbs"] SEQUENCE_ORDER = ["squat", "raise", "jack_l", "jack_r", "march_l", "march_r"]