Browser-based audio editor & jam-session recorder for Streamlit — full effects rack, mic input, real-time recording
Project description
streamlit-audio-editor
A browser-based audio editor and jam-session recorder for Streamlit. Load any audio file, route your microphone through a full effects rack, tweak parameters in real time, and record the effected output — all client-side via the Web Audio API, no ffmpeg or server processing required.
Features
- Waveform rendering from raw PCM via Web Audio API
decodeAudioData - Draggable IN/OUT trim handles directly on the waveform canvas
- Click-to-seek, live animated playhead
- Loop mode with correct
loopStart/loopEndon the AudioBufferSourceNode - Zoom (scroll wheel or ±) + horizontal scrollbar for long files
- Full effects rack — all real-time, no playback restart:
- 3-Band EQ (low shelf · mid peak · high shelf)
- Filter (lowpass / highpass / bandpass / notch) with frequency + resonance
- Compressor (threshold, ratio, attack, release)
- Delay with feedback loop
- Chorus (LFO-modulated delay, rate + depth + mix)
- Distortion (waveshaper overdrive)
- Tremolo (LFO amplitude modulation, rate + depth)
- Reverb (convolution with synthetic impulse response)
- Stereo Pan
- Speed / Pitch (tape-style playback rate)
- Gain control
- Microphone input — route live mic audio through the entire effects chain
- Jam Session recording — capture the effected output (file + mic) via MediaRecorder, then preview, download, or send to Streamlit
- Export: slices raw PCM, encodes 16-bit WAV in the browser, previews inline, provides download
- Supports MP3, WAV, OGG, M4A, FLAC — anything the browser can decode
- Zero server-side dependencies (no ffmpeg, no pydub)
Installation
pip install streamlit-audio-editor
Quickstart
import base64
import streamlit as st
from streamlit_audio_editor import st_audio_editor
st.title("Audio Editor")
result = st_audio_editor(key="editor")
if result and result.get("type") == "export":
st.success(
f"Trimmed {result['trimStart']:.2f}s → {result['trimEnd']:.2f}s "
f"({result['trimEnd'] - result['trimStart']:.2f}s)"
)
wav_bytes = base64.b64decode(result["wavBase64"])
st.audio(wav_bytes, format="audio/wav")
st.download_button("Download trimmed WAV", wav_bytes, "trimmed.wav", "audio/wav")
if result and result.get("type") == "recording":
audio_bytes = base64.b64decode(result["recordingBase64"])
st.audio(audio_bytes, format=result["mimeType"])
st.download_button("Download recording", audio_bytes, "jam.webm", result["mimeType"])
Pre-loading a file
# Load from a URL
result = st_audio_editor(audio_url="https://example.com/sample.mp3", key="editor")
# Load from a local file via data URI
with open("sample.wav", "rb") as f:
import base64
b64 = base64.b64encode(f.read()).decode()
result = st_audio_editor(audio_url=f"data:audio/wav;base64,{b64}", key="editor")
API
st_audio_editor(audio_url=None, key=None)
| Parameter | Type | Description |
|---|---|---|
audio_url |
str | None |
URL or data-URI to pre-load |
key |
str |
Streamlit widget key |
Returns dict on export or recording:
# On Export Trim (type="export"):
{
"type": "export",
"trimStart": float, # trim in-point, seconds
"trimEnd": float, # trim out-point, seconds
"duration": float, # total file duration, seconds
"gain": float, # gain multiplier (0.0 – 2.0)
"wavBase64": str, # base64-encoded 16-bit PCM WAV of the trimmed region
# … plus all current effect parameters (eqLow, filterFreq, delayTime, etc.)
}
# On Send Recording (type="recording"):
{
"type": "recording",
"mimeType": str, # e.g. "audio/webm;codecs=opus"
"recordingBase64": str, # base64-encoded audio blob
"durationSec": float, # recording length in seconds
}
Returns None before the user clicks Export.
Development
git clone https://github.com/RhythrosaLabs/streamlit-audio-editor
cd streamlit-audio-editor
cd streamlit_audio_editor/frontend
npm install
npm start # dev server on :3002
# separate terminal
cd ../..
pip install -e .
# Set _RELEASE = False in streamlit_audio_editor/__init__.py
streamlit run example.py
License
MIT
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file streamlit_audio_editor-0.4.0.tar.gz.
File metadata
- Download URL: streamlit_audio_editor-0.4.0.tar.gz
- Upload date:
- Size: 430.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e742d5b93a9f54dc9e4916dac7ebe6160a0ccfb098883c1e1b95fce8fae9895c
|
|
| MD5 |
76758151967b75d6ca8ecdb32a8513f3
|
|
| BLAKE2b-256 |
5dcfaab6e5ef84296592a400f642cd66ba22dcb24e1deca55f124f2b72b5f837
|
File details
Details for the file streamlit_audio_editor-0.4.0-py3-none-any.whl.
File metadata
- Download URL: streamlit_audio_editor-0.4.0-py3-none-any.whl
- Upload date:
- Size: 433.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
26b99b3bf97bc03103f203988f49916d9b2f6f70d6cec1d807aec0858513594f
|
|
| MD5 |
c5bf6e30050cb3055fa208d4976e9e24
|
|
| BLAKE2b-256 |
c68964361250977fff2f407351e542b6ee5c1d8fea5f82409d1c0f22739c6b1d
|