File size: 5,010 Bytes
a38b4f9
 
 
 
7006220
a38b4f9
e44bb9b
 
1ac057d
e44bb9b
 
 
 
a38b4f9
7006220
 
 
 
 
 
 
 
 
 
 
 
d53004d
 
 
 
 
 
 
 
 
 
 
 
 
 
7006220
d53004d
 
 
 
 
 
 
 
 
 
 
 
 
 
a38b4f9
d53004d
 
 
a38b4f9
 
 
 
d53004d
 
 
a38b4f9
 
 
d53004d
1ac057d
a38b4f9
 
7006220
d53004d
 
7006220
 
a38b4f9
d53004d
a38b4f9
d53004d
473ecbf
d53004d
 
 
a38b4f9
 
 
d53004d
a38b4f9
 
d53004d
7006220
d53004d
 
7006220
 
a38b4f9
d53004d
a38b4f9
7006220
d53004d
7006220
d53004d
 
a38b4f9
d53004d
 
 
a38b4f9
 
 
 
 
 
 
 
 
 
7006220
a38b4f9
 
 
 
d53004d
a38b4f9
d53004d
7006220
a38b4f9
 
 
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
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
# streamlit_ui.py
import streamlit as st
import requests
import base64
import io

st.set_page_config(
    page_title="Prompta - Text to Media Generator",
    page_icon="πŸŽ™οΈ",
    layout="wide",
    initial_sidebar_state="expanded"
)
st.title("πŸŽ™οΈπŸ–ΌοΈπŸŽžοΈ Prompta - Text to Media Generator")

# πŸ› οΈ Get Token FIRST
TOKEN = st.sidebar.text_input("πŸ”‘ API Token", type="password")
HEADERS = {"Authorization": f"Bearer {TOKEN}"} if TOKEN else {}

# βœ… Display AFTER token is typed
if TOKEN:
    st.sidebar.write("Using token:", TOKEN)
else:
    st.sidebar.warning("⚠️ Please enter a valid API token to use the app.")

API_BASE = "http://localhost:8000"

# ==================================================
# Unified media rendering
# ==================================================
def render_media(response, label):
    content_type = response.headers.get("Content-Type", "")
    file_bytes = response.content

    if "audio" in content_type:
        st.audio(file_bytes, format=content_type)
    elif "video" in content_type:
        st.video(file_bytes)
    elif "image" in content_type:
        st.image(file_bytes, caption=label, use_container_width=True)
    else:
        try:
            # JSON fallback (video download_url case)
            data = response.json()
            if "download_url" in data:
                video_url = f"{API_BASE}{data['download_url']}"
                st.info("πŸ“₯ Downloading video from URL...")
                video_resp = requests.get(video_url, headers=HEADERS)
                if video_resp.status_code == 200:
                    st.video(video_resp.content)
                else:
                    st.error(f"❌ Failed to download video from {video_url}")
            else:
                st.warning("⚠️ Unsupported media format or empty response.")
        except Exception:
            st.warning("⚠️ Unsupported media format or empty response.")

# ==================================================
# Sidebar Inputs
# ==================================================
st.sidebar.header("πŸ› οΈ Settings")

tab = st.sidebar.radio("Select Task", ["Text to Audio", "Text to Image", "Text to Video"])

# ==================================================
# Text to Audio
# ==================================================
if tab == "Text to Audio":
    st.subheader("🎀 Text to Audio")
    text = st.text_area("Enter text")
    voice = st.selectbox("Choose voice/language", ["en-US", "hi-IN", "te-IN", "ta-IN"])

    if st.button("πŸ”Š Generate Audio"):
        with st.spinner("Generating audio..."):
            r = requests.post(
                f"{API_BASE}/api/v1/audio/generate",
                json={"text": text, "voice": voice},
                headers=HEADERS
            )
            if r.status_code == 200:
                render_media(r, "Generated Audio")
            else:
                st.error(f"❌ Failed: {r.json().get('detail', r.text)}")

# ==================================================
# Text to Image
# ==================================================
elif tab == "Text to Image":
    st.subheader("πŸ–ΌοΈ Text to Image")
    prompt = st.text_area("Enter image prompt")
    style = st.selectbox("Choose style", ["nature", "technology", "urban", "abstract"])

    if st.button("🧠 Generate Image"):
        with st.spinner("Generating image from Unsplash..."):
            r = requests.post(
                f"{API_BASE}/api/v1/image/generate",
                json={"prompt": prompt, "style": style},
                headers=HEADERS
            )
            if r.status_code == 200:
                render_media(r, "Generated Image")
            else:
                try:
                    err = r.json().get('detail', 'Unknown error')
                except Exception:
                    err = r.text
                st.error(f"❌ Failed to fetch/display image: {err}")

# ==================================================
# Text to Video
# ==================================================
elif tab == "Text to Video":
    st.subheader("🎞️ Text to Video")
    prompt = st.text_area("Enter video prompt")
    tone = st.selectbox("Tone", ["formal", "casual", "emotional", "documentary"])
    domain = st.selectbox("Domain", ["health", "education", "governance", "entertainment"])
    environment = st.selectbox("Environment", ["urban", "rural", "nature", "futuristic"])

    if st.button("🎬 Generate Video"):
        with st.spinner("Generating video..."):
            r = requests.post(
                f"{API_BASE}/api/v1/video/generate",
                json={"prompt": prompt, "tone": tone, "domain": domain, "environment": environment},
                headers=HEADERS
            )
            if r.status_code == 200:
                render_media(r, "Generated Video")
            else:
                st.error(f"❌ Failed: {r.json().get('detail', r.text)}")


st.sidebar.markdown("---")
st.sidebar.info("Built with ❀️ for AI GovTech Challenge 2025")