import streamlit as st import hmac import os from helpers import text_to_speech, autoplay_audio, speech_to_text, get_api_key from generate_answer import base_model_chatbot, with_pdf_chatbot from audio_recorder_streamlit import audio_recorder from streamlit_float import * from PIL import Image # Display image/logo in the "Course Query Assistant" section (optional) voice = Image.open("8090687.png") # Ensure the file is in the correct directory st.image(voice, width=100) # Adjust the size as per preference def main(answer_mode: str): # Float feature initialization float_init() # Prompt for API key api_key = get_api_key() if not api_key: st.error("You must provide a valid OpenAI API Key to proceed.") st.stop() def initialize_session_state(): if "messages" not in st.session_state: st.session_state.messages = [ {"role": "assistant", "content": "Hi! How may I assist you today? (Please Speak Clearly)"} ] initialize_session_state() st.title("OpenAI Conversational Chatbot 🤖") # Create footer container for the microphone footer_container = st.container() with footer_container: audio_bytes = audio_recorder() for message in st.session_state.messages: with st.chat_message(message["role"]): st.write(message["content"]) if audio_bytes: # Write the audio bytes to a file with st.spinner("Transcribing..."): webm_file_path = "temp_audio.mp3" with open(webm_file_path, "wb") as f: f.write(audio_bytes) transcript = speech_to_text(webm_file_path) if transcript: st.session_state.messages.append({"role": "user", "content": transcript}) with st.chat_message("user"): st.write(transcript) os.remove(webm_file_path) if st.session_state.messages[-1]["role"] != "assistant": with st.chat_message("assistant"): with st.spinner("Thinking🤔..."): if answer_mode == 'base_model': final_response = base_model_chatbot(st.session_state.messages) elif answer_mode == 'pdf_chat': final_response = with_pdf_chatbot(st.session_state.messages) # Add final check for punctuation and completeness if not final_response.strip()[-1] in ".!?": final_response += " This is the end of the response. Let me know if you need anything else." with st.spinner("Generating audio response..."): audio_file = text_to_speech(final_response) autoplay_audio(audio_file) st.write(final_response) st.session_state.messages.append({"role": "assistant", "content": final_response}) os.remove(audio_file) # Float the footer container and provide CSS to target it with footer_container.float("bottom: 0rem;") if __name__ == "__main__": main(answer_mode='base_model') # Or: answer_mode='pdf_chat'