Comparison & Alternatives

July 10, 2026 · View on GitHub

A landscape of audio tools across the web, Python, CLI, and desktop. The goal: help you pick the right tool for the job — including, often, not audio.

audio occupies a specific niche: a non-destructive audio workstation library for JavaScript runtimes (Node, Deno, Bun, browsers). Decode, edit, analyze, encode, play, record — chainable API + CLI, no native binaries, ~20 KiB gzipped core.

audio is part of the audiojs ecosystem — a constellation of small focused packages (@audio/decode, @audio/encode, @audio/speaker, @audio/mic, @audio/filter, @audio/dynamics, @audio/denoise, wavearea, ...) that together cover most JS audio needs. audio itself composes many of them into a unified workstation.

Comparison matrix

Cells contain method/op names where supported, if absent. For audio, plain names are built-ins; the rest are @audio/* registry atoms (npm i the package, then audio.use('name') — same chainable API). Comma-separated lists are not exhaustive.

audiopydublibrosaaubioessentiaPedalboardSoXFFmpegAudacityMATLAB Audio Toolbox
Identity
Scopeedit + analyze + play + recordhigh-level edit (slice/fade/normalize)MIR / analysispitch + onset + beat + MFCCMIR / 240+ algorithmseffects + VST hostingCLI batch DSPCLI multimediadesktop GUI editorscientific DSP + ML for audio
LanguageJS / TSPythonPythonC (Python/JS bindings)C++ (Python/JS bindings)Python (C++/JUCE core)CCC++MATLAB
PlatformNode, Deno, Bun, browserPython (needs FFmpeg)Python 3native, Python, browser (WASM)native, Python, browser (essentia.js)Python (native)native CLInative CLI + libsnative app (Win/Mac/Linux)MATLAB R20xx+
Packagingnpm i audio (~20 KiB gz)pip install pydubpip install librosabrew install aubio, pip install aubiobrew install essentia, build from sourcepip install pedalboardbrew install soxbrew install ffmpegstandalone installerMathworks license
LicenseMITMITISCGPL-3AGPL-3 (commercial avail.)GPL-3GPL/LGPLLGPL/GPLGPL-2proprietary
Open/closedopenopenopenopenopenopenopenopenopenclosed
API stylechainable + planchainable AudioSegmentfunctional (NumPy)functional + CLIalgorithm objects Algo()(in)callable chainCLI argsCLI argsGUI + Nyquist + macrosfunctional + System objects
CLIaudio in.wav ...aubiopitch/onset/tempo/notes/mfcc/quiet/trackessentia_streaming_extractor_musicyesyesmacros only
Linkhttps://github.com/audiojs/audiohttps://github.com/jiaaro/pydubhttps://librosa.orghttps://aubio.orghttps://essentia.upf.eduhttps://github.com/spotify/pedalboardhttps://sox.sourceforge.nethttps://ffmpeg.orghttps://audacityteam.orghttps://mathworks.com/products/audio.html
I/O
Decode formatswav, mp3, flac, ogg, opus, aac, aiff, caf, webm, amr, wma, qoaanything FFmpeg supportswav, mp3, flac, ogg (audioread)wav, aiff, flac, ogg, mp3 (libsndfile/ffmpeg)wav, mp3, flac, ogg, m4a (FFmpeg)wav, aiff, flac, mp3, ogg (+ AAC/AC3/WMA per platform)wav, aiff, mp3, flac, ogg, auvirtually every codecwav, mp3, flac, ogg, opus, m4a, ...wav, flac, mp3, ogg, mp4, m4a
Encode formatswav, mp3, flac, opus, ogg, aiffexport via FFmpegwav (via soundfile)wavwavsame as decodesame as decodesame as decodewav, mp3, flac, ogg, opuswav, flac, ogg, m4a, mp4
Streamingyes (page-based, OPFS)noeager (NumPy)yes (frame-by-frame source)yes (streaming network)yes (chunked O(1)-mem)nononodsp.AudioFileReader
Async iteratorfor await (chunk of a.stream())source iterationstreaming networkwhile f.tell() < f.framesblock-by-block read
Editing
Non-destructiveyes (edit plan, replayable)nonon/a (analysis)n/a (analysis)nononopartial (history)no
Undoa.undo(n?)yes (GUI)
Serialize editsJSON.stringify(a)pool serializationproject file
Crop / trimcrop({at, duration})seg[a:b]slicingsource slicingSlicer, Trimmerarray slicetrimatrimTrimarray slice
Remove rangeremove({at, duration})manualmanualmanualCutmanual
Insertinsert(src, {at})seg[:a] + new + seg[a:]manualmanualPastemanual
Repeatrepeat(n)seg * nnp.tilemanualrepeataloopRepeatrepmat
Pad silencepad(before, after?)silence + segpad_centermanualpadapadGenerate→Silencezeros padding
Mix / overlaymix(b, {at})overlay()y1+y2manual sum-m combineamix, amergeMix and Rendersum
Concat / crossfadecrossfade(b, dur, curve?)+, append(crossfade=)manualspliceacrossfadeCrossfade Trackscrossfade
Reversereverse({at,duration})reverse()y[::-1]reverseareverseReverseflip
Panpan(value, {at, duration})pan()manual(via remix matrix)panStereo→Mono onlyaudioPanner
Remix channelsremix(layout)set_channels()manualMonoMixer, StereoMuxerremixchannelmap, panStereo to Monomatrix multiply
Time / pitch
Speed (pitch+tempo)speed(rate)speedup()resamplespeedasetrateChange Speedresample-based
Time stretchstretch(factor)effects.time_stretchtempo, stretchatempo, rubberbandChange Tempo, PaulstretchstretchAudio
Pitch shiftpitch(semitones)effects.pitch_shiftPitchShift(semitones)pitchrubberband=pitchChange PitchshiftPitch
Resampleresample(sr, opts?)set_frame_rate()librosa.resampleResampleResample(target_sr)ratearesampleProject rateresample
Band split (crossover)crossover(...freqs)manualMultibandSplitacrossovercrossoverFilter
Volume / dynamics
Gain (dB)gain(dB | t=>dB)seg + dBy * gainMultiplierGain(db)gain, volvolumeAmplifyscalar multiply
Fade in/outfade(in, out?, curve?)fade_in/fade_outmanualfadeafadeFade In/Out, Adjustable Fadefade
Peak normalizenormalize()effects.normalizeutil.normalizeNormalizenormvolume=normalizeNormalizemanual
LUFS normalizenormalize('podcast')customLoudnessEBUR128 (measure)loudnormLoudness NormalizationintegratedLoudness
DC removalnormalize({dc:true})customDCRemovaldcshiftdcshiftDChighpass at low f
Compressorcompressor(), compand(), leveler()compress_dynamic_range()customCompressor(thr, ratio)compandacompressorCompressorcompressor
Limiterlimiter()Limiter(compand ∞)alimiterLimiterlimiter
Gategate()compand negagateNoise Gatenoisegate
Distortion / clipsoftclip(), distortion(), waveshaper()Distortion, ClippingoverdriveasoftclipDistortioncustom
Bit crushbitcrusher(), lofi()Bitcrushacrusher(plugin)custom
Filters
Highpasshighpass(f)high_pass_filter()scipy.signal.butterdigital_filterHighPassHighpassFilterhighpasshighpassHigh-Pass Filterdesignfilt, highpass
Lowpasslowpass(f)low_pass_filter()scipy.signal.butterfilterLowPassLowpassFilterlowpasslowpassLow-Pass Filterlowpass
Bandpassbandpass(f, Q?)band_pass_filter()butterfilterBandPassbandpassbandpass(Filter Curve)bandpass
Notchnotch(f, Q?)customfilterBandRejectband -nbandrejectNotch Filterbandstop
Allpassallpass(f, Q?)customfilterAllPassallpassallpassdesignfilt
Low/high shelflowshelf/highshelf(f, dB, Q?)customfilterLowShelf, HighShelfbass/treblebass/trebleBass and TrebledesignShelvingEQ
Parametric EQeq(f, dB, Q?)customequalizerequalizer, anequalizerFilter Curve EQ, Graphic EQmultibandParametricEQ, graphicEQ
FIR / convolution@audio/eq-fir, @audio/reverb-convolution (import)scipy.signal.fftconvolveFFT-basedConvolutionafir, firequalizer(plugin)dsp.FIRFilter, dsp.Convolver
Ladder filtermoog(), diode(), korg35(), oberheim()LadderFilter
Derivative / integralderivative(), integral()np.diff / np.cumsumDerivativeaderivative, aintegraldiff, cumsum
Spatial effects
Reverbfreeverb(), plate(), fdn(), spring(), shimmer()Reverb, ConvolutionreverbafirReverbreverberator
Echo / delaydelay(), multitap(), pingpong()Delayecho, echos, delayaecho, adelayEcho, Delayexamples
Choruschorus()Choruschoruschorus(VST)examples
Flangerflanger()flangerflanger
Phaserphaser()PhaserphaseraphaserPhaser
Tremolotremolo()tremolotremoloTremolo
Vibratovibrato()(via bend)vibrato
Stereo widen / imagewidener(), haas(), midside(), surround(), crossfeed()oops, earwaxstereotools, stereowiden, crossfeed, bs2b(plugin)crossoverFilter
HRTF / binauralsofalizer, headphone(plugin)interpolateHRTF
Restoration
Denoisespecsub(), wiener(), omlsa(), dehum(), dereverb()noisered, noiseprofafftdn, arnndn, anlmdnNoise Reductionwdenoise
Declickdeclick(), decrackle()ClickDetectoradeclickClick Removalmanual
Declipdeclip()adeclipClip Fixmanual
Ditherdither(bits?)dither(sample fmt)(project export)dither
Analysis (volume)
Peak (dB)stat('db')seg.max_dBFSnp.max(np.abs)aubioquietMaxMagnitudestatastats, volumedetectPlot Spectrummax(abs)
RMSstat('rms')seg.rms, dBFSfeature.rmsaubioquietRMS, EnergystatastatsMeasure RMSrms
LUFS loudnessstat('loudness')customLoudnessEBUR128, Loudnessebur128, loudnormLoudness NormalizationintegratedLoudness, loudnessMeter
Clippingstat('clipping')manualClickDetectorstatastatsFind Clippingmanual
DC offsetstat('dc')np.meanDCRemoval (measure)statastatsDC statmean
Silencestat('silence'), stat('sounds'), shrink()split_on_silence, detect_silenceeffects.splitaubioquietSilenceRate, StartStopSilencesilencesilencedetect, silenceremoveTruncate Silence, Label SoundsvoiceActivityDetector
Speech contrast (WCAG)stat('speech-contrast')Contrast
Analysis (spectral)
FFT spectrumstat('spectrum')librosa.stftpvoc, fftFFT, SpectrumspectrogramshowspectrumPlot Spectrumfft, stft, pspectrum
MFCCstat('cepstrum')feature.mfccaubiomfcc, mfccMFCC, BFCC, GFCC(plugin)mfcc
Mel spectrogram(in cepstrum)feature.melspectrogramfilterbankMelBands, BarkBands, ERBBandsmelSpectrogram
Chromagramstat('chroma')feature.chroma_stft/cqt/censHPCP, Chromagrammanual
Tonnetzstat('tonnetz')feature.tonnetzTonnetz, TonalExtractor
Spectral centroid/bw/flatness/rolloffstat('centroid'/'spread'/'flatness'/'rolloff')feature.spectral_*specdescCentroid, SpectralCentroidTime, Flatness, RollOffaspectralstatsspectralCentroid, spectralFlatness, spectralRolloff
Zero-crossing ratestat('zcr')feature.zero_crossing_ratezero_crossing_rateZeroCrossingRatezerocrossrate
Analysis (rhythm/melody)
Tempo / BPMstat('bpm')beat.tempo, beat.beat_trackaubiotempoRhythmExtractor, PercivalBpmEstimatorBeat Findertempo
Beat trackingstat('beats')beat.beat_trackaubiotrackBeatTrackerMultiFeature, BeatsLoudnessBeat Finderbeat
Onset detectionstat('onsets')onset.onset_detectaubioonset, onsetOnsetDetection, OnsetsSound FinderdetectSpeech (vad)
Pitch (notes, F0)stat('notes')pyin, piptrackaubiopitch, aubionotesPitchYin, PitchYinFFT, PredominantPitchMelodia(plugin)pitch
Chord recognitionstat('chords')(3rd-party)ChordsDetection, ChordsDetectionBeats
Key detectionstat('key')(3rd-party)KeyExtractor, Key
Downbeatstat('downbeat')(madmom)BeatTrackerMultiFeature
Stem separation@audio/neural-separate (import)effects.hpssHarmonicMask, HPSS(OpenVINO plugin)separateSpeakers
Playback / record
Playbacka.play({at, duration, rate, loop})play(seg) (simpleaudio)play (utility)ffplay (separate)GUI transportaudioplayer, sound
Pause / seeka.pause(), a.seek(t)GUIpause, resume
Volume / loop / ratea.volume, a.loop, a.playbackRateGUIlimited
Recording (mic)a.record({deviceId, sampleRate, channels})pyaudiosource from micstreaming source(rec)(avfoundation/dshow)GUI RecordaudioDeviceReader, audiorecorder
Events'data', 'timeupdate', 'play', 'ended', 'progress', ...GUIlisteners on System objects
Streaming metera.meter({type, smoothing, hold})per-frame sourcestreaming network outputsGUI metersdsp.SpectrumAnalyzer, timescope
Synthesis
Generatorsaudio.from(fn, {duration})tone generatormanualsynthaevalsrc, sine, anoisesrcTone, Noise, Chirp, DTMF, Pluck, Risset Drum, Rhythm TrackaudioOscillator, dsp.SineWave
Synth voicesvoice(), poly() (note events)
Envelopes (ADSR)adsr(), gain automationEnvelope toolexamples
LFOfunction-arg automation, tremolo(), autopan()audioOscillator
Transport / scheduling
MIDInote events (voice/poly), @audio/tune-midi (import)MIDI importmidiread, midiwrite
Plugin hosting
VST3 / AUVST3, AULADSPA, LV2VST/AU/LV2/NyquistvalidateAudioPlugin (export)
Custom processorsaudio.op(name, descriptor)Python functionPython functionC/Python pluginC++ algorithmPython Plugin subclassC filterNyquistSystem object subclass
Macros / batchCLI macroscriptsscriptsshell + scriptsscripts + extractor profilesPython scriptsshell scriptsfilter graphAudacity Macrosscripts / Live Editor
Misc
Performancemeasured — § Performanceslow (shells out to ffmpeg)numpy-fastnativenativenativenativenativen/anative
Bundle size~20 KiB gz coren/an/an/an/an/an/an/an/an/a
Last releaseactiveactiveactiveactiveactiveactive2015activeactiveactive
IntegrationsWavearea, audiojs ecosystemFFmpegscikit-learn, torchaudio, numpyPureData, MaxMSP, Python, JSTensorFlow, Gaia, essentia.jsTensorFlow, PyTorch, JUCE pluginsshell, FFmpegLADSPA/LV2, ffmpeg.wasmVST/AU/LV2 pluginsSimulink, Deep Learning Toolbox

Adjacent (different paradigm)

These are not direct competitors — they solve a different problem — but often appear in the same conversations.

ToolScopeWhy differentLink
Tone.jslive synth + transport + scheduling on Web Audioaimed at music creation (synth voices, sequencer, MIDI), not file processinghttps://tonejs.github.io
Wavesurfer.jswaveform UI + player + region/spectrogram pluginsa visualization component, not a processing libraryhttps://wavesurfer.xyz
audiotool / probeAndré Michelle's browser DAW + analyzerfull DAW UI, not a libraryhttps://probe.audiotool.com
Web Audio APIbrowser native real-time audio graphsubstrate everything in the browser builds onhttps://developer.mozilla.org/Web/API/Web_Audio_API
WebCodecs APIlow-level browser encode/decodeformat codec primitives, no editing or analysishttps://developer.mozilla.org/Web/API/WebCodecs_API
JUCEC++ framework for plugins / native appsindustry standard for VST/AU/AAX authoringhttps://juce.com
FaustDSP-specific functional language → C++/JS/WASMlanguage for writing DSP, not using ithttps://faust.grame.fr
Csound, SuperCollider, Pure Data, Max/MSPmusic synthesis languages/environmentscomposition + live performance

Other notable tools

Compact one-liners for tools not in the matrix.

Web / JavaScript

ToolScopeLink
HTML5 <audio>element-level playback; universalhttps://developer.mozilla.org/Web/HTML/Element/audio
Howler.jsplayback only: load, play, fade, spritehttps://howlerjs.com
Pizzicato.jsWeb Audio effects wrapper (Distortion, Delay, Reverb, Compressor)https://alemangui.github.io/pizzicato/
Tuna.jsWeb Audio effects (Chorus, Filter, Compressor, Convolver, Phaser, Overdrive)https://github.com/Theodeus/tuna
MeydaWeb Audio feature extraction (MFCC, chroma, centroid, RMS, ZCR)https://meyda.io
Essentia.jsWASM port of Essentia; full MIR (key, BPM, danceability)https://mtg.github.io/essentia.js
WaveareaDOM-native editable waveform componenthttps://github.com/dy/wavearea
Magenta.jsTensorFlow.js music ML (generation, transcription)https://magenta.tensorflow.org/js
audiojs ecosystem@audio/decode, @audio/encode, @audio/speaker, @audio/mic, @audio/filter, @audio/stretch, @audio/mirhttps://github.com/audiojs

Python

ToolScopeLink
soundfilelibsndfile binding for I/Ohttps://github.com/bastibe/python-soundfile
scipy.signalDSP primitives (filter design, convolution, resample)https://docs.scipy.org/doc/scipy/reference/signal.html
madmomMIR specialized for music (beats, downbeats, chords, key)https://github.com/CPJKU/madmom
torchaudioPyTorch audio I/O + transforms + datasetshttps://pytorch.org/audio
noisereducespectral gating noise reductionhttps://github.com/timsainb/noisereduce
demucs / spleetersource separation (stems)https://github.com/facebookresearch/demucs

CLI / native

ToolScopeLink
ecasoundLinux multitrack CLI, chain-based effectshttps://ecasound.seul.org
mhwaveeditminimalist GTK editor
Rubber Bandtime-stretch + pitch-shift library + CLIhttps://breakfastquay.com/rubberband

Desktop DAWs

ToolScopeLink
Reaperaffordable cross-platform DAW; deep scripting (Lua, Python, EEL)https://reaper.fm
Adobe Auditionpro audio editor; spectral repair, multitrackhttps://adobe.com/products/audition
Logic ProApple DAW; pro mixing/masteringhttps://apple.com/logic-pro
Pro Toolsindustry standard for audio post; HDX integrationhttps://avid.com/pro-tools
Ardouropen-source DAWhttps://ardour.org
Ocenaudiofree cross-platform editor; leaner than Audacityhttps://ocenaudio.com
WaveLabSteinberg mastering suite
iZotope RXgold-standard audio repair (declick, denoise, declip, dialogue isolate)https://izotope.com/en/products/rx.html

Scientific / industrial

ToolScopeLink
GNU Octave + signal packageopen-source MATLAB-alikehttps://octave.sourceforge.io/signal/
R tuneR, seewaveR packages for audio + bioacousticshttps://cran.r-project.org/package=tuneR

Performance

Measured 2026-07: 10-minute 44.1 kHz stereo fixture (105 MB WAV / 192 kbps MP3, mixed tones + shaped noise + 120 BPM pulse), one op per cell, end-to-end from the input file — decode for decode rows, decode + analyze for analysis rows, decode + op + encode-to-file for transform rows. Best of 3 warm runs. CLI tools (audio, SoX, FFmpeg) run as a fresh subprocess per rep, so their cells include process startup and full decode (~100 ms of every audio cell is Node boot + import). librosa/Pedalboard are libraries and run in-process — their cells exclude interpreter startup, which flatters them slightly. Apple M4 Max, macOS 26.5, Node 25.9, FFmpeg 8.0.1, SoX 14.4.2, librosa 0.11, Pedalboard 0.9.24. Reproduce: npm run bench (bench/bench.js).

Operationaudio (Node)librosaPedalboardSoXFFmpeg
WAV decode967 ms84 ms35 ms51 ms73 ms
MP3 decode1.57 s274 ms432 ms487 ms
Peak normalize1.89 s462 ms
LUFS measurement973 ms337 ms
Resample 44.1k→48k2.00 s581 ms6.24 s1.02 s270 ms
Time stretch 0.8×8.74 s6.98 s5.54 s640 ms
Pitch shift +2 st15.2 s6.62 s9.29 s5.74 s794 ms
FFT spectrum (1024-pt)1.22 s452 ms
MFCC (13 coeff)1.29 s610 ms
Beat tracking1.11 s1.16 s

Reading the numbers honestly:

  • Analysis is audio's strong lane. Stats ride the decode pass (the always-resident index), so LUFS/FFT/MFCC/beat cells are ≈ decode cost + 0–0.3 s. Beat tracking matches librosa wall-to-wall — including Node startup that librosa's cell doesn't pay. Ten stats on one file cost one decode, not ten passes.
  • Decode is ~10–15× native. Pure-JS codecs. The gap is real; it buys zero native dependencies on every platform.
  • Stretch/pitch is ~1.5–2.6× SoX/librosa — a pure-JS phase vocoder at ~40–70× realtime. Within reach of the native tools, an order of magnitude behind FFmpeg's asetrate+aresample (which is the cheap resample trick, not a duration-preserving vocoder like the others — not like-for-like). Earlier drafts of this table read ~15× slower here; that was a streaming-encode defect (per-block await kept V8 from tiering up the FFT), fixed 2026-07 — see the note below.
  • Resample beats Pedalboard, trails the rest. normalize includes writing 105 MB of output; the LUFS row shows the measure-only cost.

Why the CLI transform numbers moved 6–9×. Until 2026-07, save/encode drove the DSP through a per-1024-sample-block async loop, which prevented V8 from tiering up the FFT-heavy ops for the whole file (baseline JIT, ~10× slower on a one-shot process). The fix renders the plan through the synchronous generator in large synchronous bursts, crossing an await only for I/O between bursts — bit-identical output, JIT-friendly. read() was always on the fast path. The remaining gap to native is a genuine constant factor, addressable via the atom contract's WASM lane (jz) for the streaming/realtime case that can't batch.

audio does not aim to beat native FFmpeg/SoX on raw throughput. It trades ergonomics + portability + non-destructive editing for a constant-factor cost. Where it competes structurally:

  • Time-to-first-sampleaudio plays during decode; native CLIs render then play
  • Amortized analysis — the index makes the 2nd..Nth stat/waveform query ~free; CLI tools re-decode per query
  • Bundle sizeaudio core ~20 KiB gz vs ffmpeg.wasm ~25 MiB
  • Cold-start in browser — no install, no native binary, no subprocess