File size: 2,402 Bytes
60897a4
bbd9992
60897a4
 
1efe423
6416df7
60897a4
 
 
86b3c7b
5e51a2a
 
37b42cd
5e51a2a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6416df7
 
142fdd3
6a2514e
 
e0d7f16
1fdc73b
9d08248
1fdc73b
60897a4
 
5b52e56
6416df7
 
 
 
 
9d08248
5b52e56
 
45e82e6
9d08248
5b52e56
 
6416df7
5b52e56
c6f164b
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
import streamlit as st
from transformers import pipeline

def img2text(url):
    image_to_text_model = pipeline("image-to-text", model="Salesforce/blip-image-captioning-large", use_fast=True)
    text = image_to_text_model(url)[0]["generated_text"]
    return text

def text2story(text):
    story_generator = pipeline("text-generation", model="pranavpsv/gpt2-genre-story-generator", device_map="auto", return_full_text=False)
    prompt = f"<BOS> {text}"
    generated = story_generator(prompt, max_new_tokens=140, do_sample=True, temperature=0.7)
    story_text = generated[0]['generated_text']

    # Split into sentences
    sentences = re.split(r'(?<=[.!?])\s+', story_text.strip())
    
    # Initialize variables
    current_word_count = 0
    final_sentences = []
    
    # Iterate through each sentence and accumulate until the word count is within 100
    for sentence in sentences:
        words = sentence.split()
        word_count = len(words)
        if current_word_count + word_count > 100:
            break
        final_sentences.append(sentence)
        current_word_count += word_count
    
    # Join the final sentences to form the story
    final_story = ' '.join(final_sentences)
    
    # Ensure it ends with a punctuation mark
    if not final_story.endswith(('.', '!', '?')):
        final_story += '.'
    
    return final_story

def text2audio(story_text):
    audio_generator = pipeline("text-to-speech", model="ylacombe/vits_vctk_scottish_female")
    audio_output = audio_generator(story_text)
    return audio_output

st.set_page_config(page_title="Once Upon A Time - Storytelling Application", page_icon="πŸ“–")
st.header("Create a story of yours with an image!πŸ§™")
uploaded_file = st.file_uploader("Upload an image for creating your story!")

if uploaded_file is not None:
    print(uploaded_file)
    bytes_data = uploaded_file.getvalue()
    with open(uploaded_file.name, "wb") as file:
        file.write(bytes_data)
    st.image(uploaded_file, caption="Uploaded Image", use_container_width=True)

    st.text('Entering the scene...🏰')
    scenario = img2text(uploaded_file.name)
    st.write(scenario)

    st.text('Your story is going to begin...πŸ¦„')
    story = text2story(scenario)
    st.write(story)

    audio_data = text2audio(story)
    st.audio(audio_data['audio'], format="audio/wav", start_time=0, sample_rate = audio_data['sampling_rate'])