Notivox takes a single-line recording — a solo cello or violin, say — and turns it into a sequence of pitched note events with start/end times and quantized durations. The work so far is the transcription engine itself: pitch detection, note segmentation, and rhythm estimation.
Pitch detection
Two backends, built to compare against each other:
- CREPE — a deep-learning pitch tracker, run with Viterbi smoothing and confidence thresholds.
- YIN (aubio) — a classic autocorrelation tracker, fed through a Butterworth band-pass (~200–1200 Hz) first.
The CREPE path is multi-pass and onset-aware: a coarse librosa onset pass splits the audio into fast/slow regions, then CREPE runs with an adaptive step size (finer through fast passages), and a third pass re-scans long gaps at a micro step size — labeling genuine silence as rests.
Note & rhythm cleanup
- Frame-level pitches snap to the nearest semitone (via MIDI) and group into note segments.
- Segments are filtered by a minimum duration and merged across identical neighbors.
- A vibrato heuristic collapses brief one-semitone A–B–A wobbles into a single note.
- A separate pass estimates tempo (librosa beat tracking), then quantizes inter-onset intervals to standard note values — quarter, eighth, sixteenth, and so on.
Stack
Python — librosa, CREPE, aubio, NumPy, and SciPy, with matplotlib for visualizing pitch tracks. A Flask web interface (upload → transcribe) is scaffolded; for now the pipeline runs from the command line.