DSH Plugins Marketplace

DSH Plugins

Plugins

/

dsh-voice

M

dsh-voice

Discovered

DSH plugin: local voice - click-to-talk dictation (faster-whisper), spoken commands and read-aloud (Piper), fully offline

dsh-voice

Local voice for DeepSeek Harness (DSH): dictate your messages and have answers read aloud, entirely on your computer.

Maintenance: best-effort. Issues may go unanswered; forks are welcome.

What it adds

  • Dictation: a microphone button next to Send. Click to talk, click again to stop (10 minutes at most). The page converts the recording to a 16 kHz WAV, the host transcribes it with faster-whisper (small model, CPU, int8; French or English detected) and the text is added to the message box. It is never sent by itself.
  • Spoken commands: a dictation that starts with "command …" / "commande …" becomes the matching slash command or skill of the session ("command web on" → /web on, "command science reading …" → /science-reading …). Unknown names are left as text, with a notice.
  • Read aloud: a Read button under each answer, spoken by a local Piper voice (French or English, guessed from the text). Code blocks are skipped.
  • Never a wake word or an always-on microphone: the browser opens the microphone on your click and releases it when the recording stops.

The interface is in English, and in French when DSH's language is French (tables en and fr at the top of client.js).

Install

  1. The plugin:

    dsh plugin --profile web add github:MathieuPortmann/dsh-voice
    

    Requires Node ^22.19.0 || >=24 and DSH >=0.2.0-rc.2 <0.3.0 (see Compatibility). Once the package is on npm, dsh plugin --profile web add dsh-voice works too.

  2. The voice tools, once (Python 3.10 or later, about 1 GB on disk with the models). The default folder is ~/.dsh/tools/voice (<DSH_HOME>/tools/voice):

    python3 -m venv ~/.dsh/tools/voice
    ~/.dsh/tools/voice/bin/pip install faster-whisper piper-tts
    ~/.dsh/tools/voice/bin/python -m piper.download_voices --download-dir ~/.dsh/tools/voice/models/piper fr_FR-siwis-medium en_US-lessac-medium
    ~/.dsh/tools/voice/bin/python -c "from faster_whisper import WhisperModel; WhisperModel('small', device='cpu', compute_type='int8', download_root='$HOME/.dsh/tools/voice/models/whisper')"
    

    The last two commands download the models from the internet (Hugging Face); this is the only time anything is downloaded. Afterwards the worker runs offline.

  3. Restart the profile. Your browser asks for the microphone on the first dictation.

Configuration

All options have defaults; set them on the voice row of the profile:

OptionDefaultMeaning
python<DSH_HOME>/tools/voice/bin/pythonPython of the voice virtual environment
modelsDir<DSH_HOME>/tools/voice/modelsfolder with whisper/ and piper/
whisperModelsmallfaster-whisper model size (multilingual: base, small, medium…)
voiceFr, voiceEnfr_FR-siwis-medium, en_US-lessac-mediumPiper voices (<modelsDir>/piper/<voice>.onnx)
hotwordscommande command DeepSeek DSH Ollama Piper Whisperwords Whisper should spell right (names, jargon)
threadsmin(6, CPU threads)CPU threads of the worker
idleMinutes10the worker stops after this idle time (frees 1 to 2 GB of RAM)
maxAudioMB20largest recording accepted (about 10 minutes)
maxReadChars8000longest text read aloud at once

Dictation and reading support French and English only.

How it works

  • client.js (page side) draws the microphone button and the Read buttons, records with the browser's MediaRecorder, converts to a 16 kHz mono WAV and plays the answer audio.
  • index.js (host side) serves a small channel at /voice-api/<stt|tts|to-command|warm> and runs one long-lived Python worker (the Whisper model loads once), stopped after idleMinutes.
  • worker/voice_worker.py reads one JSON request per line and answers one JSON line: transcription (faster-whisper; it reads the WAV itself, PyAV is not used) or speech (Piper).
  • lib/commands.js turns "command …" into /name … with the names of the session's commands and skills. It is pure JavaScript, a port of native code compared with it on 200,000 generated cases with identical results.

Compatibility

ComponentSupported
Node.js^22.19.0 || >=24.0.0 (engines.node)
DSH>=0.2.0-rc.2 <0.3.0; declared as an optional peerDependency on @deepseek-ai/schemastery, the only DSH package the host side imports
PlatformLinux (tested); the plugin itself is pure JavaScript, the worker is Python
Python toolstested with Python 3.12, faster-whisper 1.2.1, piper-tts 1.8.0
Browsera browser with MediaRecorder and Web Audio (current Chromium and Firefox)
Pagethe chat page of DSH's web UI; the buttons are placed next to the Send and Copy buttons (found by their English or French labels) and may need an update when the page changes

