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-<ms>.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 | 宿主半边(<1KB):空实现 + 名字与版本,只为让 cordis 认得这个 bundle |
cordis.patch.yml | 往 profile 里插一条 #dsh-cold-boot |
icon.png | 512×512 插件图标(同一只鲸鱼 + HUD 细框) |
宿主侧不碰任何东西(不读文件、不发请求、不注册工具),所以权限上只要 workspace-write 就够。
前端只用到 DSH 客户端自带的 ctx/React/host.call/styles.insert,没有额外 peer 依赖。
文件
| 路径 | 作用 |
|---|
src/boot-animation.js | 引擎(唯一事实来源):时间轴 T、日志/步骤/人声文案、CSS、play() |
src/client-glue.js | 插件外壳:把引擎挂上 window.DSHBootAnimation,给插件半边的调用面 |
src/host-half.js | 宿主半边源码(空实现) |
audio/en/L1..L4-zira-rm4-ann.wav | 四句英文人声(16bit 单声道 22.05kHz) |
scripts/build-plugin.mjs | 打 lib/(内联音频、查语法、查同步);--check 只校验 |
scripts/build-standalone.mjs | 打 preview-standalone.html(引擎 + 人声 data URI 内联) |
scripts/build-frames.mjs <ms...> | 生成 dev/frame-<ms>.html 定格页(自检用) |
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 与 <style>,不会留黑屏。
- 打包体积:
lib/client.js 1.7MB → tgz 830KB(四句人声内联占 1.2MB)。
- 踩过的坑:
animation 是简写,收尾的 dsb-keep 必须写在各元素自己的规则里(分组规则会覆盖入场动画);
淡出动画只能 forwards,配 both 会在延迟到点前就按不透明显示;inset:auto 会把前面的
left/top 一起重置,居中元素要把它写在 left/top 之前。
许可
MIT(见 LICENSE)。人声由 Windows SAPI 合成、音效现场生成,仓库里不含任何第三方素材。