From e3fe9a8e7b8c442fb4212339fa82feb9889e44a4 Mon Sep 17 00:00:00 2001 From: cryptocommuniums-afk Date: Sun, 15 Mar 2026 22:32:09 +0800 Subject: [PATCH] Add free full-body 3D live camera avatar examples --- .../avatars/opensource3d/ATTRIBUTION.txt | 22 ++ .../avatars/opensource3d/beach-king.webp | Bin 0 -> 18868 bytes client/public/avatars/opensource3d/jenny.webp | Bin 0 -> 27116 bytes .../public/avatars/opensource3d/juanita.webp | Bin 0 -> 20352 bytes .../public/avatars/opensource3d/sport-tv.webp | Bin 0 -> 19684 bytes client/src/lib/liveCamera.test.ts | 12 + client/src/lib/liveCamera.ts | 211 ++++++++++++++++-- client/src/pages/LiveCamera.tsx | 107 ++++++++- docs/CHANGELOG.md | 2 + 9 files changed, 326 insertions(+), 28 deletions(-) create mode 100644 client/public/avatars/opensource3d/ATTRIBUTION.txt create mode 100644 client/public/avatars/opensource3d/beach-king.webp create mode 100644 client/public/avatars/opensource3d/jenny.webp create mode 100644 client/public/avatars/opensource3d/juanita.webp create mode 100644 client/public/avatars/opensource3d/sport-tv.webp diff --git a/client/public/avatars/opensource3d/ATTRIBUTION.txt b/client/public/avatars/opensource3d/ATTRIBUTION.txt new file mode 100644 index 0000000..b0ee749 --- /dev/null +++ b/client/public/avatars/opensource3d/ATTRIBUTION.txt @@ -0,0 +1,22 @@ +3D full-body avatar preview cutouts in this folder are derived from the Open Source Avatars registry: +https://github.com/ToxSam/open-source-avatars + +Registry summary: +- Registry metadata/docs license: CC0 +- Individual avatars used here: CC0 from collection "100Avatars R3" + +Integrated examples: +- BeachKing + Preview source: https://arweave.net/EGCdxkfTjjmNS4RGiAT_or17mG3717qnZ7R1EnZxLg8 + Model source: https://arweave.net/uKhDMselhdUyeJKjelpuVsL8s-a9v_Wqq75TQfCfnos +- Jenny + Preview source: https://arweave.net/4a6_AfH-PHvFMXqja7V42pF9hCn9ceIj5z5NAsK2SSs + Model source: https://arweave.net/kgTirc4OvUWbJhIKC2CB3_pYsYuB62KTj90IdE8s3sk +- Juanita + Preview source: https://arweave.net/5RHeIXD9fezkpuFJS1TRtGkNIVfTKZP7Rkmh9pDmaTs + Model source: https://arweave.net/nyMyZZx5lN2DXsmBgbGQSnt3PuXYN7AAjz9QJrjitLo +- SportTV + Preview source: https://arweave.net/_Qic8KV5P5mo5wJ2N3lbqX0iGVxtVDn4CxCUiM5-Qcg + Model source: https://arweave.net/ISYr7xBXT_s4tLddbhFB3PpUhWg-H_BYs2UZhVLF1hA + +Local files are optimized transparent WebP derivatives for faster in-browser overlay rendering. diff --git a/client/public/avatars/opensource3d/beach-king.webp b/client/public/avatars/opensource3d/beach-king.webp new file mode 100644 index 0000000000000000000000000000000000000000..62a03b6fedb661198fc79026b87d821eaee52ced GIT binary patch literal 18868 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

