dsh-cold-boot
DSH 开机动画:44 秒六场戏的冷启动序列(线框描边 → 鲸鱼标识 → 三栏自检 → 权限校验 → 授权接管 → 名牌定格),带四句英文人声与音效,纯 DOM 实现,零 peer 依赖。Boot animation for the DeepSeek Harness web GUI: a 44-second cold-boot sequence with voice-over, rendered with plain DOM/CSS.
安装
npx -p @deepseek-ai/dsh dsh plugin --profile web add github:zzbkl/dsh-cold-boot说明文档
阅读完整 README ↗dsh-cold-boot · DSH 开机动画
给 DeepSeek Harness 的界面加一段 44 秒的冷启动演出:黑底、等宽字、扫描线与 glitch, 六场戏、四句英文人声,音效全部用 Web Audio 现场合成。纯 DOM + CSS,零运行时依赖, 装完下次打开就播(点画面或按任意键跳过)。
非官方同人作品,与 DeepSeek 官方无关。产品名与鲸鱼标识归其权利人所有 —— 见 LICENSE。

安装
| 方式 | 怎么做 |
|---|---|
| 应用内插件市场 | 在市场里搜 dsh-cold-boot,一键装 |
| npm | dsh plugin --profile web add dsh-cold-boot(预构建,免构建授权) |
| 本地 tgz | 下载 dsh-cold-boot-.tgz → DSH 的插件页「从本地文件安装」 |
| 源码 | git clone 后 npm run build(prepare 钩子也会自动构建),再从目录安装 |
关掉 / 只播一次(浏览器控制台):
localStorage['dsh-cold-boot'] = 'off' // 永不播
localStorage['dsh-cold-boot'] = 'once' // 每个标签页只播一次;删掉这个键就恢复每次开机都播
装完在 profile 的 package.json 里会多一条 dsh.profile.bundles 记录
(本机是 %APPDATA%\dsh-desktop\harness\profiles\web,patchReload: live,不用重启)。
想关掉就把它从 bundles 里去掉,或者直接卸载。
看效果(不装插件也能看)
npm run standalone # → preview-standalone.html(1.7MB 单文件,引擎 + 四句人声全内联)
双击打开即可,不需要服务器、不依赖相对路径(可以随便拷给别人)。
| 控件 | 作用 |
|---|---|
| ▶ 从头播 | 整段 44 秒跑一遍(点画面、按任意键都能跳过) |
| ⏭ 跳过 | 直接走收尾流程 |
| 时长 32s / 44s / 56s | 整段压缩或拉长,人声音高不变、语速跟着缩放 |
| 🔊 / 🔇 | 开关音效与人声(浏览器拦自动播放,点一下才有声音) |
| ① ~ ⑥ | 定格在六场戏的任意一场 |
npm run frames 16000 34000 会生成 dev/frame-.html 定格页 —— 改完时间轴先拿它逐帧核对。
六场戏(基准 44000ms)
| 时刻 | 场 | 画面 |
|---|---|---|
| 0–7.6s | ① | 冷启动字幕(COLD BOOT / 冷启动序列 · 逐项自检 / SEQUENCE 00)+ 日志开始打字 |
| 2.6s / 12.8s | ①③ | 人声 1「Uplink established. Terminal boot sequence initiated.」;人声 2「Self-check complete…」 |
| 8.0–12.8s | ② | 标识逐笔描线(六边形线框 → 鲸鱼 → 一道光扫掠过 → DSH 字标落下)、档案栏、幽灵编号 07 |
| 13.4–26.2s | ③ | 三栏全貌 + 标题 DEEPSEEK HARNESS + 副标题 + 代号 + 日志 18 行 + 进度条与六盏步骤灯 |
| 23.6s | ③ | 人声 3「Permission proxy armed. Session handover standing by.」 |
| 26.2–30.6s | ④ | 权限校验面板:六条 scope 逐行落(workspace-write OK / 9 industrial modules ON / MCP ONLINE / modbus write ASK / credentials LOCKED / session OK),右侧百分比推到 100 |
| 31.6–40.2s | ⑤ | 授权通过:三个同心环 + AUTHORIZATION GRANTED + 一道红细线(全片唯一的红);33.8s 人声 4「System ready. Welcome back, Engineer.」 |
| 41.2s | ⑥ | 白闪 → 切三栏 → 41.8–44s 干净名牌停 2.2 秒 → 0.9 秒淡出,露出 DSH 界面 |
场景层之间是先出后进(前一块淡完才开始下一块),不会出现两块面板同时半透明。
里面有多少「真的是 DSH」
不是套壳文案,几个读数是对着本机实际安装抄的:
- 鲸鱼= DSH 桌面端
resources\icon.png里那只抠出来的,不是网上随手找的图; - v0.11.1=
DSH Desktop.exe的 ProductVersion;30 loaded= profile 里dsh.profile.bundles的条数; - 场① 第二行
81 SKILLS · 30 PLUGINS · 9 MCP · $ dsh doctor、场③ 的DSH desktop v0.11.1 · web profile与dsh doctor日志行,都可以按你自己的机器改(改DEFAULT_LOG/TEXT常量即可); - 三条读数(CONTEXT / PERMISSION / TOOLS)跟着动画时间走,不是写死的静态条。
人声与音效
- 四句人声:英文,Windows SAPI(Zira,Rate −4 ≈ 比常速慢 45%)+
scripts/voice-fx.py -ann提亮到参考素材的频谱(F0 190Hz / 质心 1063Hz)。文件audio/en/L1..L4-zira-rm4-ann.wav, 实测 7.16 / 7.74 / 7.34 / 6.63 秒。每句时长写进了DEFAULT_VOICE[].dur—— 漏写会退回 3900ms 的假设值,就是之前「两个声音」的根因(第三句实际说到 24.87s,压上第四句)。 - 音效(
createSound()):低频底噪、终端 blip、glitch 噪声、白闪、收尾 chime 全部用 Web Audio 现场合成,不带素材;音量比人声低 12~20dB,说话时自动 duck。 - 语音时刻表 2.6 / 12.8 / 23.6 / 33.8s,末句 40.4s 收,白闪 41.2s —— 每句都留 ≥800ms 余量。
插件形态
| 文件 | 说明 |
|---|---|
lib/client.js | 浏览器半边(1.7MB):引擎 + CSS + 四句人声(base64 WAV)全内联,window.__ModuleLoader__.load({...}) 外壳 |
lib/index.js | 宿主半边(` |
scripts/make-icon.py | 用抠好的鲸鱼遮罩画插件图标 |
scripts/voice-fx.py · scripts/voice-analyze.py | 人声染色 / 量化(numpy) |
docs/img/ | README 里那五张图 |
引擎 API
var handle = DSHBootAnimation.play({
duration: 44000, // 整段时长;相位按比例缩放
sound: true, volume: 0.55,
soundBase: '', voiceBase: '', // 装成插件后指向只读资源路由
voice: [{ src, dur, text, meta }],
log: [...], steps: [...], rail: [...],
skipOnClick: true, oncePerSession: false, seek: null, onDone: fn
});
handle.finish(); // 跳过
handle.destroy(); // 立刻摘掉遮罩
改时间轴只需要动:相位表 T、步骤灯时刻 STEP_AT、日志 DEFAULT_LOG、人声 DEFAULT_VOICE
(CSS 里的 --t-* 变量与 T 一一对应,两处要一起改)。
已验证 / 已知
- 六场戏 + 结尾定格逐帧截图核对(1280×800 与 512×900 两种窗口);量尺(
getBoundingClientRect) 确认窄窗下标题单行不溢出、档案栏一行一条、日志底部不被步骤灯压住。 - 实跑收尾、点击跳过、
destroy()三条路径都实测会摘掉#dsh-boot-animation与 ``,不会留黑屏。 - 打包体积:
lib/client.js1.7MB → tgz 830KB(四句人声内联占 1.2MB)。 - 踩过的坑:
animation是简写,收尾的dsb-keep必须写在各元素自己的规则里(分组规则会覆盖入场动画); 淡出动画只能forwards,配both会在延迟到点前就按不透明显示;inset:auto会把前面的left/top一起重置,居中元素要把它写在left/top之前。
许可
MIT(见 LICENSE)。人声由 Windows SAPI 合成、音效现场生成,仓库里不含任何第三方素材。