Spaces:
Running
Running
jhj0517
commited on
Commit
·
e2bed65
1
Parent(s):
b7fa700
Create music separator class
Browse files
modules/uvr/music_separator.py
CHANGED
|
@@ -13,35 +13,68 @@ class MusicSeparator:
|
|
| 13 |
output_dir: Optional[str] = None):
|
| 14 |
self.model = None
|
| 15 |
self.device = self.get_device()
|
|
|
|
| 16 |
self.model_dir = model_dir
|
| 17 |
self.output_dir = output_dir
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 18 |
|
| 19 |
def update_model(self,
|
| 20 |
model_name: str = "UVR-MDX-NET-Inst_1",
|
|
|
|
| 21 |
segment_size: int = 256):
|
| 22 |
-
|
| 23 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 24 |
device=self.device,
|
| 25 |
logger=None,
|
| 26 |
-
|
| 27 |
|
| 28 |
def separate(self,
|
| 29 |
audio_file_path: str,
|
| 30 |
-
|
|
|
|
|
|
|
| 31 |
save_file: bool = True):
|
| 32 |
-
if
|
| 33 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 34 |
|
| 35 |
result = self.model(audio_file_path)
|
| 36 |
instrumental, vocals = result["instrumental"].T, result["vocals"].T
|
| 37 |
|
| 38 |
if save_file:
|
| 39 |
-
filename = audio_file_path
|
|
|
|
| 40 |
instrumental_output_path = os.path.join(self.output_dir, "instrumental", filename)
|
| 41 |
vocals_output_path = os.path.join(self.output_dir, "vocals", filename)
|
| 42 |
|
| 43 |
-
sf.write(instrumental_output_path, instrumental, sample_rate, format="WAV")
|
| 44 |
-
sf.write(vocals_output_path, vocals, sample_rate, format="WAV")
|
| 45 |
|
| 46 |
return instrumental, vocals
|
| 47 |
|
|
|
|
| 13 |
output_dir: Optional[str] = None):
|
| 14 |
self.model = None
|
| 15 |
self.device = self.get_device()
|
| 16 |
+
self.available_devices = ["cpu", "cuda"]
|
| 17 |
self.model_dir = model_dir
|
| 18 |
self.output_dir = output_dir
|
| 19 |
+
self.sample_rate = 16000
|
| 20 |
+
self.available_models = ["UVR-MDX-NET-Inst_1", "UVR-MDX-NET-Inst_HQ_1"]
|
| 21 |
+
self.default_model = self.available_models[0]
|
| 22 |
+
self.current_model_size = self.default_model
|
| 23 |
+
self.model_config = {
|
| 24 |
+
"segment": 256,
|
| 25 |
+
"split": True
|
| 26 |
+
}
|
| 27 |
|
| 28 |
def update_model(self,
|
| 29 |
model_name: str = "UVR-MDX-NET-Inst_1",
|
| 30 |
+
device: Optional[str] = None,
|
| 31 |
segment_size: int = 256):
|
| 32 |
+
if device is None:
|
| 33 |
+
device = self.device
|
| 34 |
+
|
| 35 |
+
self.device = device
|
| 36 |
+
self.model_config = {
|
| 37 |
+
"segment": segment_size,
|
| 38 |
+
"split": True
|
| 39 |
+
}
|
| 40 |
+
self.model = MDX(name=model_name,
|
| 41 |
+
other_metadata=self.model_config,
|
| 42 |
device=self.device,
|
| 43 |
logger=None,
|
| 44 |
+
model_dir=self.model_dir)
|
| 45 |
|
| 46 |
def separate(self,
|
| 47 |
audio_file_path: str,
|
| 48 |
+
model_name: str,
|
| 49 |
+
device: Optional[str] = None,
|
| 50 |
+
segment_size: int = 256,
|
| 51 |
save_file: bool = True):
|
| 52 |
+
if device is None:
|
| 53 |
+
device = self.device
|
| 54 |
+
|
| 55 |
+
model_config = {
|
| 56 |
+
"segment": segment_size,
|
| 57 |
+
"split": True
|
| 58 |
+
}
|
| 59 |
+
|
| 60 |
+
if self.model is None or self.current_model_size != model_name or self.model_config != model_config:
|
| 61 |
+
self.update_model(
|
| 62 |
+
model_name=model_name,
|
| 63 |
+
device=device,
|
| 64 |
+
segment_size=segment_size
|
| 65 |
+
)
|
| 66 |
|
| 67 |
result = self.model(audio_file_path)
|
| 68 |
instrumental, vocals = result["instrumental"].T, result["vocals"].T
|
| 69 |
|
| 70 |
if save_file:
|
| 71 |
+
filename, ext = os.path.splitext(audio_file_path)
|
| 72 |
+
filename = os.path.basename(filename) + ".wav"
|
| 73 |
instrumental_output_path = os.path.join(self.output_dir, "instrumental", filename)
|
| 74 |
vocals_output_path = os.path.join(self.output_dir, "vocals", filename)
|
| 75 |
|
| 76 |
+
sf.write(instrumental_output_path, instrumental, self.sample_rate, format="WAV")
|
| 77 |
+
sf.write(vocals_output_path, vocals, self.sample_rate, format="WAV")
|
| 78 |
|
| 79 |
return instrumental, vocals
|
| 80 |
|