sonarwise
Pluggable audio perception engine. Hear. Search. Retrieve.
sonarwise indexes any audio like meetings, calls, podcasts, factory floors, lectures and makes it searchable by text, speaker, sound events, or audio similarity. Every component is pluggable: swap transcription, embedding, diarization, or storage without changing your code.
Features
- Transcription : Whisper, Faster Whisper, or bring your own ASR
- Audio Embeddings : CLAP joint text-audio space for semantic search
- Speaker Diarization : know who said what (pyannote)
- Speaker Registry : track speakers across files by voiceprint
- Audio Event Detection : detect alarms, machinery, glass breaks, and 50+ sound types
- Live Streaming : real-time transcription with keyword and event callbacks
- Export : SRT, VTT, JSON, CSV, TXT, meeting notes
- Pluggable Architecture : every component swappable via base classes
- CLI : full command-line interface
Install
# Core (no ML dependencies)
pip install sonarwise
# With all features
pip install sonarwise[all]
# Pick what you need
pip install sonarwise[whisper] # Whisper transcription
pip install sonarwise[faster-whisper] # Faster Whisper (CTranslate2)
pip install sonarwise[clap] # CLAP audio embeddings
pip install sonarwise[diarization] # Speaker diarization
pip install sonarwise[speaker] # Speaker identification
pip install sonarwise[events] # Audio event detection
pip install sonarwise[live] # Live microphone capture
Requires: ffmpeg (sudo apt install ffmpeg or brew install ffmpeg)
Quick Start
from sonarwise import SonarWise
sw = SonarWise(diarization=True, events=True)
# Index audio
sw.index("meeting.wav")
sw.index_folder("./recordings/")
# Search by text
results = sw.query("budget discussion", top_k=5)
for r in results:
print(f"[{r.speaker_name}] {r.transcript} (score: {r.score})")
# Search by audio similarity
results = sw.query_audio("alarm_clip.wav", top_k=5)
# Search by speaker
results = sw.query("budget", speaker="Ant", top_k=5)
# Search by event
results = sw.query_events(event="machine_fault", top_k=5)
Speaker Intelligence
# Register a speaker
sw.register_speaker("Ant", reference_audio="ant_voice.wav")
# Query by speaker
results = sw.query("budget", speaker="Ant")
# Speaker timeline
timeline = sw.speaker_timeline("meeting.wav")
# Speaker stats
stats = sw.speaker_stats("meeting.wav")
# Find speaker across files
presence = sw.find_speaker_across(speaker="Ant", folders=["./meetings/"])
Live Mode
sw = SonarWise(mode="live", diarization=True, events=True)
@sw.on("transcript")
def on_speech(segment):
print(f"[{segment.speaker_name}] {segment.transcript}")
@sw.on("keyword", words=["budget", "deadline", "risk"])
def on_keyword(segment):
send_alert(segment.transcript)
@sw.on("sound_event", events=["alarm", "glass_break"])
def on_danger(event):
trigger_alert(event)
sw.listen(source="microphone")
Plug Any Model
Every component is swappable:
from sonarwise import SonarWise
from sonarwise.core.transcriber import BaseTranscriber
class MyTranscriber(BaseTranscriber):
def transcribe(self, audio):
return my_model.process(audio)
sw = SonarWise(transcriber=MyTranscriber())
Pluggable slots:
| Component | Base Class | Default |
|---|---|---|
| Transcriber | BaseTranscriber |
Whisper |
| Audio Embedder | BaseAudioEmbedder |
CLAP |
| Vector Store | BaseVectorStore |
SQLite |
| Chunker | BaseChunker |
Silero VAD |
| Diarizer | BaseDiarizer |
pyannote |
| Speaker Embedder | BaseSpeakerEmbedder |
ECAPA-TDNN |
| Event Classifier | BaseEventClassifier |
PANNs |
| Stream Listener | BaseStreamListener |
sounddevice |
CLI
sonarwise index meeting.wav
sonarwise query "budget discussion"
sonarwise speakers meeting.wav
sonarwise timeline meeting.wav
sonarwise listen --source microphone --on-keyword "budget,risk"
sonarwise export meeting.wav --format srt
sonarwise stats
Export
sw.export("meeting.wav", format="srt", output="subtitles.srt")
sw.export("meeting.wav", format="json", output="segments.json")
sw.export("meeting.wav", format="txt", output="transcript.txt")
sw.export("meeting.wav", format="notes", output="meeting_notes.md")
Ecosystem
sonarwise is part of the VK-Ant AI perception ecosystem:
| Library | Purpose | Tagline |
|---|---|---|
| SightRAG | Visual perception | See. Search. Retrieve. |
| sonarwise | Audio perception | Hear. Search. Retrieve. |
| adaptive-intelligence | Reasoning & memory | Learn. Remember. Adapt. |
| llmevalkit | Evaluation | Evaluate. Score. Improve. |
from sightrag import SightRAG
from sonarwise import SonarWise
from adaptive_intelligence import AdaptiveRAG
brain = AdaptiveRAG()
brain.register_source("visual", SightRAG())
brain.register_source("audio", SonarWise())
# One query hits both eyes and ears
results = brain.query("when did machine 3 start failing?")
License
Apache 2.0 License. Built by Venkatkumar Rajan.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file sonarwise-0.1.0.tar.gz.
File metadata
- Download URL: sonarwise-0.1.0.tar.gz
- Upload date:
- Size: 45.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/6.2.0 CPython/3.14.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
119eaff62e46935a2be02cfb27399dbd8b9b59fb70721e7b99f88c994e85c91c
|
|
| MD5 |
9e18f6c6fcf0807b49cd52e3652f2bcf
|
|
| BLAKE2b-256 |
f69683a5adb9e06be68f90b375b3dea8dd821c45c6ab40737732233b4311b00b
|
File details
Details for the file sonarwise-0.1.0-py3-none-any.whl.
File metadata
- Download URL: sonarwise-0.1.0-py3-none-any.whl
- Upload date:
- Size: 43.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/6.2.0 CPython/3.14.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d9ae273527b6f484e541f6e6497c58ae81ee0f4ff01dd27d5ede7772b059c0c8
|
|
| MD5 |
1da3acc686471b9f3cf9786517c74621
|
|
| BLAKE2b-256 |
290736a95bbc4f0d259f22d3c526b8d7af26d55083e824c7b1dd7cf3595e0894
|