import streamlit as st
import streamlit.components.v1 as components
import requests
import os
import time
import streamlit as st
import base64
from streamlit_mic_recorder import mic_recorder
from notion_client import Client
import pandas as pd
MODEL_NAME = "drinktoomuchsax/whisper-small-hi"
lang = "en"
from threading import Thread
os.environ["COQUI_TOS_AGREED"] = "1"
os.environ["TRAINER_TELEMETRY"]= "0"
# Constants
HF_TOKEN = os.environ.get("HF_TOKEN", None)
BASETEN_API = os.environ.get("BASETEN_API", None)
BASETEN_KEY = os.environ.get("BASETEN_KEY", None)
NOTION_KEY = os.environ.get("NOTION_API_KEY", None)
NOTION_DB_ID = os.environ.get("NOTION_DB_ID", None)
notion = Client(auth=f"{NOTION_KEY}")
database_id = f"{NOTION_DB_ID}"
st.set_page_config(layout="wide")
# Load custom CSS to integrate Bootstrap, Font Awesome, and Google Fonts
st.markdown('''
''', unsafe_allow_html=True)
# Title Section
st.markdown('
My Streamlit Application
Integrating Streamlit with Bootstrap Carousel
', unsafe_allow_html=True)
left, ml, right = st.columns([3,3,3])
with left:
# Carousel Structure
st.markdown('''
Calculator
''', unsafe_allow_html=True)
# Box 1: Calculator
# Define the calculator layout
buttons = [
['7', '8', '9', '/'],
['4', '5', '6', '\*'],
['1', '2', '3', '\-'],
['C', '0', '.', '\+'],
['=']
]
# To store the calculation input
if 'calc_input' not in st.session_state:
st.session_state.calc_input = ""
# Custom calculation function
def calculate(expression):
expression = expression.replace("\\","")
try:
result = eval(expression) # placeholder for a safe eval replacement
return str(result)
except ZeroDivisionError:
return "Error: Division by zero"
except Exception:
return "Error"
# Display the calculator buttons
for row in buttons:
cols = st.columns(len(row))
for i, btn_label in enumerate(row):
if btn_label and cols[i].button(btn_label):
if btn_label == '=':
st.session_state.calc_input = calculate(st.session_state.calc_input)
elif btn_label == 'C':
st.session_state.calc_input = ""
else:
st.session_state.calc_input += btn_label.replace("\\","")
# Display the current calculation input/output
st.text_input("Calculation", st.session_state.calc_input, key="display", disabled=True)
with ml:
st.markdown('''
Gen Image
''', unsafe_allow_html=True)
api_key = f"{BASETEN_KEY}"
negative_prompt = st.text_input("Negative Prompt", "blurry, text, low quality")
positive_prompt = st.text_input("Positive Prompt", "An igloo on a snowy day, 4k, hd")
controlnet_image_url = st.text_input("ControlNet Image URL", "https://storage.googleapis.com/logos-bucket-01/baseten_logo.png")
# Button to trigger generation
if st.button("Generate Prompt"):
# Making the API request
response = requests.post(
"https://model-7wlx9oew.api.baseten.co/production/predict",
headers={"Authorization": f"Api-Key {api_key}"},
json={
'workflow_values': {
'negative_prompt': negative_prompt,
'positive_prompt': positive_prompt,
'controlnet_image': controlnet_image_url
}
}
)
# Display the response
if response.status_code == 200:
result = response.json().get("result")
if result:
image_data = result[0].get("data")
if image_data:
# Decode the base64 image data
image = base64.b64decode(image_data)
# Display the image in Streamlit
st.image(image, caption="Generated Image", use_column_width=True)
else:
st.error("No image data found in the response.")
else:
st.error("No result found in the response.")
else:
st.error(f"Error: {response.status_code}, {response.text}")
# with rl:
# # End of Box 2 and second Carousel Item
# st.markdown('''
Transcribe
''', unsafe_allow_html=True)
# # Box 3: Form 2
# # Audio recording using mic_recorder
# audio = mic_recorder(
# start_prompt="Start recording",
# stop_prompt="Stop recording",
# just_once=False,
# use_container_width=False,
# callback=None,
# key="mic_recorder"
# )
# #uploaded_file = st.file_uploader("Or upload an audio file", type=["mp3", "wav", "flac", "aac"])
# if st.button("Transcribe"):
# if audio and "bytes" in audio:
# st.success("Recording detected. Transcribing your recording...")
# with open("temp_recording.wav", "wb") as f:
# f.write(audio["bytes"])
# with st.spinner("Transcribing..."):
# #transcription = transcribe("temp_recording.wav")
# #need to send the data here
# transcription = "Under Process"
# print("")
# st.text_area("Transcription", transcription, height=200)
# else:
# st.error("Please record audio or upload a file to transcribe.")
with right:
st.markdown('''
Chat with Mistral
''', unsafe_allow_html=True)
# Box 4: Form 3
prompt3 = st.text_input("Enter Prompt", key="prompt3", value="Why is Sky Blue?")
#image_url3 = st.text_input("Enter Image URL", key="image_url3")
if st.button("Submit", key="submit3"):
payload = {"prompt": prompt3}
headers = {
"Authorization": f"Api-Key {BASETEN_KEY}"
}
response = requests.post(f"{BASETEN_API}", headers=headers, json=payload)
if response.status_code == 200:
st.write(f"**Response:** {response.json()}")
else:
st.write("Failed to get a response")
# End of Box 4 and fourth Carousel Item
left, middle, right = st.columns([1,3,1])
with middle:
# Streamlit form for data input
with st.form(key='data_entry_form'):
name = st.text_input("Name")
age = st.number_input("Age", min_value=0)
location = st.text_input("Location")
submit_button = st.form_submit_button(label='Submit')
# Function to add data to Notion
def add_to_notion(name, age, location):
new_page = {
"Name": {
"title": [
{
"text": {
"content": name
}
}
]
},
"Age": {
"number": age
},
"Location": {
"rich_text": [
{
"text": {
"content": location
}
}
]
}
}
notion.pages.create(parent={"database_id": database_id}, properties=new_page)
# Add data to Notion when form is submitted
if submit_button:
add_to_notion(name, age, location)
st.success("Data submitted to Notion!")
# Function to retrieve data from Notion
def retrieve_data_from_notion():
query_result = notion.databases.query(database_id=database_id)
data = []
for result in query_result["results"]:
# Safely extract the "Name" property
name = result["properties"]["Name"]["title"][0]["text"]["content"] if result["properties"]["Name"]["title"] else "No Name"
# Safely extract the "Age" property
age = result["properties"]["Age"]["number"] if result["properties"]["Age"]["number"] is not None else "No Age"
# Safely extract the "Location" property
location = result["properties"]["Location"]["rich_text"][0]["text"]["content"] if result["properties"]["Location"]["rich_text"] else "No Location"
data.append({"Name": name, "Age": age, "Location": location})
return pd.DataFrame(data)
# Display the data in a table
st.subheader("Stored Data")
data_df = retrieve_data_from_notion()
st.table(data_df)
hide_default_format = """
"""
st.markdown(hide_default_format, unsafe_allow_html=True)