WhisperDesk Wiki
Deployment, configuration, data, security and troubleshooting for IT admins — plus build, architecture, release and extension guidance for developers. End-user help is in the User & Admin Guide (PDF).
Administrators
System requirements
| Component | Minimum | Recommended |
|---|---|---|
| Windows | Windows 10 64-bit, version 1809+ | Windows 11 64-bit |
| Processor | 4-core x64 with AVX2 | 8+ cores |
| Memory | 8 GB | 16–32 GB |
| Graphics | Any (CPU mode) | Dedicated Vulkan GPU with 6–8 GB+ VRAM (AMD, NVIDIA or Intel), not shared with games or other GPU-heavy work |
| Disk | 1 GB + models (75 MB – 3.1 GB each) | SSD with 10 GB free |
| FFmpeg | Required to read audio/video — winget install Gyan.FFmpeg | |
The app is self-contained (.NET 8 is bundled) — no runtime needs to be installed. Keep GPU drivers current for the Vulkan backend.
Silent deployment
The MSI is per-machine (requires administrator rights), installs to C:\Program Files\DarkCipher Systems\WhisperDesk (since 1.4.2; earlier versions used C:\Program Files\WhisperDesk and are moved automatically on upgrade) and adds Start-menu shortcuts. It works with Intune, ConfigMgr, PDQ, GPO software installation or any tool that runs msiexec.
# Basic silent install msiexec /i WhisperDesk-1.5.0-x64.msi /qn # Custom folder, install FFmpeg via winget, skip Ollama msiexec /i WhisperDesk-1.5.0-x64.msi /qn INSTALLFOLDER="D:\Apps\WhisperDesk" INSTALLFFMPEG=1 INSTALLOLLAMA=0 # Pre-set default library and models folders msiexec /i WhisperDesk-1.5.0-x64.msi /qn LIBRARYPATH="D:\Recordings" MODELSPATH="D:\Models" # Verbose log for troubleshooting a deployment msiexec /i WhisperDesk-1.5.0-x64.msi /qn /l*v "%TEMP%\WhisperDesk-install.log" # Uninstall — keeps all user data msiexec /x WhisperDesk-1.5.0-x64.msi /qn # Uninstall and remove settings and models for the user running it msiexec /x WhisperDesk-1.5.0-x64.msi /qn REMOVE_SETTINGS=1 REMOVE_MODELS=1
Upgrades
- A newer MSI upgrades in place (same UpgradeCode); settings, models, voices and the library are kept.
- An older MSI is blocked from downgrading.
- Re-running the same version offers Repair or Remove.
Detection rule
For Intune/ConfigMgr, detect by MSI product (UpgradeCode {3fc82978-8263-42a1-9d62-8b858d3c0a9b}), or by registry: HKLM\Software\darkcipher0x\WhisperDesk → InstallDir, combined with the file version of WhisperDesk.exe.
Installer properties
| Property | Meaning |
|---|---|
INSTALLFOLDER | Install directory. Default C:\Program Files\DarkCipher Systems\WhisperDesk (1.4.2+). |
INSTALLFFMPEG=1 | Install FFmpeg (Gyan.FFmpeg) with winget if it isn't found. On by default in the UI. |
INSTALLOLLAMA=1 | Install Ollama with winget for local AI summaries. Off by default. |
FFMPEGPATH | Full path to an existing ffmpeg.exe. |
LIBRARYPATH / MODELSPATH | Default library and models folders. Users can still change them in Settings. |
REMOVE_LIBRARY / REMOVE_VOICES / REMOVE_SETTINGS / REMOVE_MODELS | On uninstall, also delete that data (=1) for the user running the uninstall. Only recording folders are removed from the library. |
FFMPEGPATH.Portable edition
Unzip WhisperDesk-1.5.0-x64-portable.zip anywhere and run WhisperDesk.exe. Keep all files together — the runtimes folder holds the GPU engine. No install, no admin rights. User data still goes to %LOCALAPPDATA%\WhisperDesk.
FFmpeg, models & Ollama
FFmpeg
Used to read audio/video and to burn subtitles. WhisperDesk looks for it on PATH, next to WhisperDesk.exe, or at the path in File → Settings → Tools & storage. FFmpeg is not bundled.
Whisper & speaker models
On first use WhisperDesk downloads the selected Whisper model (Large-v3 Turbo ≈ 1.6 GB) and the speaker models (≈ 32 MB) into the models folder. For offline machines, pre-stage the models folder (copy it from a machine that has downloaded them) and point MODELSPATH at it.
Ollama (optional)
Local AI summaries and consolidated reports use an Ollama server — default http://localhost:11434. If you point it at another host, transcripts are sent there; every summary records where it was processed.
File locations
| Path | Contents |
|---|---|
%LOCALAPPDATA%\WhisperDesk\settings.json | All settings |
%LOCALAPPDATA%\WhisperDesk\models | Whisper models; speakers\ holds speaker/VAD models |
%LOCALAPPDATA%\WhisperDesk\voices.json | Voice library (names, sex, voiceprints) |
%LOCALAPPDATA%\WhisperDesk\addons | Add-on DLLs; data\ holds add-on files |
%LOCALAPPDATA%\WhisperDesk\live | Temporary live recordings until saved or discarded |
Documents\WhisperDesk Library | Recordings library (configurable); each recording's folder can hold a forensics-log.jsonl audit chain (1.5+) |
HKLM\Software\darkcipher0x\WhisperDesk | InstallDir (MSI installs) |
Help → Privacy & security inside the app shows the actual resolved paths for the current user.
Settings reference
Stored per user in settings.json; edited in File → Settings (Ctrl+,).
| Setting | Default | Effect |
|---|---|---|
| Brand accent colour | 36D2CB | Accent for buttons and highlights |
| CPU threads | 0 (auto) | Threads used by Whisper on the CPU |
| GPU device index | 0 | Which Vulkan GPU to use when several are installed |
| Flash attention | Off | Experimental speed-up on some GPUs |
| Don't use previous text as context | Off | Prevents rare repetition loops |
| Vocabulary hint | (empty) | Names and terms Whisper should spell correctly |
| Separation sensitivity | 0.5 | Auto speaker count: lower = more speakers |
| Voice library match | 0.5 | Similarity needed to name a known voice |
| Min speech / silence | 0.3 / 0.5 s | Shortest speech turn / pause that splits turns |
| Suggest male below / female above | 158 / 168 Hz | Pitch thresholds for the sex suggestion |
| Pause that ends a line (live) | 600 ms | Silence needed before a live line is finished |
| Longest line (live) | 15 s | Forces a break during long monologues |
| Same-person threshold (live) | 0.45 | Similarity needed to count as someone already heard |
| FFmpeg location | auto | Custom ffmpeg.exe path |
| Library location | Documents\WhisperDesk Library | Where recordings are stored |
Network & firewall
WhisperDesk never phones home. Outbound traffic happens only for features a user triggers:
| Destination | When |
|---|---|
huggingface.co, github.com | Downloading a model the user selects |
Ollama server (default localhost:11434) | AI summaries / consolidated reports, if enabled |
| Webhook URL | Only if the Webhook add-on is enabled and configured |
| Windows Share sheet | When the user presses Share |
| winget sources | MSI only, when INSTALLFFMPEG/INSTALLOLLAMA is set |
Inbound: the optional caption server add-on listens on localhost:7890 only (off by default). No inbound firewall rule is needed or created.
Privacy & compliance
- Local by design. Audio, transcripts, voiceprints, summaries and settings stay on the PC. No account, cloud service, telemetry, analytics or crash reporting.
- Voiceprints are biometric data (e.g. GDPR Article 9, Illinois BIPA). Obtain consent, retain only what you need, and delete with Tools → Voice library → Forget. Voiceprints are never included in shared files or reports.
- Recording consent law varies (one-party vs all-party). Make sure users tell people when they record.
- Cloud-synced folders: if the library is inside OneDrive, Dropbox, Google Drive or iCloud, that service uploads it. WhisperDesk warns about this; relocate or exclude the library where recordings must remain local.
- At rest: files are protected by the Windows account ACLs. Use BitLocker on the drive and password-protected backups for off-device copies.
- Integrity: text edits are audited (who, when, why, before/after); reports and analysis exports carry SHA-256 fingerprints with a
manifest.sha256.txt; backups are verified on restore. - Add-ons are .NET code running with the user's permissions. Consider controlling
%LOCALAPPDATA%\WhisperDesk\addonswith App Control/AppLocker if users shouldn't add their own.
Forensics view & audit trail New in 1.5
Open a recording in the player and switch ☰ Transcript / ∿ Forensics, or in the Library right-click → ∿ Forensics….
| Part | What it does |
|---|---|
| Display | Time ruler with markers, speaker timeline, waveform, spectrogram (0–4 or 0–8 kHz, 60–100 dB range) with pitch track, loudness curve and an overview of the whole file. Wheel zooms, Shift+wheel pans, drag selects, click jumps; hover shows exact time and frequency. |
| ▶ Selection | Plays the selection, optionally looped. |
| Measure | Level, peak, clipping, pitch, jitter, shimmer, HNR, formants and spectral centroid for the selection. |
| Who is speaking? | Compares the selection's voice with every speaker in the recording and the voice library, using each voice's own consistency as the baseline. |
| Add note… | Time-stamped observation, shown on the ruler and in the report. |
| Integrity check | Whole-file checks (metadata, clipping, digital silence, background steps, mains hum / ENF); findings appear as orange markers. |
| Export report… | Evidence item details and hashes, audit-trail verification, an image of the current view, findings and the full audit log as PDF, HTML, Word, text or JSON, plus a .sha256.txt fingerprint. |
Tamper-evident audit log
Every action (opened, measured, identified, note, integrity check, export) is appended to forensics-log.jsonl in the recording's library folder. Each entry records the Windows user, time, computer name, the media file's SHA-256 and the hash of the previous entry, so the entries form a chain. Verify chain recomputes it and reports any entry that was edited, deleted or reordered.
- Back up or archive the log together with the original media; the chain proves the log is intact, and the SHA-256 ties it to that exact file.
- The log is plain JSON Lines, readable by any tool. Don't edit it by hand: any change breaks verification (by design).
- Work on a copy of the evidence where possible, and keep the original read-only.
Backup & migration
- File → Backup… writes one file containing the library, voice library, settings and add-ons (models optional).
- With a password it's a
.wdbackupencrypted with AES-256-GCM (key from PBKDF2-SHA256, 600,000 iterations); without, a plain.zip. - File → Restore from backup… merges recordings (existing ones skipped unless overwrite is ticked), merges voices and verifies every file against its SHA-256.
- A forgotten backup password cannot be recovered.
To move a user to a new PC: back up, copy the file across, install WhisperDesk, then restore. Leave models out of the backup to keep it small — they download again.
Identifiers
These never change between versions — safe to use in detection rules, policies and scripts.
| Item | Value |
|---|---|
| Product / Manufacturer | WhisperDesk / darkcipher0x |
| MSI UpgradeCode | 3fc82978-8263-42a1-9d62-8b858d3c0a9b |
| AppUserModelID | darkcipher0x.WhisperDesk |
| Assembly GUID | d06d3e32-6317-4cc3-a20f-2645b1c78f11 |
| Install registry key | HKLM\Software\darkcipher0x\WhisperDesk (InstallDir) |
Code signing & Smart App Control
Current releases are not code-signed. On managed fleets:
- Smart App Control is disabled automatically on enterprise-managed devices, so it won't block deployment there.
- If you use App Control for Business (WDAC) or AppLocker, allow WhisperDesk by file hash or path (
%ProgramFiles%\DarkCipher Systems\WhisperDesk\*(1.4.2+;%ProgramFiles%\WhisperDesk\*for older installs)) — publisher rules aren't possible without a signature. Hash rules must be refreshed for each release. - Verify downloads against the SHA-256 on the download page, or build from source and sign with your organisation's certificate.
Consumer guidance for Smart App Control is on the downloads page.
Troubleshooting
| Problem | Solution |
|---|---|
| "FFmpeg was not found" | winget install Gyan.FFmpeg, or set the path in Settings → Tools & storage |
| Engine badge says cpu (no Vulkan GPU) | Update the graphics driver; check Device is set to GPU; check GPU device index on multi-GPU systems |
| Slow transcription | Use Large-v3 Turbo or a smaller model; confirm GPU is selected; close other GPU-heavy apps |
| Wrong language or odd words | Set Language explicitly; add names/terms to the Vocabulary hint |
| Same sentence repeated | Tick "Don't use previous text as context" |
| Two people merged into one speaker | Set the exact speaker count, or lower Separation sensitivity (e.g. 0.4) |
| One person split into several | Raise Separation sensitivity (e.g. 0.6); reassign lines to merge |
| Live: nothing appears | Check the level meter moves; choose the right input; for Voicemeeter enable the B-bus |
| Live: lines cut mid-sentence | Raise "Pause that ends a line" (e.g. 900 ms) |
| OBS overlay is blank | Enable the caption add-on; check URL and port; start a live session |
| Install fails silently | Re-run with /l*v log.txt and check for blocked winget calls or policy restrictions |
| Blocked by Smart App Control / WDAC | See Code signing & Smart App Control |
Developers
Dev environment
| Tool | Why | Install |
|---|---|---|
| .NET 8 SDK | Builds the WPF app | winget install Microsoft.DotNet.SDK.8 |
| WiX Toolset 5 (dotnet tool) | Builds the MSI | Restored automatically by build.ps1 via dotnet tool restore |
| FFmpeg | Runtime dependency for testing | winget install Gyan.FFmpeg |
| Python 3 + reportlab | Optional — regenerates the PDF guide | pip install reportlab |
| Visual Studio 2022 / Rider / VS Code | Optional IDE | — |
Get the code from the Source Code page. The add-on contract lives in a sibling project, WhisperDesk.Addons, so keep both folders side by side.
Building
# Debug build and run cd WhisperDesk dotnet build dotnet run # Full release: MSI + portable zip + guide PDF into .\dist .\build.ps1
build.ps1 runs dotnet publish -c Release (self-contained, win-x64) into publish\, builds Installer\WhisperDesk.wxs with WiX and the UI extension, zips the publish folder as the portable edition and copies the guide PDF.
| Helper | Purpose |
|---|---|
tools\make-logo.ps1 | Regenerates Assets\app.ico, logo.png, logo-tile.png |
docs\make_guide.py | Regenerates the User & Admin Guide PDF |
..\WhisperDesk.Addons | Add-on SDK contract (copied to sdk\ for developers) |
Project layout
| Path | What's there |
|---|---|
App.xaml, MainWindow.* | App entry point and the main window, split into partials (.Feed, .Formats, .Schedule) |
*Window.xaml | Dialogs: Settings, Add-ons, Library, Player, Summary, Voice library, Voice analysis, Bulk report… |
Services\ | Engine and domain logic — transcription, live sessions, speakers, library, exports, backup |
Services\Addons\ | AddonManager plus the built-in add-ons in BuiltIn\ |
Themes\ | Control templates and the darkcipher0x dark/light palettes |
Installer\ | WiX source (WhisperDesk.wxs) and licence RTF |
sdk\ | Add-on SDK: contract DLL, XML docs, README, SampleWordExport |
docs\ | Guide generator and screenshots |
Assets\ | Icons and logos |
Architecture
| Service | Responsibility |
|---|---|
TranscriptionEngine | Wraps Whisper.net (whisper.cpp) with CPU and Vulkan runtimes |
ModelManager | Model catalogue, downloads and integrity |
AudioDecoder, WavFile | FFmpeg-based decoding to 16 kHz mono PCM |
LiveAudioSource, LiveSession | WASAPI capture (mic / loopback / Voicemeeter) via NAudio, line segmentation, live speaker tagging |
SpeakerAnalyzer, SpeakerModels, SpeakerReanalysis | sherpa-onnx segmentation + embeddings, clustering, sex suggestion |
VoiceLibrary | Named voiceprints and matching |
RecordingLibrary | Folders, tags, metadata, full-text search |
TranscriptWriter, DocumentExporter, SubtitleBurner | TXT/SRT/VTT/JSON, Word/PDF (PDFsharp/MigraDoc), burned-in subtitles |
CallSummary, AiReport, BulkReport, ReportDocument | Offline summaries, optional Ollama reports, multi-recording reports |
VoiceForensics | Pitch/formant/jitter/shimmer profiles, voice comparison, audio integrity checks |
SessionPackage, WindowsShare | .wdsession packages, self-contained HTML player, Share sheet |
Backup | Zip / AES-256-GCM .wdbackup archives with SHA-256 verification |
AppSettings, ThemeManager, PrivacyInfo, InstallerIntegration | Settings persistence, theming, privacy statement, MSI property handoff |
Add-on events are dispatched by AddonManager on a background queue, one at a time and in order; exceptions in add-ons are caught and logged.
Dependencies
| Package | Version | Licence |
|---|---|---|
| Whisper.net + Runtime + Runtime.Vulkan | 1.9.1 | MIT |
| org.k2fsa.sherpa.onnx | 1.13.8 | Apache 2.0 |
| NAudio.Wasapi | 2.2.1 | MIT |
| PDFsharp-MigraDoc-WPF | 6.2.4 | MIT |
| Microsoft.Web.WebView2 | 1.0.2903.40 | BSD-style (Microsoft) |
| WiX Toolset | 5.x (build only) | MS-RL |
Models: OpenAI Whisper (MIT), pyannote segmentation and WeSpeaker embeddings via sherpa-onnx, Silero VAD (MIT). FFmpeg and Ollama are separate, optional programs and are not redistributed.
Release process
- Bump
<Version>,<AssemblyVersion>,<FileVersion>and<InformationalVersion>inWhisperDesk.csproj. The MSI version follows it, so newer MSIs upgrade older installs. - Update the "What's new" section in
docs\make_guide.pyand regenerate the PDF. - Run
.\build.ps1→dist\WhisperDesk-<ver>-x64.msi, portable zip and guide. - Test an upgrade over the previous version and confirm settings, voices and library survive.
- Publish the artefacts with their SHA-256 hashes (this website:
tools\sync-downloads.ps1).
Add-on SDK
Add-ons are .NET 8 class libraries implementing IWhisperDeskAddon from WhisperDesk.Addons.dll. Full walkthrough, downloads and examples are on the Add-ons page.
public interface IWhisperDeskAddon
{
string Id { get; } // unique, stable, e.g. "yourname.word-export"
string Name { get; }
string Description { get; }
string Author { get; }
IReadOnlyList<AddonOption> Options { get; }
void Start(IAddonHost host); // subscribe to host events
void Stop(); // unsubscribe and release resources
}
public sealed record AddonOption(string Key, string Label, string DefaultValue, string Help = "");
| IAddonHost member | Description |
|---|---|
AppVersion, DataFolder | Host version; a private folder for the add-on's files |
GetOption(key), Log(message) | Read a user setting; write to the Add-ons window log |
LineAdded | TranscriptLineEvent: SessionId, IsLive, Timestamp, Start, End, Text, Speaker, Sex, Language, IsEdited, OriginalText |
SessionStarted / SessionStopped | SessionEvent: SessionId, IsLive, Source, Timestamp |
TranscriptSaved | TranscriptSavedEvent: SessionId, Title, Source, Folder, PlainText, Lines |
LineEdited | LineEditedEvent: SessionId, LineStart, Speaker, OldText, NewText, Reason, User, At |
Reference the contract with Private=false so it isn't copied to your output, and don't ship WhisperDesk.Addons.dll with your add-on.
Caption server API
Provided by the built-in Live captions for OBS & browsers add-on. Listens on http://localhost:7890 (configurable), localhost only.
| Endpoint | Description |
|---|---|
GET / | Index with previews, copyable URLs and options |
GET /overlay | Transparent caption page. Params: theme (terminal, chat), lines, size, speaker, color, bg, font, align |
GET /events | text/event-stream. Events: line (JSON TranscriptLineEvent), session |
GET /api/lines | JSON array of the current live session's lines |
// Follow the live transcript from any web page or Node script
const es = new EventSource("http://localhost:7890/events");
es.addEventListener("line", e => {
const line = JSON.parse(e.data);
console.log(`${line.Speaker ?? "?"}: ${line.Text}`);
});
Webhook payloads
The built-in Webhook add-on sends an HTTP POST with a JSON body to the configured URL (10-second timeout; failures are written to the add-on log).
{
"type": "line", // "line" | "saved" | "started" | "stopped"
"app": "WhisperDesk",
"data": { // TranscriptLineEvent, TranscriptSavedEvent or SessionEvent
"sessionId": "…",
"isLive": true,
"start": "00:01:12.4000000",
"end": "00:01:15.9000000",
"text": "Welcome back to the stream",
"speaker": "Luke",
"sex": "Male",
"language": "en"
}
}
Contributing
- WhisperDesk is MIT-licensed — fork it, change it, ship it; keep the copyright and licence notice.
- Match the existing style: small focused services, XML doc comments on public members, no telemetry, nothing leaves the PC by default.
- Bug reports, patches and add-on ideas: the bug report form or the Discord.