use clap::Parser;
use gradio_macro::gradio_api;
#[gradio_api(url = "jacoblincool/vocal-separation", option = "async")]
pub struct VocalSeparation;
#[derive(Parser, Debug)]
#[command(about = "Separate vocals and background with jacoblincool/vocal-separation")]
struct Args {
#[arg(short, long, value_name = "FILE")]
input: String,
#[arg(long, default_value = "vocals.wav")]
vocals: String,
#[arg(long, default_value = "background.wav")]
background: String,
}
async fn download_file(file: gradio::GradioFileData, filename: String) {
tokio::fs::write(&filename, file.download(None).await.unwrap()).await.unwrap();
println!("Saved: {}", filename);
}
#[tokio::main]
async fn main() {
let args = Args::parse();
println!("Vocal Separation");
let vocal = VocalSeparation::new().await.unwrap();
let result = vocal
.separate(&args.input)
.call()
.await
.expect("Failed to separate vocals");
let vocals_file = result[0].clone().as_file().unwrap();
let background_file = result[1].clone().as_file().unwrap();
let vocals_task = tokio::spawn({
let path = args.vocals.clone();
async move { download_file(vocals_file, path).await }
});
let background_task = tokio::spawn({
let path = args.background.clone();
async move { download_file(background_file, path).await }
});
let _ = tokio::join!(vocals_task, background_task);
}