DeepSeek Harness 插件

dsh-voice-goodandr

Voice input for DeepSeek Harness: dictation chunked by pauses and voice messages, each with its own provider fallback chain (Deepgram, Groq, HuggingFace, local whisper.cpp, plus any OpenAI-compatible(英文原文)

跳到安装方式

来源信息

GitHub 仓库
GooDAnDReaDY/dsh-voice
最近更新
2026年8月21日
分类
工具与能力
GitHub stars
0
载体类型
plugin
目录证据
上游声明已找到 dsh.bundle
证据路径
package.json#dsh.bundle
核对版本
0.1.0-rc.8
上游核对日期
2026-08-20

该证据由上游目录提供。本站没有安装、运行或安全审核这个插件。

安装

默认先复制一段 Prompt,让 Agent 读 GitHub 仓库和源码;需要自己装时再切到命令。

复制这段 Prompt,发给 DSH、Codex 或其他 Agent,让它先读 GitHub 仓库和源码。

请先不要安装或执行任何命令。阅读这个插件的 GitHub 仓库、README 和关键源码,然后用清楚、直接的方式回答以下问题,帮助我判断它是否适合我的需求:

1. 这个插件是什么,解决什么问题;
2. 适合哪些用户和典型使用场景;
3. 安装后如何使用,并给出一个最小使用示例;
4. 有哪些已知限制,以及隐私、安全、兼容性或维护风险;
5. 给出“推荐 / 有条件推荐 / 不推荐”的明确建议和理由。

请区分仓库明确说明、根据源码推断和未知信息。证据不足时请明确说明,不要猜测或照抄 README。

GitHub:https://github.com/GooDAnDReaDY/dsh-voice
插件名:dsh-voice-goodandr
作者:GooDAnDReaDY

检查来源文件

安装前先看这个插件目录里的 README 和其他文件。

文件资源管理器3 个文件
README.md来源说明 · 只读预览

dsh-voice

Voice input for the DeepSeek Harness Web GUI, in two modes, each with its own provider fallback chain.

Dictation — press the mic, talk, and the text lands in the composer as you go: speech is cut into phrases on silence and each phrase is transcribed on its own. Press again to stop; sending stays in your hands.

Voice message — press the wave button, record, press again. The transcript is inserted and sent to the agent after a short cancel window.

Both modes fall back across providers, so one outage or rate limit does not lose your recording. API keys never reach the browser: audio is posted to the plugin's own route and the host talks to the providers.

Install

# From npm:
dsh plugin --profile web add @goodandready/dsh-voice

# Locally from a checkout:
dsh plugin --profile web add file:/path/to/dsh-voice

Restart the Web UI afterwards, then hard-refresh the browser.

Providers

KeyServiceDefault modelCredential
browserthe browser's own speech recognitionnone, and nothing is uploaded to the host
deepgramDeepgramnova-2DEEPGRAM_API_KEY
groqGroqwhisper-large-v3-turboGROQ_API_KEY
hfHuggingFace Inferenceopenai/whisper-large-v3HF_TOKEN
local-whisperlocal whisper.cpp servermodel given at server startnone, fully offline

Keys are read through the DSH credentials service (Settings → Credentials, or $DSH_HOME/.credentials.yaml), falling back to the process environment. A provider without a key is skipped, not fatal.

Ready-made providers

Six providers are filled in already — put the name in a chain and add the key:

NameModelCredential
openaiwhisper-1OPENAI_API_KEY
siliconflowFunAudioLLM/SenseVoiceSmallSILICONFLOW_API_KEY
deepinfraopenai/whisper-large-v3-turboDEEPINFRA_API_KEY
fireworkswhisper-v3-turboFIREWORKS_API_KEY
mistralvoxtral-mini-latestMISTRAL_API_KEY
openroutergoogle/gemini-2.5-flashOPENROUTER_API_KEY
- id: dsh-voice
  config:
    message:
      chain:
        - provider: openai
        - provider: local-whisper

Every endpoint was probed without a key before being written down: all six answered 401, the answer of a path that exists and wants credentials. The model ids are starting points — override model in a chain row to change one.

A preset is the same form as a custom provider with the fields filled in, so a customProviders entry under the same name replaces it outright.

Your own providers

Any OpenAI-compatible API can be added as a provider and used in the chains next to the built-in ones. Two templates, because those APIs disagree on how audio is sent:

TemplateEndpointRequestTranscript read from
openai-transcriptions{baseURL}/audio/transcriptionsmultipart: file, model, languagetext
openai-chat-audio{baseURL}/chat/completionsJSON with input_audio: base64 and formatchoices[0].message.content

OpenRouter has no /audio/transcriptions endpoint at all — use the chat template there:

- id: dsh-voice
  config:
    customProviders:
      - key: openrouter
        template: openai-chat-audio
        baseURL: https://openrouter.ai/api/v1
        model: google/gemini-2.5-flash
        keyEnv: OPENROUTER_API_KEY
    message:
      chain:
        - provider: openrouter
        - provider: local-whisper

Fields: key is the name the chains refer to (it cannot shadow a built-in one), keyEnv names the credential holding the API key (empty means no authorization header), and prompt overrides the instruction sent with the audio in the chat template. A row in a chain may still override model.

The chat template accepts WAV and MP3 only, while the browser records webm/opus — the plugin converts with ffmpeg, the same way the local whisper provider does, so ffmpeg is required for openai-chat-audio.

Three ways to speak

GestureWhat happens
Click the microphonedictation: speech is cut on pauses and each phrase is appended to the composer
Click the wavea voice message: recording runs until you stop it, then the text is sent after a cancel window
Hold the waverecords only while held; release sends it, moving the pointer off the button discards
Hold Ctrlthe same without reaching for the mouse; Escape discards

The hotkey is hotkey in the settings — a modifier name (Control, Alt, Shift) or a KeyboardEvent code. Empty turns it off.

Recognition in the browser

Put browser first in a chain and speech is recognised by the browser itself: no key, no upload to this host, and the text appears while you are still speaking — an interim caption in the recording bar, with each finished phrase going into the composer.

- id: dsh-voice
  config:
    dictation:
      chain:
        - provider: browser
        - provider: local-whisper   # если браузер не умеет — обычный путь

Two things to know before choosing it:

  • Chrome sends the audio to Google. Firefox has no such API at all. Everything else in this plugin keeps audio between your browser and your own host, so this provider is the one exception — it is never used unless you put it in a chain yourself.
  • It needs a secure context (HTTPS or localhost), like the microphone itself.

Put a normal provider after it: if the browser cannot do it, recording falls back to the chain as usual.

Configure (Web GUI)

Settings → Голос (Voice) has four blocks:

  • Dictation — fallback chain (provider + optional model per row, order is

the order of attempts), language, and the silence threshold that ends a phrase (vadSilenceMs, default 700 ms).

  • Voice message — its own independent chain, language, and the cancel

window before the message is sent (autoSendMs, default 4000 ms).

  • Your own providers — an OpenAI-compatible API per card: name, template,

base URL, model, credential name. The name becomes selectable in both chains as soon as it is filled in.

  • General — local whisper endpoint, binary, model, autostart.

Speed matters for dictation and accuracy for messages, which is why the chains are separate: a sensible pair is Deepgram → Groq → local for dictation and Groq → HuggingFace → local for messages.

Local whisper.cpp

The local provider needs a running whisper.cpp server:

whisper-server -m /path/to/ggml-medium-q8_0.bin --host 127.0.0.1 --port 8001

Set whisperModel (and whisperBin if it is not in PATH) and the plugin launches the server itself when autoStart is on. While whisperModel is empty, autostart stays off.

ffmpeg is required for this provider. whisper.cpp accepts WAV only and rejects the webm/opus the browser records, so the host converts each recording to 16 kHz mono WAV before forwarding it. Point ffmpegBin at your binary if it is not in PATH.

Tool

The plugin also registers transcribe_audio(file_path, language?) for the agent, using the voice-message chain. Useful for recordings and interviews that are already files on disk.

Routes

RoutePurpose
POST /dsh-voice/transcribe{dataBase64, mimeType, mode}{ok, text, provider, tookMs}
GET /dsh-voice/statuswhisper server state and the effective chains

Structure

lib/index.js       host: config, routes, transcribe_audio, whisper autostart
lib/providers.js   the four providers, pure functions (network injected)
lib/chain.js       fallback walk over a chain
lib/wav.js         webm/opus → WAV 16 kHz mono via ffmpeg
lib/client.js      browser: composer buttons, recording, settings page
test/              node --test units for the chain and the providers

Run the tests with npm test (no dependencies, Node's built-in runner).

Requirements

  • DeepSeek Harness with the Web GUI
  • Node 20+
  • ffmpeg, for the local whisper provider
  • a microphone reachable from the browser (HTTPS or localhost)

License

MIT