dsh-guzheng-pond:一鍵編曲、離線渲 wav,對話裏多一汪隨聲起伏的水

前言

在 DSH(DeepSeek Harness)裏做長對話時,主界面往往只有文本與工具調用;若想在同一會話旁增加一點氛圍反饋,又不改輸入框、不彈新面板,通常得自己寫前端插槽、再接音頻管線。古箏池塘插件走的是另一條路:輸入區下方一顆按鈕,子會話按內置樂理手冊寫譜,宿主離線合成 wav 入隊,右下角透明水層只跟聲音起伏,四角穿透、不接事件,原對話一字不動。

下面按定位、能力、安裝與用法說明 shabe222/dsh-guzheng-pond(工作流類,MIT,當前包版本 0.3.0)。

這是什麼

dsh-guzheng-pond 由維護者 shabe222 發佈,掛在 DSH 社區目錄 skillhub.cn/plugins/shabe222/dsh-guzheng-pond。

一句話:點按鈕 → 當前對話派出子會話讀樂理、寫「琴語言」譜面 → 宿主調用渲染器在 headless Chrome 裏合成 wav → 客戶端播放,水層隨響起伏;再點可暫停。整套交互只有兩個觸點:按鈕與水,不彈窗、不加配置面板。

核心功能

端到端流程

你點輸入框下方按鈕後,大致鏈路如下(與 README 一致):

你點輸入框下面那顆按鈕
        │
        ▼
   當前對話派出一個子會話
        │
        ├─ 讀 pond_knowledge()   ← 工具自帶的中國音樂 know-how
        ├─ 按「琴語言」寫譜
        └─ 交回 pond_play(score)
                │
                ▼
        離線渲染成 wav → 入隊
                │
                ▼
        右下角那汪水跟着響,再點一下暫停

水是純裝飾層,不影響原有對話與事件傳遞。

代碼結構(便於排查)

