Personal project · April 2025
SignaVox
An audio signal-processing application: real-time capture, FFT spectral analysis, frequency filtering, voice activity detection and IFFT reconstruction.
- Problem
- The brief banned every classic filter — Butterworth, Hanning, Hamming — and mandated a single rectangular frequency mask. A constraint that forces you through the spectral domain.
- Outcome
- A complete chain — capture, VAD, FFT, rectangular mask, IFFT reconstruction — containerised, with automatic segmentation and short-silence merging.
- Role
- Full-stack developer & signal engineer
What problem does SignaVox solve?
The Fourier transform is taught as a formula. It is understood the moment you watch your own voice's spectrum deform live when you whistle.
But the real constraint of the project was elsewhere, and it was strict: filtering had to be done exclusively through a rectangular frequency mask. Butterworth, Hanning, Hamming — every classic filter was explicitly ruled out.
Why does that constraint change everything?
Banning the usual filters also bans the shortcut. Without a spectral mask you filter in the time domain by convolution, and never have to understand what happens in frequency. The constraint forces the long road, and that is exactly its value:
X = FFT(x) # move into the frequency domain
X_filtered = X ⊙ mask # Hadamard product, term by term
x_filtered = IFFT(X_filtered) # return to the time domain
The mask is 1 inside the band you keep and 0 everywhere else. Low-pass, high-pass and band-pass are just three ways of writing the same mask.
It is the IFFT reconstruction that closes the loop and makes the filter audible rather than merely visible on a plot. Without it, you are only drawing spectra.
How does the processing chain work?
Capture of the microphone stream through sounddevice, format conversion with pydub, loading in float64 — double precision is not a luxury when you chain an FFT and an IFFT.
Segmentation by voice activity detection. A decibel threshold below the peak locates silences, then a second parameter merges silences that are too short: without that merge, a breath mid-sentence would split it in two.
Spectral analysis through scipy.fft, with frequencies from fftfreq and rendering in matplotlib.
Filtering then reconstruction, along the path imposed above.
The whole thing runs in a container, with a store for the segments it produces.
What did SignaVox teach me?
A well-set constraint beats total freedom. Banning off-the-shelf filters forced me to handle the spectrum by hand — and that, not the lecture, is where the time–frequency trade-off becomes an intuition rather than a formula.
A project of the same calibre ?
Based in Thiès, available in dakar & remote. I reply within 48 hours.
Let's talk