File size: 3,119 Bytes
afe4a62
450f755
9fe39cc
 
 
9c931f4
9fe39cc
0135b7b
c84008c
2303bce
9ddce39
f73130d
2303bce
9fe39cc
 
 
 
 
 
 
 
 
 
 
 
 
058d081
9fe39cc
 
 
 
 
 
 
 
 
 
 
 
 
13faa7d
9fe39cc
 
 
 
 
 
 
b76d0bb
9fe39cc
 
 
 
 
 
b76d0bb
9fe39cc
 
 
 
 
 
 
948da99
 
 
 
 
450f755
 
 
 
 
9fe39cc
b76d0bb
13faa7d
9fe39cc
 
b76d0bb
9fe39cc
13faa7d
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
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'