File size: 3,721 Bytes
bc62b2b
 
0b3a9f2
bc62b2b
 
0bb0ef0
bc62b2b
2dd0adf
 
0d159b8
 
 
 
 
f63e27c
2dd0adf
 
bc62b2b
 
fe49032
bc62b2b
 
fe49032
 
 
 
bc62b2b
 
 
0b3a9f2
bc62b2b
 
 
fe49032
bc62b2b
 
 
 
 
 
0bb0ef0
 
0b3a9f2
fe49032
bc62b2b
0b3a9f2
 
 
 
 
 
 
bc62b2b
0d159b8
 
38efc0b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1e7aa82
 
38efc0b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
0d159b8
bc62b2b
 
 
 
 
0b3a9f2
0bb0ef0
fe49032
0b3a9f2
0bb0ef0
bc62b2b
0b3a9f2
 
 
 
 
 
795cfe8
 
bc62b2b
fe49032
0b3a9f2
 
 
 
 
 
 
 
0bb0ef0
 
0b3a9f2
0bb0ef0
 
 
fe49032
 
0bb0ef0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
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"<style>{f.read()}</style>", 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 = """
<style>
.video-container {
    position: fixed;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    overflow: hidden;
    z-index: -1;
}
video {
    position: absolute;
    top: 50%;
    left: 50%;
    min-width: 100%;
    min-height: 100%;
    width: auto;
    height: auto;
    z-index: -1;
    transform: translate(-50%, -50%);
    background-size: cover;
}
</style>

<div class="video-container">
    <video autoplay loop muted>
        <source src="https://go.screenpal.com/watch/cZX2oynVXxQ" type="video/mp4">
    </video>
</div>
"""

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()