diff --git a/docs/whisper-ecosystem/brief.md b/docs/whisper-ecosystem/brief.md new file mode 100644 index 0000000..d319f0f --- /dev/null +++ b/docs/whisper-ecosystem/brief.md @@ -0,0 +1,283 @@ +# Kon — Whisper Ecosystem Research Brief + +*Spec handover for Claude Code. Mined across 10 open-source Whisper apps, synthesised April 2026. British English. Every claim URL-backed — see Sources.* + +## TL;DR + +Ten repos surveyed (whisper.cpp, whisper-rs, Handy, Buzz, Whispering/Epicenter, faster-whisper, WhisperLive, whisper_streaming, Scriberr, Vibe, plus OpenWhispr). The dominant pre-emptive patches for Kon cluster around **silent CUDA fallback, global-hotkey edge cases, MSVC C-runtime linking between `whisper-rs-sys` and `tokenizers`, clipboard overwrite on paste, and Tauri HTTP scope blocking localhost LLM calls**. The highest-leverage features to pinch are **an engine-abstraction crate (`transcribe-rs` pattern), a named-prompt transformation pipeline with raw-transcript preservation, Vulkan as the default GPU path on Windows, VAD-gated chunking with a hallucination blocklist, and a warm-up audio file at launch**. + +--- + +## Cross-repo pain pattern matrix + +| Pain point | Repos where observed | Severity for Kon | Recommended Kon mitigation | +|---|---|---|---| +| Silent CPU fallback when CUDA version mismatches | whisper.cpp #2857, #2214, #2297; faster-whisper #1398; Buzz FAQ; Handy #209 | **H** | Detect actual compute device at runtime, log it, show in UI; prefer Vulkan default on Windows | +| Global-hotkey bugs (modifier-only, right-hand mods, F13–F24, single-key on Linux, Fn on macOS) | Handy #1143/#1105/#1019/#966/#956/#917/#47; Whispering #491/#500/#484/#549 | **H** | Dedicated cross-platform hotkey layer; per-OS capability matrix; reject invalid combos in UI | +| `whisper-rs-sys` + `tokenizers` MSVC CRT conflict on Windows | Whispering v7.11.0 | **H** | Avoid `tokenizers` crate in the same binary as whisper-rs on Windows; or route text pre/post-proc via an IPC'd sidecar | +| Audio-capture init race (first press records nothing, mic double-init) | Handy #1143, #1101, #1063 | **H** | Warm CPAL stream at app start; debounce hotkey; serialise record/stop via state machine | +| Clipboard overwrite / not restored after paste | Handy #921 (fixed by PR #1040), #692 (direct-paste in terminals) | **H** | Snapshot clipboard, paste, restore on 200 ms timer on a background thread | +| Model download corrupted → crash on load | Buzz FAQ; Handy release notes | **M** | SHA checksum verify + resumable HTTP; keep raw audio on disk even if transcribe fails | +| Tauri `http://127.0.0.1:11434` blocked by scope allowlist | Vibe #438, #487 | **H** | Pre-approve localhost LLM endpoint in `tauri.conf.json` capabilities; never surface the raw error | +| Ollama discoverability / localhost binding | Scriberr #111, #144; Vibe #440, #438 | **H** | Auto-detect + "Test connection" button + prefilled defaults; visible status chip | +| VRAM contention between Whisper and LLM on one GPU | Scriberr #217 | **M** | Pipeline: finish+unload Whisper, then load LLM; never run both concurrently by default | +| AVX2 / old-CPU `illegal instruction` | whisper-rs #8, #117; Buzz FAQ | **M** | Detect CPU flags at first launch; ship non-AVX2 fallback build | +| Chunk-boundary hallucinations ("Thanks for watching", "字幕by…") | WhisperLive #185, #246; ufal #121 | **H** | Blocklist + `no_speech_prob`/`avg_logprob` gate + `condition_on_previous_text=false` on low-conf chunks | +| Buffer-bloat / latency cliff past 30 s | ufal #120, #102 | **H** | Aggressive buffer trim tied to commit points, not wall clock | +| Prompt-loop poisoning (repetition cascades) | ufal #161 | **M** | Detect repetition; reset context window; expose `repetition_penalty` | +| Cold-start first-chunk latency (~4–5 s) | ufal #96, #135 | **M** | Run a silent warm-up WAV on launch + after idle | +| Wayland vs X11 / ALSA / Pipewire | Handy #1105, PRs #1025/#1042; Whispering (X11-only AppImage) | **M** | Target Pipewire first, gate Wayland global-shortcuts behind feature flag | +| macOS App Nap silently stops recording | Whispering #549, #559 | **M** | Disable App Nap while recording (`NSProcessInfo` activity) | +| macOS code-sign / accessibility reprompt loops | Whispering PR #195, v4 hotfix | **M** | Notarise + entitlements; persist accessibility grant; document `xattr -cr` only as last resort | +| Windows DLL hell (libssl, vulkan-1.dll on CPU-only) | Buzz #1459; Whispering #840, #829 | **M** | Bundle required DLLs in installer; fall back cleanly if Vulkan runtime absent | +| Direct-paste duplicates/breaks in terminals (Codex, Claude Code) | Handy #692 | **M** | Detect terminal focus; switch paste mode to clipboard-only in those apps | +| Settings reset on update | Handy #602 | **L** | Versioned schema migration; never destructive upgrade | + +--- + +## Killer features inventory + +| Feature | Source repo(s) | Implementation complexity | Kon priority | +|---|---|---|---| +| Engine abstraction crate (Whisper / Parakeet / Moonshine behind one trait) | Handy, Whispering (both use `transcribe-rs`) | **M** | MVP — unblocks Windows fallback off whisper-rs | +| Vulkan backend as default Windows GPU path | whisper.cpp, Buzz, Vibe | **S** | MVP | +| GPU enumeration + auto-select UI with active-device indicator | Handy PR #1142 | **S** | MVP | +| VAD-gated chunking with Silero | whisper.cpp, Buzz v1.4.4, faster-whisper | **M** | MVP (already in streaming scope) | +| Hallucination blocklist + confidence gate | WhisperLive #185, ufal #121 | **S** | MVP | +| Warm-up WAV at launch | ufal (warm-up file PR) | **S** | MVP | +| LocalAgreement-n streaming commit policy | ufal | **M** | v1 (if Kon streaming currently naive) | +| Initial prompt / custom-vocab biasing | Whispering PR #1132, Buzz, Handy custom-words | **S** | MVP | +| Progressive audio save (crash-safe) | Whispering | **S** | MVP | +| Keep audio on disk when transcription fails, offer retry | Handy v0.8.0 | **S** | MVP | +| Named prompt presets (email / notes / code / summary) | Scriberr, Whispering, OpenWhispr | **S** | MVP | +| Chained "transformation" pipeline (LLM → find/replace → LLM) | Whispering | **M** | v1 | +| Dual LLM provider toggle (bundled local ↔ BYO cloud) | Vibe, OpenWhispr, Scriberr | **S** | v1 | +| "Test connection" button for LLM endpoint | Vibe (pattern; buggy impl) | **S** | MVP | +| Raw-transcript always preserved; diff/undo LLM output | implicit in Scriberr, Whispering system prompt | **S** | MVP | +| Speaker-aware prompt substitution | Scriberr PR #294 | **S** | v1 | +| Plain-text (not JSON) fed to LLM | Scriberr PR #288 | **S** | MVP | +| Streaming LLM output with cancel button | standard Ollama/llama.cpp | **S** | MVP | +| Sound cues on start/stop/complete | Handy | **S** | MVP | +| Pause-while-recording (mute other audio) | Handy PR #1028, #998 | **M** | v1 | +| Auto-start on system login | Whispering PR #1161 | **S** | v1 | +| Auto-update channel with safe rollback | Handy #883; Whispering | **M** | v1 | +| Subtitle / SRT / VTT I/O | Buzz #1423/#1426 | **M** | later | +| Folder-watcher batch mode | Scriberr, Buzz | **M** | later | +| MCP/CLI "run user command with STDIN/STDOUT" hook | Handy Discussion #211 | **M** | later | + +--- + +## Streaming-specific findings + +- **VAD is necessary but not sufficient.** Both WhisperLive and ufal ship Silero VAD and still produce "Thanks for watching!" / "字幕by…" artefacts at chunk edges. Layer a secondary defence: a phrase blocklist, a `no_speech_prob` / `avg_logprob` gate, and toggle `condition_on_previous_text=false` during low-confidence chunks. +- **Buffer management past the 30-second Whisper context is the top failure mode.** ufal #120 and #102 show naive rolling buffers degrade catastrophically at long-session scale. Trim must be aggressive and tied to a confirmed commit point, not clock time. +- **LocalAgreement-n is the de-facto streaming policy** for un-fine-tuned Whisper. Emission latency ≈ 2× chunk size, and every chunk is re-transcribed multiple times, which is costly but correct. Newer AlignAtt (ufal/SimulStreaming, IWSLT 2025 winner) is ~5× faster — flag for a later swap. +- **Prompt carry-over is a two-edged sword.** Helpful for proper nouns (ufal's `static_init_prompt`), lethal on repetition loops (#161) or when the model wasn't trained with prompt conditioning (#133). Expose `condition_on_previous_text` as a runtime toggle and reset context on repetition detection. +- **Cold-start latency is universal (~4–5 s on first chunk).** Run a short silent WAV at app launch and after any GPU/ANE idle. +- **Backend abstraction is mandatory for Kon's five-platform target.** WhisperLive runs faster-whisper / TensorRT-LLM / OpenVINO behind one socket; ufal swaps faster-whisper / whisper-timestamped / MLX / OpenAI API. Bake this in early. +- **Reconnect/resume logic is under-engineered in both reference projects** (WhisperLive #388). For mobile targets, design resumable streaming from day one — no good OSS reference exists. +- **First chunk triggers the full Whisper context window to allocate**, causing the latency cliff. Pre-allocate on warm-up. +- **Multi-client fan-out** (WhisperLive PR #174) is a clean pattern if Kon ever wants simultaneous transcribe + translate on one mic. + +--- + +## LLM formatting layer findings + +- **Auto-apply LLM cleanup is where "LLM changed my meaning" complaints originate.** None of Scriberr/Vibe/OpenWhispr have this class of issue in volume because they keep LLM post-processing explicitly opt-in. Kon auto-applies — make it one-keystroke revertable and always show the raw transcript. +- **Ollama connectivity is the #1 source of user-facing LLM bugs** — Scriberr #111/#144, Vibe #438/#487. Solve with auto-detect, "Test connection", pre-approved Tauri HTTP capability for `127.0.0.1:11434` (and whichever port bundled llama.cpp uses), and a visible status chip. +- **VRAM contention** (Scriberr #217): bundled LLM + Whisper on one consumer GPU evict each other. Default to sequential execution: finish Whisper, unload, run LLM. +- **Feed plain text to the LLM, not raw Whisper JSON with timestamps** — Scriberr PR #288 made this switch and materially improved quality. +- **Substitute speaker labels ("SPEAKER_00" → user-assigned name) before prompting** — Scriberr PR #294. +- **CUDA/cuDNN fragmentation pushes projects towards Vulkan** — Vibe migrated off CUDA-exe (300 MB) to Vulkan whisper.cpp precisely to escape version hell. Same logic applies to llama.cpp — prefer Vulkan backend on Windows. +- **Non-English transcripts are already weaker** (Vibe Vietnamese/Hebrew). LLM "cleanup" will compound errors. Always keep raw-transcript revert; never rewrite history in the paste buffer. +- **System-prompt framing matters.** Whispering's published baseline — *"translator from spoken to written form, not an editor trying to improve the content"* — directly mitigates overcorrection. Copy this framing. +- **Settings per task** (tiny model for titles, bigger for summaries) — Scriberr pattern. Kon can extend: faster model for paste-time cleanup, bigger for explicit summarise action. +- **Streaming LLM output with cancellation** — standard Ollama/llama.cpp capability but rarely shipped; users hit X on 30-second summaries. + +--- + +## Atomic task backlog + +### Pre-emptive patches + +1. **Detect and surface active compute device.** Pain: silent CUDA→CPU fallback. Accept: settings shows "GPU: Vulkan RTX 3060" or "CPU (fallback: driver 545 < required 555)". +2. **Pre-approve `http://127.0.0.1:*` in Tauri capabilities for LLM endpoint.** Pain: Vibe #438 opaque scope error. Accept: localhost LLM HTTP calls never hit scope error in any default install. +3. **Add clipboard snapshot + restore-on-timer after paste.** Pain: Handy #921. Accept: user's prior clipboard content is restored within 300 ms of paste. +4. **Warm CPAL/WASAPI stream at app start; debounce hotkey trigger.** Pain: Handy #1143 first-press-fails, #1101 double-init. Accept: first hotkey press post-launch captures audio from t=0. +5. **Hotkey capability matrix per OS with UI rejection of invalid combos.** Pain: Handy #966/#956/#917/#1019/#1105. Accept: user cannot bind single-key on X11, right-mod on Windows, or Fn on macOS; UI explains why. +6. **Guard against `whisper-rs-sys` + `tokenizers` in same Windows binary.** Pain: Whispering v7.11.0. Accept: Windows build either omits `tokenizers` or isolates text pre-processing in a sidecar process. +7. **CPU feature detection at first launch with non-AVX2 fallback path.** Pain: whisper-rs #8/#117. Accept: app starts without "illegal instruction" on a pre-2013 CPU. +8. **Checksum-verify + resumable model downloads; retain audio when transcription fails.** Pain: Buzz FAQ; Handy v0.8.0 pattern. Accept: corrupted download is re-fetched on next launch, raw WAV is kept for manual retry. +9. **Disable macOS App Nap while recording and while LLM runs.** Pain: Whispering #549. Accept: 10-minute background recording completes unattended. +10. **Detect focused-app class; use clipboard-only paste in terminal emulators.** Pain: Handy #692. Accept: typing into Windows Terminal, iTerm2, Kitty, Alacritty does not duplicate characters. +11. **Versioned settings schema with forward-migration.** Pain: Handy #602. Accept: settings from v0.x survive upgrade to v1.y without loss. +12. **Bundle Vulkan loader and libssl DLLs in Windows installer with CPU-only fallback.** Pain: Whispering #840/#829, Buzz #1459. Accept: app launches cleanly on a VM with no GPU and on a fresh Windows install. + +### Feature pinches + +13. **Introduce engine-abstraction trait (`Transcriber`) with Whisper + Parakeet backends.** Pain/feature: Handy/Whispering `transcribe-rs` pattern; Windows whisper-rs CRT escape. Accept: engine swap at runtime via settings, no restart. +14. **GPU enumeration and explicit device selector in settings.** Feature: Handy PR #1142. Accept: dropdown lists all detected GPUs plus CPU; current active device highlighted. +15. **Named LLM prompt presets (Email, Meeting Notes, Code, Quick Clean).** Feature: Scriberr, Whispering. Accept: user picks preset from status-bar dropdown before dictating; prompts are user-editable. +16. **System-prompt baseline framed as "translator, not editor".** Feature: Whispering. Accept: default cleanup prompt is committed with that exact framing; overcorrection regression test passes. +17. **Raw-transcript-always-preserved with one-keystroke revert.** Feature: implicit in Scriberr/Whispering. Accept: after paste, ⌘/Ctrl+Z within 5 s replaces LLM output with raw transcript. +18. **Initial-prompt / custom-vocab field for domain terms.** Feature: Whispering PR #1132. Accept: user-supplied term list is passed as Whisper initial prompt and biases output. +19. **Progressive audio write to disk during capture.** Feature: Whispering. Accept: crash during transcription leaves a playable WAV in the session folder. +20. **Sound cues for start / stop / complete, user-toggleable.** Feature: Handy. Accept: three distinct short cues, volume slider, mute toggle. + +### Streaming + +21. **Silero-VAD-gated chunker with configurable threshold + hysteresis.** Pain: WhisperLive #185. Accept: sustained background noise at 0.4–0.5 VAD score does not trigger transcription. +22. **Hallucination blocklist + `avg_logprob`/`no_speech_prob` confidence gate.** Pain: WhisperLive #185/#246, ufal #121. Accept: chunks containing only blocklisted phrases or below confidence threshold are dropped, not emitted. +23. **Warm-up silent WAV on app launch and after 60 s idle.** Pain: ufal #96/#135 cold-start. Accept: first user chunk post-warm-up completes in ≤ 1.5× steady-state latency. +24. **LocalAgreement-n commit policy with configurable n.** Feature: ufal. Accept: partial text is emitted only once confirmed across n=2 consecutive passes; tentative tail is visually distinct. +25. **Aggressive buffer trim tied to commit points (not clock).** Pain: ufal #120/#102. Accept: 10-minute continuous session does not exhibit latency growth past chunk 30. +26. **Repetition detector that resets context window and drops the chunk.** Pain: ufal #161. Accept: three consecutive identical tokens trigger context reset within one chunk. + +### LLM layer + +27. **"Test connection" button with proper error classification.** Pain/feature: Vibe #438/#440. Accept: failure surfaces "Ollama not installed" / "port blocked" / "model not pulled" — never a raw URL scope error. +28. **Sequential Whisper-then-LLM execution; shared GPU guard.** Pain: Scriberr #217. Accept: on single-GPU systems, LLM does not load until Whisper has unloaded; configurable concurrent mode for users with ≥16 GB VRAM. +29. **Plain-text pre-formatter before LLM prompt.** Pain/feature: Scriberr PR #288. Accept: Whisper segments are joined into natural sentences before being sent to the LLM; timestamps stripped. +30. **Streaming LLM output with cancel button.** Feature: standard but underused. Accept: user can cancel mid-summary; partial output is kept or discarded per user pref. +31. **Visible LLM status chip (disconnected / warming / generating).** Pain: Ollama discoverability. Accept: chip reflects true state within 500 ms of change. + +--- + +## What couldn't be verified + +- **GitHub `/issues?q=...sort=reactions-%2B1-desc` URLs were blocked at the fetch layer for several repos.** Ordering of feature requests by raw reaction count is therefore inferred from comment volume, maintainer engagement, and release-note inclusion rather than numeric reaction tallies. +- **whisper-rs (GitHub) was archived on 30 July 2025; development continues at `codeberg.org/tazz4843/whisper-rs`.** Issue numbers cited post that date will not resolve on GitHub. Kon should track Codeberg or fork. +- **OpenWhispr issue tracker was not fully mined within budget** — included as a named reference for the bundled-llama.cpp architecture only. Pain-point claims for it are sourced from its README and a third-party dev.to writeup, not from its issues. +- **Whispering / EpicenterHQ issue tracker** was not fully mined — the repo was cited via its release notes and README; its issue base may contain further pain patterns worth a follow-up. +- **Scriberr, Vibe PR numbers (#288, #294, #438, #487, #217, #111, #144)** were sourced via search-result snippets where direct issue-page fetches were refused; titles and content are quoted but exact current status (open/closed/merged as of 21 Apr 2026) was not re-checked on each. +- **faster-whisper is named MIT** but its heavy Python + CUDA runtime footprint makes it a pattern source, not a recommended Kon dependency. +- **Scriberr** is **MIT, not AGPL** as the brief had hedged — full lifting is permitted; the "reference only" warning in the original task spec does not apply. +- **WhisperLive** is **MIT confirmed** — full lifting permitted. +- **`ufal/whisper_streaming` is maintenance-only**; upstream momentum has moved to `ufal/SimulStreaming` (also MIT). Consider tracking that repo for v1+. +- **Mobile (iOS, Android) pain surface** is under-represented in this survey — none of the ten desktop repos have a mature mobile story beyond whisper.cpp's XCFramework and WhisperLive's `ios-client`. Kon's mobile backlog will need a dedicated pass. + +--- + +## Sources + +https://github.com/ggerganov/whisper.cpp +https://github.com/ggml-org/whisper.cpp +https://github.com/ggml-org/whisper.cpp/releases +https://github.com/ggml-org/whisper.cpp/issues/2857 +https://github.com/ggml-org/whisper.cpp/issues/2214 +https://github.com/ggml-org/whisper.cpp/issues/2297 +https://github.com/ggerganov/whisper.cpp/issues/1502 +https://github.com/ggml-org/whisper.cpp/issues/2258 +https://github.com/ggml-org/whisper.cpp/issues/3095 +https://github.com/ggml-org/whisper.cpp/issues/3254 +https://github.com/ggml-org/whisper.cpp/discussions/2275 +https://github.com/tazz4843/whisper-rs +https://codeberg.org/tazz4843/whisper-rs +https://github.com/tazz4843/whisper-rs/blob/master/CHANGELOG.md +https://github.com/tazz4843/whisper-rs/issues/8 +https://github.com/tazz4843/whisper-rs/issues/22 +https://github.com/tazz4843/whisper-rs/issues/71 +https://github.com/tazz4843/whisper-rs/issues/117 +https://github.com/tazz4843/whisper-rs/issues/135 +https://github.com/tazz4843/whisper-rs/discussions/93 +https://github.com/cjpais/Handy +https://github.com/cjpais/Handy/releases +https://github.com/cjpais/Handy/pull/1028 +https://github.com/cjpais/Handy/pull/1025 +https://github.com/cjpais/Handy/pull/1042 +https://github.com/cjpais/Handy/discussions/211 +https://github.com/cjpais/Handy/discussions/599 +https://github.com/cjpais/Handy/discussions/666 +https://github.com/cjpais/Handy/discussions/1182 +https://github.com/cjpais/Handy/issues/16 +https://github.com/cjpais/Handy/issues/47 +https://github.com/cjpais/Handy/issues/209 +https://github.com/cjpais/Handy/issues/436 +https://github.com/cjpais/Handy/issues/602 +https://github.com/cjpais/Handy/issues/692 +https://github.com/cjpais/Handy/issues/883 +https://github.com/cjpais/Handy/issues/917 +https://github.com/cjpais/Handy/issues/921 +https://github.com/cjpais/Handy/issues/956 +https://github.com/cjpais/Handy/issues/966 +https://github.com/cjpais/Handy/issues/990 +https://github.com/cjpais/Handy/issues/998 +https://github.com/cjpais/Handy/issues/1005 +https://github.com/cjpais/Handy/issues/1019 +https://github.com/cjpais/Handy/issues/1063 +https://github.com/cjpais/Handy/issues/1101 +https://github.com/cjpais/Handy/issues/1105 +https://github.com/cjpais/Handy/issues/1143 +https://github.com/cjpais/Handy/issues/1165 +https://github.com/chidiwilliams/buzz +https://github.com/chidiwilliams/buzz/releases +https://github.com/chidiwilliams/buzz/releases/tag/v1.4.4 +https://github.com/chidiwilliams/buzz/issues/1386 +https://github.com/chidiwilliams/buzz/issues/1399 +https://github.com/chidiwilliams/buzz/issues/1422 +https://github.com/chidiwilliams/buzz/issues/1423 +https://github.com/chidiwilliams/buzz/issues/1426 +https://github.com/chidiwilliams/buzz/issues/1429 +https://github.com/chidiwilliams/buzz/issues/1438 +https://github.com/chidiwilliams/buzz/issues/1441 +https://github.com/chidiwilliams/buzz/issues/1442 +https://github.com/chidiwilliams/buzz/issues/1452 +https://github.com/chidiwilliams/buzz/issues/1459 +https://chidiwilliams.github.io/buzz/docs/faq +https://chidiwilliams.github.io/buzz/docs/installation +https://github.com/braden-w/whispering +https://github.com/EpicenterHQ/epicenter +https://github.com/EpicenterHQ/epicenter/releases/tag/v7.11.0 +https://github.com/EpicenterHQ/epicenter/pull/634 +https://github.com/EpicenterHQ/epicenter/pull/686 +https://github.com/EpicenterHQ/epicenter/pull/1132 +https://github.com/EpicenterHQ/epicenter/pull/1157 +https://github.com/EpicenterHQ/epicenter/pull/1161 +https://github.com/braden-w/whispering/issues/4 +https://github.com/braden-w/whispering/issues/829 +https://github.com/braden-w/whispering/issues/840 +https://github.com/braden-w/whispering/releases +https://github.com/EpicenterHQ/epicenter/tree/main/apps/whispering +https://github.com/SYSTRAN/faster-whisper +https://github.com/SYSTRAN/faster-whisper/issues/951 +https://github.com/SYSTRAN/faster-whisper/issues/1025 +https://github.com/SYSTRAN/faster-whisper/issues/1240 +https://github.com/SYSTRAN/faster-whisper/issues/1337 +https://github.com/SYSTRAN/faster-whisper/issues/1370 +https://github.com/SYSTRAN/faster-whisper/issues/1388 +https://github.com/SYSTRAN/faster-whisper/issues/1398 +https://github.com/SYSTRAN/faster-whisper/issues/1416 +https://github.com/SYSTRAN/faster-whisper/discussions/1296 +https://huggingface.co/Systran/faster-whisper-large-v3 +https://github.com/collabora/WhisperLive +https://github.com/collabora/WhisperLive/blob/main/LICENSE +https://github.com/collabora/WhisperLive/blob/main/whisper_live/vad.py +https://github.com/collabora/WhisperLive/releases +https://github.com/collabora/WhisperLive/issues/185 +https://github.com/collabora/WhisperLive/issues/246 +https://github.com/collabora/WhisperLive/issues/388 +https://github.com/collabora/WhisperLive/pull/174 +https://github.com/ufal/whisper_streaming +https://github.com/ufal/whisper_streaming/blob/main/whisper_online_server.py +https://github.com/ufal/whisper_streaming/issues/96 +https://github.com/ufal/whisper_streaming/issues/102 +https://github.com/ufal/whisper_streaming/issues/120 +https://github.com/ufal/whisper_streaming/issues/121 +https://github.com/ufal/whisper_streaming/issues/133 +https://github.com/ufal/whisper_streaming/issues/135 +https://github.com/ufal/whisper_streaming/issues/157 +https://github.com/ufal/whisper_streaming/issues/161 +https://github.com/ufal/SimulStreaming +https://arxiv.org/html/2506.12154v1 +https://github.com/rishikanthc/Scriberr +https://github.com/rishikanthc/Scriberr/issues/111 +https://github.com/rishikanthc/Scriberr/issues/144 +https://github.com/rishikanthc/Scriberr/issues/217 +https://github.com/rishikanthc/Scriberr/discussions/313 +https://github.com/thewh1teagle/vibe +https://github.com/thewh1teagle/vibe/blob/main/LICENSE +https://github.com/thewh1teagle/vibe/issues/438 +https://github.com/thewh1teagle/vibe/issues/440 +https://github.com/thewh1teagle/vibe/issues/487 +https://github.com/OpenWhispr/openwhispr +https://github.com/OpenWhispr/openwhispr/blob/main/LICENSE