Upon digging a bit deeper it turns out using vanilla SciPy for real-time DSP is totally a thing.
Live-coding adds some additional demands regarding a different kind of latency — pre-computations need to happen as quickly as possible — but it seems feasible.
But I have two noteworthy links:
https://warrenweckesser.github.io/papers/weckesser-scipy-lin...
Particularly “Filtering a long signal in batches” on page 6, where it shows how to apply the Butterworth filter from the previous section to individual windows while preserving its state across invocations. As I'm familiar with NumPy, but very ignorant about scipy.signal, this was the ‘Bingo!’ moment for me :)
https://scikit-dsp-comm.readthedocs.io/en/latest/
> This allows in particular demodulation of radio signals and downsampling to baseband analog signals for streaming playback of say an FM broadcast station.
I didn't dig into where it does the heavy lifting for that (sample rates in the MHz range) — there may be some C/C++ involved. But the docs show some nice examples of how to do streaming audio DSP with NumPy, SciPy and PyAudio inside Jupyter:
https://scikit-dsp-comm.readthedocs.io/en/latest/nb_examples...
I just tried searching "Jupyter audio live coding" for fun and it unearthed quite a few interesting results, but the real-time ones tend to involve SuperCollider or something similar. E.g. I discovered NSynth [0], which seemed like magic for a minute (they use Tensorflow to make a synthesizer, there's even an intrument for Ableton Live!) until I found out how they ‘cheat’ (pre-computing a wave-table for multisampling).
[0] https://magenta.tensorflow.org/nsynth-instrument