Spaces:
Sleeping
Sleeping
# A Blocks implementation of https://erlj.notion.site/Neural-Instrument-Cloning-from-very-few-samples-2cf41d8b630842ee8c7eb55036a1bfd6 | |
import datetime | |
import os | |
import random | |
import gradio as gr | |
from gradio.components import Markdown as m | |
def get_time(): | |
now = datetime.datetime.now() | |
return now.strftime("%m/%d/%Y, %H:%M:%S") | |
def generate_recording(): | |
return random.choice(["new-sax-1.mp3", "new-sax-1.wav"]) | |
def reconstruct(audio): | |
return random.choice(["new-sax-1.mp3", "new-sax-1.wav"]) | |
io1 = gr.Interface( | |
lambda x, y, z: os.path.join(os.path.dirname(__file__),"sax.wav"), | |
[ | |
gr.Slider(label="pitch"), | |
gr.Slider(label="loudness"), | |
gr.Audio(label="base audio file (optional)"), | |
], | |
gr.Audio(), | |
) | |
io2 = gr.Interface( | |
lambda x, y, z: os.path.join(os.path.dirname(__file__),"flute.wav"), | |
[ | |
gr.Slider(label="pitch"), | |
gr.Slider(label="loudness"), | |
gr.Audio(label="base audio file (optional)"), | |
], | |
gr.Audio(), | |
) | |
io3 = gr.Interface( | |
lambda x, y, z: os.path.join(os.path.dirname(__file__),"trombone.wav"), | |
[ | |
gr.Slider(label="pitch"), | |
gr.Slider(label="loudness"), | |
gr.Audio(label="base audio file (optional)"), | |
], | |
gr.Audio(), | |
) | |
io4 = gr.Interface( | |
lambda x, y, z: os.path.join(os.path.dirname(__file__),"sax2.wav"), | |
[ | |
gr.Slider(label="pitch"), | |
gr.Slider(label="loudness"), | |
gr.Audio(label="base audio file (optional)"), | |
], | |
gr.Audio(), | |
) | |
demo = gr.Blocks(title="Neural Instrument Cloning") | |
with demo.clear(): | |
m( | |
""" | |
## Neural Instrument Cloning from Very Few Samples | |
<center><img src="https://media.istockphoto.com/photos/brass-trombone-picture-id490455809?k=20&m=490455809&s=612x612&w=0&h=l9KJvH_25z0QTLggHrcH_MsR4gPLH7uXwDPUAZ_C5zk=" width="400px"></center>""" | |
) | |
m( | |
""" | |
This Blocks implementation is an adaptation [a report written](https://erlj.notion.site/Neural-Instrument-Cloning-from-very-few-samples-2cf41d8b630842ee8c7eb55036a1bfd6) by Nicolas Jonason and Bob L.T. Sturm. | |
I've implemented it in Blocks to show off some cool features, such as embedding live ML demos. More on that ahead... | |
### What does this machine learning model do? | |
It combines techniques from neural voice cloning with musical instrument synthesis. This makes it possible to produce neural instrument synthesisers from just seconds of target instrument audio. | |
### Audio Examples | |
Here are some **real** 16 second saxophone recordings: | |
""" | |
) | |
gr.Audio(os.path.join(os.path.dirname(__file__),"sax.wav"), label="Here is a real 16 second saxophone recording:") | |
gr.Audio(os.path.join(os.path.dirname(__file__),"sax.wav")) | |
m( | |
"""\n | |
Here is a **generated** saxophone recordings:""" | |
) | |
a = gr.Audio(os.path.join(os.path.dirname(__file__),"new-sax.wav")) | |
gr.Button("Generate a new saxophone recording") | |
m( | |
""" | |
### Inputs to the model | |
The inputs to the model are: | |
* pitch | |
* loudness | |
* base audio file | |
""" | |
) | |
m( | |
""" | |
Try the model live! | |
""" | |
) | |
gr.TabbedInterface( | |
[io1, io2, io3, io4], ["Saxophone", "Flute", "Trombone", "Another Saxophone"] | |
) | |
m( | |
""" | |
### Using the model for cloning | |
You can also use this model a different way, to simply clone the audio file and reconstruct it | |
using machine learning. Here, we'll show a demo of that below: | |
""" | |
) | |
a2 = gr.Audio() | |
a2.change(reconstruct, a2, a2) | |
m( | |
""" | |
Thanks for reading this! As you may have realized, all of the "models" in this demo are fake. They are just designed to show you what is possible using Blocks π€. | |
For details of the model, read the [original report here](https://erlj.notion.site/Neural-Instrument-Cloning-from-very-few-samples-2cf41d8b630842ee8c7eb55036a1bfd6). | |
*Details for nerds*: this report was "launched" on: | |
""" | |
) | |
t = gr.Textbox(label="timestamp") | |
demo.load(get_time, [], t) | |
if __name__ == "__main__": | |
demo.launch() | |