Files
Lumotia/docs/architecture-map/03-audio-transcription/audio-vad.md
Jake 26c7307607
Some checks failed
check / cargo check (macos-latest) (push) Has been cancelled
check / cargo check (ubuntu-22.04) (push) Has been cancelled
check / cargo check (windows-latest) (push) Has been cancelled
check / svelte build + lint (push) Has been cancelled
agent: lumotia-rebrand — docs, scripts, root config, residuals
Phase 9 of the rebrand cascade. Sweep covers everything the Phase 8
frontend pass deliberately skipped: docs/, root markdown, scripts,
Cargo.toml descriptions, code comments that survived earlier
word-boundary sed, plus a handful of identifiers caught on the final
verify pass.

transcription-app changes:
- README.md, HANDOVER.md, KNOWN-ISSUES.md, run.sh — magnotia/Magnotia
  -> lumotia/Lumotia.
- docs/ — sweep across all subdirs except docs/handovers/ (preserved
  as immutable audit trail). Includes architecture-map references
  to magnotia_core::*, magnotia_storage::*, etc. now pointing at
  lumotia_*; dev-setup.md tracing output examples (lumotia_startup
  target); brief/ + superpowers/ + issues/ + whisper-ecosystem/ +
  audit/.
- Cargo.toml descriptions on 9 crates (core, audio, cloud-providers,
  hotkey, llm, mcp, plus referenced others).
- crates/core/src/{error,hardware,recommendation,paths}.rs +
  crates/audio/src/wav.rs + crates/llm/src/model_manager.rs +
  crates/cloud-providers/src/keystore.rs + crates/mcp/src/lib.rs —
  doc comments and a model-manager user-agent string.
- Caught on final pass: BroadcastChannel("magnotia_task_sync") -> ...
  ("lumotia_task_sync"); magnotia_locale i18n localStorage key
  renamed + migration shim added; CSS keyframe names
  magnotiaPulse / magnotiaBar / magnotiaFade renamed in the design-
  system kit; magnotia_viewer_item / magnotia_viewer_mode handoff
  keys renamed in HistoryPage + viewer/+page.svelte; src/assets/
  wordmark.svg text.
- src-tauri/src/lib.rs comment cleanup ("magnotia era" was sed'd
  to "lumotia era" earlier — restored).

Preserved (intentional):
- crates/core/src/paths.rs — keeps "magnotia" / "Magnotia" / ".magnotia"
  legacy detection strings in legacy_and_target_paths() so the
  migration shim can still find user data from the magnotia era.
- src/lib/stores/{page,focusTimer}.svelte.ts + src/lib/i18n/index.ts
  — migration call sites reference the legacy magnotia keys
  deliberately.
- docs/handovers/ — historical audit trail.

cargo build --workspace passes. npm run check: 0 errors / 0 warnings
(3958 files). cargo test --workspace: 339 pass / 0 fail.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-13 12:38:03 +01:00

3.2 KiB

name, type, slice, last_verified
name type slice last_verified
Audio VAD (currently a stub) architecture-map-page 03-audio-transcription 2026/05/09

Audio VAD (currently a stub)

Where you are: Architecture mapAudio + Transcription → Audio VAD

Plain English summary. lumotia-audio exposes a SpeechDetector type, but right now its is_speech() returns true for every input. This is a deliberate stub: both candidate Silero VAD bindings pin an older ort version than transcribe-rs (Parakeet) requires, so adding either today would force a workspace-wide downgrade. Live capture uses the energy-based RmsVadChunker from the transcription crate as the working fallback until the ort ecosystem aligns.

At a glance

  • Crate: lumotia-audio
  • Path: crates/audio/src/vad.rs
  • LOC: 35
  • External deps: none (pulls VAD_SPEECH_THRESHOLD from lumotia_core::constants).
  • Internal callers (best effort): unused in production today. The threshold is read but never compared, because is_speech always returns true.

Public surface:

  • pub struct SpeechDetectorcrates/audio/src/vad.rs:14, derives Default.
  • pub fn SpeechDetector::new() -> Selfcrates/audio/src/vad.rs:19.
  • pub fn SpeechDetector::is_speech(&self, _samples: &[f32]) -> boolcrates/audio/src/vad.rs:26.
  • pub fn SpeechDetector::threshold(&self) -> f64crates/audio/src/vad.rs:30.
  • pub fn SpeechDetector::reset(&mut self)crates/audio/src/vad.rs:34.

What's in here

The whole file is the stub plus an explanatory header:

Both voice_activity_detector and silero-vad-rust pin ort 2.0.0-rc.10 which conflicts with transcribe-rs requiring ort 2.0.0-rc.12. When the ort ecosystem aligns (likely at 2.0.0 stable), add Silero VAD here.

For now, all audio is treated as speech. This matches v0.2 behaviour (no VAD) and doesn't affect core functionality.

The threshold comes from VAD_SPEECH_THRESHOLD (slice 5) and is currently dead weight.

Data flow

SpeechDetector::is_speech(samples) -> true. There is no flow.

Watch-outs

  • The other VAD lives in the transcription crate. RmsVadChunker (see transcription-streaming.md) is the live-capture chunker that actually decides what gets transcribed. When Silero lands here, expect to consolidate the two: the chunker becomes a thin shell around a real VAD predicate.
  • is_speech returning true is a feature, not a bug. v0.2 had no VAD at all. The stub keeps the interface stable so callers can switch to a real Silero impl without a code change.
  • Do not reach for voice_activity_detector 0.x or silero-vad-rust 6.x without a workspace-wide ort audit. The conflict is documented, has bitten before, and will bite again until upstream ort reaches a stable that both crates target.
  • reset() is a no-op. The trait shape exists for future Silero state.

See also

  • Transcription streamingRmsVadChunker, the actual gating today.
  • lumotia_core::constants::VAD_SPEECH_THRESHOLD (slice 5) — wired but unused.
  • Cargo.toml of lumotia-audio — the commented-out silero-vad-rust = "6" line documents the deferred dep.