all-in-one / app.py
Taejun Kim
Add descriptions
3f9fabf
raw
history blame
No virus
1.99 kB
import gradio as gr
import os
import allin1
from pathlib import Path
HEADER = """
<header>
<h1>
All-In-One Music Structure Analyzer 🔮
</h1>
<p>
<a href="https://github.com/mir-aidj/all-in-one">[Python Package]</a>
<a href="https://arxiv.org/abs/2307.16425">[Paper]</a>
<a href="https://taejun.kim/music-dissector/">[Visual Demo]</a>
</p>
</header>
"""
DESCRIPTION = """
This Space demonstrates [All-In-One Music Structure Analyzer](https://github.com/mir-aidj/all-in-one),
a tool that predicts:
- BPM
- Beats
- Downbeats
- Functional segment boundaries
- Functional segment labels
For more information, please visit the links above ✨🧸
"""
CACHE_EXAMPLES = os.getenv('CACHE_EXAMPLES', '1') == '1'
def analyze(path):
path = Path(path)
result = allin1.analyze(
path,
multiprocess=False,
keep_byproducts=True, # TODO: remove this
)
fig = allin1.visualize(result)
allin1.sonify(result, out_dir='./sonif')
sonif_path = Path(f'./sonif/{path.stem}.sonif{path.suffix}').resolve().as_posix()
return result.bpm, fig, sonif_path
with gr.Blocks(css='style.css') as demo:
gr.HTML(HEADER)
gr.Markdown(DESCRIPTION)
input_audio_path = gr.Audio(
label='Input',
source='upload',
type='filepath',
format='mp3',
show_download_button=False,
)
button = gr.Button('Analyze', variant='primary')
output_bpm = gr.Textbox(label='BPM')
output_viz = gr.Plot(label='Visualization')
output_sonif = gr.Audio(
label='Sonification',
type='filepath',
format='mp3',
show_download_button=False,
)
gr.Examples(
examples=[
'./assets/NewJeans - Super Shy.mp3',
],
inputs=input_audio_path,
outputs=[output_bpm, output_viz, output_sonif],
fn=analyze,
cache_examples=CACHE_EXAMPLES,
)
button.click(
fn=analyze,
inputs=input_audio_path,
outputs=[output_bpm, output_viz, output_sonif],
api_name='analyze',
)
if __name__ == '__main__':
demo.launch()