jhj0517 commited on
Commit
e2bed65
·
1 Parent(s): b7fa700

Create music separator class

Browse files
Files changed (1) hide show
  1. modules/uvr/music_separator.py +42 -9
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
- self.model = MDX(name="UVR-MDX-NET-Inst_1",
23
- other_metadata={"segment": segment_size, "split": True},
 
 
 
 
 
 
 
 
24
  device=self.device,
25
  logger=None,
26
- model_path="models\UVR\MDX_Net_Models\UVR-MDX-NET-Inst_HQ_1.onnx")
27
 
28
  def separate(self,
29
  audio_file_path: str,
30
- sample_rate: int = 44100,
 
 
31
  save_file: bool = True):
32
- if self.model is None:
33
- self.model = self.update_model()
 
 
 
 
 
 
 
 
 
 
 
 
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