Browser-based room acoustic analyzer.
Understand the sound of your space — no installation, no upload, no server.
SonicSpace measures the acoustic properties of your room using only your browser microphone. It estimates RT60 (reverberation time), analyzes frequency response across bands, and gives you prioritized, practical recommendations tailored to what you're recording — podcast, voice-over, video calls, music, and more.
Everything runs locally. No audio is ever uploaded or stored on a server.
- RT60 Estimation — Uses T20/T30 extrapolation following ISO 3382-1 methodology, adapted for consumer microphones
- Multi-band Frequency Analysis — Breaks down acoustic behavior across sub-bass, bass, low-mid, mid, high-mid, and high frequency bands
- Noise Floor Calibration — Establishes ambient noise baseline before measurement to improve accuracy
- Automatic Impulse Detection — Detects a hand clap automatically; no manual trigger required
- Confidence Scoring — Reports measurement confidence based on regression R², usable decay range, and SNR; suppresses results when signal quality is insufficient
- Purpose-Aware Recommendations — Tailors advice to your recording context (podcast, voiceover, YouTube, video calls, music, gaming, online classes)
- Prioritized Treatment Advice — Suggestions are ordered by cost: free repositioning → existing items → low-cost additions → dedicated treatment
- Measurement History — Stores past measurements locally via IndexedDB for comparison over time
- Compare Mode — Side-by-side comparison of two measurements
- Progressive Web App — Installable on desktop and mobile; works offline after first load
- Privacy-first — All processing happens on-device; microphone data never leaves your browser
01 — Measure Noise Floor
SonicSpace listens for 10 seconds to establish your room's
ambient noise level before any measurement begins.
02 — Capture an Impulse
One sharp hand clap creates an acoustic impulse.
The app detects it automatically and captures the decay tail.
03 — Analyze Decay
The impulse response is processed through the DSP pipeline:
FFT → per-band filtering → Schroeder EDC → T20/T30 regression → RT60
04 — Get Recommendations
Results are interpreted for your recording purpose with
practical, prioritized suggestions ranked by cost and effort.
RT60 is the time it takes for sound energy to decay by 60 dB after a source stops. It is the standard measure of how reflective or absorptive a room is.
| Environment | Typical RT60 |
|---|---|
| Podcast / Voice recording | 0.2 – 0.45 s |
| Furnished living room | 0.4 – 0.7 s |
| Empty room | 0.8 – 1.2 s |
| Bathroom / Tiled space | > 1.5 s |
| Music recording | 0.4 – 0.8 s |
Note: SonicSpace estimates RT60 using T20/T30 extrapolation because the dynamic range available from a consumer microphone (typically 20–40 dB) is insufficient for a direct 60 dB measurement. T20/T30 extrapolation is the accepted method under ISO 3382-1 for this reason.
Microphone Input (Web Audio API)
│
▼
Noise Floor Measurement (10s ambient capture)
│
▼
Impulse Detection (threshold + transient analysis)
│
▼
Impulse Response Extraction
│
├──► Broadband path ──────────────────────────────────────────────┐
│ │
└──► Per-band path (sub-bass / bass / low-mid / mid / high-mid / high)
│
▼
Bandpass Filter (js/dsp/filters.js)
│
▼
Schroeder EDC (Energy Decay Curve)
│
▼
T20 / T30 Regression (linear fit on -5dB → -25dB / -35dB)
│
▼
RT60 Estimate + R² Confidence ◄──────────────────────────────┘
│
▼
Confidence Scorer (SNR + R² + decay range)
│
▼
Diagnosis (LF buildup, HF absorption, spectral imbalance)
│
▼
Recommendation Engine (purpose-aware, priority-sorted)
| Layer | Technology |
|---|---|
| Audio capture | Web Audio API (AudioContext, MediaStream) |
| DSP processing | Web Workers + custom FFT (Cooley-Tukey) |
| Storage | IndexedDB via custom wrapper |
| Visualization | Canvas API (waveform, waterfall, spectrogram) |
| State management | Vanilla JS ES Modules + sessionStorage |
| Offline support | Service Worker + Cache API |
| Installable | PWA (manifest.json) |
| Hosting | GitHub Pages / Netlify |
| Build tools | None — zero dependencies, zero bundler |
SonicSpace/
├── index.html # Landing page
├── pages/
│ ├── measure.html # Main measurement flow
│ ├── results.html # Analysis results + recommendations
│ ├── history.html # Measurement history
│ ├── compare.html # Side-by-side comparison
│ ├── calibrate.html # Microphone calibration
│ ├── scan.html # Room scan mode
│ └── privacy.html # Privacy policy
├── js/
│ ├── app.js # App state, PWA bootstrap, purpose config
│ ├── landing.js # Landing page interactions
│ ├── audio/
│ │ ├── microphone.js # Microphone capture
│ │ ├── recorder.js # Audio recording
│ │ ├── noiseFloor.js # Ambient noise measurement
│ │ └── impulseDetector.js # Transient detection
│ ├── dsp/
│ │ ├── dspMain.js # DSP orchestration
│ │ ├── fft.js # Cooley-Tukey FFT
│ │ ├── filters.js # Bandpass filters
│ │ ├── rt60.js # RT60 via T20/T30 (ISO 3382-1)
│ │ ├── decayAnalysis.js # Schroeder EDC, EDT
│ │ └── regression.js # Linear regression
│ ├── analysis/
│ │ ├── frequencyBands.js # Per-band analysis
│ │ ├── sonicScore.js # Composite acoustic score
│ │ ├── diagnosis.js # Acoustic profile diagnosis
│ │ └── confidence.js # Multi-factor confidence scoring
│ ├── recommendations/
│ │ └── engine.js # Purpose-aware recommendation engine
│ ├── visualization/
│ │ ├── waveform.js # Waveform canvas renderer
│ │ ├── spectrogram.js # Frequency spectrogram
│ │ ├── waterfall.js # 3D waterfall plot
│ │ └── charts.js # RT60 bar charts
│ ├── storage/
│ │ └── database.js # IndexedDB wrapper
│ ├── pages/ # Page-specific controllers
│ ├── workers/
│ │ └── dspWorker.js # Off-main-thread DSP
│ └── utils/
│ ├── math.js
│ ├── device.js
│ └── validation.js
├── css/
│ ├── base.css
│ ├── components.css
│ ├── dashboard.css
│ └── responsive.css
├── assets/icons/ # PWA icons + favicon
├── service-worker.js # Offline caching
└── manifest.json # PWA manifest
SonicSpace has no build step and no dependencies. Just serve the files with any static server.
Using VS Code Live Server
Install the Live Server extension, right-click index.html, and select Open with Live Server.
Using Node.js serve
npx serve .Using Python
# Python 3
python -m http.server 8080Important: The Web Audio API requires a secure context. Use
localhostorhttps://. Openingindex.htmldirectly as afile://URL will not work.
For best results:
- Measure in the room where you actually record, not an adjacent space
- Close doors and windows; turn off fans, HVAC, and noisy equipment
- Stand in your typical recording position
- Clap sharply once — a single dry hand clap works better than multiple claps
- Keep the clap at arm's length from the microphone (1–2 metres away)
- Avoid clapping near walls or in corners, which can introduce comb filtering
SonicSpace provides acoustic estimation, not certified professional measurement.
Results are affected by:
- Microphone quality and frequency response (a flat-response measurement mic will always outperform a built-in laptop microphone)
- Room size relative to microphone SNR
- Background noise level during measurement
- Device hardware signal processing (some platforms apply noise suppression that distorts the impulse response)
The app will not display results when signal quality is insufficient, and always communicates a confidence level alongside measurements.
- No audio data is transmitted to any server
- Measurements are stored locally in your browser's IndexedDB
- No analytics, no tracking, no third-party scripts
- Microphone access is only requested when you start a measurement
- All stored data can be cleared from the History page at any time
See Privacy Policy for full details.
| Browser | Support |
|---|---|
| Chrome / Edge 90+ | ✅ Full |
| Firefox 90+ | ✅ Full |
| Safari 15.4+ | ✅ Full |
| Mobile Chrome (Android) | ✅ Full |
| Mobile Safari (iOS 15.4+) | ✅ Full |
| Opera 76+ | ✅ Full |
Requires: AudioContext, MediaDevices.getUserMedia, IndexedDB, Web Workers
- Exported PDF/CSV measurement reports
- Calibration tone sweep (sine sweep method for higher accuracy)
- Room mode frequency calculator
- Multi-position averaging
- Shareable results via URL (client-side encoded, no server)
Contributions are welcome. Please open an issue first to discuss what you'd like to change.
- Fork the repository
- Create your feature branch (
git checkout -b feature/your-feature) - Commit your changes (
git commit -m 'Add your feature') - Push to the branch (
git push origin feature/your-feature) - Open a pull request
Distributed under the MIT License. See LICENSE for details.
- RT60 estimation methodology based on ISO 3382-1:2009 — Acoustics: Measurement of room acoustic parameters
- Schroeder integration method: M. R. Schroeder, "New Method of Measuring Reverberation Time," JASA, 1965
Made by deekshitha875
Understand the sound of your space.