🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

语音会话插件 PerryLink/dsh-talk

DeepSeek Harnessv0.3.26
PerryLink2 天前有提交已提供中文文档扫描:含敏感能力notify

DeepSeek Harness 的语音优先会话循环:输入框麦克风按钮,支持浏览器/本地语音转文字(Web Speech、FunASR、whisper.cpp),speak 工具把回复读出来(浏览器、edge-tts、piper)…

42.4/100
综合分
18
GitHub 星标
1,517
npm 周下载
—/5
用户评分

数据截至 2026/11/1 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add dsh-talk
npm 源 · dsh-talk 的发布者账号已校验与本仓库一致

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:已验证
是什么
dsh 原生插件 · browser
装得上吗
本站已在 dsh 0.2.1-rc.5 下真实安装成功
非静态推断
L5 · 运行时冒烟等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 2 天前
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查✓ 自动检查通过
展开查看检查明细 ↓

以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。

✓npm 包dsh-talk @ 0.3.26
✓Node 引擎要求 ^22.19.0 || >=24.0.0 · 基线 Node 22.19 满足
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/31 02:20:04

安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

读写/删除本地文件发起外部网络请求
查看扫描证据(共 19 处,展示前 18 条)
  • 写入本地文件
    lib/index.js:215
    await mkdir(policy.dir, {
  • 写入本地文件
    lib/index.js:220
    await writeFile(file, data);
  • 读取本地文件
    lib/index.js:247
    const names = await readdir(dir);
  • 读取本地文件
    lib/index.js:252
    const info = await stat(join(dir, name));
  • 删除本地文件
    lib/index.js:262
    await unlink(join(dir, name));
  • 读取本地文件
    lib/index.js:739
    const bytes = await readFile(join(dir, name));
  • 删除本地文件
    lib/index.js:740
    await rm(dir, {
  • 删除本地文件
    lib/index.js:778
    await rm(dir, {
  • 写入本地文件
    lib/index.js:799
    await writeFile(wavPath, wav);
  • 读取本地文件
    lib/index.js:802
    return (await readFile(`${outBase}.txt`, "utf8")).replace(/ +/gu, " ").trim();
  • 删除本地文件
    lib/index.js:804
    await rm(dir, {
  • 发起网络请求
    lib/index.js:830
    response = await fetch(url, {
  • 读取本地文件
    lib/index.js:1067
    await readFile(filePath, "utf8");
  • 写入本地文件
    lib/index.js:1072
    if (!existing) await writeFile(filePath, FRESH_FILE_HEADER, "utf8");
  • 写入本地文件
    lib/index.js:1074
    await copyFile(filePath, backupPath);
  • 读取本地文件
    lib/index.js:1084
    const content = await readFile(filePath, "utf8");
  • 写入本地文件
    lib/index.js:1087
    await writeFile(filePath, `${normalized}${block}`, "utf8");
  • 删除本地文件
    lib/index.js:1106
    await unlink(join(dir, entry.name));
扫描于 2026/11/3(0 天前) · 范围 入口闭包 + 全包扫描 · 来源 npm 发布包

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

依赖的 DSH / Cordis 模块
@deepseek-ai/dsh-attachment@deepseek-ai/cordis@deepseek-ai/cordis-plugin-include@deepseek-ai/cordis-plugin-loader@deepseek-ai/dsh-agent@deepseek-ai/dsh-api-remotes@deepseek-ai/dsh-client-connection@deepseek-ai/dsh-client-locale@deepseek-ai/dsh-client-ui-conversation@deepseek-ai/dsh-client-ui-settings@deepseek-ai/dsh-client-ui-slots@deepseek-ai/dsh-llm
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

界面预览

2 张 · 点击查看大图

功能亮点

  • 麦克风语音输入
  • 多引擎语音转文字
  • 回复语音朗读
v0.3.262026-10-24
· 变更内容 · chore(deps):在 actions-minor-patch 组里把 ossf/scorecard-action 从 2.4.4 升到 2.5.0,由 @dependabot[bot] 提交于 · chore(deps):把 actions/checkout 从 4 升到 7,由 @dependabot[bot] 提交于 · chore(deps):把 github/codeql-action 从 3 升到 4,由 @dependabot[bot] 提交于 · chore(deps):把 pnpm/action-setup 从 4 升到 6,由 @dependabot[bot] 提交于 · chore(deps):把 actions/setup-node 从 4 升到 7,由 @dependabot[bot] 提交于 · 新贡献者 · @dependabot[bot] 首次贡献于 完整变更日志:
v0.3.252026-10-19
记录远程浏览器麦克风的安全来源要求,附 HTTPS/SSH 转发变通方案。已更新五个 README。
数据来自仓库的 GitHub Release,可能与插件实际版本不一致。

README

由 DeepSeek 最新模型翻译生成
🎙️ dsh-talk - 1024 store channel:先执行一次 npm i -g dsh1024,再执行 dsh1024 plugin --profile web add dsh-talk(会计入 deepseek1024.com 的安装排行)。 dshfind DeepSeek Harness 的语音优先会话循环:跟它说话,听它回答。 按下麦克风,开口说话,回复会念给你听——还能说话打断。 dsh-doctor DSH Market English · 简体中文 · Español · Português · हिन्दी dsh plugin --profile <name> add dsh-talk 📖 生态知识库——只讲实测数据,不搞营销:插件开发指南 · 插件选型数据 · 维护标准。 安装与卸载 - git 渠道(最新 main):dsh plugin --profile web add github:PerryLink/dsh-talk——prepare 脚本只带生产依赖构建。 - npm 渠道(已发布版本):dsh plugin --profile web add dsh-talk。
展开完整文档(README 剩余 1 节)
🎙️ dsh-talk

- 1024 store channel:先执行一次 npm i -g dsh1024,再执行 dsh1024 plugin --profile web add dsh-talk(会计入 deepseek1024.com 的安装排行)。

dshfind

DeepSeek Harness 的语音优先会话循环:跟它说话,听它回答。

按下麦克风,开口说话,回复会念给你听——还能说话打断。

dsh-doctor
DSH Market

English · 简体中文 · Español · Português · हिन्दी

dsh plugin --profile <name> add dsh-talk

📖 生态知识库——只讲实测数据,不搞营销:插件开发指南 · 插件选型数据 · 维护标准。

安装与卸载

- git 渠道(最新 main):dsh plugin --profile web add github:PerryLink/dsh-talk——prepare 脚本只带生产依赖构建。
- npm 渠道(已发布版本):dsh plugin --profile web add dsh-talk。
- tarball 渠道:在本仓库执行 pnpm pack,再执行 dsh plugin --profile web add ./dsh-talk-<version>.tgz。
- 卸载:dsh plugin --profile web remove dsh-talk(或从配置档补丁里删掉对应行)。

如果 pnpm 对这个包报 ERR_PNPM_IGNORED_BUILDS(esbuild 的平台二进制校验,无害),在 pnpm-workspace.yaml 里加上 allowBuilds: { esbuild: true }——dsh 命令行会打印出确切的片段。

⭐ 如果它帮到了你

这个插件是 DSH 插件家族的一员(95 个,全部 Apache-2.0)。如果你在用,给个 star —— 它不会解锁任何功能,但会让下一个人在搜索里更容易找到它。

English: part of a 95 plugin family for DeepSeek Harness. If it is useful, a star helps the next person find it — nothing is gated behind it.

dsh-talk 是什么?

DeepSeek Harness 的语音优先会话循环:跟它说话,听它回答。

按下麦克风,开口说话,回复会读给你听 —— 还能说话打断。

dsh-talk 的工作流示意图:安装 → 打开面板 → 使用。

工作流概览:安装 → 打开面板 → 使用。下面的示例用的都是真实命令。

兼容性

| 层面 | 状态 |
| Harness | DeepSeek Harness dsh-v0.2.1-alpha.1(2026-09-24 适配:第三条 peer 条款 + engines.dsh + manifestVersion: 1,月度 Compat 工作流也锚定在这一版本线上);2026-09-24 全部门禁链路通过(双 typecheck 规则、86 个测试、构建、自包含、产物、打包)。npm dev/test 线 0.1.7-rc.2,peers >=0.1.2-rc.1 <0.2.0 || >=0.1.5-alpha.1 <0.2.0 || >=0.1.6-0 <0.2.0 || >=0.1.7-0 <0.2.0。 |
| Node | ^22.19.0 \|\| >=24.0.0 |
| 浏览器 | Web Speech + MediaRecorder(Chrome/Edge 效果最好);其余浏览器用宿主端的转写/TTS 引擎 |

你能得到什么

dsh-talk 把语音循环的两个方向都打通了:

- speak 工具 —— 智能体把回复读出来。TTS 引擎可选:浏览器语音、edge-tts(网络神经语音)或 piper(本地)。音频在浏览器里播放;用本地引擎时还会写入文件,工具结果里带上绝对路径(audioPath),供其他工具使用;宿主支持的话,会话日志会记录脱敏后的朗读内容(见安全边界)。
- 输入框麦克风按钮 —— 按下它,开口说话,转写结果落进输入框(也可以直接提交)。STT 引擎可选:浏览器的 Web Speech(包含临时结果)、FunASR HTTP 服务器,或本地 whisper.cpp。
- 说话打断 —— 一开口就停掉正在播放的内容(客户端通过 talk Remote 命名空间发给宿主)。
- 事件播报 —— 轮次完成、待审批(瀑布安全:绝不阻塞门禁)、错误,都支持静音开关和自定义短语。
- 设置标签页 —— 引擎/语言下拉框和播报开关,以只追加的配置档补丁操作保存,并带备份。

browser host
🎙 press ──▶ interrupt ─────────────────▶ talk/interrupt
record (MediaRecorder / Web Speech)
transcribe (browser) or talk/transcribe ─▶ FunASR / whisper.cpp
setDraft(text) or submit() ◀── talk:speech projection ── speak tool / announcements
▶ play audio (talk/audio or speechSynthesis)

快速开始

dsh plugin --profile web add github:PerryLink/dsh-talk

1. install the bundle into your profile
dsh plugin --profile web add github:PerryLink/dsh-talk

or from npm (published releases)
dsh plugin --profile web add dsh-talk

2. 重启并验证该行

dsh --profile web --dump-config | grep -A2 'id: talk'

然后按下输入框旁边的麦克风按钮说话,让智能体用 speak 说出回复:

Say "hello" with the speak tool.

远程浏览器需要安全来源

浏览器麦克风(getUserMedia / Web Speech / MediaRecorder)只在安全上下文中可用:https://… 或 http://localhost / http://127.0.0.1。普通 http://<LAN-IP>:3081 页面——包括另一台机器上的 Safari——不会开放麦克风,即使 Talk 设置正确也不行。

远程浏览器请任选一种方式:

- 通过 HTTPS 反向代理或隧道打开 Web UI;
- 用 SSH 转发端口,在客户端打开 http://localhost:<port>;
- 让 UI 和浏览器跑在同一台机器上。

stt.engine: funasr / whisper 改变的是转写在哪里运行,不是浏览器的采集权限;录音仍然需要安全上下文。

示例

以下是真实界面;设置标签页和麦克风按钮是 UI 入口。

详细示例

命令

~~~sh
speak

输入

~~~json
{"text":"hello","engine":"browser"}

输出

~~~text
Spoke hello aloud with the browser engine. No audio file: the browser engine synthesizes in the browser.

观察自 plugins/dsh-talk/tests/lifecycle.spec.ts:124-137; renderer at src/tool.ts:47-64

失败分支

输入

~~~text
{"text":" "}

输出

~~~text
Error: dsh-talk: speak text must not be empty

观察自 plugins/dsh-talk/src/tool.ts:124; plugins/dsh-talk/tests/tool.spec.ts:41-44

简要示例

- talk:status
- talk:transcribe

配置

所有可调项都是 Schemastery Config 字段(可在 cordis.yml 中修改)。cordis.patch.yml 在每个键旁内联说明。

| 键 | 默认值 | 含义 |
| record.enabled | true | 显示输入框麦克风按钮 |
| record.hotkey | (无) | 可选切换热键,例如 "alt+r" |
| record.maxSeconds | 60 | 录音上限,单位秒(1..600) |
| record.autoSubmit | false | 把转写结果作为用户消息提交(false = 填入草稿) |
| record.vad.enabled / silenceMs / energyThreshold | true / 1500 / 0.01 | 语音活动检测:静音自动结束录音(缺少 AudioContext 时降级) |
| stt.engine | auto | auto / web / funasr / whisper;auto 优先用已配置的本地引擎,其次 Web Speech |
| stt.language | auto | BCP-47 语言或 auto |
| stt.interim | true | 显示临时转写(Web Speech) |
| stt.silenceFinaliseMs | 4000 | 连续 Web Speech 识别在无语音这么多毫秒后停止(500..15000) |
| stt.funasr.url | (无) | FunASR 推理端点;引擎为 funasr 时必填 |
| stt.whisper.modelPath | (无) | whisper.cpp 模型;引擎为 whisper 时必填 |
| tts.engine | auto | auto / browser / edge-tts / piper;auto 优先选 piper,其次 edge-tts,最后浏览器语音 |
| tts.rate | 0 | edge-tts/piper 的语速偏移,单位百分比(-50..50) |
| tts.fallbackToBrowser | true | 本地引擎失败时回退到浏览器语音 |
| tts.browser.voiceName | (无) | 首选浏览器语音名称;名称未知时用平台默认值 |
| tts.browser.rate | 1 | 浏览器 SpeechSynthesis 语速(0.1..10) |
| tts.browser.pitch | 1 | 浏览器 SpeechSynthesis 音高(0..2) |
| tts.piper.modelPath | (无) | piper 语音模型;引擎为 piper 时必填 |
| tts.export.enabled | true | 把本地合成的音频写入文件,并以 audioPath 返回路径 |
| tts.export.dir | <home>/.dsh-talk/audio | 导出目录;~ 表示 home,相对路径在 home 下解析(绝不在工作区) |
| tts.export.maxFiles | 20 | 导出目录保留的文件数,含刚写入的那个(1..1000) |
| tts.export.maxAgeMinutes | 1440 | 超过这个分钟数的导出文件在下次写入时清理(1..10080) |
| announce.enabled | true | 事件播报总开关 |
| announce.onTurnEnd / onApproval / onError | true | 播报哪些事件 |
| announce.messages. | "Turn complete." 等* | 播报用语 |
| interrupt | true | 说话会停止当前播放 |
| maxSpeakChars | 20000 | speak 工具文本长度上限(1..100000) |
| maxAudioCacheBytes | 8388608 | 内存中合成音频缓存上限(1 MiB..64 MiB) |

stt.silenceFinaliseMs 和 record.vad.silenceMs 是两套独立机制:前者在连续识别听不到语音时定稿 Web Speech 转写结果,后者是 MediaRecorder 基于能量的检测器,用来结束录音(record.autoSubmit 开启时还会提交录音)。两者跑在不同流水线里,不共享任何状态。

音频文件导出

本地引擎(edge-tts、piper)合成的每段语音都会写入文件,同时也进浏览器播放用的内存缓存。浏览器引擎在客户端合成,因此不导出任何文件——这种状态会明确上报,绝不悄悄略过。

- 位置:tts.export.dir,默认 <home>/.dsh-talk/audio,即插件自己的目录。这里刻意不用宿主机的工作目录,仓库因此永远不会被污染;相对路径的 tts.export.dir 同样在 home 目录下解析,原因相同。
- 命名:speech-<YYYYMMDD>T<HHMMSS>Z-<8 hex>.mp3(edge-tts)或 .wav(piper)。时间戳用 UTC,文件名按时间顺序排列;token 取自语音 id,因此文件能对应回 dsh-talk/speech 日志条目。播报文本绝不进入文件名。
- 清理:每次写入都会触发清理,先按时间、再按数量。先删除超过 tts.export.maxAgeMinutes(默认 1440,即 24 小时)的文件,然后从最旧的文件开始删除,直到目录中最多保留 tts.export.maxFiles 个文件(默认 20,包含刚写入的那个文件)。清理只会删除匹配本插件 speech-… 模式的文件名,共享目录中的其他文件绝不会被改动。使用默认值时,目录最多保留 20 个文件(约几 MB),且没有超过一天的文件。
- 失败处理:导出是语音播报的附加功能,绝不是前提条件。如果目录无法创建或写入,语音仍然会播放,结果中会报告 audioExport: "failed" 并附上原因;清理失败会被忽略,并在下次写入时重试。
- 模型可见的路径:speak 工具的规范返回值携带 audioPath(以及 audioExport,没有文件时还有 exportNote),渲染后的结果文本中也包含同一路径——因此智能体可以直接把它传给另一个接受文件的工具,例如 messenger 插件的文件参数。事件播报(回合结束、审批、错误)通过同一管线合成,也以相同方式导出;它们受相同的上限约束。
- 把文件交给另一个插件:如果消费方只接受自己工作区内的文件——dsh-wechat 的 send_wechat 会拒绝调用会话工作区之外的 file_path,除非它自己的 allowAnyFilePath 设置已开启——那么它会拒绝你主目录下的路径。对于这种流程,请把 tts.export.dir 指向该工作区内的目录(例如 <workspace>/.dsh-talk-audio);默认值有意保持在所有仓库之外。

工具与界面

| 界面 | 类型 | 说明 |
| speak | 工具 | 朗读文本(browser/edge-tts/piper);每次调用可覆盖引擎/语音;返回规范 JSON 结果 |
| 麦克风按钮 | conversation.input.left 插槽 | 录音 → 转写 → 填入草稿(或提交);按下时说话打断 |
| 设置标签页 | settings.plugins.tab(id talk) | 引擎/语言/播报开关;仅追加保存 |
| talk: | Typert Remote | status、audio、transcribe、applySettings、interrupt(宿主命名空间) |

权限与数据

- 权限:插件在内存中保留一个按字节上限的音频缓存用于播放;对于本地引擎,还会把合成的音频写入自己的有界目录(tts.export.,默认 <home>/.dsh-talk/audio,默认最多 20 个文件、保留 24 小时);麦克风权限由浏览器管理。设置标签页只向配置档追加补丁片段,并附带带时间戳的备份——绝不重写文件。
- 数据:音频字节永远不会进入模型上下文或会话日志。宿主会话词汇表支持时,dsh-talk/speech 事件会带上话语 id、引擎、原因、大小、脱敏文本,以及适用时的浏览器语音/语速/音调;在不支持 envelope 的宿主上,该事件完全不写入。speak 工具结果会带上导出文件的路径(插件自己目录下的持久产物),显示/日志界面上的其他内容都要经过脱敏辅助函数,因此凭据、JWT、bearer 头、临时路径都不会外泄。
- 网络:只联系你配置的引擎。edge-tts 执行网络合成,FunASR 使用配置的端点,Chrome 的 webkitSpeechRecognition 会把麦克风音频发到 Google 服务器转写;浏览器 speechSynthesis 播放仍在本地。

安全边界

- 模型可见 ⟺ 已记录——模型只能看到 speak 工具的规范值和渲染文本。只有宿主能承载时,才会追加 dsh-talk/speech 事件(见宿主兼容性);tool/call + tool/result 事件始终是可重建的轨迹。
- 审批通知从不阻塞——approval/request 监听器始终调用 next()。
- 输出已脱敏——凭据和临时音频路径永远不会进入日志或显示界面。唯一有意的例外是 speak 结果里的导出音频路径,它是插件自己目录下的持久文件(仍会经过密钥脱敏器),用途是交给另一个工具。
- 宿主兼容性——dsh-talk/speech 事件通过一个是/否门控来追加。已知类型词汇表覆盖该事件的宿主会追加,调用也会报告已追加;其他所有宿主——包括 0.1.1-rc.2 之前的所有已发布版本、0.1.2-alpha 系列、0.1.2-rc.1,以及 0.1.6-alpha.2(它的 Session.append 只能标记表层意图,不能标记 ignorable envelope,该字段仅为存储日志读取兼容而保留)——都不会追加,因此语音永远不会污染那里的会话日志。跳过不再静默:宿主按会话维护已追加/已跳过计数器,talk/latest(sessionId) 会读回它们,客户端的会话级播放列表保持为空,speak 工具结果仍是可重建的审计轨迹。
- 失败要响亮——无效引擎、超出范围的值、配置了引擎却缺少必需的模型/端点,都会让挂载失败。

已知限制

- 浏览器支持:Web Speech 和 MediaRecorder 会做特性检测;没有它们时麦克风按钮会自行禁用,配置好后宿主引擎(FunASR/whisper.cpp)仍可转写。
- 本地引擎需要你自己安装:edge-tts、piper、whisper.cpp 的可执行文件和模型必须单独安装。
- 音频文件需要本地引擎:浏览器语音在客户端合成,所以 speak 在那里不返回 audioPath(结果里会明确说明);本地引擎失败后回退到浏览器时,同样没有文件。导出的文件放在插件自己的受限目录里——位置、命名和清理规则见「音频文件导出」。
- 录音格式:浏览器用原生 MediaRecorder 编解码器录音;whisper.cpp 可能要求录音器配置成 WAV,其他格式则需要在服务端转换。
- 设置在重载后生效:设置标签页把改动追加到配置档补丁;重载配置档(或重启 Web 应用)后改动才生效。
- 宿主缺少词表时,实时播放历史为空:在 0.1.1-rc.2、0.1.2-alpha 系列、0.1.2-rc.1 和 0.1.6-alpha.2 上,宿主词表不认识 dsh-talk/speech,所以闸门什么都不写,客户端按会话划分的播放列表保持为空;talk/latest(sessionId) 仍会返回最新一条语音和跳过计数。语音本身、麦克风、设置标签页和工具都不受影响。
- dsh-talk ≤ 0.2.1 写下的旧日志,冷加载前可能需要修复:直到 0.2.1 的版本追加的 dsh-talk/speech 事件不带标记。在 0.1.0-rc.7 及更新的宿主上,日志里已含这类事件的会话,下次冷加载会报 SessionFormatUnsupportedError。修复方法:停掉宿主,备份该会话的 .jsonl 日志,给每一行 "type" 为 "dsh-talk/speech" 的 JSON 顶层加上 "ignorable":true(例如在开头的 { 后面插入 "ignorable":true,),然后重新打开会话。其他内容不变,也不会丢失;本版本的新追加永远不会写入未标记事件。

开发 sh
pnpm install # node ^22.19 || >=24
pnpm run typecheck # tsc: src + tests against the local harness checkout
pnpm run typecheck:ci # tsc against the published 0.1.7-alpha.2 types (no paths)
pnpm test # vitest: 108 tests, 16 suites
pnpm run build # tsc declarations + tsdown bundles (lib/)
pnpm run verify:self-contained # dependency specs resolve from the registry
pnpm run verify:artifacts # built ESM faces + client ModuleLoader handshake
pnpm pack # the published tarball

与其他 DSH 插件的互操作性

已针对 DSH 0.2.0-rc.2(本 README 面向的运行时)以及 2026-10-05 调研的高星插件集做过验证。

本插件不会干扰其他插件,包括广泛安装的高星插件:

- 工具名不冲突。 每个工具都带命名空间;不注册任何已发布工具或其他插件占用的裸名称。
- 服务键不冲突。 它提供 talk;该键不是内置接缝,调研过的高星插件也没有提供它。
- 槽位不冲突。 它不注册任何客户端槽位键,因此不会争抢 shadows-shipped-ui 的席位。
- 不会与 HTTP 路由冲突。 它不注册任何 webServer 前缀。
- 不会与补丁层冲突。 这个 bundle 补丁只 insert 自己那一行,从不覆盖内置行的 config。
- 不做全局改动。 它不改原型,不改写 process.env,也不替换全局 fetch dispatcher。

共享事件监听器从设计上就互不干扰。 它用 ctx.on() 监听对顺序敏感的事件 approval/request —— 这是 Cordis 的广播式注册,每个监听器都会执行,谁也无法饿死别人。这里每个监听器都通过 next() 往下传,所以调用链永远不会被短路;改动是施加在 next() 产出的值上,而不是顶替它返回:

静态证据:dsh-plugin-doctor 的 K10–K13 对本仓库的每一项检查都报告 pass。

Topics

dsh, dsh-plugin, deepseek-harness, deepseek, cordis, voice, speech, tts, stt, speech-to-text, text-to-speech, microphone

Contributors

- @Mo-Mia — Web Speech 隐私与兼容性、composer 输入操作、语言回退、连续听写、talk:speech 投影,以及浏览器 TTS 设计方案(#2–#9);其中若干条影响了当前的设置界面。
- @PerryLink — 创建者与维护者:speak 流水线、语音引擎、麦克风录音器、事件播报、投影单元,以及五种语言的文档。

PerryLink DSH Plugin Family

本项目属于 PerryLink 的 DeepSeek Harness 插件家族。下方名单默认折叠,这样每个 README 的首屏都能保持简短;展开即可看到每一行及其状态。

Expand all plugins

| Plugin | Status |
| dsh-aqua-input-check | |
| dsh-archive-check | |
| dsh-auto-review | |
| dsh-autotier | |
| dsh-bid-ca-precheck | |
| dsh-bid-qual-check | |
| dsh-cert-mcp | |
| dsh-checkpoint-rewind | |
| dsh-click | |
| dsh-composer-history | |
| dsh-contract-stance | |
| dsh-customs-doc-check | |
| dsh-data-quality | |
| dsh-demurrage-ledger | |
| dsh-doublecheck | |
| dsh-drill-script-check | |
| dsh-eia-guide-check | |
| dsh-emergency-plan | |
| dsh-essay-rubric-check | |
| dsh-evidence-check | |
| dsh-export-ctl-check | |
| dsh-fast | |
| dsh-fmea-table-check | |
| dsh-forecast-penalty | |
| dsh-fund-research | |
| dsh-github | |
| dsh-gongwen-flow-check | |
| dsh-gongwen-word-check | |
| dsh-guard-plan-qc | |
| dsh-hazchem-check | |
| dsh-hazplan-check | |
| dsh-hidden-risk-map | |
| dsh-hs-classify | |
| dsh-icd-rule-check | |
| dsh-industry-research | |
| dsh-lawcite-adapter | |
| dsh-laya | |
| dsh-lc-doc-check | |
| dsh-learning-gap-check | |
| dsh-library | |
| dsh-local-ai | |
| dsh-lsp-actions | |
| dsh-mask | |
| dsh-mcp-panel | |
| dsh-medrec-qc | |
| dsh-memento | |
| dsh-nsfc-form-check | |
| dsh-nurse-record-check | |
| dsh-observe | |
| dsh-origin-rvc-check | |
| dsh-ota-review-check | |
| dsh-output-styles | |
| dsh-paper-doc-adapter | |
| dsh-permission-rules | |
| dsh-permit-report-check | |
| dsh-pipeline-check | |
| dsh-pleading-draft | |
| dsh-plugin-doctor | |
| dsh-plugin-guide | |
| dsh-plugin-kit | |
| dsh-plugin-upgrade | |
| dsh-policy-brief-draft | |
| dsh-power-loss-split | |
| dsh-power-ticket-check | |
| dsh-ppap-check | |
| dsh-protest-deadline | |
| dsh-railway-window | |
| dsh-repair-order-qc | |
| dsh-research-report | |
| dsh-review-reply-check | |
| dsh-rulefile-check | |
| dsh-safety-brief-check | |
| dsh-score | |
| dsh-session-sync | |
| dsh-site-log-check | |
| dsh-skill-pack-security | |
| dsh-soe-decision-check | |
| dsh-soilwater-check | |
| dsh-sop-sync-check | |
| dsh-spc-gbt-adapter | |
| dsh-talk | |
| dsh-tender-extract | |
| dsh-tender-matrix | |
| dsh-test-drive | |
| dsh-ticktick | |
| dsh-translate | |
| dsh-warranty-calc | |
| dsh-budget | 🧊 已冻结 —— 见仓库 README |
| dsh-claude-move | 🧊 已冻结 —— 见仓库 README |
| dsh-defend | 🧊 已冻结 —— 见仓库 README |
| dsh-draw | 🧊 已冻结 —— 见仓库 README |
| dsh-reach | 🧊 已冻结 —— 见仓库 README |
| dsh-background-agents | 🚫 已退役 —— 见仓库 README |
| dsh-session-pin | 🚫 已退役 —— 见仓库 README |
| dsh-team-rooms | 🚫 已退役 —— 见仓库 README |

许可证

Apache License 2.0 © 2026 dsh-talk contributors
预览分享卡片长什么样 ↓PerryLink/dsh-talk
分享 · DeepSeek Harness Hub
PerryLink/dsh-talk

DeepSeek Harness 的语音优先会话循环:输入框麦克风按钮,支持浏览器/本地语音转文字(Web Speech、FunASR、whisper.cpp),speak 工具把回复读出来(浏览器、edge-tts、piper)…

回到顶部