1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136
|
# Python-SoXR
[](https://github.com/dofuuz/python-soxr) [](https://pypi.org/project/soxr/) [](https://anaconda.org/conda-forge/soxr-python) [](https://repology.org/project/python:soxr/versions) [](https://python-soxr.readthedocs.io)
High quality, one-dimensional sample-rate conversion library for Python.
- Homepage: https://github.com/dofuuz/python-soxr
- Documentation: https://python-soxr.readthedocs.io
- PyPI: https://pypi.org/project/soxr/
Keywords: Resampler, Audio resampling, Samplerate conversion, DSP(Digital Signal Processing)
Python-SoXR is a Python wrapper of [libsoxr](https://sourceforge.net/projects/soxr/).
## Installation
```
pip install soxr
```
If installation fails, upgrade pip with `python -m pip install --upgrade pip` and try again.
### in Conda environment
```
conda install -c conda-forge soxr-python
```
Note: Conda packge name is `soxr-python`, not python-soxr.
## Basic usage
```python
import soxr
y = soxr.resample(
x, # input array – mono(1D) or multi-channel(2D of [frame, channel])
48000, # input samplerate
16000 # target samplerate
)
```
If input is not `numpy.ndarray`, it will be converted to `numpy.ndarray(dtype='float32')`.
dtype should be one of float32, float64, int16, int32.
Output is `numpy.ndarray` with same dimension and data type of input.
## Streaming usage
Use `ResampleStream` for real-time processing or very long signal.
```python
import soxr
rs = soxr.ResampleStream(
44100, # input samplerate
16000, # target samplerate
1, # channel(s)
dtype='float32' # data type (default = 'float32')
)
eof = False
while not eof:
# Get chunk
...
y_chunk = rs.resample_chunk(
x, # input aray – mono(1D) or multi-channel(2D of [frame, channel])
last=eof # Set True at end of input
)
```
Output frame count may not be consistent. This is normal operation.
(ex. [0, 0, 0, 186, 186, 166, 186, 186, 168, ...])
📝 [More code examples](https://dofuuz.github.io/dsp/2024/05/26/sample-rate-conversion-in-python.html)
## Benchmark
Sweep, impulse, speed compairsion with other resamplers for Python.
https://colab.research.google.com/drive/1_xYUs00VWYOAXShB85W1MFWaUjGHfO4K?usp=sharing
### Speed comparison summary
Downsampling 10 sec of 48000 Hz to 44100 Hz.
Ran on Google Colab.
Library | Time on CPU (ms)
------------------------ | ----------------
soxr (HQ) | 10.8
torchaudio | 13.8
soxr (VHQ) | 14.5
scipy.signal.resample | 21.3
lilfilter | 24.7
julius | 31
resampy (kaiser_fast) | 108
samplerate (sinc_medium) | 223
resampy (kaiser_best) | 310
samplerate (sinc_best) | 794
## Technical detail
For technical details behind resampler, see libsoxr docs.
- https://sourceforge.net/p/soxr/wiki/Home/
- http://sox.sourceforge.net/SoX/Resampling ([archive](https://web.archive.org/web/20230626144127/https://sox.sourceforge.net/SoX/Resampling))
- https://sourceforge.net/p/soxr/code/ci/master/tree/src/soxr.h
Python-SoXR package comes with [modified version](https://github.com/dofuuz/soxr) of libsoxr. [See changes here](https://github.com/dofuuz/soxr/compare/0.1.3...master).
These changes do not apply to dynamic-linked builds (e.g. conda-forge build).
To check the version of libsoxr, use `soxr.__libsoxr_version__`.
## Credit and License
Python-SoXR is LGPL v2.1+ licensed, following libsoxr's license.
### OSS libraries used
#### libsoxr (LGPLv2.1+)
The SoX Resampler library
https://sourceforge.net/projects/soxr/
Python-SoXR is a Python wrapper of libsoxr.
#### PFFFT (BSD-like)
PFFFT: a pretty fast FFT.
https://bitbucket.org/jpommier/pffft/
libsoxr dependency.
|