File size: 3,231 Bytes
c580672
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
import streamlit as st
import requests
import os
import base64
import random

# Function to automatically generate scene text prompts from a movie topic
def generate_scene_prompts(movie_topic):
    actions = [
        "begins their journey in",
        "encounters a mysterious character in",
        "discovers a hidden secret within",
        "faces a daunting challenge in",
        "finds a crucial clue leading to the next adventure in",
        "unravels a complex puzzle in",
        "is forced to make a critical decision at",
        "unearths an ancient artifact in",
        "befriends an unlikely ally within",
        "witnesses a breathtaking phenomenon in"
    ]
    action1 = random.choice(actions)
    action2 = random.choice(list(set(actions) - {action1}))
    scene1 = f"{movie_topic} - Scene 1: Our hero {action1} the setting, marking the start of their adventure."
    scene2 = f"{movie_topic} - Scene 2: As the story progresses, the hero {action2}, moving closer to their goal."
    return [scene1, scene2]

# Function to make the API request and save the image
def generate_and_save_image(api_key, text_prompts):
    url = "https://api.stability.ai/v1/generation/stable-diffusion-xl-1024-v1-0/text-to-image"
    images = []
    
    for text_prompt in text_prompts:
        body = {
          "steps": 20,
          "width": 1024,
          "height": 1024,
          "seed": random.randint(0, 2**32),
          "cfg_scale": 5,
          "samples": 1,
          "text_prompts": [
            {
              "text": text_prompt,
              "weight": 1
            },
            {
              "text": "blurry, bad",
              "weight": -1
            }
          ],
        }
        headers = {
          "Accept": "application/json",
          "Content-Type": "application/json",
          "Authorization": f"Bearer {api_key}",
        }
        response = requests.post(url, headers=headers, json=body)
        
        if response.status_code != 200:
            raise Exception("Non-200 response: " + str(response.text))
        
        data = response.json()

        out_dir = "./out"
        if not os.path.exists(out_dir):
            os.makedirs(out_dir)

        for i, image in enumerate(data["artifacts"]):
            image_path = os.path.join(out_dir, f'txt2img_{text_prompt[:10]}_{image["seed"]}.png')
            with open(image_path, "wb") as f:
                f.write(base64.b64decode(image["base64"]))
            images.append(image_path)
            
    return images

# Streamlit UI
st.title("Stability AI Movie Scene Generator")

api_key = st.text_input("Enter your Stability API Key", type="password")
movie_topic = st.text_input("Enter a movie topic", value="A mysterious forest adventure")

if st.button("Generate Images"):
    text_prompts = generate_scene_prompts(movie_topic)
    
    try:
        images = generate_and_save_image(api_key, text_prompts)
        if images:
            cols = st.columns(2)
            with cols[0]:
                st.image(images[0], caption="View (Scene 1)")
            with cols[1]:
                st.image(images[1], caption="Buffer (Scene 2)")
    except Exception as e:
        st.error(f"Failed to generate images: {str(e)}")