Permissions and external services

Everything the plugin can touch, and what happens when it fails:

CapabilityWhereUsed forIf it fails
Microphoneclient.js (getUserMedia)only between your two clicks on the microphone button; released right afterthe page shows "microphone blocked or missing"
Commandsindex.js (child_process.spawn)starts python -I worker/voice_worker.py with a minimal environment (PATH, HOME, offline Hugging Face flags, thread count), in a temporary folder; stopped when idle or when DSH stopsdictation and reading show the error ("voice tools are not installed" when the Python is missing)
Filesindex.js, workerwrites each recording and each spoken answer as a WAV in a temporary folder and deletes it after use; reads the models from modelsDirthe request fails with an error message
Networknone at run timethe worker runs with HF_HUB_OFFLINE=1 and local_files_only; only the one-time install commands above download modelsn/a
HTTP routeindex.js (ctx.webServer.register)POST /voice-api/<method> for the page, behind ctx.connection.admit() (DSH's Host/Origin fence and token); audio limited to maxAudioMB, JSON bodies to 1 MiBnon-admitted requests get 401/403; other errors are returned as JSON
Session dataindex.js (ctx.commands, ctx.skills, ctx.agents)reads the names of the session's commands and skills, to recognise spoken commands; nothing is writtenthe dictation stays plain text
Dynamic module loadingindex.js (importFromDsh)loads @deepseek-ai/schemastery (the config schema) from the DSH installation that runs the plugin. Nothing is downloaded and no code is evaluated from text (eval / new Function are not used)the plugin fails to load
Interfaceclient.jsthe microphone button, a status line, the Read buttons; registers a French dictionary and language entry with DSH's locale serviceno buttons

The plugin adds no tool for the model and never sends a message by itself.

Verification

Checked on a disposable profile (DSH_HOME pointing at a temporary folder, so the real profile is never touched):

npm pack
dsh plugin --profile t add file:$PWD/dsh-voice-0.1.0.tgz   # install
dsh t --port 3095 --no-open                                 # start: plugin loads, no error
dsh plugin --profile t remove dsh-voice                      # uninstall

npm test runs 7 standalone tests of lib/commands.js with no DSH installation needed.

Develop

npm test

License

MIT

Comments

Loading…

Similar plugins

dsh-voice-context

by CharlesLiuZC

Voice-to-text plugin for DeepSeek Harness (desktop & web): composer mic button with cloud (SiliconFlow) or local offline (FunASR / faster-whisper) transcription.

Manifest valid

★ 0

TypeScript

Oct 2, 2026

dsh plugin --profile web add dsh-voice-context

by Jesse-njx

Voice notes in, spoken answers out — dictate audio that becomes user messages (transcribe), have the agent read replies aloud (speak), and leave walk-away narration on long headless runs. Local-first:

Tools & CapabilitiesVision & MultimodalManifest valid

★ 3

MIT

TypeScript

Aug 13, 2026

dsh plugin --profile web add @dsh-voice/bundle

by baisama-cloud

Speech-to-text voice input plugin for DeepSeek Harness (DSH) web GUI: click the mic in the composer to turn speech into text in the input box. Browser Web Speech API + OpenAI-compatible Whisper (OpenA

Tools & CapabilitiesVision & MultimodalDevelopment & InfrastructureTerminal & ClientsManifest valid

★ 3

MIT

JavaScript

Aug 31, 2026

dsh plugin --profile web add dsh-stt-input

by PensiveFei

DSH voice input plugin: tap Alt to talk, get text in composer. Web Speech default (zero config), optional OpenAI-compatible ASR, polish via DSH LLM.

Tools & CapabilitiesManifest valid

★ 35

MIT

JavaScript

Oct 25, 2026

dsh plugin --profile web add dsh-voice-scribe

by yuzh1090

DSH plugin: compress verbose voice-dictation text into token-efficient prompts — fully local, zero LLM tokens.

Manifest valid

★ 0

MIT

TypeScript

Aug 19, 2026

dsh plugin --profile web add dsh-voice-prompt-compressor

by moazzamak

Offline local speech-to-text for the DeepSeek Harness composer: a microphone button that records, transcribes with faster-whisper on your own machine, and inserts the text into the chat draft.

Manifest valid

★ 0

MIT

JavaScript

Oct 6, 2026

dsh plugin --profile web add dsh-voice-input