diff --git a/deploy/separator-web/README.md b/deploy/separator-web/README.md index f2be3fd..2cde4fd 100644 --- a/deploy/separator-web/README.md +++ b/deploy/separator-web/README.md @@ -27,3 +27,7 @@ Unterstützt Gesang (BS-Roformer), Schlagzeug/Bass (Demucs FT), Gitarre/Klavier/ Modellquellen einschließlich aller Ensemble-Dateien und SHA-256 stehen in separator_sources.json. Paket-Downloads und Restore prüfen alle Hashes. Quelle darf GitHub/UVR oder Meta sein; es wird keine Hugging-Face-Herkunft erfunden. Lokale Übernahme erhält IDs und wird separat als Übernahme dargestellt. Unbekannte lokale Dateien benötigen weiterhin einen belegten Herkunftsabgleich. Backup speichert Paketrezepte, Quellen und Container-Konfiguration. Der Docker-Helfer kann das hier hinterlegte Image-Rezept auf einer leeren Installation wieder bauen; Gewichte werden von den geprüften Quellen erneut bezogen. + +ZIP-Ausgaben heißen bei Gesang `Vocals.wav` und `Instrumental.wav`; andere Ziele +verwenden `Drums.wav`, `Bass.wav`, `Guitar.wav`, `Piano.wav` oder `Other.wav` +zusammen mit `Rest.wav`, ohne technische Modell- oder Eingabedateinamen. diff --git a/deploy/separator-web/app.py b/deploy/separator-web/app.py index 8a8bc3a..b479b93 100644 --- a/deploy/separator-web/app.py +++ b/deploy/separator-web/app.py @@ -7,6 +7,10 @@ from email.parser import BytesParser BASE='http://127.0.0.1:8108' CONFIG=Path('/data/deck-connection.json') TARGETS={'vocals':'model_bs_roformer_ep_317_sdr_12.9755.ckpt','drums':'htdemucs_ft.yaml','bass':'htdemucs_ft.yaml','guitar':'htdemucs_6s.yaml','piano':'htdemucs_6s.yaml','other':'htdemucs_6s.yaml'} +def archive_name(target,filename): + if target not in TARGETS:raise ValueError('Unbekannte Zielspur.') + if Path(filename).name=='rest.wav':return 'Instrumental.wav' if target=='vocals' else 'Rest.wav' + return {'vocals':'Vocals','drums':'Drums','bass':'Bass','guitar':'Guitar','piano':'Piano','other':'Other'}[target]+'.wav' def request(path,body=None,ctype='application/json',token=None): if token is None:token=json.loads(CONFIG.read_text())['token'] if CONFIG.exists() else '' if not token:raise ValueError('Zuerst die Deck-Verbindung einrichten.') @@ -71,7 +75,7 @@ class Handler(BaseHTTPRequestHandler): if current['state']!='complete':raise ValueError(current['phase']) result=io.BytesIO() with zipfile.ZipFile(result,'w',zipfile.ZIP_STORED) as bundle: - for f in current['files']:bundle.writestr(Path(f['name']).name,request(f"/api/v1/separator-tests/audio?id={ident}&index={f['index']}")) + for f in current['files']:bundle.writestr(archive_name(target,f['name']),request(f"/api/v1/separator-tests/audio?id={ident}&index={f['index']}")) return self.send(result.getvalue(),mime='application/zip') raise ValueError('Trennauftrag hat das Zeitlimit überschritten.') except Exception as exc:return self.send({'detail':str(exc) if isinstance(exc,ValueError) else 'Verarbeitung fehlgeschlagen; Verbindung und Audioformat prüfen.'},400) diff --git a/deploy/separator-web/index.html b/deploy/separator-web/index.html index dd3f751..d31aab4 100644 --- a/deploy/separator-web/index.html +++ b/deploy/separator-web/index.html @@ -15,5 +15,5 @@