import os
import streamlit as st
#from dotenv import load_dotenv
#load_dotenv()
# for audio stuff
import whisper
from pydub import AudioSegment
from io import BytesIO
from gtts import gTTS
# for langchain stuff
from langchain.llms import OpenAI
from langchain.agents import create_sql_agent,load_tools,initialize_agent
from langchain.agents.agent_toolkits import SQLDatabaseToolkit
from langchain.sql_database import SQLDatabase
from langchain.agents import AgentExecutor
from langchain import SQLDatabaseChain
# for streaming stdout stuff
from contextlib import contextmanager
from io import StringIO
from streamlit.runtime.scriptrunner.script_run_context import SCRIPT_RUN_CONTEXT_ATTR_NAME
from threading import current_thread
import sys
@contextmanager
def st_redirect(src, dst):
placeholder = st.empty()
output_func = getattr(placeholder, dst)
with StringIO() as buffer:
old_write = src.write
def new_write(b):
if getattr(current_thread(), SCRIPT_RUN_CONTEXT_ATTR_NAME, None):
buffer.write(b)
output_func(buffer.getvalue())
sys.stdout.write('\n')
else:
old_write(b)
try:
src.write = new_write
yield
finally:
src.write = old_write
@contextmanager
def st_stdout(dst):
with st_redirect(sys.stdout, dst):
yield
@contextmanager
def st_stderr(dst):
with st_redirect(sys.stderr, dst):
yield
# Code taken from https://github.com/prateekralhan/OpenAI_Whisper_ASR/tree/main
st.set_page_config(
page_title="OpeneXplore insights",
page_icon="musical_note",
layout="wide",
initial_sidebar_state="auto",
)
audio_tags = {'comments': 'Converted using pydub!'}
upload_path = "uploads/"
download_path = "downloads/"
transcript_path = "transcripts/"
# @st.cache(persist=True,allow_output_mutation=False,show_spinner=True,suppress_st_warning=True)
def to_mp3(audio_file, output_audio_file, upload_path, download_path):
## Converting Different Audio Formats To MP3 ##
if audio_file.name.split('.')[-1].lower()=="wav":
audio_data = AudioSegment.from_wav(os.path.join(upload_path,audio_file.name))
audio_data.export(os.path.join(download_path,output_audio_file), format="mp3", tags=audio_tags)
elif audio_file.name.split('.')[-1].lower()=="mp3":
audio_data = AudioSegment.from_mp3(os.path.join(upload_path,audio_file.name))
audio_data.export(os.path.join(download_path,output_audio_file), format="mp3", tags=audio_tags)
elif audio_file.name.split('.')[-1].lower()=="ogg":
audio_data = AudioSegment.from_ogg(os.path.join(upload_path,audio_file.name))
audio_data.export(os.path.join(download_path,output_audio_file), format="mp3", tags=audio_tags)
elif audio_file.name.split('.')[-1].lower()=="wma":
audio_data = AudioSegment.from_file(os.path.join(upload_path,audio_file.name),"wma")
audio_data.export(os.path.join(download_path,output_audio_file), format="mp3", tags=audio_tags)
elif audio_file.name.split('.')[-1].lower()=="aac":
audio_data = AudioSegment.from_file(os.path.join(upload_path,audio_file.name),"aac")
audio_data.export(os.path.join(download_path,output_audio_file), format="mp3", tags=audio_tags)
elif audio_file.name.split('.')[-1].lower()=="flac":
audio_data = AudioSegment.from_file(os.path.join(upload_path,audio_file.name),"flac")
audio_data.export(os.path.join(download_path,output_audio_file), format="mp3", tags=audio_tags)
elif audio_file.name.split('.')[-1].lower()=="flv":
audio_data = AudioSegment.from_flv(os.path.join(upload_path,audio_file.name))
audio_data.export(os.path.join(download_path,output_audio_file), format="mp3", tags=audio_tags)
elif audio_file.name.split('.')[-1].lower()=="mp4":
audio_data = AudioSegment.from_file(os.path.join(upload_path,audio_file.name),"mp4")
audio_data.export(os.path.join(download_path,output_audio_file), format="mp3", tags=audio_tags)
return output_audio_file
# @st.cache(persist=True,allow_output_mutation=False,show_spinner=True,suppress_st_warning=True)
def process_audio(filename, model_type):
model = whisper.load_model(model_type)
result = model.transcribe(filename)
return result["text"]
# @st.cache(persist=True,allow_output_mutation=False,show_spinner=True,suppress_st_warning=True)
def save_transcript(transcript_data, txt_file):
with open(os.path.join(transcript_path, txt_file),"w") as f:
f.write(transcript_data)
# generic search agent
llm = OpenAI(temperature=0)
tools = load_tools(['serpapi','llm-math'], llm=llm, verbose=True)
agent = initialize_agent(tools, llm, agent='zero-shot-react-description', verbose=True)
# import pandas as pd
# df = pd.DataFrame({'date':pd.date_range('2023-01-01','2023-04-30'),
# 'city':[np.random.choice(['Edmonton']) for i in range(120)],
# 'sales':[np.random.randint(640000,1800000) for i in range(120)],
# 'max_temperature':[np.random.randint(25) for i in range(120)],
# 'min_temperature':[np.random.randint(-10,10) for i in range(120)],
# 'weather':[np.random.choice(['sunny','partly cloudy']) for i in range(120)]
# })
# df1 = pd.DataFrame({'date':pd.date_range('2023-01-01','2023-04-30'),
# 'city':[np.random.choice(['Kitchener']) for i in range(120)],
# 'sales':[np.random.randint(640000,1800000) for i in range(120)],
# 'max_temperature':[np.random.randint(25) for i in range(120)],
# 'min_temperature':[np.random.randint(-10,10) for i in range(120)],
# 'weather':[np.random.choice(['sunny','partly cloudy']) for i in range(120)]
# })
# df = pd.concat([df,df1])
# from sqlalchemy import create_engine
# disk_engine = create_engine('sqlite:///company_database.db')
# df.to_sql('daily_sales', disk_engine, if_exists='replace',index=False)
# db agent
db = SQLDatabase.from_uri('sqlite:///company_database.db')
db_chain = SQLDatabaseChain(llm=llm,database=db,verbose=True)
toolkit = SQLDatabaseToolkit(db=db, llm=llm)
agent_executor = create_sql_agent(
llm=OpenAI(temperature=0),
toolkit=toolkit,
verbose=True
)
st.title("🗣💡 OracleXplore - last mile for insights ✨")
# select journey - text or voice
input_format = st.radio(
"How would you like to ask the question?",
("Not sure","Type it","Say it"), horizontal=True
)
transcript=''
if input_format == "Type it":
transcript = st.text_input("type your question here",placeholder="Example: using our own data what is the total revenue from Edmonton in Feb?")
elif input_format == "Say it":
st.info('✨ Supports all popular audio formats - WAV, MP3, MP4, OGG, WMA, AAC, FLAC, FLV')
col1, col2 = st.columns([3, 2])
with col1:
uploaded_file = st.file_uploader("Upload audio file", type=["wav","mp3","ogg","wma","aac","flac","mp4","flv"])
audio_file = None
if uploaded_file is not None:
generate_text = st.button("Generate speech to text")
audio_bytes = uploaded_file.read()
with open(os.path.join(upload_path,uploaded_file.name),"wb") as f:
f.write((uploaded_file).getbuffer())
with st.spinner(f"Processing Audio ... 💫"):
output_audio_file = uploaded_file.name.split('.')[0] + '.mp3'
output_audio_file = to_mp3(uploaded_file, output_audio_file, upload_path, download_path)
audio_file = open(os.path.join(download_path,output_audio_file), 'rb')
audio_bytes = audio_file.read()
# transcribe the text
if generate_text:
with st.spinner(f"Generating Transcript... 💫"):
transcript = process_audio(str(os.path.abspath(os.path.join(download_path,output_audio_file))), 'base')
st.write("Here's what our AI heard you say:")
output_txt_file = str(output_audio_file.split('.')[0]+".txt")
save_transcript(transcript, output_txt_file)
output_file = open(os.path.join(transcript_path,output_txt_file),"r")
output_file_data = output_file.read()
with col2:
if uploaded_file is not None:
print("Opening ",audio_file)
st.markdown("---")
st.markdown("Feel free to play your uploaded audio file 🎼")
st.audio(audio_bytes)
else:
st.markdown("---")
st.warning('⚠ Please upload your audio file 😯')
else:
pass
# process next steps
if transcript!='':
st.info(f"Question: {transcript}")
# run agent
# with st_stdout("error"):
if "using our own data" in transcript.lower():
response = agent_executor.run(transcript.replace("using our own data",""))
# with st.expander('Message history:'):
# st.info(memory.buffer)
else:
response = agent.run(transcript)
# convert this back into audio
sound_file = BytesIO()
tts = gTTS(response, lang='en')
tts.write_to_fp(sound_file)
st.info(f"Answer: {response}")
st.audio(sound_file)
st.markdown("