Wiki / WhisperDesk

WhisperDesk Wiki

v1.5.0AdministratorsDevelopers

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

ComponentMinimumRecommended
WindowsWindows 10 64-bit, version 1809+Windows 11 64-bit
Processor4-core x64 with AVX28+ cores
Memory8 GB16–32 GB
GraphicsAny (CPU mode)Dedicated Vulkan GPU with 6–8 GB+ VRAM (AMD, NVIDIA or Intel), not shared with games or other GPU-heavy work
Disk1 GB + models (75 MB – 3.1 GB each)SSD with 10 GB free
FFmpegRequired 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.

Sizing tip: Whisper and the speaker models compete for GPU time and VRAM. Sharing a GPU with a game, renderer or encoder slows transcription and costs the other app performance. For live or heavy use, run WhisperDesk on a dedicated machine or a second GPU (e.g. a streaming PC), and set GPU device index in Settings on multi-GPU systems.

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

PropertyMeaning
INSTALLFOLDERInstall directory. Default C:\Program Files\DarkCipher Systems\WhisperDesk (1.4.2+).
INSTALLFFMPEG=1Install FFmpeg (Gyan.FFmpeg) with winget if it isn't found. On by default in the UI.
INSTALLOLLAMA=1Install Ollama with winget for local AI summaries. Off by default.
FFMPEGPATHFull path to an existing ffmpeg.exe.
LIBRARYPATH / MODELSPATHDefault library and models folders. Users can still change them in Settings.
REMOVE_LIBRARY / REMOVE_VOICES / REMOVE_SETTINGS / REMOVE_MODELSOn uninstall, also delete that data (=1) for the user running the uninstall. Only recording folders are removed from the library.
Note: winget-based installs (FFmpeg, Ollama) need internet access and winget available in the installing context. In locked-down environments, deploy FFmpeg separately and pass 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

PathContents
%LOCALAPPDATA%\WhisperDesk\settings.jsonAll settings
%LOCALAPPDATA%\WhisperDesk\modelsWhisper models; speakers\ holds speaker/VAD models
%LOCALAPPDATA%\WhisperDesk\voices.jsonVoice library (names, sex, voiceprints)
%LOCALAPPDATA%\WhisperDesk\addonsAdd-on DLLs; data\ holds add-on files
%LOCALAPPDATA%\WhisperDesk\liveTemporary live recordings until saved or discarded
Documents\WhisperDesk LibraryRecordings library (configurable); each recording's folder can hold a forensics-log.jsonl audit chain (1.5+)
HKLM\Software\darkcipher0x\WhisperDeskInstallDir (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+,).

SettingDefaultEffect
Brand accent colour36D2CBAccent for buttons and highlights
CPU threads0 (auto)Threads used by Whisper on the CPU
GPU device index0Which Vulkan GPU to use when several are installed
Flash attentionOffExperimental speed-up on some GPUs
Don't use previous text as contextOffPrevents rare repetition loops
Vocabulary hint(empty)Names and terms Whisper should spell correctly
Separation sensitivity0.5Auto speaker count: lower = more speakers
Voice library match0.5Similarity needed to name a known voice
Min speech / silence0.3 / 0.5 sShortest speech turn / pause that splits turns
Suggest male below / female above158 / 168 HzPitch thresholds for the sex suggestion
Pause that ends a line (live)600 msSilence needed before a live line is finished
Longest line (live)15 sForces a break during long monologues
Same-person threshold (live)0.45Similarity needed to count as someone already heard
FFmpeg locationautoCustom ffmpeg.exe path
Library locationDocuments\WhisperDesk LibraryWhere recordings are stored

Network & firewall

WhisperDesk never phones home. Outbound traffic happens only for features a user triggers:

DestinationWhen
huggingface.co, github.comDownloading a model the user selects
Ollama server (default localhost:11434)AI summaries / consolidated reports, if enabled
Webhook URLOnly if the Webhook add-on is enabled and configured
Windows Share sheetWhen the user presses Share
winget sourcesMSI 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\addons with App Control/AppLocker if users shouldn't add their own.
Forensics disclaimer: voice and audio analysis results are investigative indicators, not proof of identity or authenticity. For legal use, have an accredited forensic examiner review the original recordings.

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….

PartWhat it does
DisplayTime 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.
▶ SelectionPlays the selection, optionally looped.
MeasureLevel, 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 checkWhole-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 .wdbackup encrypted 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.

ItemValue
Product / ManufacturerWhisperDesk / darkcipher0x
MSI UpgradeCode3fc82978-8263-42a1-9d62-8b858d3c0a9b
AppUserModelIDdarkcipher0x.WhisperDesk
Assembly GUIDd06d3e32-6317-4cc3-a20f-2645b1c78f11
Install registry keyHKLM\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

