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

本地语音转写 apetersson/dsh-voice-input-local

DeepSeek Harness
apetersson28 天前有提交已提供中文文档扫描:未发现敏感能力

接入自建转写端点,把录音可靠变成输入文字

29.9/100
综合分
0
GitHub 星标
—
npm 周下载
—/5
用户评分

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

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add apetersson/dsh-voice-input-local
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:需留意
是什么[目录]—
dsh 原生插件 · ui
暂无时间戳·判据 →
装得上吗[实装验证]!
实装验证未通过(unknown),装前请到仓库确认最近更新与 issue
L4 · 真实安装等级说明 →
数据截至 2026/11/05·判据 →
安全吗[自动扫描]—
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
数据截至 2026/11/04·判据 →
还在维护吗[仓库]✓
活跃:最近一次提交在 28 天前
暂无时间戳·判据 →
图例:✓ 通过! 需注意— 未判定 / 无数据· 「未判定」= 本站尚无数据,不代表插件有问题
档位由哪些信号合成

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

验证判据与等级说明 →

可信度证据

⚠︎ 实装验证未通过(unknown · 2026/11/5) ——可能是验证环境差异,装前建议到 GitHub 仓库确认最近更新与 issue。
安全扫描自动 · 静态分析源码
v2.7.0
🟢 扫描:未发现敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描未发现敏感能力:最多只发网络请求、读取自身元数据或只读文件,未发现执行命令、文件写入或敏感信息读取。

