$ show ppXD/Wisp
Wisp is a local-first, real-time meeting transcription desktop application built with Rust and SvelteKit, using Tauri v2 for cross-platform deployment (macOS Apple Silicon, Windows x64). It captures microphone and system audio, runs on-device automatic speech recognition (ASR) using multiple engines (whisper.cpp, sherpa-onnx, Apple Speech), provides live speaker-diarized transcripts with timestamps, and supports offline semantic search via local ONNX embedding models. The architecture is modular, with pluggable traits for audio sources, ASR engines, denoisers, echo cancellers, and model stores. It also offers optional cloud transcription (OpenAI, Gemini, Groq, etc.) and AI assist features. Although primarily an application, it integrates significant data engineering patterns for streaming audio processing, feature extraction (VAD, diarization), and on-device model management.
The LLM identified 4 files worth highlighting for reuse:
Defines the core trait contracts (AsrEngine, StreamingAsrEngine, AudioSource, Denoiser, Diarizer, Segmenter, Vad, EchoCanceller, ModelStore) that enable component interchangeability. Each trait is narrowly scoped with clear input/output types, making the system easy to extend or mock. This pattern is reusable for any real-time audio processing pipeline that needs swappable backends.
Implements ParamSpec and ParamValues, a typed, UI-agnostic parameter system that allows engine configurations (temperature, VAD settings, language) to be defined in Rust and automatically rendered by a single Svelte component (ParamsPanel.svelte). Adding a new knob requires no frontend changes. This pattern is highly reusable for any system requiring dynamic configuration of multiple backends.
Provides HttpDownloader with regional mirror failover (Hugging Face, mirrors), proxy support (HTTP/SOCKS), partial resume via Range headers, and progress reporting. The design is generic and could be extracted as a standalone crate for any file download use case requiring reliability and user feedback.
Transcriber orchestrates both file (batch) and live (streaming) transcription. It handles merging consecutive segments from utterances, rolling context injection (recent finalized text fed back as bias), and utterance identity sharing for partial → final updates. The clean separation of concerns between segmentation, transcription, and finalization makes this a reusable pattern for any streaming NLP pipeline.