import streamlit as st import os from audio_recorder_streamlit import audio_recorder from streamlit_float import * import base64 from openai import OpenAI api_key = os.getenv("openapikey") client = OpenAI(api_key=api_key) def get_answer(messages): system_message = [{"role": "system", "content": "You are an helpful AI chatbot, that answers questions asked by User."}] messages = system_message + messages response = client.chat.completions.create( model="gpt-3.5-turbo-1106", messages=messages ) return response.choices[0].message.content def speech_to_text(audio_data): with open(audio_data, "rb") as audio_file: transcript = client.audio.transcriptions.create( model="whisper-1", response_format="text", file=audio_file ) return transcript def text_to_speech(input_text): response = client.audio.speech.create( model="tts-1", voice="nova", input=input_text ) webm_file_path = "temp_audio_play.mp3" with open(webm_file_path, "wb") as f: response.stream_to_file(webm_file_path) return webm_file_path def autoplay_audio(file_path: str): with open(file_path, "rb") as f: data = f.read() b64 = base64.b64encode(data).decode("utf-8") md = f""" """ st.markdown(md, unsafe_allow_html=True) # Initialize floating features for the interface float_init() # Initialize session state for managing chat messages 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?"}] initialize_session_state() st.title("OpenAI Conversational Chatbot 🤖") # Create a container for the microphone and audio recording 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🤔..."): final_response = get_answer(st.session_state.messages) 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;")