Spaces:
Sleeping
Sleeping
import streamlit as st | |
from PIL import Image | |
from transformers import pipeline | |
from gtts import gTTS | |
import tempfile | |
# ββββββββ Page config | |
st.set_page_config(page_title="Storyteller for Kids", layout="centered") | |
st.title("πΌοΈ β‘οΈ π Interactive Storyteller") | |
# ββββββββ Cache model loading | |
def load_pipelines(): | |
# 1) Image captioning | |
captioner = pipeline( | |
"image-captioning", | |
model="Salesforce/blip-image-captioning-base" | |
) | |
# 2) Story generation with Flan-T5 | |
storyteller = pipeline( | |
"text2text-generation", | |
model="google/flan-t5-base" | |
) | |
return captioner, storyteller | |
captioner, storyteller = load_pipelines() | |
# ββββββββ Image upload | |
uploaded = st.file_uploader("Upload an image:", type=["jpg", "jpeg", "png"]) | |
if uploaded: | |
image = Image.open(uploaded).convert("RGB") | |
st.image(image, caption="Your image", use_column_width=True) | |
# ββββββββ 1. Caption | |
with st.spinner("π Looking at the image..."): | |
cap = captioner(image)[0]["generated_text"] | |
st.markdown(f"**Caption:** {cap}") | |
# ββββββββ 2. Story generation | |
prompt = ( | |
"Write a playful, 50β100 word story for 3β10 year-old children " | |
f"based on this description:\n\nβ{cap}β\n\nStory:" | |
) | |
with st.spinner("βοΈ Writing a story..."): | |
out = storyteller( | |
prompt, | |
max_length=200, | |
do_sample=True, | |
top_p=0.9, | |
temperature=0.8, | |
num_return_sequences=1 | |
) | |
story = out[0]["generated_text"].strip() | |
st.markdown("**Story:**") | |
st.write(story) | |
# ββββββββ 3. Text-to-Speech | |
with st.spinner("π Converting to speech..."): | |
tts = gTTS(story, lang="en") | |
tmp = tempfile.NamedTemporaryFile(suffix=".mp3", delete=False) | |
tts.write_to_fp(tmp) | |
tmp.flush() | |
st.audio(tmp.name, format="audio/mp3") |