GlobalInsight / pages /3_Story-to-2Images.py
eaglelandsonce's picture
Rename pages/3_Storyto2Images.py to pages/3_Story-to-2Images.py
425f40e verified
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)}")