Spaces:
Sleeping
Sleeping
import streamlit as st | |
import librosa | |
import numpy as np | |
import matplotlib.pyplot as plt | |
from matplotlib.animation import FuncAnimation | |
import tempfile | |
import os | |
# Import custom visualizers | |
from felguk import felguk_viz | |
from result_video_audio_vizualizer import result_video_viz | |
from piepy import piepy_viz | |
from pyz import pyz_viz | |
# List of visualizers | |
VISUALIZERS = { | |
"Waveform": lambda y, sr: librosa.display.waveshow(y, sr=sr), | |
"Spectrogram": lambda y, sr: librosa.display.specshow(librosa.amplitude_to_db(np.abs(librosa.stft(y)), ref=np.max), sr=sr, x_axis='time', y_axis='log'), | |
"Mel Spectrogram": lambda y, sr: librosa.display.specshow(librosa.feature.melspectrogram(y=y, sr=sr), sr=sr, x_axis='time', y_axis='mel'), | |
"Chromagram": lambda y, sr: librosa.display.specshow(librosa.feature.chroma_stft(y=y, sr=sr), sr=sr, x_axis='time', y_axis='chroma'), | |
"Felguk Visualizer": felguk_viz, | |
"Result Video Visualizer": result_video_viz, | |
"Piepy Visualizer": piepy_viz, | |
"Pyz Visualizer": pyz_viz, | |
"Tempogram": lambda y, sr: librosa.display.specshow(librosa.feature.tempogram(y=y, sr=sr)), | |
"Spectral Contrast": lambda y, sr: librosa.display.specshow(librosa.feature.spectral_contrast(y=y, sr=sr), sr=sr, x_axis='time'), | |
} | |
# Function to generate a video | |
def generate_video(y, sr, visualizer): | |
fig, ax = plt.subplots(figsize=(10, 4)) | |
def animate(i): | |
ax.clear() | |
visualizer(y[:i * 1000], sr) # Update visualization for each frame | |
ax.set_title(f"Frame {i}") | |
anim = FuncAnimation(fig, animate, frames=len(y) // 1000, interval=50) | |
# Save the animation as a video file | |
video_file = tempfile.NamedTemporaryFile(delete=False, suffix=".mp4") | |
anim.save(video_file.name, writer="ffmpeg", fps=30) | |
plt.close() | |
return video_file.name | |
# Streamlit app | |
st.title("Audio Visualizer") | |
st.write("Upload an audio file to visualize it in different ways.") | |
# Upload audio file | |
audio_file = st.file_uploader("Upload an audio file", type=["wav", "mp3", "ogg"]) | |
if audio_file is not None: | |
st.audio(audio_file, format='audio/wav') | |
y, sr = librosa.load(audio_file, sr=None) | |
# Select visualizer | |
selected_viz = st.selectbox("Select a visualizer", list(VISUALIZERS.keys())) | |
# Plot the selected visualizer | |
st.write(f"### {selected_viz}") | |
plt.figure(figsize=(10, 4)) | |
VISUALIZERS[selected_viz](y, sr) | |
plt.colorbar(format="%+2.0f dB") | |
st.pyplot(plt) | |
# Generate and return video | |
if st.button("Generate Video"): | |
video_path = generate_video(y, sr, VISUALIZERS[selected_viz]) | |
st.video(video_path) | |
with open(video_path, "rb") as file: | |
st.download_button( | |
label="Download Video", | |
data=file, | |
file_name="audio_visualization.mp4", | |
mime="video/mp4" | |
) | |
os.unlink(video_path) # Clean up the temporary file |