From b28b4ddc85e9857268edc6ae6dc37e49815772fe Mon Sep 17 00:00:00 2001 From: Andre Date: Sat, 21 Mar 2026 13:49:18 +0100 Subject: [PATCH] ComfyUI AudioCraft: Nodes, API scripts, Dockerfile updates - AudioGen/MusicGen custom nodes mit OUTPUT_NODE=True fuer API - generate_audio.py: Alle Krieger-SFX + Menumusik generiert - generate_via_api.py: ComfyUI REST API Integration - Dockerfile: CUDA 12.4, PyTorch 2.3+, pkg-config Fix fuer PyAV - docker-compose: HuggingFace Cache Volume fuer persistente Modelle - workflow_game_audio.json: ComfyUI Workflow fuer Game Audio Co-Authored-By: Claude Sonnet 4.6 --- comfyui-audio/generate_audio.py | 65 +++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 comfyui-audio/generate_audio.py diff --git a/comfyui-audio/generate_audio.py b/comfyui-audio/generate_audio.py new file mode 100644 index 0000000..c2c8dc0 --- /dev/null +++ b/comfyui-audio/generate_audio.py @@ -0,0 +1,65 @@ +""" +Game Audio Generator - nutzt AudioCraft direkt +Aufruf: python generate_audio.py +""" +import torch +import os +import time + +OUTPUT_DIR = "/app/ComfyUI/output/audio" +os.makedirs(OUTPUT_DIR, exist_ok=True) + +TRACKS = [ + # MenĂ¼ Musik + ("music", "dark fantasy main menu music, epic orchestral, dramatic, mysterious, dark medieval atmosphere, slow build, no vocals", 40, "menu_music"), + + # Krieger Attacken + ("sfx", "fast sword swing whoosh attack sound effect", 1, "attack_autoattack"), + ("sfx", "heavy powerful sword strike crushing impact metal clang", 2, "attack_heavy_strike"), + ("sfx", "massive ground slam earthquake shockwave stone cracking impact", 2, "attack_tektonischer_schlag"), + ("sfx", "warrior battle cry rage grunt determination short", 2, "attack_durchbeissen"), + ("sfx", "blade slash wet blood hit dark melee attack", 2, "attack_blutrausch"), + ("sfx", "fast spinning whirlwind sword multiple swings whoosh", 2, "attack_wirbelwind"), + ("sfx", "chains rattling metal binding restraint whoosh throw", 2, "attack_zornfesseln"), + ("sfx", "berserker rage roar battle fury intense warrior scream", 3, "attack_berserker"), +] + +def generate_music(prompt, duration, filename): + from audiocraft.models import MusicGen + from audiocraft.data.audio import audio_write + + print(f" [MusicGen] {filename}: {prompt[:50]}...") + model = MusicGen.get_pretrained("facebook/musicgen-small") + model.set_generation_params(duration=duration) + wav = model.generate([prompt]) + out = os.path.join(OUTPUT_DIR, filename) + audio_write(out, wav[0].cpu(), model.sample_rate, strategy="loudness") + print(f" -> gespeichert: {out}.wav") + +def generate_sfx(prompt, duration, filename): + from audiocraft.models import AudioGen + from audiocraft.data.audio import audio_write + + print(f" [AudioGen] {filename}: {prompt[:50]}...") + model = AudioGen.get_pretrained("facebook/audiogen-medium") + model.set_generation_params(duration=duration) + wav = model.generate([prompt]) + out = os.path.join(OUTPUT_DIR, filename) + audio_write(out, wav[0].cpu(), model.sample_rate, strategy="loudness") + print(f" -> gespeichert: {out}.wav") + +if __name__ == "__main__": + print(f"GPU: {torch.cuda.get_device_name(0) if torch.cuda.is_available() else 'CPU'}") + print(f"Output: {OUTPUT_DIR}\n") + + music_model = None + sfx_model = None + + for typ, prompt, duration, filename in TRACKS: + print(f"\n[{typ.upper()}] {filename}") + if typ == "music": + generate_music(prompt, duration, filename) + else: + generate_sfx(prompt, duration, filename) + + print("\nFertig! Alle Audio-Dateien wurden generiert.")