ProblemSolution
"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 transcriptionUse Large-v3 Turbo or a smaller model; confirm GPU is selected; close other GPU-heavy apps
Wrong language or odd wordsSet Language explicitly; add names/terms to the Vocabulary hint
Same sentence repeatedTick "Don't use previous text as context"
Two people merged into one speakerSet the exact speaker count, or lower Separation sensitivity (e.g. 0.4)
One person split into severalRaise Separation sensitivity (e.g. 0.6); reassign lines to merge
Live: nothing appearsCheck the level meter moves; choose the right input; for Voicemeeter enable the B-bus
Live: lines cut mid-sentenceRaise "Pause that ends a line" (e.g. 900 ms)
OBS overlay is blankEnable the caption add-on; check URL and port; start a live session
Install fails silentlyRe-run with /l*v log.txt and check for blocked winget calls or policy restrictions
Blocked by Smart App Control / WDACSee Code signing & Smart App Control

Developers

Dev environment

ToolWhyInstall
.NET 8 SDKBuilds the WPF appwinget install Microsoft.DotNet.SDK.8
WiX Toolset 5 (dotnet tool)Builds the MSIRestored automatically by build.ps1 via dotnet tool restore
FFmpegRuntime dependency for testingwinget install Gyan.FFmpeg
Python 3 + reportlabOptional — regenerates the PDF guidepip install reportlab
Visual Studio 2022 / Rider / VS CodeOptional 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.

HelperPurpose
tools\make-logo.ps1Regenerates Assets\app.ico, logo.png, logo-tile.png
docs\make_guide.pyRegenerates the User & Admin Guide PDF
..\WhisperDesk.AddonsAdd-on SDK contract (copied to sdk\ for developers)

Project layout

PathWhat's there
App.xaml, MainWindow.*App entry point and the main window, split into partials (.Feed, .Formats, .Schedule)
*Window.xamlDialogs: 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

ServiceResponsibility
TranscriptionEngineWraps Whisper.net (whisper.cpp) with CPU and Vulkan runtimes
ModelManagerModel catalogue, downloads and integrity
AudioDecoder, WavFileFFmpeg-based decoding to 16 kHz mono PCM
LiveAudioSource, LiveSessionWASAPI capture (mic / loopback / Voicemeeter) via NAudio, line segmentation, live speaker tagging
SpeakerAnalyzer, SpeakerModels, SpeakerReanalysissherpa-onnx segmentation + embeddings, clustering, sex suggestion
VoiceLibraryNamed voiceprints and matching
RecordingLibraryFolders, tags, metadata, full-text search
TranscriptWriter, DocumentExporter, SubtitleBurnerTXT/SRT/VTT/JSON, Word/PDF (PDFsharp/MigraDoc), burned-in subtitles
CallSummary, AiReport, BulkReport, ReportDocumentOffline summaries, optional Ollama reports, multi-recording reports
VoiceForensicsPitch/formant/jitter/shimmer profiles, voice comparison, audio integrity checks
SessionPackage, WindowsShare.wdsession packages, self-contained HTML player, Share sheet
BackupZip / AES-256-GCM .wdbackup archives with SHA-256 verification
AppSettings, ThemeManager, PrivacyInfo, InstallerIntegrationSettings 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

PackageVersionLicence
Whisper.net + Runtime + Runtime.Vulkan1.9.1MIT
org.k2fsa.sherpa.onnx1.13.8Apache 2.0
NAudio.Wasapi2.2.1MIT
PDFsharp-MigraDoc-WPF6.2.4MIT
Microsoft.Web.WebView21.0.2903.40BSD-style (Microsoft)
WiX Toolset5.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

  1. Bump <Version>, <AssemblyVersion>, <FileVersion> and <InformationalVersion> in WhisperDesk.csproj. The MSI version follows it, so newer MSIs upgrade older installs.
  2. Update the "What's new" section in docs\make_guide.py and regenerate the PDF.
  3. Run .\build.ps1 → dist\WhisperDesk-<ver>-x64.msi, portable zip and guide.
  4. Test an upgrade over the previous version and confirm settings, voices and library survive.
  5. Publish the artefacts with their SHA-256 hashes (this website: tools\sync-downloads.ps1).
Never change the MSI UpgradeCode, AppUserModelID or assembly GUID — upgrades, taskbar pinning and notifications depend on them.

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 memberDescription
AppVersion, DataFolderHost 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
LineAddedTranscriptLineEvent: SessionId, IsLive, Timestamp, Start, End, Text, Speaker, Sex, Language, IsEdited, OriginalText
SessionStarted / SessionStoppedSessionEvent: SessionId, IsLive, Source, Timestamp
TranscriptSavedTranscriptSavedEvent: SessionId, Title, Source, Folder, PlainText, Lines
LineEditedLineEditedEvent: 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.

EndpointDescription
GET /Index with previews, copyable URLs and options
GET /overlayTransparent caption page. Params: theme (terminal, chat), lines, size, speaker, color, bg, font, align
GET /eventstext/event-stream. Events: line (JSON TranscriptLineEvent), session
GET /api/linesJSON 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.