Skip to content

Repository files navigation

🔊 SonicSpace

Browser-based room acoustic analyzer.
Understand the sound of your space — no installation, no upload, no server.

Live Demo License PWA Vanilla JS


What is SonicSpace?

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.


Features

  • 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

How It Works

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.

Understanding RT60

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.


DSP Pipeline

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)

Tech Stack

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

Project Structure

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

Running Locally

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 8080

Important: The Web Audio API requires a secure context. Use localhost or https://. Opening index.html directly as a file:// URL will not work.


Measurement Tips

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

Accuracy & Limitations

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.


Privacy

  • 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

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


Roadmap

  • 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)

Contributing

Contributions are welcome. Please open an issue first to discuss what you'd like to change.

  1. Fork the repository
  2. Create your feature branch (git checkout -b feature/your-feature)
  3. Commit your changes (git commit -m 'Add your feature')
  4. Push to the branch (git push origin feature/your-feature)
  5. Open a pull request

License

Distributed under the MIT License. See LICENSE for details.


Acknowledgements

  • RT60 estimation methodology based on ISO 3382-1:2009Acoustics: 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.

About

Browser-based room acoustic analyzer. Measure RT60, analyze frequency response, and get recording recommendations — no installation, no upload, runs entirely on-device.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages