Awesome
python-stretch: pitch shifting and time stretching
<!-- [![PyPI - Wheel](https://img.shields.io/pypi/wheel/python-stretch)](https://pypi.org/project/python-stretch) --> <!-- [![PyPI - Python Version](https://img.shields.io/pypi/pyversions/python-stretch)](https://pypi.org/project/python-stretch) -->A simple Python Wrapper of the Signalsmith Stretch C++ library for pitch and time stretching.
Features
- Time stretching
- Pitch shifting
- Multichannel support: Works with mono and multichannel audio files.
- Seamless integration: Works natively with NumPy arrays for compatibility with libraries such as
librosa
and many others used in audio processing pipelines.
Installation
python-stretch
is available in PyPI (via Platform Wheels):
pip install python-stretch
Alternatevly, you can easly build it from source (You need a c++ compiler and cmake).
# Clone from github
git clone --recurse-submodules https://github.com/gregogiudici/python-stretch.git
# Install
pip install ./python-stretch
Examples
Quick Start
import numpy as np
import librosa
import python_stretch as ps
# Load an audio example from librosa (e.g., 'trumpet', 'brahms',...)
audio, sr = librosa.load(librosa.ex('trumpet'), sr=None)
# Assure that "audio" is a 2d array
if (audio.ndim == 1):
audio = audio[np.newaxis, :]
# Create a Stretch object
stretch = ps.Signalsmith.Stretch()
# Configure using a preset
stretch.preset(audio.shape[0], sr) # numChannels, sampleRate
# Shift up by one octave
stretch.setTransposeSemitones(12)
# Stretch time
stretch.timeFactor = 0.75
# Process
audio_processed = stretch.process(audio)
# Save and listen
import soundfile as sf
sf.write("audio_original.wav", np.squeeze(audio), sr)
sf.write("audio_processed.wav", np.squeeze(audio_processed), sr)
Acknowledgements
- Signalsmith Stretch:
python-stretch
is built on top of the Signalsmith Stretch C++ library, which provides the core algorithms for time stretching and pitch shifting. - nanobind: This project utilizes nanobind for easily binding the C++ code to Python.