发起外部网络请求
查看扫描证据(共 1 处,展示前 1 条)
  • 发起网络请求
    packages/speech-to-text-endpoint/lib/index.js:169
    response = await fetch(endpoint, {
扫描于 2026/11/4(1 天前) · 范围 全包扫描 · 来源 GitHub 仓库

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

社区实装还没有人打卡 · 装过的第一个就是你
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • 接入自建转写端点
  • 录音转文字
  • 自带语音输入界面

给 DSH 语音输入做本地语音转文字,走任意兼容 OpenAI 的转写端点,另附自带语音 UI 的分支(重试、后台安全采集、内联 voice_input 标记、蓝按钮发送、麦克风右键菜单)

README

由 DeepSeek 最新模型翻译生成
dsh-voice-input-local 为 DeepSeek Harness 语音输入提供语音转文字,识别服务由你指定的端点提供——本地端点或已有端点都行,只要能跑转写模型。凡是支持 OpenAI 兼容的 POST /v1/audio/transcriptions 协议的服务都能用:llama-swap、speaches、whisper.cpp server、LocalAI、vLLM、托管 API。下面的示例用 llama-swap 跑 Parakeet v3。 除此之外,还附带一份对官方语音 UI 的 fork,修掉了原版在录音失败或中断时的处理问题。 两个包,使用时无需下载模型: | 包 | 端 | 作用 | | speech-to-text-endpoint | Host | 为每个配置的模型注册一个 speechToText 服务商,通过端点的 OpenAI 兼容 /v1/audio/transcriptions 路由做转写 | | voice-input-plus | Client | 输入框麦克风:重试、后台安全采集、内联标记、蓝色按钮发送、右键选项 | 两者都基于官方 @deepseek-ai/dsh-experimental-voice-input-bundle 构建,语音注册表、已认证的浏览器 Remote、输入框里的麦克风位置都由它负责。
展开完整文档(README 剩余 1 节)
dsh-voice-input-local

为 DeepSeek Harness 语音输入提供语音转文字,识别服务由你指定的端点提供——本地端点或已有端点都行,只要能跑转写模型。凡是支持 OpenAI 兼容的 POST /v1/audio/transcriptions 协议的服务都能用:llama-swap、speaches、whisper.cpp server、LocalAI、vLLM、托管 API。下面的示例用 llama-swap 跑 Parakeet v3。

除此之外,还附带一份对官方语音 UI 的 fork,修掉了原版在录音失败或中断时的处理问题。

两个包,使用时无需下载模型:

| 包 | 端 | 作用 |
| speech-to-text-endpoint | Host | 为每个配置的模型注册一个 speechToText 服务商,通过端点的 OpenAI 兼容 /v1/audio/transcriptions 路由做转写 |
| voice-input-plus | Client | 输入框麦克风:重试、后台安全采集、内联标记、蓝色按钮发送、右键选项 |

两者都基于官方 @deepseek-ai/dsh-experimental-voice-input-bundle 构建,语音注册表、已认证的浏览器 Remote、输入框里的麦克风位置都由它负责。

你能得到什么

- 自己的识别器。 端点跑什么模型就用什么——示例里是 Parakeet v3——全在你自己的机器上。首次使用无需下载:Host 启动时识别器就报告 ready。
- 重试,而不是重录。 官方 UI 在转写失败时会把音频丢掉,只给一个重新录制。这里会保留这段录音,重试转写会把它重新发出去。
- 失焦也能转写。 窗口失去焦点或隐藏后无法继续录音,但可以收尾:这段录音会被转写并留在草稿里。它绝不会自己发送。
- 发送就是蓝色按钮。 录音进行中,输入框的蓝色按钮会一键完成停止、转写、提交。先按停止则只插入文本,供你检查。
- 听写文本有标记。 每段转写返回时都包在 <voice_input>…</voice_input> 里,模型能区分听写和手打——你也能,因为手打的文本留在元素外面。
- 右键点麦克风,可以打开语音输入设置和识别器选项。

环境要求

- DeepSeek Harness 0.2.0-rc.2(客户端包是该版本所带 bundle 的 fork)。
- 一个能访问转写模型的端点。Parakeet v3 的 llama-swap 配置大致如下:

llama-swap config.yaml
apiKeys:
- "${env.LLAMA_SWAP_API_KEY}"
models:
parakeet-v3:
aliases: [parakeet-v3]
cmd: /path/to/audio-venv/bin/python /path/to/audio_service.py
proxy: http://127.0.0.1:18083
checkEndpoint: /health
capabilities:
in: [audio]
out: [text]

- apiKeyEnv 指定的凭据(默认 LLAMA_SWAP_API_KEY),通过 DSH 凭据服务,或在 Host 环境中导出。密钥绝不放在配置文件里。

安装

1. the speech service, browser Remote and microphone seat
dsh plugins enable @deepseek-ai/dsh-experimental-voice-input-bundle

2. the recognizers
dsh plugins install file:$PWD/packages/speech-to-text-endpoint

3. the voice UI fork
dsh plugins install file:$PWD/packages/voice-input-plus

然后应用配置档补丁,把语音服务指向你的识别器,禁用内置的 SenseVoice 模型,并把麦克风席位交给这个分支:

~/.dsh/profiles/<profile>/cordis.patch.yml
- id: speech-to-text
name: "@deepseek-ai/dsh-experimental-speech-to-text"
config:
defaultProvider: parakeet-v3
language: auto

Keeps the provider picker on the local endpoint and avoids a ~239 MB download.
- id: speech-to-text-sensevoice
name: "@deepseek-ai/dsh-experimental-speech-to-text-sensevoice"
disabled: true

conversation.input.activity is a single slot, so exactly one of the two may be enabled.
- id: ui-voice-input
name: "@deepseek-ai/dsh-experimental-client-ui-voice-input"
disabled: true

启动 DSH,打开 Settings → Plugins → Voice input,选择你的识别器。

配置

每个字段都可以在 Settings → Plugins → dsh-speech-to-text-endpoint → Configure 中编辑,也可以在配置档补丁里同一行的 config 块中编辑。

| Key | Default | Meaning |
| baseURL | http://127.0.0.1:10888/v1 | 转写端点的 OpenAI 兼容 base URL |
| apiKeyEnv | LLAMA_SWAP_API_KEY | 凭据引用,每次转写时解析 |
| models | [parakeet-v3] | 该端点提供的模型 id;每个都会成为一个服务商 id |
| wrapTranscript | true | 返回的转写文本包在 <voice_input>…</voice_input> 中 |
| timeoutMs | 900000 | 每次转写的超时时间,覆盖服务器加载模型时的冷启动 |
| maxResponseBytes | 4194304 | 响应大小上限 |

models 就是你的名单:把该端点提供的每个 id 都列出来,每个都会成为独立的服务商。发送的内容只有模型 id、音频和一个 response_format,读取的也只有响应里的 text 字段,所以这里不依赖某个服务器的扩展。哪个识别器是默认值,是另一个选择:在 voice-input bundle 页面上的选择器里设置,存为 speech-to-text.defaultProvider。

设计说明

几个有意思的决定,以及背后的原因:

标签由服务商生成,而不是客户端。 DSH 插件的客户端部分收不到任何配置——启动入口创建时不带配置——所以放在那里的开关永远不会出现在 UI 里。从 Host 返回 <voice_input>…</voice_input>,wrapTranscript 就成了普通的配置字段,任何使用该服务商的一方都能受益。缓存也不花什么代价:标签就附在用户自己的消息里,不需要为它追加动态提示词上下文。早先的一个版本确实用了提示词上下文;DSH 会把它们作为尾部用户消息追加,从不改写系统提示词,所以缓存本来就没有风险,但内联形式完全避免了多出一条历史记录。

蓝色按钮由一个隐形标记启用。 发送按钮归 dsh-client-ui-conversation 所有,只要 draft.trim() === "" 就禁用它,并通过自己的 keyboard.submit 注入来派发——没有插件钩子。所以 fork 只能做两件可行的事:在捕获插入区间之前,往空草稿里写入一个 U+200B(这会翻转 empty 检查),以及在 document 上挂一个捕获阶段的 click 监听器,把主按钮识别为 [data-composer-card] 内最后一个 button[class="_primary"],并在录制 take 期间认领这次点击。每条退出路径都会释放标记,监听器也会在正常发送前剥掉残留,所以它永远不会到达模型。如果上游标记结构变了,最坏情况就是按钮被禁用——和以前一样。

客户端包是 vendored fork。 packages/voice-input-plus/lib/client.js 是从 app.asar 里取出的发布 bundle,加了针对性补丁;上游构建步骤不会重跑。这就是在不给代码签名应用 bundle 打补丁的前提下,改变 composer 行为要付出的代价。完整补丁表见包 README。

已知限制

- DSH 更新不会传到 fork。 需要针对新的 lib/client.js 重新应用补丁表,或者删掉这个包,重新启用随发行版提供的行。
- dsh-hmr 忽略 /node_modules*,而且 pnpm 不会重新复制已变更的 file: 依赖。因此编辑任一包都意味着要把文件部署到配置档副本里并重启 DSH;包 README 里给出了 rsync 命令行。
- 听写出的斜杠命令不再以 / 开头,因为标签排在最前面。
- 右键菜单必须从 getAnchorRect 返回 DOMRect 字段名(left、top、right、bottom)。返回 x/y 会让列表定位到虚无之处,看起来和「右键没反应」一模一样。
- composer 标记是为了弥补缺失的扩展点而做的 DOM 层适配,不是 API。

来源与许可

MIT。packages/voice-input-plus/lib/client.js 是 @deepseek-ai/dsh-experimental-client-ui-voice-input 的修改副本,来自 deepseek-ai/deepseek-harness,该项目采用 MIT 许可;原始版权予以保留。此处内容与 DeepSeek 无隶属关系,也未获其背书。
预览分享卡片长什么样 ↓apetersson/dsh-voice-input-local
分享 · DeepSeek Harness Hub
apetersson/dsh-voice-input-local

接入自建转写端点,把录音可靠变成输入文字

这个插件是你维护的吗?
作者本人可认领并核对本条目;认领通过后,详情页会显示「作者已认领」标记。
认领条目 →
回到顶部