# dsh-pet — 设计与实现 > 状态:已实现并运行。本文档描述当前实际实现;与代码有出入时以代码为准。 > 仓库:https://github.com/PC2005-cloud/dsh-pet --- ## 1. 项目定位 在 DeepSeek Harness Web 界面(`dsh web`)显示一只**常驻动画宠物**:待机呼吸、随机动作(含打瞌睡)、偶尔转向、屏幕漫游、点击反应、可拖拽。 **三件套成果**: 1. **提示词**(`prompts/`)——51 个动作的生成配方(绿幕规范 + 按秒分解) 2. **素材生成链**(`scripts/` + `video/`)——源视频 → 透明动画的完整处理管线 3. **插件**(`dsh-pet/`)——运行在 DSH 里的成品 任何人 clone 仓库后,可用提示词生成自己的宠物,跑素材链得到动画,安装插件使用——**从零到宠物全流程可复现**。 ## 2. 素材处理链(Python + ffmpeg) 素材链在工作区 `scripts/` 目录,7 个脚本构成流水线: > 注:`video/` 源 mp4 不入 git,托管在 GitHub Releases `assets-videos`(51 个拼音名 mp4,`gh release download assets-videos` 批量拉取)。`dsh-pet/assets/preview/` GIF 在仓库内(README 用 raw 直链渲染——GitHub 不支持仓库内 webm 在 README 内联播放,GIF 是唯一可靠的仓库内渲染方案;Release 附件以 `application/octet-stream` 返回也无法渲染,故 GIF 必须留在仓库)。 ``` video/(51 个原始绿幕 mp4 + 水印 mask;源视频从 Releases assets-videos 下载) → watermark_step01.py 水印遮罩填充 → step01/(mp4) → chroma_step02.py HSV 色相绿幕抠像转透明 → step02/(透明 webm) → normalize_step03.py 归一化 2160×1215 统一站立居中 → step03/(母版) → encode_thumbs.py 转码 640×360 播放变体 → step04/(thumb) ``` - 运行方式:`cd scripts && python watermark_step01.py`(依次 4 步;`make_mask_black.py` 生成水印 mask,`fill_nn.py` 被 watermark_step01 调用) - 依赖:Python 标准库 + numpy + scipy + 工作区自带 ffmpeg(`.tools/`) - 关键点(踩过的坑): - `chromakey` + `format=yuva420p` 保留 alpha 透明 - `-c:v libvpx-vp9` 必须放在 `-i` 前(libvpx 解码才能保留 VP9 alpha,否则黑底) - Windows 下 `subprocess.run(text=True)` 需 `encoding="utf-8", errors="replace"` - 绿幕抠像最终采用 **HSV 色相方案**(非 chromakey/RGB 差值):仅绿相 70~170° 且饱和度/明度 ≥0.15 才抠掉,人物保留 97~98%、绿幕清除 99.6%+,不误伤亮绿残边/白衣/蓝衣 - 水平居中用**非透明像素 x 中位数**(非 bbox 中点):手/零食等扩展物会把 bbox 中心带偏 200px,中位数全片稳定 - step04 产物同步到 `dsh-pet/assets/thumb/`(npm 包自包含播放资源) ## 3. 插件架构(dsh-pet/) ### 3.1 双半侧 bundle ``` dsh-pet/ ├── package.json # "dsh": {"bundle"} + exports["./client"] + "dsh":{"client"} ├── cordis.patch.yml # insert pet 行 ├── assets/thumb/*.webm # 51 个 640×360 播放变体(~28MB) ├── lib/ │ ├── index.js # host 半侧(服务器端,/pet 视频路由) │ ├── client.js # 浏览器半侧(手写官方 CJS bundle) │ └── types/ # TypeScript 声明 ├── scripts/prepack-check.js # npm 发布前健康检查 ├── README.md # 极简(指向仓库) └── LICENSE # MIT ``` ### 3.2 host 半侧(lib/index.js) - 注册 `/pet/` 前缀路由(`ctx.webServer.register`): - `/pet/thumb/.webm` → 读 `assets/thumb/`(播放资源) - `/pet/full/.webm` → 读 `$DSH_HOME/pet-assets/`(原始母版,需手动下载) - 防路径穿越(`resolveAsset`)+ 流式返回 + 缓存 1 小时 ### 3.3 浏览器半侧(lib/client.js) - 注册到官方 `shell.overlay` 列表槽(全应用浮动层,点击穿透) - **双缓冲播放**:两个 `