import os import sys import types import subprocess import tempfile # ── 환경 변수 설정 ────────────────────────────────────────────── os.environ["HF_FORCE_SAFE_SERIALIZATION"] = "1" os.environ["XFORMERS_FORCE_DISABLE"] = "1" # xformers 비활성화 # ── ✨ xformers 더미 모듈 삽입 ────────────────────────────────── dummy = types.ModuleType("xformers") dummy.ops = types.ModuleType("xformers.ops") # audiocraft가 ops 하위모듈도 찾음 sys.modules["xformers"] = dummy sys.modules["xformers.ops"] = dummy.ops # ─────────────────────────────────────────────────────────────── # ── audiocraft 동적 설치 ─────────────────────────────────────── try: from audiocraft.models import MusicGen except ModuleNotFoundError: subprocess.check_call([ sys.executable, "-m", "pip", "install", "git+https://github.com/facebookresearch/audiocraft@main", "--use-pep517" # 의존성 포함 설치 ]) from audiocraft.models import MusicGen import gradio as gr from transformers import VisionEncoderDecoderModel, ViTImageProcessor, AutoTokenizer from audiocraft.data.audio import audio_write from PIL import Image import torch # ───── 이미지 캡셔닝 모델 로딩 ───────────────────────────────── caption_model = VisionEncoderDecoderModel.from_pretrained( "nlpconnect/vit-gpt2-image-captioning", use_safetensors=True, low_cpu_mem_usage=True ) feature_extractor = ViTImageProcessor.from_pretrained("nlpconnect/vit-gpt2-image-captioning") tokenizer = AutoTokenizer.from_pretrained("nlpconnect/vit-gpt2-image-captioning") # ───── MusicGen 모델 로딩 ───────────────────────────────────── musicgen = MusicGen.get_pretrained("facebook/musicgen-small") musicgen.set_generation_params(duration=10) # 생성 음악 길이(초) # ───── 이미지 → 설명 문장 생성 함수 ──────────────────────────── def generate_caption(image: Image.Image) -> str: pixel_values = feature_extractor(images=image, return_tensors="pt").pixel_values output_ids = caption_model.generate(pixel_values, max_length=50) return tokenizer.decode(output_ids[0], skip_special_tokens=True) # ───── 설명 → 음악 생성 함수 ────────────────────────────────── def generate_music(prompt: str) -> str: wav = musicgen.generate([prompt]) # batch size = 1 tmp_dir = tempfile.mkdtemp() audio_path = os.path.join(tmp_dir, "musicgen_output.wav") audio_write(audio_path, wav[0], musicgen.sample_rate, strategy="loudness") return audio_path # ───── 전체 파이프라인 ──────────────────────────────────────── def process(image: Image.Image): caption = generate_caption(image) prompt = f"A cheerful melody inspired by: {caption}" audio_path = generate_music(prompt) return caption, audio_path # ───── Gradio 인터페이스 ───────────────────────────────────── demo = gr.Interface( fn=process, inputs=gr.Image(type="pil"), outputs=[ gr.Text(label="AI가 생성한 그림 설명"), gr.Audio(label="생성된 AI 음악 (MusicGen)") ], title="🎨 AI 그림-음악 생성기", description="그림을 업로드하면 AI가 설명을 만들고, 설명을 바탕으로 음악을 생성해 들려줍니다." ) if __name__ == "__main__": demo.launch()