from audiocraft.models import MusicGen
import streamlit as st
import os
import torch
import torchaudio
from io import BytesIO
st.set_page_config(
page_icon=":musical_note:",
page_title="Music Gen"
)
with open("style.css") as f:
st.markdown(f"", unsafe_allow_html=True)
@st.cache_resource
def load_model():
model = MusicGen.get_pretrained("facebook/musicgen-small")
return model
def generate_music_tensors(description, duration: int):
print("Description:", description)
print("Duration:", duration)
model = load_model()
model.set_generation_params(
use_sampling=True,
top_k=250,
duration=duration
)
output = model.generate(
descriptions=[description],
progress=True,
return_tokens=True
)
return output[0]
def save_audio_to_bytes(samples: torch.Tensor):
sample_rate = 32000
assert samples.dim() == 2 or samples.dim() == 3
samples = samples.detach().cpu()
if samples.dim() == 2:
samples = samples[None, ...] # Add batch dimension if missing
audio_buffer = BytesIO()
torchaudio.save(audio_buffer, samples[0], sample_rate=sample_rate, format="wav")
audio_buffer.seek(0) # Move to the start of the buffer
return audio_buffer
video_background = """
"""
st.markdown(video_background, unsafe_allow_html=True)
def main():
st.title("Your Music")
with st.expander("See Explanation"):
st.write("This app uses Meta's Audiocraft Music Gen model to generate audio based on your description.")
text_area = st.text_area("Enter description")
time_slider = st.slider("Select time duration (seconds)", 2, 20, 5)
if text_area and time_slider:
st.json(
{
"Description": text_area,
"Selected duration": time_slider
}
)
st.write("Generating your music... please wait.")
def main():
st.title("Your Music")
with st.expander("See Explanation"):
st.write("This app uses Meta's Audiocraft Music Gen model to generate audio based on your description.")
text_area = st.text_area("Enter description")
time_slider = st.slider("Select time duration (seconds)", 2, 20, 5)
if text_area and time_slider:
st.json(
{
"Description": text_area,
"Selected duration": time_slider
}
)
st.write("We will be back with your music... please enjoy doing the rest of your tasks while we come back in some time :)")
st.subheader("Generated Music")
music_tensors = generate_music_tensors(text_area, time_slider)
# Convert audio to bytes for playback and download
audio_buffer = save_audio_to_bytes(music_tensors)
# Play audio
st.audio(audio_buffer, format="audio/wav")
# Download button for audio
st.download_button(
label="Download Audio",
data=audio_buffer,
file_name="generated_music.wav",
mime="audio/wav"
)
if __name__ == "__main__":
main()