Eason918's picture
Update app.py
bfa0b31 verified
raw
history blame
3.09 kB
import streamlit as st
from PIL import Image
from transformers import pipeline
from gtts import gTTS
import os
os.system("pip install transformers==4.36.2")
st.set_page_config(page_title="AI Storyteller", page_icon="๐Ÿ“–")
# Beautify | UI ็พŽๅŒ–
page_bg_img = """
<style>
[data-testid="stAppViewContainer"] {
background-image: url("https://your-background-image-url.com");
background-size: cover;
}
h1, h3 {
text-align: center;
color: white;
}
</style>
"""
st.markdown(page_bg_img, unsafe_allow_html=True)
# ๐ŸŽฏ Load Hugging Face Models | ๅŠ ่ผ‰ Hugging Face ๆจกๅž‹
image_to_text_model = pipeline("image-to-text", model="Salesforce/blip-image-captioning-base")
story_generator = pipeline("text-generation", model="facebook/opt-350m", device=-1)
# Image to Text (Generate Caption) | ๅœ–็‰‡ โ†’ ๆ–‡ๅญ—๏ผˆ็”Ÿๆˆๆ่ฟฐ๏ผ‰
def img2text(image_path):
text = image_to_text_model(image_path)[0]["generated_text"]
return text
# Text to Story (Generate a Complete Story) | ๆ–‡ๅญ— โ†’ ๆ•…ไบ‹๏ผˆ็”ŸๆˆๅฎŒๆ•ดๆ•…ไบ‹๏ผ‰
def text2story(text):
prompt = f"Write a fun and magical children's story based on this idea: {text}.\n\nOnce upon a time..."
story = story_generator(prompt, max_length=300, do_sample=True, temperature=0.8, top_p=0.9, repetition_penalty=1.2)[0]['generated_text']
return story
# Story to Speech (TTS) | ๆ•…ไบ‹ โ†’ ่ชž้Ÿณ๏ผˆTTS๏ผ‰
def text2audio_gtts(story_text, filename="story.mp3"):
# Avoid filename conflicts | ้ฟๅ…ๆ–‡ไปถๅ†ฒ็ช
if os.path.exists(filename):
os.remove(filename)
# Limit text length (to prevent gTTS crashes)| ้™ๅˆถ TTS ๆ–‡ๆœฌ้•ทๅบฆ๏ผˆ้ฟๅ… gTTS ๅดฉๆฝฐ๏ผ‰
max_chars = 500 # gTTS ๅฏ่ƒฝไธๆ”ฏๆŒ้Ž้•ทๆ–‡ๆœฌ
story_text = story_text[:max_chars]
# Generate Speech | ็”Ÿๆˆ่ฏญ้Ÿณ
tts = gTTS(text=story_text, lang="en")
tts.save(filename)
return filename
# Streamlit Web UI
st.header("๐Ÿ“– AI Storyteller: Turn Your Image into a Story with Audio")
uploaded_file = st.file_uploader("Upload an Image...", type=["jpg", "png"])
if uploaded_file:
# Save image locally | ไฟๅญ˜ๅœ–็‰‡ๅˆฐๆœฌๅœฐ
image_path = "uploaded_image.jpg"
with open(image_path, "wb") as f:
f.write(uploaded_file.getbuffer())
# Load and Display Image | ่ฎ€ๅ–ไธฆ้กฏ็คบๅœ–็‰‡
image = Image.open(image_path)
st.image(image, caption="Uploaded Image", use_container_width=True)
# Generate Image Caption | ็”Ÿๆˆๅœ–็‰‡ๆ่ฟฐ
st.text("๐Ÿ” Generating image caption...")
caption = img2text(image_path)
st.write("**Image Description:**", caption)
# Generate Story | ็”Ÿๆˆๆ•…ไบ‹
st.text("๐Ÿ“ Generating story...")
story = text2story(caption)
st.write("**Generated Story:**")
st.write(story)
# Generate Audio | ็”Ÿๆˆ่ชž้Ÿณ
st.text("๐Ÿ”Š Generating audio...")
audio_file = text2audio_gtts(story)
# Play Audio | ๆ’ญๆ”พ้Ÿณ้ ป
st.audio(audio_file, format="audio/mp3")
# Download Audio | ไธ‹่ผ‰ๆŒ‰้’ฎ
with open(audio_file, "rb") as file:
st.download_button("๐Ÿ“ฅ Download Audio", file, file_name="story.mp3")