from datasets import load_dataset import gradio as gr from gradio_client import Client import json import torch from diffusers import FluxPipeline, AutoencoderKL from live_preview_helpers import flux_pipe_call_that_returns_an_iterable_of_images import spaces device = torch.device("cuda" if torch.cuda.is_available() else "cpu") pipe = FluxPipeline.from_pretrained("black-forest-labs/FLUX.1-dev", torch_dtype=torch.bfloat16).to(device) good_vae = AutoencoderKL.from_pretrained("black-forest-labs/FLUX.1-dev", subfolder="vae", torch_dtype=torch.bfloat16).to(device) pipe.flux_pipe_call_that_returns_an_iterable_of_images = flux_pipe_call_that_returns_an_iterable_of_images.__get__(pipe) llm_client = Client("Qwen/Qwen2.5-72B-Instruct") ds = load_dataset("MohamedRashad/FinePersonas-Lite", split="train") prompt_template = """다음 페르소나 설명을 가진 캐릭터를 생성하세요: {persona_description} 다음 설명의 세계에서: {world_description} 다음 필드를 포함하는 JSON 형식으로 캐릭터를 작성하세요: - name: 캐릭터의 이름 - background: 캐릭터의 배경 - appearance: 캐릭터의 외모 - personality: 캐릭터의 성격 - skills_and_abilities: 캐릭터의 기술과 능력 - goals: 캐릭터의 목표 - conflicts: 캐릭터의 갈등 - backstory: 캐릭터의 과거 이야기 - current_situation: 캐릭터의 현재 상황 - spoken_lines: 캐릭터의 대사 (문자열 리스트) JSON 형식의 캐릭터 설명만 작성하고 다른 내용은 포함하지 마세요. '```'도 포함하지 마세요. """ world_description_prompt = "독특하고 무작위한 세계 설명을 생성하세요 (세계 설명만 작성하고 다른 내용은 포함하지 마세요)." def get_random_world_description(): result = llm_client.predict( query=world_description_prompt, history=[], system="반드시 한글로 출력하라. 당신은 도움이 되는 어시스턴트입니다.", api_name="/model_chat", ) return result[1][0][-1] def get_random_persona_description(): return ds.shuffle().select([100])[0]["persona"] @spaces.GPU(duration=75) def infer_flux(character_json): for image in pipe.flux_pipe_call_that_returns_an_iterable_of_images( prompt=character_json["appearance"], guidance_scale=3.5, num_inference_steps=28, width=1024, height=1024, generator=torch.Generator("cpu").manual_seed(0), output_type="pil", good_vae=good_vae, ): yield image def generate_character(world_description, persona_description, progress=gr.Progress(track_tqdm=True)): result = llm_client.predict( query=prompt_template.format( persona_description=persona_description, world_description=world_description ), history=[], system="반드시 한글로 출력하라. 당신은 도움이 되는 어시스턴트입니다.", api_name="/model_chat", ) output = json.loads(result[1][0][-1]) return output with gr.Blocks(title="캐릭터 자동 생성", theme="Nymbo/Nymbo_Theme") as app: with gr.Column(): gr.HTML("