| from openai import OpenAI |
| import os |
| import streamlit as st |
| from PIL import Image |
| import requests |
| from dotenv import load_dotenv |
| from transformers import pipeline |
| from datasets import load_dataset |
| import soundfile as sf |
| import torch |
|
|
| |
| st.set_page_config( |
| page_title="Image to Story Generator", |
| layout="wide", |
| initial_sidebar_state="expanded", |
| ) |
|
|
| from components import animation_html_a, animation_html, con_color |
| st.markdown(con_color,unsafe_allow_html=True) |
|
|
| load_dotenv() |
| |
| OPENAI_API_KEY = os.getenv("OPENAI_API_KEY") |
| HUGGINGFACEHUB_API_TOKEN = os.getenv("HUGGINGFACEHUB_API_TOKEN") |
|
|
| client = OpenAI(api_key=OPENAI_API_KEY) |
|
|
| header = {"Authorization": f"Bearer {HUGGINGFACEHUB_API_TOKEN}"} |
| |
| @st.cache_data |
| def logo(): |
| logo_image = Image.open("images/background.png") |
| return logo_image |
| st.image(logo(), use_column_width=True) |
|
|
| |
| col1, col2, col3 = st.columns([1, 2.2, 1]) |
| co1, co2, co3 = st.columns([1,1.5,1]) |
| c1, c2, c3, c4, c5 = st.columns([1,1,0.35,1,1]) |
| st.divider() |
|
|
| def imagettext(url): |
| response = requests.post("https://api-inference.huggingface.co/models/Salesforce/blip-image-captioning-large", headers = header, data= url) |
| text = response.json() |
| text = text[0]['generated_text'] |
| return text |
|
|
| def story_generator(scenario): |
| response = client.chat.completions.create( |
| model="gpt-3.5-turbo", |
| messages=[{"role": "system", "content": f""" |
| You're a Story Teller. You wanna generate a story based on simple narrative, the story should be less than 60 words and should not exceed it. |
| Context: {scenario}` |
| STORY: |
| """}], |
| max_tokens=70, |
| temperature=1, |
| ) |
| story = response.choices[0].message.content.strip() |
| |
| current_sentence = [] |
| word_count = 0 |
| scenario_words = story.split() |
| |
| for word in scenario_words: |
| current_sentence.append(word) |
| word_count += 1 |
| if word_count >= 60 and word_count <= 100 and word == ".": |
| break |
| storyy = " ".join(current_sentence) |
| return storyy |
|
|
| @st.cache_resource |
| def text2speech(): |
| synthesiser = pipeline("text-to-speech", "microsoft/speecht5_tts") |
|
|
| embeddings_dataset = load_dataset("Matthijs/cmu-arctic-xvectors", split="validation") |
| speaker_embedding = torch.tensor(embeddings_dataset[7306]["xvector"]).unsqueeze(0) |
|
|
| return synthesiser, speaker_embedding |
|
|
|
|
| with co2: |
| with st.container(border=True): |
| uploaded_file = st.file_uploader(":black[Choose an image]", type=["png", "jpg", "jpeg"]) |
| if uploaded_file is not None: |
| with st.container(border=True): |
| st.image(uploaded_file, caption="Scroll Down", use_column_width=True) |
| |
| with c3: |
| animation_html_container = st.markdown(animation_html, unsafe_allow_html=True) |
| image_bytes = uploaded_file.read() |
| scenario = imagettext(image_bytes) |
| |
| story = story_generator(scenario) |
| animation_html_container.empty() |
| st.subheader("Generated Story:") |
| st.info(story) |
|
|
| x1 , x2, x3, x4, x5 = st.columns([1,1,1,1,1]) |
| with x3: |
| gene = st.markdown("###### Generating... ") |
| |
| with c3: |
| animation_html_con = st.markdown(animation_html_a, unsafe_allow_html=True) |
| synethsiser, speaker_embedding = text2speech() |
| speech = synethsiser(story, forward_params={"speaker_embeddings": speaker_embedding}) |
| sf.write("speech.wav", speech["audio"], samplerate=speech["sampling_rate"]) |
| gene.empty() |
| animation_html_con.empty() |
|
|
| |
| st.subheader("Story Audio:") |
| st.audio("speech.wav", format="audio/wav", start_time=0) |
| |
| r1, r2, r3 = st.columns([1,1.6,1]) |
| t1 , t2, t3, t4, t5 = st.columns([1,1,0.8,1,1]) |
| colz1, colz2, colz3, colz4, colz5, colz6,colz7,colz8,colz9,colz10 = st.columns([1,1,1,1,1,1,2.2,1,1,1]) |
|
|
| with r2: |
| st.markdown("### ♾ Designed and Developed by Harish Kumar ♾") |
| with t3: |
| st.markdown("##### Connect with Me!!!") |
|
|
| |
| twitter_logo = Image.open("images/x.png") |
| colz7.image(twitter_logo, width=50) |
| colz7.markdown("[Twitter](https://twitter.com/isharizh)") |
|
|
| |
| linkedin_logo = Image.open("images/linkedin.png") |
| colz5.image(linkedin_logo, width=50) |
| colz5.markdown("[LinkedIn](https://www.linkedin.com/in/harizh/)") |
|
|
| |
| github_logo = Image.open("images/github.png") |
| colz6.image(github_logo, width=50) |
| colz6.markdown("[GitHub](https://github.com/isharizh)") |