File size: 3,988 Bytes
2862b53
5350da8
 
 
b1ae41c
5350da8
c544135
ce36df3
2862b53
5350da8
8738846
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5d9279e
c544135
5d9279e
 
c544135
5d9279e
 
c544135
8738846
 
 
7a1f380
 
 
 
 
 
 
 
 
 
 
8738846
2862b53
 
 
 
7a1f380
2862b53
 
 
7a1f380
 
b1ae41c
7a1f380
2862b53
7a1f380
2862b53
b1ae41c
7a1f380
 
 
 
 
 
2862b53
b1ae41c
2862b53
 
 
 
 
 
 
 
 
7a1f380
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
import re
import os
import streamlit as st
from transformers import pipeline
from typing import Dict, Optional
from together import Together
from gtts import gTTS
from mail_sender import MailSender


# Image-to-text
def img2txt(url: str) -> str:
    print("Initializing captioning model...")
    captioning_model = pipeline("image-to-text", model="Salesforce/blip-image-captioning-base")
    
    print("Generating text from the image...")
    text = captioning_model(url, max_new_tokens=20)[0]["generated_text"]
    
    print(text)
    return text

# Text-to-story generation with LLM model
def txt2story(prompt: str, top_k: int, top_p: float, temperature: float) -> str:
    # Load the Together API client
    client = Together(api_key=os.environ.get("TOGETHER_API_KEY"))

    # Modify the prompt based on user inputs and ensure a 250-word limit
    story_prompt = f"Write a short story of no more than 250 words based on the following prompt: {prompt}"

    # Call the LLM model
    stream = client.chat.completions.create(
        model="meta-llama/Meta-Llama-3.1-8B-Instruct-Turbo",
        messages=[
            {"role": "system", "content": '''As an experienced short story writer, write a meaningful story influenced by the provided prompt.
            Ensure the story does not exceed 250 words.'''},
            {"role": "user", "content": story_prompt}
        ],
        top_k=top_k,
        top_p=top_p,
        temperature=temperature,
        stream=True
    )

    # Concatenate story chunks
    story = ''
    for chunk in stream:
        story += chunk.choices[0].delta.content

    return story

# Text-to-speech
def txt2speech(text: str) -> None:
    print("Converting text to speech using gTTS...")
    
    # Generate audio from the text
    tts = gTTS(text=text, lang='en')
    
    # Save the audio output to a file
    tts.save("audio_story.mp3")

# Get user preferences for the story
def get_user_preferences() -> Dict[str, str]:
    preferences = {
        'continent': st.selectbox("Continent", ["North America", "Europe", "Asia", "Africa", "Australia"]),
        'genre': st.selectbox("Genre", ["Science Fiction", "Fantasy", "Mystery", "Romance"]),
        'setting': st.selectbox("Setting", ["Future", "Medieval times", "Modern day", "Alternate reality"]),
        'plot': st.selectbox("Plot", ["Hero's journey", "Solving a mystery", "Love story", "Survival"]),
        'tone': st.selectbox("Tone", ["Serious", "Light-hearted", "Humorous", "Dark"]),
        'theme': st.selectbox("Theme", ["Self-discovery", "Redemption", "Love", "Justice"]),
        'conflict': st.selectbox("Conflict Type", ["Person vs. Society", "Internal struggle", "Person vs. Nature", "Person vs. Person"]),
        'twist': st.selectbox("Mystery/Twist", ["Plot twist", "Hidden identity", "Unexpected ally/enemy", "Time paradox"]),
        'ending': st.selectbox("Ending", ["Happy", "Bittersweet", "Open-ended", "Tragic"])
    }
    return preferences


def send_story_email(recipient_email: str, story_text: str, audio_file_path: str) -> bool:
    """
    Send the story text and audio file to the specified email address using python-mail-sender
    Returns True if successful, False otherwise
    """
    try:
        # Initialize the MailSender with env variables
        mail_sender = MailSender()
        
        # Email configuration
        subject = "Your Generated Story"
        content = f"Here's your generated story:\n\n{story_text}\n\nEnjoy!"
        
        # Send email
        mail_sender.send_mail(
            receiver_address=recipient_email,
            subject=subject,
            email_content=content,
            attached_files=[audio_file_path]
        )
        return True
        
    except Exception as e:
        print(f"Error sending email: {str(e)}")
        return False

def validate_email(email: str) -> bool:
    """
    Basic email validation
    """
    pattern = r'^[\w\.-]+@[\w\.-]+\.\w+$'
    return re.match(pattern, email) is not None