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