Introduction¶
DeepSeek Harness’s Web GUI comes with built-in voice input capabilities, but the default pipeline implies the audio passes through a remote speech service. To keep recording-to-text entirely local, you need to find a local recognition solution and integrate it into the voice pipeline—find a model, find a command-line tool, and shove the output back into Harness; you have to set up every step yourself. The linj1k/dsh-whisper-local (Category: Model Inference, Maintainer: Linj1k) introduced below turns this process into a plugin: The browser records 16 kHz mono WAV, the Host uses whisper.cpp for transcription, audio does not pass through the network, and no OpenAI account or API key is required.
It should be noted that this is a community bundle, not an official DeepSeek plugin. The project page is hosted on skillhub.cn, a third-party community site with no official affiliation with DeepSeek.
What is this¶
One-sentence positioning: Provides a host-local SpeechProvider for DSH’s Web GUI, with whisper.cpp’s Windows x64 CPU version as the underlying layer. The browser is only responsible for recording and sending audio to the Host; the Host is responsible for saving to disk, invoking whisper-cli.exe, reading the text output, and cleaning up temporary files.
It solves three specific problems:
- Zero external dependency recognition pipeline—no need to register external speech services or API keys.
- Runtime and model hosting—whisper.cpp runtime and GGML models are downloaded on demand, verified (size + SHA-256), cached, and usable offline afterwards.
- Model switching has an entry point—there is a model dropdown in the Harness UI, changes take effect immediately and persist.
Core Features¶
Below are explanations of the capabilities listed in the README, all executed locally:
- Fully local dictation:
whisper-cli.exeruns on CPU, model and audio stay on the machine. - Default automatic language detection:
language: autolets Whisper judge the language of each recording on its own; 99 Whisper languages can also be manually specified in voice settings. - Select model inside UI: The plugin page allows selecting tiny, base, small, medium, large-v3-turbo, changes take effect immediately and are saved.
- Managed installation: Windows x64 whisper.cpp runtime and GGML models are downloaded on demand, verified (size + SHA-256), cached, and usable offline afterwards.
- No audio persistence: Each recording is written to a temporary WAV, deleted immediately after transcription.
- Agent integration: The assistant can use the
whisper_modeltool to list models, download in the background, or switch the current model.
The workflow is as follows:
Browser (Harness composer)
└─ Microphone button records 16 kHz mono PCM WAV
└─ speech Remote sends recording to Host
└─ whisper-local SpeechProvider
├─ Write temporary WAV
├─ Start whisper-cli.exe with selected GGML model
├─ Read text output
└─ Delete temporary file and return transcription result
The Provider is registered via ctx.speechToText.register() and declares location: 'host-local'. This allows the voice UI to show the ready state and trigger model downloads when needed.
Installation and Enablement¶
Environment Requirements¶
| Item | Description |
|---|---|
| DeepSeek Harness | Desktop/Web version, with experimental Voice Input bundle enabled |
| System | Windows 10/11 x64 (Fixed runtime is Windows CPU build) |
| Runtime dependency | tar.exe (Built-in to Windows 10/11, used to unpack runtime archive) |
| Disk | Unpacked runtime is approx. 90 MB, each model is 31–547 MB |
| CPU | Any x64 CPU, more cores/threads makes it faster. No GPU used |
| Microphone | Requires OS and browser microphone authorization |
The runtime does not need Node.js, Python, a compiler, or CUDA.
Installation from GitHub (Recommended)¶
- First, enable the official Voice Input bundle: Plugins → Voice Input.
- Open Plugins → Add plugin → Install a third-party plugin.
- Enter the repository Git address:
git+https://github.com/Linj1k/dsh-whisper-local.git
To pin a version, use:
git+https://github.com/Linj1k/dsh-whisper-local.git#v1.3.0
- Confirm the bundle is enabled. Its patch sets the speech module to
whisper-local+language: autoand registers thewhisper_modeltool. - If the Host module was added during Harness runtime and the Provider didn’t appear, restart Harness once. Changing the UI is hot-reload, no restart needed.
Other Installation Methods¶
- Release package: Download
dsh-whisper-local-1.3.0.tgzfrom GitHub Releases, point to the file in Plugins → Add plugin. - npm: Package name
dsh-whisper-local. Install via Plugins → Add plugin by entering the package name (can include version, e.g.,dsh-whisper-local@1.3.0) after the maintainer executesnpm publish. - Local checkout: Enter the absolute path of the local directory in Plugins → Add plugin, suitable for development and debugging.
Typical Usage¶
Dictation¶
- Click the Microphone button in the composer (between the model selector and Send).
- The first time it will request microphone authorization.
- Speak, then press Stop.
- The transcription result will be inserted into the draft; check and send normally.
Select Model¶
Open Plugins → Whisper local. The page provides a model dropdown (with size and speed/accuracy hints), the currently active model, and a Save model button. The selection is written to the profile configuration via the Harness Settings service and persists after a restart. If the selected model hasn’t been downloaded, the preparation process will start automatically; progress is displayed in the Download and prepare area of the Voice Input bundle details.
Select Language¶
Whisper local provides 99 languages plus auto. Change it in Plugins → Voice Input → bundle details → Language. The official selector shows translated labels for auto, en, zh, ja, ko; other languages show ISO codes (e.g., fr, de, es).
The default is auto, which does not force French or any fixed language. Mixed language scenarios suit auto-detection; for short recordings or high noise, explicit language specification is more stable.
Model List¶
Models are all from the multilingual GGML builds hosted by ggerganov/whisper.cpp:
| Key | File | Size | Description |
|---|---|---|---|
tiny-q5_1 |
ggml-tiny-q5_1.bin |
~31 MB | Fastest, lowest accuracy |
base-q5_1 |
ggml-base-q5_1.bin |
~57 MB | Fast, base accuracy |
small-q5_1 |
ggml-small-q5_1.bin |
~181 MB | Default, balanced |
medium-q5_0 |
ggml-medium-q5_0.bin |
~514 MB | More accurate, slower |
large-v3-turbo-q5_0 |
ggml-large-v3-turbo-q5_0.bin |
~547 MB | Best multilingual accuracy |
Official benchmarks (AMD Ryzen 9 9950X3D, 8 threads, ~10s speech): small-q5_1 processes French in ~1.3s, Japanese in ~1.2s; large-v3-turbo-q5_0 French in ~3.3s, Japanese in ~4.0s.
The fixed runtime is the official nightly b5454 Windows x64 OpenBLAS build, with its release SHA-256 as the checksum.
Configuration¶
Default configuration from the bundle patch (cordis.patch.yml):
- insert:
- id: whisper-local
name: 'dsh-whisper-local'
config:
dataRoot: !!js dshHomePath('speech-to-text', 'whisper-local')
model: small-q5_1
threads: 8
timeoutMs: 180000
- id: speech-to-text
config:
defaultProvider: whisper-local
language: auto
| Field | Default | Meaning |
|---|---|---|
dataRoot |
%USERPROFILE%\.dsh\speech-to-text\whisper-local |
Directory for hosting runtime, models, and diagnostic info |
model |
small-q5_1 |
One of the model Keys in the table above, can be modified in UI |
threads |
8 |
Number of CPU threads passed to whisper-cli |
timeoutMs |
180000 |
Timeout for a single transcription |
modelPath |
Not set | Use existing GGML model file, skip managed download |
whisperCli |
Not set | Use existing whisper-cli.exe, skip managed runtime |
User overrides are written in the profile’s patch layer, taking priority over bundle defaults; the model selected in the UI is also written there.
Agent Tools¶
The bundle registers the whisper_model tool, allowing the assistant to perform three types of operations: list the model directory, download models in the background, or switch the current model. Suitable for letting the Agent switch automatically when the user says “switch to small”.
Suitable Scenarios and Considerations¶
Suitable for these scenarios:
- Recording content involves privacy or should not go online, requiring local transcription.
- No external speech API keys are available in the environment, or you don’t want to apply for an account just for dictation.
- You already have an x64 Windows machine and want to use the CPU to get a near-instant draft for ~10 seconds of speech.
Note:
- Permission Scope. The plugin runs with the permissions of the current DSH process. Downloading the runtime and models, executing
whisper-cli.exe, and reading/writing thedataRootdirectory all happen under these process permissions. You should read the source code and license (MIT) before installing to confirm the directory paths and command execution scope meet expectations; do not install based solely on the directory page description. - Platform and Architecture Limitations. Only supports Windows 10/11 x64, uses CPU only, no GPU. Not applicable on macOS / Linux or ARM machines.
- Disk and First Download. Runtime is approx. 90 MB, models are 31–547 MB. The first enable (especially selecting medium or higher) will take some time to download. The runtime and models have size and SHA-256 verification. Try to keep the default configuration and do not manually replace them.
- Default language is auto. If your scenario has a fixed language and the recording is short or noisy, it is recommended to explicitly specify the language to avoid auto-detection errors.
- Audio not persisted. It transcribes only on a temporary WAV and deletes it after transcription—this refers specifically to the plugin’s behavior; the specific effect depends on whether you have other recording pipelines outside Harness.
- Community Project. This is a third-party bundle, not an official DeepSeek plugin; star count and version info follow the current state of GitHub; check the version number before upgrading.
Conclusion¶
The value of this plugin is to converge the “browser recording + local transcription” pipeline into an installable bundle: no external service configuration, no need to manage runtime installation, model selection and language selection are done in the UI, and audio stays local. If local dictation is part of your daily routine, it is worth a try; if it is just occasional recording, estimate the model download volume cost first.
Project page: https://www.skillhub.cn/plugins/Linj1k/dsh-whisper-local
GitHub: https://github.com/Linj1k/dsh-whisper-local