dsh
OpenPetsHQ/openpets将 DeepSeek Harness 的生命周期状态、错误与审批请求,桥接到本地运行的 OpenPets 桌面伙伴。
DSH 声音工坊:在会话结束、弹出选项、请求许可与停止时播放指定音效,支持 AI 角色语音生成与音效库管理。
English | 中文
DSH Web GUI 声音工坊(Sound Lab):四个触发条件各自可选用音效(会话结束 / 弹出选项 / 请求许可 / 停止),AI 生成角色语音,音效库上传与管理——全程可视化点选,无需改代码;悬浮角色桌宠(默认)或圆球按钮、三种外观、配置双持久化。
🐋 角色引用:本项目为《明日方舟》(Arknights)角色 安洁莉娜(Angelina) 的粉丝向自制项目,默认示例音效为安洁莉娜「hirari do~」「呢?」与「啊哇哇!」语音片段,仅供个人学习与娱乐使用,不用于任何商业用途。
两种方式对两类用户(桌面版 / web 版)都适用,任选其一即可。
方式一:Setup 安装器(推荐,零依赖,两种用户都可用)
npx dsh web),完成 profile 初始化;然后退出正在运行的 dsh(桌面应用或 dsh web 服务)说明(仅了解原理,无需任何操作):安装器把插件部署到
$DSH_HOME\plugins\dsh-sound-lab,并扫描$DSH_HOME\profiles下所有已初始化的 profile(web / desktop / …)逐一调用官方dsh plugin命令登记,使各 profile 共用同一份部署副本;若本机没有 dsh CLI,会自动穷举补齐(桌面应用自带 runtime → 系统 npx → 自动下载 Node.js);若 dsh 尚未初始化(无 profiles),会自动运行 dsh web 完成首次初始化。安装完成后自动重启 dsh:桌面版先关闭正在运行的实例,再重新启动(模拟双击打开,无终端窗口,关闭安装器窗口不影响);未检测到桌面应用(web 环境)时提示手动重启 dsh web 服务。全程自动化,不手改任何配置。
方式二:dsh CLI(需 Node.js,两种用户都可用)
如果 dsh 尚未运行,请先启动一次(
npx @deepseek-ai/dsh web),完成 profile 初始化,再进行安装(npm run setup与方式一安装器在未初始化时会自动执行该步骤)。 尚未安装 dsh?下载 DeepSeek Harness 桌面版,或安装 Node.js(https://nodejs.org)后运行npx @deepseek-ai/dsh web。
请二选一:根据你的实际运行方式(桌面版 / web 版)选择执行其中一条,不要两条都执行:
# 桌面版用户 —— 执行这一条
npx @deepseek-ai/dsh plugin --profile desktop add dsh-sound-lab --config.minimumReleaseAge=0
# web 用户(用 `npx dsh web` 运行)—— 执行这一条
npx @deepseek-ai/dsh plugin --profile web add dsh-sound-lab --config.minimumReleaseAge=0
然后重启 dsh(若尚未启动则直接启动):
npx @deepseek-ai/dsh web
开发便利:
npm run setup自动检测本机所有 profile 并逐一登记本插件;npm run setup:deploy把副本部署到$DSH_HOME/plugins并让所有 profile 指向它(发布/固定使用模式)。加--profile <name>(如node tools/install.mjs --profile web --unify)可只操作单个 profile;node tools/install.mjs --npm --start以 npm 包方式安装并在完成后自动启动对应端(desktop 弹应用窗口 / web 启动并自动打开浏览器)。
sounds/ 目录本地音频 + sounds.json 控制文件管理)+ 刷新 + 「上传」弹窗:选择/拖拽上传音频、删除音效、恢复被隐藏的附带音效;非附带音效支持 ✎ 重命名sounds/ 目录的本地音频文件(mp3/wav/ogg/m4a/flac/opus/aac/wma/webm),宿主端经 /dsh-sounds-control 静态服务(Range/206 分片、ETag、流式)提供config.json 双写,重启不丢;加载时逐字段清洗(类型/范围/枚举),脏数据回退默认值npm test(宿主端 list/config/upload/delete 与浏览器端逻辑的 Node 冒烟测试)、npm run setup / setup:fix / setup:deploy(多 profile 自动配置)、releases/build-single-exe.ps1(打包 Setup/UnSetup 安装器)dsh-sound-lab/
├── package.json # 包声明(dsh.client / dsh.bundle.patch / types / scripts)
├── cordis.patch.yml # 组成补丁:挂载行 ui-event-sounds
├── CHANGELOG.md # 版本记录
├── README.md / README.zh.md
├── LICENSE
├── sounds/ # 音效库:附带音效(hirari do~/呢?/啊哇哇!)+ 上传/AI 生成的音频
├── frames/ # 桌宠帧素材:<动作>/sprite.webp 精灵图(WebP lossless)+ motion.json(60fps,12 动作)
├── lib/
│ ├── index.js # 宿主端:/dsh-sounds-control 静态服务(list/config/音频/TTS)+ /dsh-frames-control(桌宠帧)
│ ├── client.js # 浏览器端:角色桌宠/悬浮球 + 配置弹窗 + 触发监测 + 播放
│ ├── tutorial/ # AI 生成角色音频的图文教程配图(image1.png / image2.png)
│ └── types/index.d.ts # 类型声明
└── tools/
├── install.mjs # 多 profile 自动配置(setup / --fix / --unify / --deploy)
├── test-host.mjs # 宿主端接口冒烟测试(list/config/upload/delete/TTS)
├── test-client.mjs # 浏览器端逻辑冒烟测试
└── api/ # 独立 TTS 脚本(tts_api.py + 使用说明 + 参考音频)
插件由 宿主端 + 浏览器端 两半组成,随单个安装包一并自动加载:
sounds/ 目录通过 /dsh-sounds-control 静态服务暴露给浏览器端(音效列表 / 音频文件 / config.json 持久化),并把 frames/ 桌宠帧素材通过 /dsh-frames-control 暴露(动作清单 / 帧 PNG)两半的挂载由 package.json 声明驱动,无需手动分开安装:
dsh.client 声明(exports "./client")→ 驱动浏览器端在 Web GUI 加载dsh.bundle.patch(cordis.patch.yml)→ 驱动宿主端在 DSH 主进程注册由于 dsh 插件按 profile 隔离($DSH_HOME/profiles/<name> 各自持有 package.json / node_modules),需要哪个 profile 用就必须在哪个 profile 登记——这正是安装器与 tools/install.mjs 自动完成的事(见安装)。
sounds/ 目录(见上方目录树),启动后会自动对账登记进音效库;已安装使用时无需手动找文件夹——打开配置弹窗 → 音效库 → 「上传」,选择本地文件或拖拽导入即可(自动复制进安装位置的 sounds/ 目录),也可在列表中删除音效(附带音效为隐藏,可随时恢复)或 ✎ 重命名。sounds/ 下的所有音频文件提示:桌宠可拖到屏幕任意位置,拖到屏幕边缘会自动停靠(左右窥视、上下睡觉:左/右停靠隐藏 40% 并旋转 30°、顶部倒挂隐藏 80%、底部不隐藏),无操作 90s 自动睡觉,点击打招呼;「外观」里可切换 角色桌宠 / 圆球按钮,以及 鲸鱼娘 / 纯白 / 纯黑 风格;悬浮窗配置弹窗可单独调整 主题 / 事件·素材·音频;位置与配置会自动保存,重启不丢。