File size: 3,841 Bytes
90bef38
8d5fabf
90bef38
8d5fabf
 
 
118cd25
8d5fabf
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
b038974
8d5fabf
 
b038974
8d5fabf
 
90bef38
8d5fabf
 
b038974
8d5fabf
118cd25
8d5fabf
 
 
 
 
 
 
 
 
cd79461
8d5fabf
 
 
 
 
 
 
 
b038974
8d5fabf
 
 
 
 
 
 
 
 
 
 
 
b038974
7c5a1e4
 
90bef38
8d5fabf
 
4e37056
 
8d5fabf
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4e37056
8d5fabf
 
 
 
 
 
 
 
 
 
 
 
 
 
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
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
import streamlit as st
from transformers import pipeline
from PIL import Image
import io
from gtts import gTTS
import time

# Set page title
st.set_page_config(page_title="Kids Story Generator")

# Title and introduction
st.title("Kids Story Generator")
st.write("Upload a picture and let's create a magical story!")

# Initialize models
@st.cache_resource
def load_models():
    image_to_text = pipeline("image-to-text", model="microsoft/git-base-coco")
    story_generator = pipeline("text-generation", model="gpt2")
    return image_to_text, story_generator

image_to_text, story_generator = load_models()

# Function to generate caption from image
def generate_caption(image):
    try:
        caption = image_to_text(image)[0]['generated_text']
        return caption
    except Exception as e:
        st.error(f"Error generating caption: {str(e)}")
        return "children playing in a colorful park"

# Function to generate story from caption (less than 100 words)
def generate_story(caption):
    try:
        prompt = f"Once upon a time, {caption} "
        
        # Set parameters for faster generation while keeping quality
        story = story_generator(
            prompt, 
            max_length=100, 
            do_sample=True,
            temperature=0.7,  # Lower temperature for faster generation
            top_p=0.9,
            num_return_sequences=1
        )[0]['generated_text']
        
        # Ensure story doesn't exceed 100 words
        words = story.split()
        if len(words) > 100:
            words = words[:100]
            story = " ".join(words)
            # Add period to the end if needed
            if not story.endswith(('.', '!', '?')):
                story += '.'
        
        return story
    except Exception as e:
        st.error(f"Error generating story: {str(e)}")
        return f"Once upon a time, {caption}. Something magical happened and everyone lived happily ever after."

# Function to convert text to speech
def text_to_speech(text):
    try:
        tts = gTTS(text=text, lang='en', slow=False)
        audio_file = "story_audio.mp3"
        tts.save(audio_file)
        return audio_file
    except Exception as e:
        st.error(f"Error generating audio: {str(e)}")
        return None

# File uploader
uploaded_file = st.file_uploader("Choose an image...", type=["jpg", "jpeg", "png"])

if uploaded_file is not None:
    try:
        # Display the uploaded image
        image = Image.open(uploaded_file)
        st.image(image, caption='Uploaded Image', use_container_width=True)
        
        # Generate button
        if st.button("Generate Story"):
            # Use progress bar for better UX
            progress_bar = st.progress(0)
            
            # Generate caption
            progress_bar.progress(25)
            st.text('Analyzing image...')
            caption = generate_caption(image)
            st.write("Image caption:", caption)
            
            # Generate story
            progress_bar.progress(50)
            st.text('Creating story...')
            story = generate_story(caption)
            word_count = len(story.split())
            st.write(f"### Your Story ({word_count} words)")
            st.write(story)
            
            # Generate audio
            progress_bar.progress(75)
            st.text('Generating audio...')
            audio_file = text_to_speech(story)
            
            # Display audio
            if audio_file:
                progress_bar.progress(100)
                st.write("### Listen to your story")
                st.audio(audio_file)
            
            # Clear progress when done
            progress_bar.empty()
    
    except Exception as e:
        st.error(f"An error occurred: {str(e)}")

st.markdown("---")
st.write("Created for ISOM5240 Assignment")