q_w4Zm!-(5uGL|DI+kVYFTBv@C1$1Iwv(VJgqG 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 literal 0 HcmV?d00001 diff --git a/client/public/avatars/opensource3d/sport-tv.webp b/client/public/avatars/opensource3d/sport-tv.webp new file mode 100644 index 0000000000000000000000000000000000000000..831ca62e6b1166b7dc29c7ef38434887f2a95a89 GIT binary patch literal 19684 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 literal 0 HcmV?d00001 diff --git a/client/src/lib/liveCamera.test.ts b/client/src/lib/liveCamera.test.ts index 9600146..90c517b 100644 --- a/client/src/lib/liveCamera.test.ts +++ b/client/src/lib/liveCamera.test.ts @@ -1,8 +1,10 @@ import { describe, expect, it } from "vitest"; import { ACTION_WINDOW_FRAMES, + AVATAR_PRESETS, createStableActionState, getAvatarAnchors, + getAvatarPreset, resolveAvatarKeyFromPrompt, stabilizeActionStream, type FrameActionSample, @@ -92,9 +94,19 @@ describe("live camera avatar helpers", () => { expect(resolveAvatarKeyFromPrompt("dog mascot", "gorilla")).toBe("dog"); expect(resolveAvatarKeyFromPrompt("狐狸风格", "gorilla")).toBe("fox"); expect(resolveAvatarKeyFromPrompt("兔子教练", "gorilla")).toBe("rabbit"); + expect(resolveAvatarKeyFromPrompt("BeachKing 3D 替身", "gorilla")).toBe("beachKing"); + expect(resolveAvatarKeyFromPrompt("Juanita avatar", "gorilla")).toBe("juanita3d"); expect(resolveAvatarKeyFromPrompt("", "pig")).toBe("pig"); }); + it("exposes full-body 3d avatar examples with CC0 metadata", () => { + const presets = AVATAR_PRESETS.filter((preset) => preset.category === "full-body-3d"); + + expect(presets).toHaveLength(4); + expect(presets.every((preset) => preset.license === "CC0")).toBe(true); + expect(getAvatarPreset("sportTv")?.modelUrl).toContain("arweave.net"); + }); + it("builds avatar anchors from pose landmarks", () => { const landmarks = Array.from({ length: 33 }, () => ({ x: 0.5, y: 0.5, visibility: 0.95 })); landmarks[0] = { x: 0.5, y: 0.16, visibility: 0.99 }; diff --git a/client/src/lib/liveCamera.ts b/client/src/lib/liveCamera.ts index d75a4b2..8234075 100644 --- a/client/src/lib/liveCamera.ts +++ b/client/src/lib/liveCamera.ts @@ -16,7 +16,25 @@ export type AvatarKey = | "panda" | "lion" | "tiger" - | "rabbit"; + | "rabbit" + | "beachKing" + | "jenny3d" + | "juanita3d" + | "sportTv"; + +export type AvatarCategory = "animal" | "full-body-3d"; + +export type AvatarPreset = { + key: AvatarKey; + label: string; + category: AvatarCategory; + keywords: string[]; + description?: string; + collection?: string; + license?: string; + sourceUrl?: string; + modelUrl?: string; +}; export type AvatarRenderState = { enabled: boolean; @@ -84,6 +102,9 @@ type AvatarVisualSpec = { bodyFill: string; limbStroke: string; glow: string; + renderMode: "badge" | "full-figure"; + figureScale?: number; + figureOffsetY?: number; }; const ACTIONS: LiveActionType[] = ["forehand", "backhand", "serve", "volley", "overhead", "slice", "lob", "unknown"]; @@ -96,17 +117,61 @@ const ACTION_UNKNOWN_MIN_MS = 900; const ACTION_LOCK_IN_WINDOWS = 2; const ACTION_SWITCH_DELTA = 0.12; -export const AVATAR_PRESETS: Array<{ key: AvatarKey; label: string; keywords: string[] }> = [ - { key: "gorilla", label: "猩猩", keywords: ["gorilla", "ape", "猩猩", "猩", "大猩猩"] }, - { key: "monkey", label: "猴子", keywords: ["monkey", "ape", "猴", "猴子"] }, - { key: "dog", label: "狗", keywords: ["dog", "puppy", "犬", "狗", "小狗"] }, - { key: "pig", label: "猪", keywords: ["pig", "猪", "小猪"] }, - { key: "cat", label: "猫", keywords: ["cat", "kitty", "猫", "小猫"] }, - { key: "fox", label: "狐狸", keywords: ["fox", "狐狸"] }, - { key: "panda", label: "熊猫", keywords: ["panda", "熊猫"] }, - { key: "lion", label: "狮子", keywords: ["lion", "狮子"] }, - { key: "tiger", label: "老虎", keywords: ["tiger", "虎", "老虎"] }, - { key: "rabbit", label: "兔子", keywords: ["rabbit", "bunny", "兔", "兔子"] }, +export const AVATAR_PRESETS: AvatarPreset[] = [ + { key: "gorilla", label: "猩猩", category: "animal", keywords: ["gorilla", "ape", "猩猩", "猩", "大猩猩"], description: "轻量动物替身,移动端负担最低。" }, + { key: "monkey", label: "猴子", category: "animal", keywords: ["monkey", "ape", "猴", "猴子"], description: "轻量动物替身,适合快速练习。" }, + { key: "dog", label: "狗", category: "animal", keywords: ["dog", "puppy", "犬", "狗", "小狗"], description: "轻量动物替身,覆盖速度快。" }, + { key: "pig", label: "猪", category: "animal", keywords: ["pig", "猪", "小猪"], description: "轻量动物替身,适合低端设备。" }, + { key: "cat", label: "猫", category: "animal", keywords: ["cat", "kitty", "猫", "小猫"], description: "轻量动物替身,适合低码率录制。" }, + { key: "fox", label: "狐狸", category: "animal", keywords: ["fox", "狐狸"], description: "轻量动物替身,动作切换反馈清晰。" }, + { key: "panda", label: "熊猫", category: "animal", keywords: ["panda", "熊猫"], description: "轻量动物替身,适合直播预览。" }, + { key: "lion", label: "狮子", category: "animal", keywords: ["lion", "狮子"], description: "轻量动物替身,轮廓感更强。" }, + { key: "tiger", label: "老虎", category: "animal", keywords: ["tiger", "虎", "老虎"], description: "轻量动物替身,适合训练 PK。" }, + { key: "rabbit", label: "兔子", category: "animal", keywords: ["rabbit", "bunny", "兔", "兔子"], description: "轻量动物替身,适合日常训练。" }, + { + key: "beachKing", + label: "BeachKing", + category: "full-body-3d", + keywords: ["beachking", "beach king", "海滩王", "3d beach", "beach avatar"], + description: "CC0 全身 3D 示例,适合覆盖竖屏全身站姿。", + collection: "100Avatars R3", + license: "CC0", + sourceUrl: "https://github.com/ToxSam/open-source-avatars", + modelUrl: "https://arweave.net/uKhDMselhdUyeJKjelpuVsL8s-a9v_Wqq75TQfCfnos", + }, + { + key: "jenny3d", + label: "Jenny", + category: "full-body-3d", + keywords: ["jenny", "frog coach", "青蛙教练", "3d jenny", "jenny avatar"], + description: "CC0 全身 3D 示例,适合想要更完整人物轮廓时使用。", + collection: "100Avatars R3", + license: "CC0", + sourceUrl: "https://github.com/ToxSam/open-source-avatars", + modelUrl: "https://arweave.net/kgTirc4OvUWbJhIKC2CB3_pYsYuB62KTj90IdE8s3sk", + }, + { + key: "juanita3d", + label: "Juanita", + category: "full-body-3d", + keywords: ["juanita", "粉发学员", "pink avatar", "3d juanita", "juanita avatar"], + description: "CC0 全身 3D 示例,适合教学演示和移动端预览。", + collection: "100Avatars R3", + license: "CC0", + sourceUrl: "https://github.com/ToxSam/open-source-avatars", + modelUrl: "https://arweave.net/nyMyZZx5lN2DXsmBgbGQSnt3PuXYN7AAjz9QJrjitLo", + }, + { + key: "sportTv", + label: "SportTV", + category: "full-body-3d", + keywords: ["sporttv", "sport tv", "屏幕街头", "tv avatar", "hoodie avatar"], + description: "CC0 全身 3D 示例,适合训练空间较宽的画面。", + collection: "100Avatars R3", + license: "CC0", + sourceUrl: "https://github.com/ToxSam/open-source-avatars", + modelUrl: "https://arweave.net/ISYr7xBXT_s4tLddbhFB3PpUhWg-H_BYs2UZhVLF1hA", + }, ]; const AVATAR_VISUALS: Record = { @@ -115,65 +180,115 @@ const AVATAR_VISUALS: Record = { bodyFill: "rgba(39,39,42,0.95)", limbStroke: "rgba(63,63,70,0.92)", glow: "rgba(161,161,170,0.32)", + renderMode: "badge", }, monkey: { src: "/avatars/twemoji/monkey.svg", bodyFill: "rgba(120,53,15,0.95)", limbStroke: "rgba(146,64,14,0.9)", glow: "rgba(180,83,9,0.3)", + renderMode: "badge", }, dog: { src: "/avatars/twemoji/dog.svg", bodyFill: "rgba(180,83,9,0.93)", limbStroke: "rgba(180,83,9,0.88)", glow: "rgba(217,119,6,0.26)", + renderMode: "badge", }, pig: { src: "/avatars/twemoji/pig.svg", bodyFill: "rgba(244,114,182,0.92)", limbStroke: "rgba(244,114,182,0.86)", glow: "rgba(244,114,182,0.28)", + renderMode: "badge", }, cat: { src: "/avatars/twemoji/cat.svg", bodyFill: "rgba(245,158,11,0.92)", limbStroke: "rgba(217,119,6,0.88)", glow: "rgba(251,191,36,0.28)", + renderMode: "badge", }, fox: { src: "/avatars/twemoji/fox.svg", bodyFill: "rgba(234,88,12,0.93)", limbStroke: "rgba(194,65,12,0.9)", glow: "rgba(251,146,60,0.3)", + renderMode: "badge", }, panda: { src: "/avatars/twemoji/panda.svg", bodyFill: "rgba(82,82,91,0.92)", limbStroke: "rgba(39,39,42,0.9)", glow: "rgba(228,228,231,0.28)", + renderMode: "badge", }, lion: { src: "/avatars/twemoji/lion.svg", bodyFill: "rgba(202,138,4,0.92)", limbStroke: "rgba(161,98,7,0.9)", glow: "rgba(250,204,21,0.28)", + renderMode: "badge", }, tiger: { src: "/avatars/twemoji/tiger.svg", bodyFill: "rgba(249,115,22,0.94)", limbStroke: "rgba(194,65,12,0.9)", glow: "rgba(251,146,60,0.3)", + renderMode: "badge", }, rabbit: { src: "/avatars/twemoji/rabbit.svg", bodyFill: "rgba(236,72,153,0.9)", limbStroke: "rgba(219,39,119,0.86)", glow: "rgba(244,114,182,0.28)", + renderMode: "badge", + }, + beachKing: { + src: "/avatars/opensource3d/beach-king.webp", + bodyFill: "rgba(15,23,42,0.16)", + limbStroke: "rgba(125,211,252,0.28)", + glow: "rgba(56,189,248,0.16)", + renderMode: "full-figure", + figureScale: 1.12, + figureOffsetY: 0.02, + }, + jenny3d: { + src: "/avatars/opensource3d/jenny.webp", + bodyFill: "rgba(34,197,94,0.16)", + limbStroke: "rgba(16,185,129,0.24)", + glow: "rgba(34,197,94,0.18)", + renderMode: "full-figure", + figureScale: 1.08, + figureOffsetY: 0, + }, + juanita3d: { + src: "/avatars/opensource3d/juanita.webp", + bodyFill: "rgba(244,114,182,0.14)", + limbStroke: "rgba(236,72,153,0.26)", + glow: "rgba(244,114,182,0.18)", + renderMode: "full-figure", + figureScale: 1.06, + figureOffsetY: 0, + }, + sportTv: { + src: "/avatars/opensource3d/sport-tv.webp", + bodyFill: "rgba(59,130,246,0.14)", + limbStroke: "rgba(96,165,250,0.24)", + glow: "rgba(96,165,250,0.18)", + renderMode: "full-figure", + figureScale: 1.1, + figureOffsetY: 0.02, }, }; const avatarImageCache = new Map(); +export function getAvatarPreset(key: AvatarKey) { + return AVATAR_PRESETS.find((preset) => preset.key === key) ?? AVATAR_PRESETS[0]; +} + function clamp(value: number, min: number, max: number) { return Math.max(min, Math.min(max, value)); } @@ -502,6 +617,51 @@ function drawAvatarBadge( ctx.fill(); } +function drawFullFigureAvatar( + ctx: CanvasRenderingContext2D, + anchors: AvatarAnchors, + avatarKey: AvatarKey, + sprite: HTMLImageElement | null, +) { + const visual = AVATAR_VISUALS[avatarKey]; + const topY = anchors.headY - anchors.headRadius * 1.55 + anchors.bodyHeight * (visual.figureOffsetY ?? 0); + const baseHeight = Math.max(anchors.footY - topY, anchors.bodyHeight * 2.35); + const figureHeight = baseHeight * (visual.figureScale ?? 1); + const aspectRatio = sprite?.naturalWidth && sprite?.naturalHeight + ? sprite.naturalWidth / sprite.naturalHeight + : 0.72; + const figureWidth = figureHeight * aspectRatio; + const figureLeft = anchors.bodyX - figureWidth / 2; + + ctx.save(); + ctx.fillStyle = visual.glow; + ctx.beginPath(); + ctx.ellipse( + anchors.bodyX, + anchors.footY - anchors.headRadius * 0.1, + Math.max(anchors.bodyWidth * 0.42, 34), + Math.max(anchors.headRadius * 0.22, 10), + 0, + 0, + Math.PI * 2, + ); + ctx.fill(); + ctx.restore(); + + if (sprite) { + ctx.save(); + ctx.shadowColor = "rgba(15,23,42,0.28)"; + ctx.shadowBlur = 16; + ctx.shadowOffsetY = 10; + ctx.drawImage(sprite, figureLeft, topY, figureWidth, figureHeight); + ctx.restore(); + return; + } + + drawRoundedBody(ctx, anchors, visual.bodyFill); + drawLimbs(ctx, anchors, visual.limbStroke); +} + export function drawLiveCameraOverlay( canvas: HTMLCanvasElement | null, landmarks: PosePoint[] | undefined, @@ -516,20 +676,27 @@ export function drawLiveCameraOverlay( const anchors = getAvatarAnchors(landmarks, canvas.width, canvas.height); if (anchors) { const sprite = getAvatarImage(avatarState.avatarKey); + const visual = AVATAR_VISUALS[avatarState.avatarKey]; ctx.save(); ctx.globalAlpha = 0.95; - drawAvatarBadge(ctx, anchors, avatarState.avatarKey, sprite); + if (visual.renderMode === "full-figure") { + drawFullFigureAvatar(ctx, anchors, avatarState.avatarKey, sprite); + } else { + drawAvatarBadge(ctx, anchors, avatarState.avatarKey, sprite); + } ctx.restore(); - ctx.save(); - ctx.strokeStyle = "rgba(255,255,255,0.16)"; - ctx.lineWidth = 2; - ctx.setLineDash([8, 10]); - ctx.beginPath(); - ctx.moveTo(anchors.bodyX, anchors.shoulderY - anchors.headRadius * 1.25); - ctx.lineTo(anchors.bodyX, anchors.footY); - ctx.stroke(); - ctx.restore(); + if (visual.renderMode !== "full-figure") { + ctx.save(); + ctx.strokeStyle = "rgba(255,255,255,0.16)"; + ctx.lineWidth = 2; + ctx.setLineDash([8, 10]); + ctx.beginPath(); + ctx.moveTo(anchors.bodyX, anchors.shoulderY - anchors.headRadius * 1.25); + ctx.lineTo(anchors.bodyX, anchors.footY); + ctx.stroke(); + ctx.restore(); + } return; } } diff --git a/client/src/pages/LiveCamera.tsx b/client/src/pages/LiveCamera.tsx index e5877d9..2d89184 100644 --- a/client/src/pages/LiveCamera.tsx +++ b/client/src/pages/LiveCamera.tsx @@ -19,9 +19,11 @@ import { createEmptyStabilizedActionMeta, createStableActionState, drawLiveCameraOverlay, + getAvatarPreset, resolveAvatarKeyFromPrompt, stabilizeActionStream, type AvatarKey, + type AvatarPreset, type AvatarRenderState, type FrameActionSample, type LiveActionType, @@ -32,6 +34,7 @@ import { Camera, CameraOff, CheckCircle2, + ExternalLink, FlipHorizontal, Maximize2, Minus, @@ -1114,7 +1117,10 @@ export default function LiveCamera() { const heroAction = ACTION_META[currentAction]; const rawActionMeta = ACTION_META[rawAction]; const pendingActionMeta = stabilityMeta.pendingAction ? ACTION_META[stabilityMeta.pendingAction] : null; - const resolvedAvatarLabel = AVATAR_PRESETS.find((preset) => preset.key === resolvedAvatarKey)?.label || "猩猩"; + const resolvedAvatarPreset = getAvatarPreset(resolvedAvatarKey); + const resolvedAvatarLabel = resolvedAvatarPreset?.label || "猩猩"; + const animalAvatarPresets = AVATAR_PRESETS.filter((preset) => preset.category === "animal"); + const fullBodyAvatarPresets = AVATAR_PRESETS.filter((preset) => preset.category === "full-body-3d"); const previewTitle = analyzing ? stabilityMeta.pending && pendingActionMeta ? `${pendingActionMeta.label} 切换确认中` @@ -1204,6 +1210,78 @@ export default function LiveCamera() { ); + const renderAvatarShowcaseCard = (preset: AvatarPreset) => { + const active = resolvedAvatarKey === preset.key; + return ( +

+ ); + }; + return (
@@ -1320,7 +1398,7 @@ export default function LiveCamera() {

实时分析中枢

- 摄像头启动后会持续识别正手、反手、发球、截击、高压、切削、挑高球与未知动作。系统会用 24 帧时间窗口统一动作,再把稳定动作写入片段、训练记录与评分;开启虚拟形象后,画面中的人体会被猩猩、猴子、狗、猪、猫、狐狸、熊猫、狮子、老虎或兔子形象覆盖显示。 + 摄像头启动后会持续识别正手、反手、发球、截击、高压、切削、挑高球与未知动作。系统会用 24 帧时间窗口统一动作,再把稳定动作写入片段、训练记录与评分;开启虚拟形象后,画面中的人体可切换为 10 个轻量动物替身,或 4 个免费的全身 3D Avatar 示例覆盖显示。

@@ -1455,7 +1533,7 @@ export default function LiveCamera() {
虚拟形象替换
- 开启后实时画面会用 10 个免费动物虚拟形象之一覆盖主体,仅影响前端叠加显示,不改变动作识别与原视频归档。 + 开启后实时画面可使用 10 个免费动物替身,或 4 个免费的全身 3D Avatar 示例覆盖主体。当前只影响前端叠加显示,不改变动作识别与原视频归档。
当前映射:{resolvedAvatarLabel} - {avatarPrompt.trim() ? ` · 输入 ${avatarPrompt.trim()}` : " · 可输入猩猩、狐狸、熊猫、兔子等别名自动映射"} + {avatarPrompt.trim() ? ` · 输入 ${avatarPrompt.trim()}` : " · 可输入猩猩、狐狸、熊猫、兔子,或 BeachKing、Juanita 等别名自动映射"}
@@ -1477,9 +1555,12 @@ export default function LiveCamera() { - {AVATAR_PRESETS.map((preset) => ( + {animalAvatarPresets.map((preset) => ( {preset.label} ))} + {fullBodyAvatarPresets.map((preset) => ( + {preset.label} · 3D + ))}
@@ -1488,11 +1569,25 @@ export default function LiveCamera() { setAvatarPrompt(event.target.value)} - placeholder="例如 狐狸 / panda coach / dog mascot" + placeholder="例如 狐狸 / panda coach / BeachKing / Juanita" className="h-12 rounded-2xl border-border/60" /> +
+
+
+
免费 3D 全身范例
+
+ 这 4 个示例来自 Open Source Avatars 的 CC0 集合,当前已处理成轻量透明素材用于实时覆盖;后续若切换到 VRM/three-vrm,可继续沿用同一批模型源。 +
+
+ CC0 · Open Source Avatars +
+
+ {fullBodyAvatarPresets.map(renderAvatarShowcaseCard)} +
+
diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index ad99d56..f59f32b 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -5,12 +5,14 @@ ### 功能更新 - `/live-camera` 新增 10 个免费动物虚拟形象,可将主体实时替换为猩猩、猴子、狗、猪、猫、狐狸、熊猫、狮子、老虎、兔子 +- `/live-camera` 再新增 4 个免费的全身 3D Avatar 示例,可直接覆盖人物轮廓,并提供对应的 CC0 模型源链接 - 增加形象别名输入,当前可按输入内容自动映射到内置形象 - 实时分析动作稳定器从短窗口切换为 24 帧时间窗口,降低 1-2 秒内频繁跳动作的问题 - 动作切换新增确认阶段与延迟入库逻辑,连续动作区间改为只按稳定动作聚合 - 画面内新增稳定动作、原始候选、窗口占比、切换确认状态等实时状态提示 - 实时分析会话保存新增稳定窗口、动作切换次数、原始波动率、虚拟形象状态等指标 - 动物头像素材切换为本地集成的免费 Twemoji SVG,避免外链依赖 +- 新增 Open Source Avatars 的本地优化透明 WebP 全身素材,减少全身替身叠加时的页面流量和首帧加载时间 ### 测试