MubertTTM / app.py
jaumaras's picture
Duplicate from OneAfterlife/MubertTTM
54a2113
import time
import gradio as gr
from sentence_transformers import SentenceTransformer
import httpx
import json
from utils import get_tags_for_prompts, get_mubert_tags_embeddings, get_pat
minilm = SentenceTransformer('all-MiniLM-L6-v2')
mubert_tags_embeddings = get_mubert_tags_embeddings(minilm)
def get_track_by_tags(tags, pat, duration, maxit=20, loop=False):
if loop:
mode = "loop"
else:
mode = "track"
r = httpx.post('https://api-b2b.mubert.com/v2/RecordTrackTTM',
json={
"method": "RecordTrackTTM",
"params": {
"pat": pat,
"duration": duration,
"tags": tags,
"mode": mode
}
})
rdata = json.loads(r.text)
assert rdata['status'] == 1, rdata['error']['text']
trackurl = rdata['data']['tasks'][0]['download_link']
print('Generating track ', end='')
for i in range(maxit):
r = httpx.get(trackurl)
if r.status_code == 200:
return trackurl
time.sleep(1)
def generate_track_by_prompt(email, prompt, duration, loop=False):
try:
pat = get_pat(email)
_, tags = get_tags_for_prompts(minilm, mubert_tags_embeddings, [prompt, ])[0]
return get_track_by_tags(tags, pat, int(duration), loop=loop), "Success", ",".join(tags)
except Exception as e:
return None, str(e), ""
block = gr.Blocks()
with block:
gr.HTML(
"""
<div style="text-align: center; max-width: 700px; margin: 0 auto;">
<div
style="
display: inline-flex;
align-items: center;
gap: 0.8rem;
font-size: 1.75rem;
"
>
<h1 style="font-weight: 900; margin-bottom: 7px;">
Mubert Text to Music
</h1>
</div>
<p style="margin-bottom: 10px; font-size: 94%">
All music is generated by Mubert API – <a href="https://mubert.com" style="text-decoration: underline;" target="_blank">www.mubert.com</a>
</p>
</div>
"""
)
with gr.Group():
with gr.Box():
email = gr.Textbox(label="Enter your email (for API token)")
prompt = gr.Textbox(label="Key prompts to generate a track (genre, theme, etc.)")
duration = gr.Slider(label="Duration (seconds)", value=60, maximum=300)
is_loop = gr.Checkbox(label="Generate loop")
out = gr.Audio()
result_msg = gr.Text(label="Result message")
tags = gr.Text(label="Interpreted tags from your key prompts")
btn = gr.Button("Submit").style(full_width=True)
btn.click(fn=generate_track_by_prompt, inputs=[email, prompt, duration, is_loop], outputs=[out, result_msg, tags])
gr.HTML('''
<div class="footer" style="text-align: center; max-width: 700px; margin: 0 auto;">
</div>
</div>
<p style="margin-bottom: 10px; font-size: 94%">
if you put anything over 250 seconds, you will need to wait 10 or 30 second after it is done processing.
</div>
''')
block.launch()