import io import numpy as np import pedalboard as pb import pydub import soundfile as sf import streamlit as st from audio_recorder_streamlit import audio_recorder def stretch(audio, factor): buffer = [] for s in audio: for _ in range(factor): buffer.append(s) return np.array(buffer) st.title("๐Ÿ‘น Sound Refukculator") audio = np.array([]) source = st.radio("Choose source", ["Microphone", "File upload"]) if source == "Microphone": audio_bytes = audio_recorder() if audio_bytes: audio, sr = sf.read(io.BytesIO(audio_bytes)) else: audio_bytes = st.file_uploader("Upload file") if audio_bytes: if audio_bytes.name.endswith("mp3"): audio = pydub.AudioSegment.from_mp3(audio_bytes) sr = audio.frame_rate audio = np.float32(audio.get_array_of_samples()) / 2**15 else: audio, sr = sf.read(audio_bytes) if audio.any(): st.write("Original sound:") st.audio(audio.T, sample_rate=sr) cols = st.columns(5) chunk_dividend = cols[0].slider("๐Ÿซ€ Chunkizer", 16, 128, step=16) prob = cols[1].slider("๐Ÿคก Impredictidiblize", 0, 100, 0) stretch_factor = cols[2].slider("๐ŸงŒ Trollizer", 0, 10, 0) reps = cols[3].slider("๐Ÿซฃ Repetizer", 0, 1, 0) rev_size = cols[4].slider("๐Ÿš› Hugermaker", 0.0, 0.09, 0.0) delay_macro = cols[0].slider("๐Ÿช Spaceometer", 0.01, 0.09, 0.0) rounder = cols[1].slider("๐Ÿค” Rounder", 0, 100, 0) pshift = cols[2].slider("๐Ÿ˜ฑ Tonermaker", 0, 1, 0) reverse = cols[3].slider("๐Ÿงถ Revolver", 0, 1, 0) sr_factor = cols[4].slider("๐Ÿƒโ€โ™€๏ธ Chirpidize", 1, 16, 1) delay = pb.Pedalboard( [pb.Delay(delay_seconds=delay_macro, feedback=delay_macro * 5)] ) reverb = pb.Pedalboard([pb.Reverb(room_size=rev_size)]) chorus = pb.Pedalboard([pb.Chorus(rate_hz=rounder)]) pshifter7 = pb.Pedalboard([pb.PitchShift(-7)]) pshifter3 = pb.Pedalboard([pb.PitchShift(-3)]) pshifter5 = pb.Pedalboard([pb.PitchShift(-5)]) pshifter12 = pb.Pedalboard([pb.PitchShift(-12)]) processed = [] chunk_dividend = sorted(np.random.randint(audio.shape[0], size=chunk_dividend)) for i, chunk in enumerate(np.array_split(audio, chunk_dividend)): chunk = ( stretch(chunk, stretch_factor) if np.random.randint(100) < prob and stretch_factor else chunk ) chunk = ( reverb(chunk, sample_rate=sr, reset=False) if np.random.randint(100) < prob and rev_size else chunk ) chunk = ( delay(chunk, sample_rate=sr, reset=False) if np.random.randint(100) < prob and delay_macro else chunk ) chunk = ( chorus(chunk, sample_rate=sr, reset=False) if np.random.randint(100) < prob and rounder else chunk ) chunk = ( pshifter7(chunk, sample_rate=sr, reset=True) if np.random.randint(100) < prob and pshift else chunk ) chunk = ( pshifter3(chunk, sample_rate=sr, reset=True) if np.random.randint(100) < prob and pshift else chunk ) chunk = ( pshifter5(chunk, sample_rate=sr, reset=True) if np.random.randint(100) < prob and pshift else chunk ) chunk = ( pshifter12(chunk, sample_rate=sr, reset=True) if np.random.randint(100) < prob and pshift else chunk ) chunk = np.concatenate([chunk, chunk]) if np.random.randint(100) < prob and reps else chunk chunk = np.flip(chunk) if np.random.randint(100) < prob and reverse else chunk processed += [s for s in chunk] processed = np.array(processed) reverb = pb.Pedalboard([pb.Reverb(room_size=0.3)]) # processed = reverb(processed, sr, reset=False) compressor = pb.Pedalboard([pb.Limiter(threshold_db=-1)]) processed = compressor(processed, sr, reset=False) st.write("Refukculized sound:") st.audio(processed.T, sample_rate=sr * sr_factor)