"""One native separation process; exact pinned package, no arbitrary model code.""" import json,sys from pathlib import Path from audio_separator.separator import Separator import torch model_dir,model,input_file,output_dir=sys.argv[1:5] target=sys.argv[5] if len(sys.argv)>5 else '' from separator_runtime import verify_package if not verify_package(model_dir,model):raise RuntimeError('Modellpaket-Prüfsumme stimmt nicht.') if not torch.cuda.is_available():raise RuntimeError('CUDA nicht verfügbar; kein stiller CPU-Fallback.') separator=Separator(model_file_dir=model_dir,output_dir=output_dir,output_format='WAV',use_soundfile=True,demucs_params={'segment_size':7,'shifts':2,'overlap':.25},mdxc_params={'segment_size':256,'override_model_segment_size':False,'batch_size':1,'overlap':2,'pitch_shift':0}) separator.load_model(model) files=separator.separate(input_file) root=Path(output_dir).resolve();names=[] for name in files: path=(root/name).resolve() if path.parent!=root or not path.is_file() or path.suffix.lower()!='.wav':raise RuntimeError('Ungültige Ausgabe.') names.append(path.name) if not names:raise RuntimeError('Keine Spuren erzeugt.') if target: import subprocess chosen=next((n for n in names if target in Path(n).stem.lower()),None) if not chosen:raise RuntimeError('Zielspur fehlt.') others=[root/n for n in names if n!=chosen] if not others:raise RuntimeError('Restspuren fehlen.') args=['ffmpeg','-hide_banner','-loglevel','error','-y'] for f in others:args+=['-i',str(f)] args+=['-filter_complex',''.join(f'[{i}:a]' for i in range(len(others)))+f'amix=inputs={len(others)}:normalize=0:dropout_transition=0[rest]','-map','[rest]','-c:a','pcm_s16le',str(root/'rest.wav')] subprocess.run(args,check=True,stdout=subprocess.DEVNULL,stderr=subprocess.DEVNULL,timeout=180) names=[chosen,'rest.wav'] (root/'results.json').write_text(json.dumps(names))