部分 路徑 作用
宿主插件 index.js cordis 插件:註冊 pond_knowledge / pond_play、/api/pond/*、派子會話
客戶端 client.js shell.overlay 放水,conversation.composer.dock 放按鈕
水層 assets/water.js、assets/gl-water.js 從 /api/pond/asset/ 加載
渲染器 renderer/ 琴語言解析 + Web Audio,headless Chrome 離線渲 wav
樂理手冊 renderer/tray/knowledge/ 子會話寫譜依據

子會話工具與 HTTP 接口

工具(子會話可見):

  • pond_knowledge — 讀樂理手冊全文,子會話第一步應調用。
  • pond_play — 交譜面,同步渲染,返回時長、自查報告、技法統計。

宿主 /api/pond:

方法 路徑 說明
GET /state 隊列、項目路徑、手冊是否讀到
POST /task {sessionId, idea} → 派子會話編曲
POST /submit {title, score} → 直接交譜,同步返回渲染結果
POST /queue {op:'played', id} → 播完出隊
GET /audio/<id>.wav 音頻流
GET /asset/<name> 水層資源

琴語言(譜面格式)

子會話輸出極簡記譜,例如:

@from 坐在窗邊,風進來了
@to 合好窗扣,回到桌前
@turn 4
| 6/800 5/900 3/850 2/800 3/950 1/1000 ,3400
| 2/850 6/800 5/900 3/950 1/850 2/1000 ,3600
@2800

要點:1 2 3 5 6 爲五聲音級(無 4、7);/800 爲時值毫秒;句首行必須有 |,否則解析器會靜默跳過該行。完整語法見包內 renderer/tray/knowledge/QLANG.md。插件在 0 句時會打回,不進入渲染。

安裝與啓用

插件以當前 DSH 進程權限運行,安裝前建議閱讀倉庫源碼與 MIT 許可證。社區目錄與 DeepSeek / 幻方無官方從屬關係,屬「一切皆插件」生態中的獨立條目。

前置

  • DSH 0.1.x 或 0.2.x
  • Node.js ≥ 18(須爲本機 真 node,不能是 Electron 內嵌解釋器)
  • 本機 Chrome 或 Edge(渲染器借 Web Audio 離線合成)

步驟

1. 裝渲染器依賴

cd renderer
npm install

渲染器僅依賴 playwright-core(約 15MB,不含瀏覽器)。

2. 裝插件本體

npm pack
dsh plugin --profile web add ./dsh-guzheng-pond-0.3.0.tgz

dsh plugin add 只寫入 profile 的 dependencies;還需在 dsh.profile.bundles 中加上包名。本地開發可用 link: 絕對路徑,例如:

{
  "dependencies": {
    "dsh-guzheng-pond": "link:/path/to/dsh-guzheng-pond"
  },
  "dsh": {
    "profile": {
      "bundles": ["...", "dsh-guzheng-pond"]
    }
  }
}

裝好後重啓 DSH 進程。

3. 驗證

curl --noproxy '*' http://127.0.0.1:3080/api/pond/state

返回 200 且 "knowledge": true 表示手冊與宿主均就緒。若爲 knowledge: false,多爲找不到 renderer/tray/knowledge/CORE.md;404 則檢查啓動日誌中的 plugin tree failed to load。

配置項

可在 profile 的 cordis.patch.yml 中按 id guzheng-pond 覆蓋(覆蓋既有掛載配置,不是新增掛載):

- id: guzheng-pond
  config:
    projectDir: /path/to/my-guzheng
    nodeExe: C:/Program Files/nodejs/node.exe
    servePort: 8792
    maxQueue: 24
鍵 默認 說明
projectDir <包根>/renderer 渲染器與知識手冊根目錄
nodeExe ""(自動探測) 跑渲染用的真 node
servePort 8792 靜態服務端口
maxQueue 24 隊列上限,超出丟棄最舊

DSH 自身是 Electron,process.execPath 不是 node。用錯會導致渲染子進程 silently 掛住。探測順序:配置 → GUZHENG_POND_NODE → 常見路徑 → PATH 中的 node。可選環境變量還有 GUZHENG_CHROME、GUZHENG_SERVE_PORT。

典型用法

在 DSH 裏

  1. 完成安裝與 bundles 配置並重啓。
  2. 在對話輸入區下方點池塘按鈕,由子會話調用 pond_knowledge 後寫譜並 pond_play。
  3. 等待入隊(README 記載單首渲染約 20–60 秒),右下角水層隨播放起伏;再點可暫停。

不裝 DSH,只跑渲染器

cd renderer
npm install

# 終端 1
npm run serve

# 終端 2
npm run render
# → out/demo.wav

自定義譜:寫入 dev/xxx.js(導出 TEXT),然後:

node dev/render-qin.mjs xxx.js my-song.wav

適用場景與注意

適合: 希望在 Web 版 DSH 對話旁增加輕量氛圍、又願意接受「五聲體、離線慢渲」約束的開發者;子會話編曲演示工作流類插件如何掛工具、API 與客戶端插槽。

限制(README 明確):

  • 只支持五聲音階,譜面出現 4 或 7 會解析失敗。
  • Windows 上瀏覽器路徑枚舉更完整;macOS/Linux 建議設 GUZHENG_CHROME。
  • 採樣約 29 個音,缺音退化到鄰近音高。
  • 改 index.js 需冷啓 DSH;改 client.js 刷新頁面即可。profile 與包內 cordis.patch.yml 勿重複 insert 同插件。

開發踩坑: 包內 patch 的 name 只能寫包名,不能寫 ./node_modules/... 路徑,否則整棵插件樹可能 ERR_MODULE_NOT_FOUND。

卸載:從 dsh.profile.bundles 去掉包名 → dsh plugin --profile web remove dsh-guzheng-pond → 重啓。

結尾

dsh-guzheng-pond 把「子會話讀手冊寫譜 → headless 渲 wav → 隊列播放 + 透明水 UI」收成一顆按鈕,主對話協議不變。若要覈對安裝命令、接口與琴語言細節,以倉庫 README 爲準。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